Редактирование: Инициализация параметров глубокой сети

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 9: Строка 9:
 
Рассмотрим линейное преобразование:
 
Рассмотрим линейное преобразование:
 
*<tex>y=w^Tx+b=\sum(w_i x_i)+b=\sum(y_i)+b</tex>
 
*<tex>y=w^Tx+b=\sum(w_i x_i)+b=\sum(y_i)+b</tex>
Примем значение вектора смещения $b$ нулевым, тогда дисперсия линейного преобразования (считаем настраиваемые параметры и входные данные независимыми):
+
Его дисперсия (считаем настраиваемые параметры и входные данные независимыми):
 
*<tex>\mathrm{Var}[y_i]=\mathrm{Var}[w_i x_i]=\mathbb{E}[x_i]^2\mathrm{Var}[w_i]+\mathbb{E}[w_i]^2\mathrm{Var}[x_i]+\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex> ([https://en.wikipedia.org/wiki/Variance#Product_of_independent_variables см. дисперсия произведения])
 
*<tex>\mathrm{Var}[y_i]=\mathrm{Var}[w_i x_i]=\mathbb{E}[x_i]^2\mathrm{Var}[w_i]+\mathbb{E}[w_i]^2\mathrm{Var}[x_i]+\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex> ([https://en.wikipedia.org/wiki/Variance#Product_of_independent_variables см. дисперсия произведения])
Так как мы сами выбираем параметры распределения, то мы их можем подобрать так, чтобы $\mathbb{E}[w_i]=0$ (для всех слоев). Также можно добиться того, чтобы для первого слоя $\mathbb{E}[x_i]=0$, если данные будут центрироваться в ходе нормализации, тогда:
+
Если отнормировать входные данные и подобрать параметры, чтобы среднее было нулевым, получится:
 
*<tex>(\mathbb{E}[x_i]=0, \mathbb{E}[w_i]=0) \Rightarrow \mathrm{Var}[y_i]=\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
 
*<tex>(\mathbb{E}[x_i]=0, \mathbb{E}[w_i]=0) \Rightarrow \mathrm{Var}[y_i]=\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
Предыдущее предположение верно для первого слоя. Не трудно показать, что для всех следующих слоев оно тоже будет верно, если использовать симметричную функцию активации, которая будет сохранять нулевое математическое ожидание. Пусть $x=f(y_{prev})$, где $f$ это симметричная функция активации, а $y_{prev}=w_{prev}^T x_{prev}$ (предыдущее представление). Покажем что $\mathbb{E}[x]=0$:
 
*<tex>\mathbb{E}[y_{prev_{i}}]=\mathbb{E}[w_{prev_{i}} x_{prev_{i}}]=\mathbb{E}[w_{prev_{i}}] \mathbb{E}[x_{prev_{i}}]=0</tex><br>Мы можем расписать математическое ожидание произведения, как произведение мат. ожиданий, поскольку $w$ и $x$ независимы.<br><tex>\Rightarrow \mathbb{E}[y_{prev}]=\mathbb{E}[\sum\limits_{i=1}^{n_{in}}[y_{prev_{i}}]]=\sum\limits_{i=1}^{n_{in}}(\mathbb{E}[y_{prev_{i}}])=0</tex><br><tex>\Rightarrow \mathbb{E}[x]=\mathbb{E}[f(y_{prev})]=0</tex><br>Поскольку $f$ симметрична.
 
 
Поскольку $x_i$ мы отнормировали, а $w_i$ из одного распределения, то все дисперсии одинаковые:
 
Поскольку $x_i$ мы отнормировали, а $w_i$ из одного распределения, то все дисперсии одинаковые:
*<tex>\mathrm{Var}[y]=\mathrm{Var}[\sum\limits_{i=1}^{n_{in}}[y_i]]=\sum\limits_{i=1}^{n_{in}}\mathrm{Var}[w_i x_i]=n_{in} \mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
+
*<tex>\mathrm{Var}[y]=\mathrm{Var}[\sum\limits_{i=1}^{n_{in}}[y_i]]=\sum\limits_{i=1}^{n_{in}}[w_i x_i]=n_{in} \mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
Отсюда видно, что дисперсия результата линейно зависит от дисперсии входных данных с коэффициентом $n_{in} \mathrm{Var}[w_i]$, поэтому если инициализировать параметры так, что $\mathrm{Var}[w_i]=\frac{1}{n_{in}}$, то наша дисперсия будет равна $\mathrm{Var}[x_i]$.
+
Отсюда видно, что дисперсия результата линейно зависит от дисперсии входных данных с коэффициентом $n_{in} \mathrm{Var}[w_i]$.
  
*Если коэффициент будет $>1$ это приведет к увеличению дисперсии с каждым новым преобразованием, что может привести к ошибкам или насыщению функции активации, что негативно скажется на обучении сети.
+
Если коэффициент будет $>1$ это приведет к увеличению дисперсии с каждым новым преобразованием, что может привести к ошибкам или насыщению функции активации, что негативно скажется на обучении сети.
  
*Если коэффициент будет $<1$ это приведет к снижению дисперсии с каждым новым преобразованием с около нулевым промежуточным представлением, что тоже негативно скажется на обучении сети.
+
Если коэффициент будет $<1$ это приведет к снижению дисперсии с каждым новым преобразованием с около нулевым промежуточным представлением, что тоже негативно скажется на обучении сети.
  
Если бы мы не использовали между слоями функцию активации, то дисперсия на последнем слое совпадала бы с дисперсией при инициализации входных данных, но использовать глубокую сеть без функции активации не имеет смысла, потому что она добавляет нелинейность нашей модели, чтобы выявлять более сложные закономерности. Поэтому, если мы будем использовать симметричную функцию активации, дисперсия на первом слое и на последнем все еще будет отличаться, но коэффициент $n_{in} \mathrm{Var}[w_i]$ уже не будет вносить вклад в дисперсию.
+
Поэтому для начальной инициализации параметров стоит использовать такое распределение, что $\mathrm{Var}[w_i]=\frac{1}{n_{in}}$, которое позволит сохранить дисперсию входных данных.
 
 
Поэтому для начальной инициализации параметров стоит использовать такое распределение, что $\mathrm{Var}[w_i]=\frac{1}{n_{in}}$, которое позволит контролировать изменение дисперсии.
 
  
 
===Метод инициализации Xavier<ref>[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]</ref>===
 
===Метод инициализации Xavier<ref>[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]</ref>===
Строка 36: Строка 32:
 
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}+n_{out}})</tex>
 
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}+n_{out}})</tex>
  
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (например гиперболический тангенс), для ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks) ReLU, Wikipedia]</ref> данный способ не подходит.
+
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (гиперболический тангенс, сигмоид), для ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks) ReLU, Wikipedia]</ref> данный способ не подходит.
  
