[6 февраля, 2015 ] Как инициализировать сети с глубокой активацией ReLU, чтобы градиенты не исчезали и не взрывались

TL-DR

Инициализация — это не шутки, и она сильно зависит от используемой вами функции активации. Неправильная инициализация может привести к исчезновению или взрыву градиентов, что, в свою очередь, может замедлить или даже остановить конвергенцию. В этой статье предлагается эвристика инициализации, которая позволяет стабильно обучать активированные ReLU глубокие сети.

Введение

В этой статье представлен ряд улучшений, которые позволили авторам выиграть конкурс ImageNet 2015: функция активации PReLU и новая схема инициализации для глубоких NN с нелинейными функциями активации.

Почему важна инициализация?

Интуитивно понятно, что инициализация важна, потому что если сеть действует как усилитель дисперсии, как при прямом, так и при обратном распространении. Если дисперсия высока или низка, эффект усилителя дисперсии будет усиливать эту дисперсию, так что последние слои в каждом вычислении (последние слои в прямом распространении, которое идет 1 → n, и первые слои в обратном распространении, которые идет n → 1) будет страдать от очень высоких или очень низких значений, которые будут стремиться к бесконечности или нулю и будут эффективно «убивать» нейроны. Это то, что обычно называют «взрывающимися» или «исчезающими» градиентами (или нейронами на прямом проходе).

Если прямой/обратный сигнал неправильно масштабируется с коэффициентом β на каждом уровне, то окончательный распространяемый сигнал будет масштабироваться с коэффициентом β L после L слоев, где L может представлять некоторые или все слои. . Когда L велико, если β > 1, это приводит к чрезвычайно усиленным сигналам и бесконечному результату алгоритма; если β ‹ 1, это приводит к уменьшению сигналов. В любом случае алгоритм не сходится — в первом случае он расходится, а во втором останавливается.

Прямое распространение

Помните, что для слоя свертки алгоритм прямого распространения представляет собой матричное умножение со смещением, подобным этому:

x представляет изображение. Это вектор, содержащий все пиксели для каждого канала изображения. Таким образом, его длина составляет k²*c, где k – это длина изображения (и ширина, мы предполагаем, что изображения квадратные), а cколичество каналов. В свою очередь, Wпредставляет сверточные веса в форме матрицы с размерами d на n, где d — количество фильтров, а n соответствует длине вектора x k²*c. y — это вектор, полученный в результате свертки x и добавления b, вектора смещения . Наконец, мы используем l для индексации слоя.

Обратите внимание, что x_l = f(y_(l-1)), где f — функция активации предыдущего слоя. Кроме того, c_l = d_(l-1);количество каналов следующего слоя равно количеству фильтров в предыдущем слое.

Мы предполагаем, что:

  1. Функция активации — ReLU для каждого слоя
  2. W_l взаимно независимы и имеют одно и то же распределение, то же самое относится и к x_l.
  3. x_l и W_l не зависят друг от друга
  4. Элементы в W_l (мы называем их w_l) имеют нулевое среднее

Если допустить это, то после некоторого вывода (вычислить в Medium невозможно) получим:

Это уравнение действительно важно. Мы можем очень ясно видеть, как член ‹1 в умножении будет стремиться к нулю, а член ›1 будет стремиться к бесконечности. В частности, нам нужно, чтобы дисперсия оставалась постоянной и стабильной. Как мы можем это сделать? Давайте решим уравнение! Мы пытаемся понять, что мы должны инициализировать для каждого из w_l,, поэтому мы должны решить для w_l:

Для этого нам нужна дисперсия w_l, чтобы компенсировать фактор 1/2*n_l (1):

Обратное распространение

Мы также хотим избежать исчезновения или взрыва градиентов при движении назад при обновлении наших весов. Обратное распространение определяется следующей функцией, где delta(x_l) — это градиент на входе для каждого слоя, а delta(y_l) — это градиент на выходе перед активацией. для каждого слоя:

delta(y) – это вектор длиной k²*d. В случае back-prop мы определим значение, похожее на n_l, но другое. В этом случае он будет называться n_hat и определяется как n_hatкак длина delta(y)k²*d.W_hat, в свою очередь, представляет собой матрицу c на n_hat, где фильтры противоположны W, в способ обратного распространения (обратите внимание, что W_hat и W — это одна и та же матрица, устроенная по-разному). delta(x) — это вектор длины c, который содержит градиент в пикселе этого слоя.

Обратите внимание, что delta(y_l) = f’(y_l)*delta(x_(l+1)), где f — функция активации предыдущего слоя. Кроме того, для случая ReLUf’(y_l) равно нулю или единице с равной вероятностью (поскольку y_l симметричен относительно 0).

Мы снова предполагаем, что:

  1. w_l и delta(y_l) не зависят друг от друга.
  2. delta(x_l) имеет нулевое среднее значение для всех l, когда w_l инициализируется как симметричное распределение около 0
  3. f’(y_l) и delta(x_(l+1))независимы друг от друга

n возвращается как nhat

Как вы увидите, уравнения, поддерживающие правильность обратного распространения, такие же, как и для прямого распространения, но с nhat_lзаменойn_l.

После еще одного вывода получаем:

Опять рецидив. И снова нам нужно быть осторожными, чтобы какое-то значение не взорвалось и не исчезло при запуске алгоритма:

Нам снова нужна дисперсия w_l, чтобы компенсировать фактор 1/2*nhat_l (1):

У нас есть два, но мы можем инициализировать только один

Который из? Короче говоря: это не имеет значения. Вы можете использовать любой из них. Почему?

Допустим, мы используем тот, который мы получили в разделе обратного распространения. Тогда уравнение для прямого распространения будет таким:

c_2 — это количество каналов на уровне 2, а d_L — это количество фильтров на последнем уровне. Вы можете увидеть, как получается этот результат, если заменить n_l и n_hat_l по их определениям и исходя из того, чтоc_l = d_(l-1).

Помните, что это уравнение верно для Var[y_L]. Мы можем обобщить, сказав, что:

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

В обратном случае, если мы используем метод инициализации веса, который мы получили в разделе прямого распространения, мы будем иметь в обратном распространении:

И то же самое рассуждение применимо.

Несколько слов о Ксавьере

Инициализация Xavier — это метод инициализации из другой статьи, выпущенной за 4 года до этой, в которой предполагалась линейная функция активации (с производной, равной 1 при 0). Их уравнение было:

И их решение упускает фактор 1/2, который мы имеем для ReLU в Kaiming:

ПРеЛУ

Parametric Rectified Linear Unit или PReLU — это вариант функции активации ReLU, в которой коэффициент отрицательной части по умолчанию не равен нулю, но его можно изучить.

Авторы утверждают, что это улучшение в отношении ReLU повышает точность при незначительных вычислительных затратах (количество дополнительных параметров равно общему количеству каналов в сети, и это незначительно по сравнению с общим количеством весов).

Результаты

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

Авторы опробовали свой метод инициализации в глубокой ReLU-активированной сверточной сети и сравнили свои результаты с методом Ксавьера.

Они установили, что:

  1. Их метод сходится быстрее (рис. 1)
  2. Этот эффект усиливается по мере увеличения глубины сети, а для очень глубоких сетей Xavier останавливается и даже не сходится (рис. 2).
  3. Если они оба сходятся, методы не отличаются точностью

ПРеЛУ

PReLU улучшил базовую ошибку на 1,2%. Разница между совместно используемым каналом и поканальным относится к возможности связывания параметра PReLU между каналами на уровне или присвоения каждому каналу собственного параметра. Для версии с общим каналом версия PReLU добавляет только 13 параметров, но этого достаточно, чтобы повысить производительность на 1,1% (значительное улучшение производительности без значительного увеличения вычислительных затрат).

Примечания

(1) Для первого слоя правильным коэффициентом будет 1/n_l(или 1/nhat_lв случае обратной опоры)из-за чтобы на входе не было активации ReLU. Но разница коэффициентов 1/2 не имеет значения в одном слое (этот слой не является частью повторения), поэтому для простоты во всех слоях используется один и тот же коэффициент инициализации.

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

Углубление в выпрямители: превосходство на уровне человека по классификации ImageNet, Kaiming et al., Microsoft, 2015

Понимание сложности обучения нейронных сетей с глубокой прямой связью, Glorot et al., Universite de Montreal, 2010

Пьер Уаннес, Как инициализировать глубокие нейронные сети? Инициализация Ксавьера и Кайминга, 22 марта 2019 г.

Источник изображения: Flickr

Профессор Ксавьер: PapelPop