Принцип выбора начальных значений весов для слоев, составляющих модель очень важен: установка всех весов в 0 будет серьезным препятствием для обучения, так как ни один из весов изначально не будет активен. Присваивать весам значения из интервала <tex>[-1, 1]</tex> — тоже обычно не лучший вариант — на самом деле, иногда (в зависимости от задачи и сложности модели) от правильной инициализации модели может зависеть, достигнет она высочайшей производительности или вообще не будет сходиться. Даже если задача не предполагает такой крайности, удачно выбранный способ инициализации весов может значительно влиять на способность модели к обучению, так как он предустанавливает параметры модели с учетом функции потерь<ref>[https://habr.com/company/wunderfund/blog/315476/ Тонкая настройка нейронной сети, Habr]</ref>.
Всегда можно выбрать случайно начальное приближение, но лучше выбирать определённым образом.
===Инициализация случайными числами===
Рассмотрим линейный нейрон:
*<tex>y=w^Tx+b=\sum(w_i x_i)+b=\sum(y_i)+b</tex>
Его дисперсия (считаем настраиваемые параметры и входные данные независимыми):
*<tex>\mathrm{Var}[y_i]=\mathrm{Var}[w_i x_i]=\mathrm{E}[x_i]^2\mathrm{Var}[w_i]+\mathrm{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{E}[x_i]=0, \mathrm{E}[w_i]=0) \Rightarrow \mathrm{Var}[y_i]=\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
Поскольку $x_i$ мы отнормировали, а $w_i$ из одного распределения, то все дисперсии одинаковые:
*<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]$.
Если коэффициент будет $>1$ это приведет к увеличению дисперсии с каждым новым преобразованием, что может привести к ошибкам или насыщению функции активации, что негативно скажется на обучении сети.
Если коэффициент будет $<1$ это приведет к снижению дисперсии с каждым новым преобразованием с около нулевым промежуточным представлением, что тоже негативно скажется на обучении сети.
Поэтому для начальной инициализации настраиваемых параметров стоит использовать такое распределение, что $\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>.===
Предыдущий подход хорошо работает, когда размерность наших данных не изменяется после преобразований $(n_{in} == n_{out})$, но так бывает не всегда. В качестве компромисса Xavier Glorot и Yoshua Bengio предлагают инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}+n_{out}}$.
Для равномерного распределения $U$ это будет:
*<tex>w_i \sim U[-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}},\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}]</tex>
Для нормального распределения $N$ это будет:
*<tex>w_i \sim N(0,\frac{2}{n_{in}+n_{out}})</tex>
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (гиперболический тангенс, сигмоид), для ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks) ReLU, Wikipedia]</ref> данный способ не подходит.
===Метод инициализации He===
Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым:
*<tex>(\mathrm{E}[x_i] \neq 0, \mathrm{E}[w_i]=0)</tex><br><tex>\Rightarrow \mathrm{Var}[y_i]=\mathrm{E}[x_i]^2\mathrm{Var}[w_i] + \mathrm{Var}[w_i]\mathrm{Var}[x_i]=\mathrm{Var}[w_i](\mathrm{E}[x_i]^2 + \mathrm{Var}[x_i])=\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=n_{in}\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex>
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между функциями активации ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
*<tex>x=\mathrm{ReLU}(y_{prev})</tex>
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что:
*<tex>\mathrm{E}[x_i^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>
Получается, что при использовании ReLU, нужно инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}}$. Для нормального распределения $N$ это будет:
*<tex>w_i \sim N(0,\frac{2}{n_{in}})</tex>
==См.также==
* [[Настройка глубокой сети]]
* [[Глубокое обучение]]
==Примечания==
<references/>
==Источники информации==
#[https://ml-handbook.ru/chapters/neural_nets/training Онлайн-учебник по машинному обучению от ШАД]
[[Категория: Машинное обучение]]
[[Категория: Глубокое обучение]]