Пакетная нормализация

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

Еще мы встретили нормализацию данных при изучении моделей внимания. В механизме Self-Attention используется нормализация данных на выходе блока внимания и на выходе блока Feed Forward. Отличие от предыдущей нормализации заключается в области нормализации данных. Если в первом случае мы брали каждый отдельный параметр и нормализовали его значения в разрезе исторических данных, то во втором случае мы смотрели не на историю значений одного показателя, а наоборот брали все показатели на текущий момент и нормализовали их значения в рамках текущего состояния. Можно сказать, проводили нормализацию данных вдоль временного отрезка и поперек. Первый вариант относится к пакетной нормализации данных, а второй называется нормализацией данных нейронного слоя Layer Normalization.

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

norm_2hlpercp

 

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

В феврале 2015 года Сергей Иоффе (Sergey Ioffe) и Кристиан Сзегеди (Christian Szegedy) предложили метод пакетной нормализации данных (Batch Normalization) для решения проблемы внутреннего ковариационного сдвига. Суть метода заключалась в нормализации каждого отдельного нейрона на некоем временном интервале со смещением медианы выборки к нулю и приведением дисперсии выборки к единице.

Эксперименты, проведенные авторами метода, показывают, что применение метода Batch Normalization выступает и в роли регуляризатора. Это позволяет отказаться от использования других методов регуляризации, в частности от Dropout. Более того, есть более поздние работы, в которых показано, что совместное использование Dropout и Batch Normalization отрицательно сказывается на результатах обучения нейронной сети.

В современных архитектурах нейронных сетей предложенный алгоритм нормализации можно встретить в различных вариациях. Авторы предлагают использовать Batch Normalization непосредственно перед нелинейностью (формулой активации).