Открыть сервис

Layer Normalization

Layer Normalization — это метод нормализации активаций нейронной сети, при котором вычисляются среднее и дисперсия по всем нейронам одного слоя для каждого отдельного обучающего примера, после чего активации нормализуются и масштабируются с помощью обучаемых параметров. В отличие от пакетной нормализации (Batch Normalization), Layer Normalization не зависит от размера батча и одинаково применяется как во время обучения, так и во время инференса, что делает её особенно эффективной для рекуррентных нейронных сетей (RNN) и трансформеров.

История

Метод Layer Normalization был предложен в 2016 году группой исследователей из Стэнфордского университета (Джимми Лей Ба, Джейми Райан Кирос, Джеффри Хинтон) в статье «Layer Normalization». Разработка была мотивирована ограничениями пакетной нормализации, которая требовала достаточно больших батчей для стабильной оценки статистик и плохо работала в рекуррентных архитектурах. Layer Normalization стала альтернативой, не зависящей от размера батча и применимой к последовательностям произвольной длины.

Принцип работы

Математическая основа

Для слоя нейронной сети с $H$ нейронами входной вектор активаций $x \in \mathbb{R}^H$ нормализуется следующим образом:

  1. Вычисляется среднее значение по слою:

$$\mu = \frac{1}{H} \sum_{i=1}^{H} x_i$$

  1. Вычисляется дисперсия по слою:

$$\sigma^2 = \frac{1}{H} \sum_{i=1}^{H} (x_i - \mu)^2$$

  1. Выполняется нормализация:

$$\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}$$

где $\epsilon$ — малая константа (обычно $10^{-5}$), предотвращающая деление на ноль.

  1. Применяются обучаемые параметры сдвига и масштаба:

$$y_i = \gamma_i \hat{x}_i + \beta_i$$

где $\gamma \in \mathbb{R}^H$ — вектор масштаба, $\beta \in \mathbb{R}^H$ — вектор сдвига. Оба параметра обучаются в процессе обратного распространения ошибки.

Отличия от других методов нормализации

ХарактеристикаLayer NormalizationBatch NormalizationInstance Normalization
Ось нормализацииПо нейронам слоя (для каждого примера)По батчу (для каждого нейрона)По пространственным измерениям (для каждого примера и канала)
Зависимость от батчаНетДаНет
Применимость к RNNДаПлохаяНет
Параметры$\gamma, \beta$ (обучаемые)$\gamma, \beta$ (обучаемые)$\gamma, \beta$ (обучаемые)
Вычислительная сложность$O(H)$ на пример$O(H)$ на батч$O(H \cdot W \cdot C)$ на пример

Применение

Рекуррентные нейронные сети

Layer Normalization особенно эффективна в RNN, где пакетная нормализация проблематична из-за рекуррентной природы вычислений. В LSTM и GRU нормализация применяется к скрытым состояниям или к входам вентилей, что стабилизирует обучение на длинных последовательностях. Исследования показывают, что Layer Normalization сокращает время сходимости в 2–3 раза для задач языкового моделирования.

Трансформеры

В архитектуре трансформеров Layer Normalisation является стандартным компонентом:

  • Pre-LN (нормализация перед подуровнями внимания и FFN) — более стабильная версия, используемая в GPT-2, GPT-3, BERT (в некоторых реализациях).
  • Post-LN (нормализация после подуровней) — оригинальная версия из статьи «Attention is All You Need», но менее стабильная при глубоких сетях.

В современных моделях (LLaMA, GPT-4, Mistral) применяется RMS Layer Normalization — упрощённая версия, где нормализация выполняется только по среднеквадратичному отклонению (без вычитания среднего), что снижает вычислительные затраты.

Свёрточные нейронные сети

Хотя Layer Normalization реже используется в CNN, она может быть полезна в задачах, где размер батча мал (например, медицинская визуализация с батчами 1–4). В таких случаях она заменяет Batch Normalization, которая при малых батчах даёт неточные оценки статистик.

Преимущества и недостатки

Преимущества

  • Независимость от размера батча — применима при обучении с батчем размера 1 (например, в онлайн-обучении или при работе с очень большими изображениями).
  • Единая обработка обучения и инференса — не требует накопления скользящих статистик, как Batch Normalization.
  • Эффективность для последовательностей — хорошо работает с RNN и трансформерами, где длина последовательности может варьироваться.
  • Стабильность градиентов — предотвращает взрыв/затухание градиентов в глубоких сетях.

Недостатки

  • Вычислительная сложность — требует вычисления статистик для каждого примера отдельно, что может быть затратно при большом числе нейронов в слое.
  • Меньшая эффективность в CNN — в свёрточных сетях Layer Normalization уступает Batch Normalization по скорости сходимости при больших батчах.
  • Чувствительность к масштабу — при очень малых значениях дисперсии нормализация может приводить к нестабильности (решается выбором $\epsilon$).

Варианты и модификации

RMS Layer Normalization

Предложена в 2019 году (Zhang, Sennrich). Вместо полной нормализации используется только среднеквадратичное отклонение: $$\hat{x}_i = \frac{x_i}{\sqrt{\frac{1}{H} \sum_{j=1}^{H} x_j^2 + \epsilon}}$$ Это упрощение снижает вычислительные затраты на 10–15% без потери качества в большинстве задач.

Layer Normalization с адаптивным масштабом

В некоторых реализациях (например, в моделях семейства T5) $\gamma$ и $\beta$ могут быть функциями от входных данных, что позволяет адаптировать нормализацию под конкретный пример.

Conditional Layer Normalization

Используется в моделях с условной генерацией (например, в диффузионных моделях), где параметры $\gamma$ и $\beta$ зависят от дополнительного контекста (временного шага, класса).

Сравнение с другими методами

Batch Normalization (BN)

  • BN: нормализует по батчу, требует накопления статистик, плохо работает с RNN и малыми батчами.
  • LN: нормализует по слою, не зависит от батча, универсальна для RNN и трансформеров.

Instance Normalization (IN)

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

Group Normalization (GN)

  • GN: компромисс между LN и BN — делит каналы на группы и нормализует внутри каждой группы.
  • LN: частный случай GN с одной группой (все каналы).

Реализация в популярных фреймворках

PyTorch

```python import torch.nn as nn layer_norm = nn.LayerNorm(normalized_shape=[hidden_size])

normalized_shape может быть int или tuple

```

TensorFlow/Keras

``python import tensorflow as tf layer_norm = tf.keras.layers.LayerNormalization(axis=-1) ``

JAX/Flax

``python import flax.linen as nn class MyModel(nn.Module): @nn.compact def __call__(self, x): x = nn.LayerNorm()(x) return x ``

Источники

  1. Ba, J. L., Kiros, J. R., & Hinton, G. E. (2016). Layer Normalization. arXiv:1607.06450.
  2. Vaswani, A., et al. (2017). Attention is All You Need. NeurIPS.
  3. Zhang, B., & Sennrich, R. (2019). Root Mean Square Layer Normalization. NeurIPS.
  4. Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML.
  5. Wu, Y., & He, K. (2018). Group Normalization. ECCV.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →