Перейти к основному содержимому

Инициализация

Перед началом обучения нейросети необходимо случайно инициализировать её веса.

Важность случайной инициализации

Инициализировать начальные значения весов нужно именно случайно, а не одинаковыми константами, иначе для симметрично расположенных нейронов с одинаковыми весами на каждом шаге оптимизации из симметрии архитектуры они будут изменяться синхронно на одинаковую величину и нейроны будут извлекать одинаковые признаки!

Обычно веса инициализируют

  • из равномерного распределения wnU[ε,ε]w_n\sim U[-\varepsilon,\varepsilon], Var[wn]=ε23Var[w_n]=\frac{\varepsilon^2}{3}

  • либо (чаще) из нормального распределения wnN(0,σ2)w_n\sim \mathcal{N}(0,\sigma^2), Var[wn]=σ2Var[w_n]=\sigma^2

где σ2\sigma^2 и ε\varepsilon - малы, а смещения полагают равными нулю.

Разумная инициализация должна приводить к двум свойствам, когда мы рассматриваем дисперсию для разных слоёв нейросети:

  • дисперсия активаций не должна изменяться.

  • дисперсия градиента потерь по весу не должна изменяться.

Реального распределения активаций мы не знаем, поэтому пожелания выше должны выделяться для независимых и одинаково распределённых случайных величин.

Рекомендация

В случае нелинейностей с узкой областью изменений (в районе нуля для sigmoid, tangh, hard-tangh, soft-sign) желательно дополнительно обеспечивать малость дисперсий активаций за счёт уменьшения дисперсии входных признаков. В этом случае функции нелинейности не будут выходить на насыщение и нейроны (по крайней мере в начале обучения) будут настраиваться на невырожденные признаки.

Нечётные функции нелинейности

Рассмотрим случай нечётных функций нелинейности, т.е. удовлетворяющих свойству:

g(u)=g(u).g(-u) = -g(u).

Среди рассмотренных функций этому свойству будут удовлетворять нелинейности tangh, hard-tangh и soft-sign.

Рассмотрим нейрон скрытого слоя с выходом y=g(s)y=g(s), где

s=n=1Ninwnzn,s=\sum_{n=1}^{N_{in}} w_n z_n,

а NinN_{in} - число нейронов предыдущего слоя, {zn}n\{z_n\}_n - их активации, а смещение не пишем, поскольку инициализируем его нулём.

Обратим внимание, что если Ewn=0\mathbb{E}w_n=0 и Ezn=0\mathbb{E}z_n=0, то

Es=E{n=1Ninwnzn}=n=1NinE{wnzn}=n=1NinE{wn}E{zn}=0,\begin{align*} \mathbb{E}s &= \mathbb{E}\left\{ \sum_{n=1}^{N_{in}} w_n z_n \right\} \\ &=\sum_{n=1}^{N_{in}} \mathbb{E}\left\{ w_n z_n \right\}\\ &=\sum_{n=1}^{N_{in}} \mathbb{E}\{w_n\} \mathbb{E} \{ z_n \}=0, \end{align*}

где в последнем переходе мы воспользовались независимостью случайных величин znz_n и wnw_n.

В силу нечётности функции нелинейности,

E{y}=E{g(s)}=0.\mathbb{E}\{y\} = \mathbb{E}\{g(s)\} = 0.

Таким образом, если входные признаки отцентрированы (имеют нулевое мат. ожидание), то нулевым мат. ожиданием будут обладать и полученные от них активации, а следовательно, по индукции, и активации всех последующих слоёв, если в каждом слое мы продолжаем использовать симметричные функции нелинейности.

Калиброванная случайная инициализация

Если рассматриваем нейрон первого скрытого слоя, то z1,...zNinz_1,...z_{N_{in}} - входные признаки. Отнормируем эти признаки, чтобы они имели нулевое среднее и единичную дисперсию. По формуле дисперсии произведения имеем:

Var[wnzn]=E[wn]2Var[zn]+Var[wn]E[zn]2+Var[wn]Var[zi]=Var[wn]Var[zn],\begin{align*} Var[w_n z_n] &= \mathbb{E}[w_n]^2 Var[z_n]+Var[w_n] \mathbb{E}[z_n]^2+Var[w_n]Var[z_i] \\ &= Var[w_n]Var[z_n], \end{align*}

где

  • E[wi]2Var[zi]=0\mathbb{E}[w_i]^2 Var[z_i]=0 поскольку мы так инициализируем веса, что E[wi]=0\mathbb{E}[w_i]=0.

  • Var[wi]E[zi]2=0Var[w_i] \mathbb{E}[z_i]^2=0, поскольку E[zi]=0\mathbb{E}[z_i]=0, вследствие того, что начальные признаки отцентрированы (имеют нулевое среднее), а линейный слой с симметричными функциями нелинейности сохраняет свойство нулевых мат. ожиданий для последующих активаций.

При нормализации входных признаков они все будут иметь нулевое мат. ожидание и дисперсию 1.

