Как рассчитывается Layer Normalization?

«Как рассчитывается Layer Normalization?» — вопрос из категории Нейронные сети и Deep Learning, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Layer Normalization (LN) стандартизирует активации по измерениям признаков (features) для каждого отдельного примера в батче, в отличие от BatchNorm, который нормализует по батчу для каждого признака.

Формула расчета для входного тензора (x):

[ text{LN}(x) = gamma cdot frac{x - mu}{sqrt{sigma^2 + epsilon}} + beta ]

Где:

  • (mu) — среднее значение по последней оси (признакам).
  • (sigma^2) — дисперсия по последней оси.
  • (gamma) и (beta) — обучаемые параметры масштаба и сдвига.
  • (epsilon) — малая константа для численной стабильности.

Практическая реализация на PyTorch:

import torch
import torch.nn as nn

# Пример с размерностью [batch_size, sequence_length, hidden_size]
batch_size, seq_len, d_model = 32, 10, 512
x = torch.randn(batch_size, seq_len, d_model)

# Инициализация слоя
layer_norm = nn.LayerNorm(d_model, eps=1e-5)

# Прямой проход
output = layer_norm(x)
print(f'Input shape: {x.shape}')
print(f'Output shape: {output.shape}')
print(f'Gamma shape: {layer_norm.weight.shape}')  # [d_model]
print(f'Beta shape: {layer_norm.bias.shape}')     # [d_model]

Ключевые свойства:

  • Независимость от размера батча: Работает корректно даже при batch_size=1, что критично для RNN и инференса.
  • Стабильность обучения: Сглаживает градиенты, особенно в глубоких сетях и трансформерах.
  • Инвариантность к сдвигу и масштабу: Параметры gamma и beta позволяют модели восстановить оптимальное представление.