Layer Normalization
Layer Normalization — это метод нормализации активаций нейронной сети, при котором вычисляются среднее и дисперсия по всем нейронам одного слоя для каждого отдельного обучающего примера, после чего активации нормализуются и масштабируются с помощью обучаемых параметров. В отличие от пакетной нормализации (Batch Normalization), Layer Normalization не зависит от размера батча и одинаково применяется как во время обучения, так и во время инференса, что делает её особенно эффективной для рекуррентных нейронных сетей (RNN) и трансформеров.
История
Метод Layer Normalization был предложен в 2016 году группой исследователей из Стэнфордского университета (Джимми Лей Ба, Джейми Райан Кирос, Джеффри Хинтон) в статье «Layer Normalization». Разработка была мотивирована ограничениями пакетной нормализации, которая требовала достаточно больших батчей для стабильной оценки статистик и плохо работала в рекуррентных архитектурах. Layer Normalization стала альтернативой, не зависящей от размера батча и применимой к последовательностям произвольной длины.
Принцип работы
Математическая основа
Для слоя нейронной сети с $H$ нейронами входной вектор активаций $x \in \mathbb{R}^H$ нормализуется следующим образом:
- Вычисляется среднее значение по слою:
$$\mu = \frac{1}{H} \sum_{i=1}^{H} x_i$$
- Вычисляется дисперсия по слою:
$$\sigma^2 = \frac{1}{H} \sum_{i=1}^{H} (x_i - \mu)^2$$
- Выполняется нормализация:
$$\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}$$
где $\epsilon$ — малая константа (обычно $10^{-5}$), предотвращающая деление на ноль.
- Применяются обучаемые параметры сдвига и масштаба:
$$y_i = \gamma_i \hat{x}_i + \beta_i$$
где $\gamma \in \mathbb{R}^H$ — вектор масштаба, $\beta \in \mathbb{R}^H$ — вектор сдвига. Оба параметра обучаются в процессе обратного распространения ошибки.
Отличия от других методов нормализации
| Характеристика | Layer Normalization | Batch Normalization | Instance 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 ``
Источники
- Ba, J. L., Kiros, J. R., & Hinton, G. E. (2016). Layer Normalization. arXiv:1607.06450.
- Vaswani, A., et al. (2017). Attention is All You Need. NeurIPS.
- Zhang, B., & Sennrich, R. (2019). Root Mean Square Layer Normalization. NeurIPS.
- Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML.
- Wu, Y., & He, K. (2018). Group Normalization. ECCV.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →