Реализация пакетной нормализации на Python

Мы уже познакомились с алгоритмом пакетной нормализации данных и даже реализовали слой пакетной нормализации для нашей библиотеки на языке MQL5. В том числе мы добавили возможность использования технологии многопоточных вычислений с помощью OpenCL. Теперь давайте посмотрим, какой вариант реализации данного метода предлагает знакомая нам библиотека Keras для TensorFlow.

Данная библиотека предлагает к использованию слой tf.keras.layers.BatchNormalization.

tf.keras.layers.BatchNormalization(
    axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    moving_mean_initializer='zeros',
    moving_variance_initializer='ones', beta_regularizer=None,
    gamma_regularizer=None, beta_constraint=None, gamma_constraint=None, **kwargs
)

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

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

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

где:

  • — небольшая константа (настраивается как часть аргументов конструктора) для исключения ошибки деления на ноль;
  • — это обучаемый коэффициент масштабирования (инициализированный как 1), который можно отключить установкой параметра scale=False в конструкторе объекта;
  • — это обучаемый коэффициент смещения (инициализированный как 0), который можно отключить установкой параметра center=False в конструкторе объекта;
  • X — тензор пакета исходных данных;
  • — среднее значение по пакету данных;
  • — дисперсия пакета данных.

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

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

В конструктор слоя можно передавать следующие аргументы:

  • axis — целое число, ось, которая должна быть нормализована (обычно это ось признаков);
  • momentum — импульс для скользящей средней;
  • epsilon — небольшая константа для исключения ошибки деления на ноль;
  • center — при True добавляет смещение beta к нормализованному тензору, при False beta игнорируется;
  • scale — при True умножается на gamma, при False gamma не используется. Когда следующий слой является линейным, его можно отключить, поскольку масштабирование будет выполняться следующим слоем;
  • beta_initializer — тип инициализатора бета-веса;
  • gamma_initializer — тип инициализатора гамма-веса;
  • moving_mean_initializer — тип инициализатора для скользящей средней;
  • moving_variance_initializer — тип инициализатора для скользящей средней дисперсии;
  • beta_regularizer — дополнительный регуляризатор для бета-веса;
  • gamma_regularizer — дополнительный регуляризатор для гамма-веса;
  • beta_constraint — необязательное ограничение для бета-веса;
  • gamma_constraint — необязательное ограничение для гамма-веса.

При обращении к слою возможно использование  следующих параметров:

  • inputs — тензор исходных данных, допускается использование тензора любого ранка;
  • training — логический флаг, указывающий на режим работы слоя: обучение или эксплуатация (различие режимов работы указано выше);
  • input_shape — используется для описания размерности исходных данных в случае указания слоя первым в модели.

На выходе слой выдает тензор результатов с сохранением размерности исходных данных.

Кроме того, конструкция слоя позволяет использовать настройку layer.trainable, которая блокирует изменение параметров в процессе обучения. Это не обязательно, и обычно это означает, что слой работает в режиме вывода. Для включения этого режима чаще всего используется параметр training, который может быть передан при вызове слоя. Но нужно понимать, что «Замораживание параметров» и «Режим вывода» — это два разных понятия.

Однако в случае слоя BatchNormalization установка trainable = False означает, что слой будет впоследствии запускаться в режиме логического вывода. Это значит, что он будет использовать скользящее среднее значение и скользящую дисперсию для нормализации текущей партии, вместо среднего значения и дисперсии текущей выборки.

Такое поведение было добавлено в TensorFlow 2.0, чтобы обеспечить при layer.trainable = False наиболее часто ожидаемое поведение в случае тонкой настройки.

Обратите внимание, что установка trainable для модели, содержащей другие слои, рекурсивно установит trainable значение всех внутренних слоев.

Если значение trainable атрибута изменяется после компиляции модели, новое значение не вступает в силу для этой модели до тех пор, пока модель не будет заново перекомпилирована.