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

Преимущества пакетной нормализации

Пакетная нормализация оптимизирует обучение сети. Было показано, что он имеет несколько преимуществ:

  1. Сети обучаются быстрее. Каждая итерация обучения фактически будет медленнее из-за дополнительных вычислений во время прямого прохода и дополнительных гиперпараметров для обучения во время обратного распространения. Однако он должен сходиться намного быстрее, поэтому тренировка в целом должна проходить быстрее.
  2. Позволяет повысить скорость обучения - градиентный спуск обычно требует небольшой скорости обучения, чтобы сеть могла сойтись. А по мере того, как сети становятся глубже, их градиенты становятся меньше при обратном распространении, поэтому им требуется еще больше итераций. Использование пакетной нормализации позволяет нам использовать гораздо более высокие скорости обучения, что еще больше увеличивает скорость обучения сетей.
  3. Облегчает инициализацию весов. Инициализация весов может быть трудной, и еще более сложной при создании более глубоких сетей. Нормализация партии, кажется, позволяет нам быть гораздо менее осторожными при выборе наших начальных начальных весов.
  4. Делает больше функций активации доступными. Некоторые функции активации не работают должным образом в некоторых ситуациях. Сигмоиды довольно быстро теряют свой градиент, а это значит, что их нельзя использовать в глубоких сетях. А ReLU часто вымирают во время обучения, когда они полностью перестают учиться, поэтому нам нужно быть осторожными с диапазоном вводимых в них значений. Поскольку пакетная нормализация регулирует значения, входящие в каждую функцию активации, нелинейности, которые, похоже, не работают в глубоких сетях, на самом деле снова становятся жизнеспособными.
  5. Упрощает создание более глубоких сетей. Благодаря первым 4 элементам, перечисленным выше, при использовании пакетной нормализации проще создавать и быстрее обучать более глубокие нейронные сети. И было показано, что более глубокие сети обычно дают лучшие результаты, так что это здорово.
  6. Обеспечивает небольшую регуляризацию - пакетная нормализация добавляет небольшой шум в вашу сеть. В некоторых случаях, например, в модулях Inception, пакетная нормализация работает так же хорошо, как и выпадение. Но в целом следует рассматривать пакетную нормализацию как некоторую дополнительную регуляризацию, которая, возможно, позволит вам уменьшить некоторые потери, которые вы можете добавить в сеть.
  7. В целом может дать лучшие результаты. Некоторые тесты показывают, что нормализация пакета на самом деле улучшает результаты обучения. Однако на самом деле это оптимизация, которая помогает тренироваться быстрее, поэтому не стоит думать об этом как о способе улучшить свою сеть. Но поскольку это позволяет вам быстрее обучать сети, это означает, что вы можете быстрее перебирать больше проектов. Это также позволяет создавать более глубокие сети, которые обычно лучше. Поэтому, если учесть все факторы, вы, вероятно, добьетесь лучших результатов, если построите свои сети с пакетной нормализацией.

Мы добавляем пакетную нормализацию к слоям внутри функции fully_connected. Вот несколько важных моментов:

Слои с пакетной нормализацией не содержат смещения. Установите use_bias = False в tf.layers.conv2d () и tf.layers.dense ()

В TensorFlow есть функцияtf.layers.batch_normalization для обработки математики.

Мы сообщаем tf.layers.batch_normalization, обучается ли сеть. Это важный шаг.

Мы добавляем нормализацию перед вызовом функции активации.

def conv_layer(prev_layer, layer_depth, is_training):
  conv_layer = tf.layers.conv2d(prev_layer, layer_depth*4, 3, strides, 'same', use_bias=False, activation=None)
  conv_layer = tf.layers.batch_normalization(conv_layer, training=is_training)
  conv_layer = tf.nn.relu(conv_layer)

Источники: Из конспектов лекции: https://classroom.udacity.com/nanodegrees/nd101/syllabus