====Пример инициализации Xavier на языке Python с фреймворком PyTorch====
+
====Пример инициализации Xavier на языке Python с библиотекой PyTorch====
  
 
     <font color=darkgreen># инициализация параметров одного слоя</font>
 
     <font color=darkgreen># инициализация параметров одного слоя</font>
Строка 57: Строка 53:
 
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между входами ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
 
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между входами ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
 
*<tex>x=\mathrm{ReLU}(y_{prev})</tex>
 
*<tex>x=\mathrm{ReLU}(y_{prev})</tex>
$\mathbb{E}[y_{prev}]=0$, так как $w_{prev_{i}}$ и $x_{prev_{i}}$ независимы. Доказательство было в главе про инициализацию случайными числами.
+
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что:
 
+
*<tex>\mathbb{E}[x_i^2]=\frac{1}{2}\mathrm{Var}[
Также $y_{prev_i}$ распределены симметрично относительно нуля:
 
*<tex>\mathbb{P}(y_{prev_i}>0)=\mathbb{P}(w_{prev_{i}} x_{prev_{i}}>0)</tex><br><tex>=\mathbb{P}((w_{prev_{i}}>0 \wedge x_{prev_{i}}>0) \vee ((w_{prev_{i}}<0 \wedge x_{prev_{i}}<0)))</tex><br><tex>=\mathbb{P}(w_{prev_{i}}>0)\mathbb{P}(x_{prev_{i}}>0)+\mathbb{P}(w_{prev_{i}}<0)\mathbb{P}(x_{prev_{i}}<0)</tex><br><tex>=\frac{1}{2}\mathbb{P}(x_{prev_{i}}>0)+\frac{1}{2}\mathbb{P}(x_{prev_{i}}<0)=\frac{1}{2}</tex>
 
Из предыдущих двух выкладок следует:
 
*<tex>\mathbb{E}[x_i^2]=\mathbb{E}[max(0, y_{prev})^2]=\frac{1}{2}\mathbb{E}[y_{prev}^2]=\frac{1}{2}\mathrm{Var}[
 
 
y_{prev}]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=\frac{1}{2}n_{in}\mathrm{Var}[w_i]\mathrm{Var}[y_{prev}]</tex>
 
y_{prev}]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=\frac{1}{2}n_{in}\mathrm{Var}[w_i]\mathrm{Var}[y_{prev}]</tex>
  
Строка 72: Строка 64:
 
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}})</tex>
 
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}})</tex>
  
====Пример инициализации He на языке Python с фреймворком PyTorch====
+
====Пример инициализации He на языке Python с библиотекой PyTorch====
  
 
   <font color=darkgreen># инициализация параметров одного слоя</font>
 
   <font color=darkgreen># инициализация параметров одного слоя</font>
 
   conv1 = torch.nn.Conv2d(...)
 
   conv1 = torch.nn.Conv2d(...)
 
   torch.nn.init.kaiming_uniform_(conv1.weight)
 
   torch.nn.init.kaiming_uniform_(conv1.weight)
 
====Пример инициализации He на языке Python с библиотекой TensorFlow====
 
 
  <font color=darkgreen># инициализация параметров тензора 2x2</font>
 
  initializer = tf.keras.initializers.HeUniform()
 
  values = initializer(shape=(2, 2))
 
  
 
==См.также==
 
==См.также==

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: