Глубокое понимание пакетной нормализации
1. Какова предыстория предложения Б.Н.?
Важным допущением в статистическом обучении является то, что распределение входных данных является относительно стабильным. Если это предположение не выполняется, сходимость модели будет медленной или даже невозможной. Поэтому для общих задач статистического обучения нормализация или отбеливание данных перед обучением — очень распространенный прием.
Но эту проблему становится сложнее решить в глубоких нейронных сетях. В нейронной сети сеть многоуровневая, и каждый слой можно рассматривать как отдельный классификатор, а сеть можно рассматривать как конкатенацию классификаторов. Это означает, что в процессе обучения по мере изменения параметров определенного слоя классификаторов будет меняться и распределение его выходных данных, что приводит к неустойчивому распределению входных данных следующего слоя. Классификатору необходимо постоянно адаптироваться к новым распределениям, что затрудняет сходимость модели.
Предварительная обработка данных может решить проблему распределения входных данных первого слоя, но не имеет ничего общего с проблемой скрытого слоя.Internal Covariate Shift. И пакетная нормализация на самом деле в основном решает эту проблему.
Кроме того, размер градиента общей нейронной сети часто связан с размером параметров (аффинное преобразование), и в процессе обучения будут большие колебания, что делает скорость обучения непригодной для установки слишком большой.Пакетная нормализация делает размер градиента относительно фиксированным,В определенной степени позволяет нам использовать более высокую скорость обучения.
(слева) без нормализации, (справа) с применением пакетной нормализации
2. Как работает БН?
Предполагая, что наши входные данные представляют собой мини-партию размера N, y, рассчитанный по следующим четырем формулам, является значением нормализации партии (BN).
данные выглядят какГауссово распределение.
Сначала из (2.1) и (2.2) получаются среднее значение и дисперсия мини-пакета, а затем выполняется операция нормализации (2.3) К знаменателю добавляется небольшая константа, чтобы избежать деления на 0. всего процесса, Только последнее (2.4) вводит дополнительные параметры γ и β, а их размер есть длина признака, которая совпадает с xi.
Слой BN обычно добавляется перед функцией активации скрытого слоя и после линейного преобразования. Если мы сложим (2.4) и функции активации после них вместе, мы можем думать о них как о полной нейронной сети (линейной + активации). (Обратите внимание, что линейное преобразование BN все же отличается от линейного преобразования общего скрытого слоя. Первое — поэлементное, а второе — матричное умножение.)
В настоящее время, можно рассматривать как вход этого слоя сети, и
с фиксированным средним значением и дисперсией. Это решает ковариативный сдвиг.
Кроме того, y также имеет функцию обеспечения возможности выражения данных. При нормализации неизбежно изменение собственного распределения, что приведет к определенной степени потери выраженности характеристик исследований. Вводя параметры γ и β, сеть может восстановить исходное распределение данных в стандартной разности и среднем значении γ и β до исходного распределения. Это гарантирует, что введение БН не ухудшит эффект.
3. Каков метод реализации БН?
Мы разделяем пакетную нормализацию на два процесса: прямой (только с учетом обучения) и обратный.
Параметр x прямого процесса — это мини-пакетные данные, gamma и beta — параметры слоя BN, а bn_param — словарь, включающийЗначение и используется для вывода
и
Скользящее среднее и, наконец, возвращает выход y слоя BN, кэш промежуточной переменной, используемый в обратном процессе, и обновленное скользящее среднее.
Параметры обратного процесса — это сигнал ошибки dout из предыдущего уровня и кэш промежуточных переменных, хранящийся в прямом процессе, и, наконец, возврат.Частная производная от .
Реализация отличается от деривации тем, что реализация представляет собой операцию над всей партией.
import numpy as np
def batchnorm_forward(x, gamma, beta, bn_param):
# read some useful parameter
N, D = x.shape
eps = bn_param.get('eps', 1e-5)
momentum = bn_param.get('momentum', 0.9)
running_mean = bn_param.get('running_mean', np.zeros(D, dtype=x.dtype))
running_var = bn_param.get('running_var', np.zeros(D, dtype=x.dtype))
# BN forward pass
sample_mean = x.mean(axis=0)
sample_var = x.var(axis=0)
x_ = (x - sample_mean) / np.sqrt(sample_var + eps)
out = gamma * x_ + beta
# update moving average
running_mean = momentum * running_mean + (1-momentum) * sample_mean
running_var = momentum * running_var + (1-momentum) * sample_var
bn_param['running_mean'] = running_mean
bn_param['running_var'] = running_var
# storage variables for backward pass
cache = (x_, gamma, x - sample_mean, sample_var + eps)
return out, cache
def batchnorm_backward(dout, cache):
# extract variables
N, D = dout.shape
x_, gamma, x_minus_mean, var_plus_eps = cache
# calculate gradients
dgamma = np.sum(x_ * dout, axis=0)
dbeta = np.sum(dout, axis=0)
dx_ = np.matmul(np.ones((N,1)), gamma.reshape((1, -1))) * dout
dx = N * dx_ - np.sum(dx_, axis=0) - x_ * np.sum(dx_ * x_, axis=0)
dx *= (1.0/N) / np.sqrt(var_plus_eps)
return dx, dgamma, dbeta
4. В чем преимущества БН?
- Более быстрая сходимость.
- Уменьшите важность начальных весов.
- Надежные гиперпараметры.
- Требует меньше данных для обобщения.
5. Каковы недостатки БН?
- Нестабильно при использовании небольших размеров пакетов: нормализация пакетов должна вычислять среднее значение и дисперсию, чтобы нормализовать предыдущие выходные данные для пакетов. Эта статистическая оценка является более точной, если размер партии относительно велик, и точность оценки продолжает снижаться по мере уменьшения размера партии.
Выше приведен график ошибок проверки для ResNet-50. Можно сделать вывод, что если размер партии оставить равным 32, окончательная ошибка проверки составит около 23, и ошибка будет продолжать уменьшаться по мере уменьшения размера партии (размер партии не может быть равен 1, поскольку он сам по себе является средним). Потери совсем другие (около 10%).
Если размер партии является проблемой, почему бы нам не использовать более крупные партии? Мы не можем использовать большие партии в каждом случае. При тонкой настройке мы не можем использовать большие партии, чтобы не повредить модель из-за чрезмерных градиентов. Во время распределенного обучения большие пакеты в конечном итоге будут распределены по экземплярам в виде набора небольших пакетов.
- Приводит к увеличению времени обучения: эксперименты, проведенные NVIDIA и Университетом Карнеги-Меллона, показывают, что «хотя пакетная нормализация не требует больших вычислительных ресурсов, а общее количество итераций, необходимых для сходимости, уменьшается». увеличивается по мере увеличения размера партии.
Пакетная нормализация занимает 1/4 всего времени обучения. Причина в том, что для пакетной нормализации требуется две итерации входных данных: одна для вычисления пакетной статистики, а другая для нормализации выходных данных.
- Разные результаты во время обучения и вывода и вывода: например, выполнение «обнаружения объекта» в реальном мире. При обучении детектора объекта мы обычно используем большие пакеты (как yolov4, так и в Faster-rcnn, обучаются с размером партии по умолчанию = 64). Но после вступления в производство эти модели не работают так же, как и они, когда они были обучены. Это потому, что они обучены большими партиями, и в случае в реальном времени их размер партии равен 1, потому что он должен обрабатывать кадр по кадрам. Учитывая это ограничение, некоторые реализации предпочитают использовать предварительное среднее значение и дисперсию на основе набора тренировок. Другая возможность состоит в том, чтобы рассчитать средние значения и дисперсионные значения на основе распределения вашего теста.
- Плохо для электронного обучения: электронное обучение — это метод обучения, при котором система обучается постепенно, передавая ей экземпляры данных по очереди, либо индивидуально, либо посредством процесса, называемогоmini-batchгруппы. Каждый шаг обучения является быстрым и дешевым, поэтому система может обучаться в режиме реального времени по мере поступления новых данных.
Поскольку он опирается на внешние источники данных, данные могут поступать индивидуально или пакетами. Из-за изменения размера пакета на каждой итерации способность к обобщению масштаба и смещения входных данных не является хорошей, что в конечном итоге влияет на производительность.
-
Не подходит для рекуррентных нейронных сетей:
Хотя пакетная нормализация может значительно ускорить обучение и обобщение сверточных нейронных сетей, ее трудно применить к рекурсивным структурам. Пакетная нормализация может применяться между стеками RNN, где нормализация применяется «вертикально», то есть к выходным данным каждой RNN. Но его нельзя применять «горизонтально», например, между временными шагами, так как это повредит обучению из-за взрывных градиентов, создаваемых повторным масштабированием.
[^note]: Некоторые исследовательские эксперименты показали, что нормализация пакетов делает нейронные сети уязвимыми для враждебных действий, но мы не включили это из-за отсутствия исследований и доказательств.
6. Альтернативный метод:
В случаях, когда пакетная нормализация не работает, есть несколько альтернатив.
- Layer Normalization
- Instance Normalization
- Group Normalization (+ weight standardization)
- Synchronous Batch Normalization
7. Ссылки
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- Deriving the Gradient for the Backward Pass of Batch Normalization
- CS231n Convolutional Neural Networks for Visual Recognition
- к data science.com/curse-of-turn…