В этой статье были представлены как активация PReLU, так и инициализация Kaiming. Мы обсудим инициализацию Kaiming в этом посте.

Модели Deep NN испытывают трудности с сходимостью, когда веса инициализируются с использованием нормального распределения с фиксированным стандартным отклонением. Это связано с тем, что не учитывается дисперсия весов, что приводит к очень большим или малым значениям активации, что приводит к проблеме взрыва или исчезновения градиента во время обратного распространения. Эта проблема усугубляется по мере увеличения глубины NN.

Для решения вышеуказанной проблемы была введена инициализация Xavier. Он пытается сохранить одинаковую дисперсию всех слоев.

W - матрица весов между слоями j и j + 1. U - равномерное распределение. nⱼ - количество входов в слое j.

Но это предполагает, что функция активации является линейной, что явно не так. Введите Инициализация Kaiming He, учитывающая функцию активации. Для активации ReLU:

Происхождение инициализации Kaiming He

В этом разделе много математики, поэтому не стесняйтесь его пропускать.

Во-первых, нам нужно знать-

где X и Y - независимые случайные величины.

Их вывод дается в конце. Вы также можете попробовать вывести их самостоятельно.

Предположим, yᵏ = Wᵏxᵏ + bᵏ и xᵏ⁺¹ = f (yᵏ); k - номер слоя, f - функция активации. Здесь y, x и b - векторы-столбцы, а W - матрица. Это справедливо как для NN с прямой связью, так и для CNN (поскольку свертка может быть представлена ​​как матричное умножение [3]).

Предположения (действительно для каждого слоя k) -

  1. Все элементы в Wᵏ имеют одинаковое распределение и не зависят друг от друга. Аналогично для xᵏ и yᵏ.
  2. каждый элемент Wᵏ и каждый элемент xᵏ независимы друг от друга.
  3. Wᵏ и yᵏ имеют нулевое среднее и симметричны относительно нуля.
  4. bᵏ инициализируется нулевым вектором, поскольку изначально нам не требуется никакого смещения.

Я удалю номер слоя (Wᵏ - ›W) и предположу, что речь идет об общем номере слоя. Я снова добавлю его, когда будет несколько слоев. Теперь для каждого элемента yᵢ из y-

Помните, что E [xⱼ²] ≠ Var (xⱼ), если E [Xⱼ] = 0. Это из-за ReLU, у которого нет нулевого среднего.

Теперь мы хотим просто пойти дальше, мы не использовали связь между x и y; х = f (y). Итак, мы можем использовать его для упрощения термина E [xⱼ²].

Комбинируя его с ранее полученным выражением Var (yᵢ), мы получаем:

На этот раз отбросьте номер индекса и сохраните номер слоя, поскольку каждый элемент вектора или матрицы независим и одинаково распределен. Таким образом, приведенное выше уравнение становится:

Объединение слоя 1 с L-

Чтобы предотвратить проблему взрывающихся или исчезающих градиентов, мы хотим, чтобы дисперсия на входе = дисперсия на выходе. Это произойдет, только если каждый член внутри продукта = 1. т.е.

Таким образом, мы приходим к ранее упомянутой формуле:

В приведенном выше случае мы произвели инициализацию только с использованием прямого прохода. Аналогичные результаты могут быть получены при обратном распространении.

Эта формула действительна только тогда, когда мы используем ReLU в каждом слое. Для другой функции активации мы можем получить инициализацию, используя другую функцию активации в подынтегральном выражении члена E [xⱼ]. Для случая PReLU получаем:

a = инициализированный наклон PReLU.

  • если a = 0, мы получаем случай ReLU
  • если a = 1, мы получаем линейный случай

Если вы запустите приведенный ниже код, вы увидите, что var (y) близко к 1, то есть var (x).

import torch
import torch.nn.functional as F
import math
input_size=1200
hidden_size=4000
w=torch.randn(hidden_size,input_size)*math.sqrt(2/input_size)
x=torch.randn(input_size,1)
[email protected](x)
x.var(),y.var()

Использованная литература-

  1. Инициализация Kaiming He - https://arxiv.org/abs/1502.01852
  2. Инициализация Xavier Glorot - http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
  3. Свертка как умножение матриц - https://stackoverflow.com/a/44039201