Ответ
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позволяют модели восстановить оптимальное представление.