Все веса на заданном слое инициализируются случайно с одинаковой дисперсией Var[wn]Var[w_n]. Веса генерируются независимо от входов znz_n. Предположим также, что входы - независимые случайные величины и имеют одинаковую дисперсию Var[zn]Var[z_n]. Тогда:

Var[y]Var[s]=NinVar[wn]Var[zn]Var[y] \approx Var[s] = N_{in} Var[w_n] Var[z_n]

Var[y]Var[s]Var[y] \approx Var[s], поскольку веса инициализируются малыми числами, поэтому суммарный вход ss также мал, а для малых значений симметричные нелинейности примерно равны тождественной функции нелинейности:

g(u)u.g(u)\approx u.

Входы znz_n в общем случае будут иметь различающиеся дисперсии, но если мы стандартизуем входные признаки (входы нулевого слоя нейросети), чтобы они имели одинаковую дисперсию, а дисперсию весов будем выбирать равной

Var[wn]=1Nin(1)Var[w_n]=\frac{1}{N_{in}} \tag{1}

то дисперсии выходов слоя также будут равны единице и далее, по индукции, будут примерно равны единице и выходы всех последующих слоёв сети.

Отклонения от (1)

Если Var[wn]>1NinVar[w_n]>\frac{1}{N_{in}}, то дисперсии активаций будут возрастать с номером слоя, а если

Var[wn]<1NinVar[w_n]<\frac{1}{N_{in}}, то убывать.

Инициализация весов, используя (1), называется калиброванной случайной инициализацией (calibrated random initialization).

  • Если wnU[ε,ε]w_n\sim U[-\varepsilon,\varepsilon], то Var[wn]=ε23Var[w_n]=\frac{\varepsilon^2}{3}, следовательно ε=3Nin\varepsilon=\sqrt{\frac{3}{N_{in}}}

  • Если wnN(0,σ2)w_n\sim \mathcal{N}(0,\sigma^2), то σ2=1Nin\sigma^2=\frac{1}{N_{in}}

Инициализация Ксавьера

Если рассматривать не дисперсии активаций при проходе вперёд, а дисперсии градиентов при проходе назад во время метода обратного распространения ошибки, который используется для настройки сетей и будет описан далее, то те же самые рассуждения для сохранения дисперсии градиентов приведут к требованию

Var[wn]=1Nout,(2)Var[w_n]=\frac{1}{N_{out}}, \tag{2}

где NoutN_{out} - число выходов линейного слоя.

В работе [1] предложено находить компромисс между сохранением дисперсий активаций (1) и сохранением дисперсий градиентов (2), беря среднее гармоническое между ними:

Var[wn]=112(1/1Nin)+12(1/1Nout)=2Nin+NoutVar[w_n]=\frac{1}{\frac{1}{2}(1/\frac{1}{N_{in}}) + \frac{1}{2}(1/\frac{1}{N_{out}})}=\frac{2}{N_{in}+N_{out}}
  • Если wnU[ε,ε]w_n\sim U[-\varepsilon,\varepsilon], то Var[wn]=ε23Var[w_n]=\frac{\varepsilon^2}{3}, следовательно ε=6Nin+Nout\varepsilon=\frac{\sqrt{6}}{\sqrt{N_{in}+N_{out}}}

  • Если wnN(0,σ2)w_n\sim \mathcal{N}(0,\sigma^2), то σ2=2Nin+Nout\sigma^2=\frac{2}{N_{in}+N_{out}}.

Эта инициализация называется инициализацией Ксавьера (Xavier initialization, также известная как Glorot initialization, поскольку первый автор Glorot Xavier).

Ниже показано сравнительное распределение активаций (при прямом проходе, activation value) и градиентов (при обратном проходе, backpropagated gradients) для инициализации весов wnU[ε,ε]w_n\sim U[-\varepsilon,\varepsilon] для ε=1/Nin\varepsilon=1/\sqrt{N_{in}} и ε=6/Nin+Nout\varepsilon=\sqrt{6}/\sqrt{N_{in}+N_{out}} вверху и внизу каждого из изображений.

Распределение активаций на разных слоях [1]:

Распределение градиентов на разных слоях [1]:

Из-за отсутствия множителя 6\sqrt{6} в калиброванной случайной инициализации распределение активаций сужается при переходе к более поздним слоям (изображение 1), а распределение градиентов наоборот расширяется (изображение 3). При инициализации Ксавьера оба распределения сохраняют стабильность по слоям (изображения 2 и 4).

Инициализация сложных архитектур

Рекомендуется строить графики распределения активаций и градиентов при настройке новых сложных архитектур.

Инициализация Хе

Инициализация весов Хе (He initialization, также известная как Kaiming initialization, поскольку первый автор Kaiming He) была предложена в работе [2] и рассматривает случай ReLU и Leaky ReLU функций нелинейности. Они сложнее, чем симметричные нелинейности, поскольку, Ez0\mathbb{E}z\ne 0. Например, для ReLU всегда Ez>0\mathbb{E}z>0.

Рассмотрим нейрон в промежуточном слое с выходом

y=ReLU(s),y=\text{ReLU}(s), s=n=1Ninwnzn,s=\sum_{n=1}^{N_{in}} w_n z_n, zn=ReLU(snprev),z_n=\text{ReLU}(s_n^{prev}),

где NinN_{in} - число нейронов предыдущего слоя, а snprevs_n^{prev} - сумма активаций ещё более раннего слоя, формирующая активацию нейрона znz_n.

Смещение, как и прежде, инициализируем нулём.

Используя генерацию весов с нулевым мат. ожиданием (Ewn=0\mathbb{E}w_n=0) и свойство

Var[zn]=E[zn2]E[zn]2,Var[z_n]=\mathbb{E} [ z_n^2 ] - \mathbb{E} [ z_n ]^2,

получим:

Var[wnzn]=E[wn]2Var[zn]+Var[wn]E[zn]2+Var[wn]Var[zi]=Var[wn]E[zn]2+Var[wn]Var[zn]=Var[wn](E[zn]2+Var[zn])=Var[wn]E[zn2]\begin{align*} Var[w_n z_n] &= \mathbb{E}[w_n]^2 Var[z_n]+Var[w_n] \mathbb{E}[z_n]^2+Var[w_n]Var[z_i] \\ &= Var[w_n] \mathbb{E}[z_n]^2+Var[w_n]Var[z_n] \\ &= Var[w_n] (\mathbb{E}[z_n]^2+Var[z_n]) \\ &= Var[w_n] \mathbb{E} [ z_n^2 ] \end{align*}

Предполагая независимость входов и весов,

Var[s]=Var[n=1Ninwnzn]=n=1NinVar[wnzn]=NinVar[wn]E[zn2]=12NinVar[wn]E[(snprev)2],\begin{align*} Var[s] &= Var[\sum_{n=1}^{N_{in}} w_n z_n] = \sum_{n=1}^{N_{in}} Var[w_n z_n] \\ &= N_{in} Var[w_n] \mathbb{E} [ z_n^2 ] = \frac{1}{2} N_{in} Var[w_n] \mathbb{E} [ (s_n^{prev})^2 ], \end{align*}

где мы воспользовались симметрией распределения snprevs^{prev}_n (как функции от весов с симметрично распределёнными весами относительно нуля), у которого половина отрезается нелинейностью ReLU:

E[zn2]=E[ReLU(snprev)2]=12E[(snprev)2]\mathbb{E} [ z_n^2 ]=\mathbb{E} [ \text{ReLU}(s^{prev}_n)^2 ]=\frac{1}{2} \mathbb{E} [(s^{prev}_n)^2]

Таким образом, чтобы сохранить дисперсию ss при переходе от предыдущего слоя к текущему, необходимо инициализировать веса по правилу

12NinVar[wn]=1Var[wn]=2Nin(3)\frac{1}{2} N_{in} Var[w_n]=1 \quad \Rightarrow \quad Var[w_n]=\frac{2}{N_{in}} \tag{3}

Поэтому веса можно инициализировать из следующих распределений:

  • wnU[6Nin,6Nin]w_n \sim U[-\frac{\sqrt{6}}{\sqrt{N_{in}}}, \frac{\sqrt{6}}{\sqrt{N_{in}}}]

  • wnN(0,2Nin)w_n\sim \mathcal{N}(0,\frac{2}{N_{in}})

Инициализация Каиминга ускоряет обучение глубоких нейронных сетей с функцией нелинейности ReLU (источник):

Для функции активации Leaky ReLU:

h(u)=max{αu;u},  α(0,1)гиперпараметр.h(u)=\max\{ \alpha u; u \},\; \alpha\in (0,1) - \text{гиперпараметр.}

требование по равномерности дисперсии по слоям становится

12(1+α2)NinVar[wn]=1Var[wn]=2Nin(1+α2)\frac{1}{2}(1+\alpha^2) N_{in} Var[w_n]=1 \quad \Rightarrow \quad Var[w_n]=\frac{2}{N_{in}(1+\alpha^2)}

Легко заметить, что при α=0\alpha=0 это сводится к (3), а при α=1\alpha=1 (нелинейность-тождественное преобразование) сводится к (1).

Итог

  • Веса сети нужно инициализировать из нормального или равномерного распределения с нулевым мат. ожиданием и малой дисперсией.

  • Дисперсия должна быть тем меньше, чем больше нейронов в слое.

  • Инициализация Ксавьера используется для слоя с нечётными функциями активации.

  • Инициализация Хе используется для слоя с функциями активации ReLU и LeakyReLU.

Литература

  1. Glorot X., Bengio Y. Understanding the difficulty of training deep feedforward neural networks //Proceedings of the thirteenth international conference on artificial intelligence and statistics. – JMLR Workshop and Conference Proceedings, 2010. – С. 249-256.
  2. He K. et al. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification //Proceedings of the IEEE international conference on computer vision. – 2015. – С. 1026-1034.