Слои нормализации: LayerNormalization, BatchNormalization

Нормализация слоёв в нейронных сетях является важным инструментом для ускорения обучения и стабилизации процесса оптимизации. В Keras.js, JavaScript-версии Keras, реализованы ключевые подходы к нормализации: BatchNormalization и LayerNormalization, каждый из которых имеет свои особенности и применимость в зависимости от архитектуры сети и характера данных.


BatchNormalization

BatchNormalization (BN) применяется для нормализации входов каждого слоя по мини-батчу. Основная идея заключается в том, чтобы смещать и масштабировать активации слоя так, чтобы они имели нулевое среднее и единичную дисперсию в рамках одного батча.

Основные свойства BN:

  • Стабилизация градиентов: уменьшает внутреннее смещение распределений (internal covariate shift), делая обучение более предсказуемым.
  • Ускорение обучения: позволяет использовать более высокие значения learning rate без риска расходимости.
  • Регуляризация: за счёт вариации в статистике мини-батчей BN оказывает слабый регуляризующий эффект, снижая переобучение.

Параметры в Keras.js:

  • axis: определяет ось, вдоль которой производится нормализация. Для плотных слоёв обычно axis=-1, для сверточных — ось каналов.
  • momentum: коэффициент для скользящей средней вычисленных статистик при обучении. Стандартное значение 0.99.
  • epsilon: маленькое число для предотвращения деления на ноль при вычислении стандартного отклонения.
  • center и scale: флаги для добавления обучаемого сдвига (β) и масштаба (γ).

Пример применения BN в Keras.js:

const model = new KerasJS.Model({
  layers: [
    { class_name: 'Dense', config: { units: 128, activation: 'relu' } },
    { class_name: 'BatchNormalization', config: { axis: -1, momentum: 0.99, epsilon: 1e-3 } },
    { class_name: 'Dense', config: { units: 10, activation: 'softmax' } }
  ]
});

Особенности использования:

  • BN эффективен для больших батчей, так как статистики мини-батчей становятся более стабильными.
  • При маленьких батчах (<32) может давать нестабильные результаты; в таких случаях рассматривают LayerNormalization или GroupNormalization.
  • BN обычно применяется до функции активации, хотя в некоторых архитектурах встречается после.

LayerNormalization

LayerNormalization (LN) нормализует входные значения слоя по всем нейронам одного примера, а не по батчу. Это делает LN особенно полезным для рекуррентных сетей и ситуаций, когда размер батча мал или варьируется.

Основные характеристики LN:

  • Независимость от батча: LN вычисляет статистики отдельно для каждого образца, что исключает зависимость от размера батча.
  • Стабильное обучение в RNN и Transformer: рекуррентные и трансформерные архитектуры выигрывают от LN, так как последовательности разной длины нормализуются корректно.
  • Обучаемые параметры: LN также поддерживает γ и β для масштабирования и сдвига.

Параметры в Keras.js:

  • axis: ось или оси, по которым производится нормализация. Обычно axis=-1 для плотных слоёв.
  • epsilon: предотвращает деление на ноль.
  • center и scale: добавление обучаемых параметров β и γ.

Пример применения LN в Keras.js:

const model = new KerasJS.Model({
  layers: [
    { class_name: 'Dense', config: { units: 128, activation: 'relu' } },
    { class_name: 'LayerNormalization', config: { axis: -1, epsilon: 1e-5 } },
    { class_name: 'Dense', config: { units: 10, activation: 'softmax' } }
  ]
});

Особенности использования:

  • LN подходит для небольших батчей и онлайн-обучения.
  • Для сверточных сетей иногда используют модифицированную версию LN с нормализацией по каналам.
  • LN не даёт такой сильной регуляризации, как BN, но обеспечивает стабильность градиентов при глубоком обучении.

Сравнение BatchNormalization и LayerNormalization

Параметр BatchNormalization LayerNormalization
Нормализация по Батчу Примеру
Зависимость от размера батча Да Нет
Тип архитектуры CNN, плотные сети RNN, Transformer, малые батчи
Регуляризация Слабая Нет
Стабильность на малых батчах Низкая Высокая

Выводы по применению:

  • BN лучше подходит для сверточных и плотных сетей с большими батчами.
  • LN оптимален для рекуррентных моделей, трансформеров и при малых батчах.
  • Для гибридных архитектур возможно сочетание обоих подходов: BN в сверточных блоках и LN в рекуррентных/трансформерных блоках.

Практические рекомендации

  • Всегда учитывать ось нормализации в axis, так как неверная ось приведёт к ошибкам в вычислении статистик.
  • Настраивать epsilon для предотвращения численных нестабильностей, особенно при глубоком обучении.
  • При использовании LN в глубоких сетях с ReLU может потребоваться небольшая настройка learning rate, так как LN влияет на масштаб градиентов иначе, чем BN.
  • Для динамических батчей или последовательностей переменной длины LN предпочтительнее.

Эти слои нормализации позволяют существенно улучшить стабильность и скорость обучения нейронных сетей в Keras.js, обеспечивая гибкость при работе с различными архитектурами и размерами батчей.