BatchNorm vs LayerNorm: как работают, преимущества и недостатки
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
BatchNorm vs LayerNorm: Полное сравнение
Что такое нормализация и зачем она нужна
Нормализация в глубоких нейронных сетях решает фундаментальную проблему — внутреннее сдвиг распределения (Internal Covariate Shift). Это явление, при котором распределение входов к каждому слою меняется во время обучения, что замедляет сходимость и требует тщательной настройки learning rate. Нормализация стабилизирует обучение, позволяя использовать более высокие learning rates и получать модели с лучшей обобщающей способностью.
Как работает BatchNorm
BatchNorm нормализует активации по измерению батча.
import torch.nn as nn
# BatchNorm в PyTorch
bn = nn.BatchNorm2d(num_features=64) # для CNN
# На вход подаётся (N, C, H, W), нормализация по оси N (батч)
# Формула:
# y = gamma * (x - mean_batch) / sqrt(var_batch + eps) + beta
# где mean и var вычисляются по всему батчу
Ключевые характеристики:
- Нормализует по измерению батча (N в формате NCHW)
- Использует running statistics (mean, variance) во время инференса
- Требует батча > 1 для обучения (маленькие батчи → нестабильность)
- Зависит от размера батча — может давать разные результаты при different batch sizes
Как работает LayerNorm
LayerNorm нормализует активации по признакам (features) внутри каждого примера.
import torch.nn as nn
# LayerNorm в PyTorch
ln = nn.LayerNorm(normalized_shape=512) # для трансформеров
# На вход подаётся (..., D), нормализация по последнему измерению
# Формула:
# y = gamma * (x - mean_features) / sqrt(var_features + eps) + beta
# где mean и var вычисляются по всем признакам одного примера
Ключевые характеристики:
- Нормализует по измерению признаков (C в формате NCHW)
- Использует те же statistics для обучения и инференса
- Независим от размера батча
- Детерминированный, воспроизводимый
Практическое сравнение
| Аспект | BatchNorm | LayerNorm |
|---|---|---|
| Нормализует по | Батч (N) | Признаки (C) |
| Зависимость от батча | Да, критична | Нет, независим |
| Инференс | Использует running statistics | Same as train |
| Маленькие батчи | Нестабилен | Стабилен |
| CNN | ✓ Хорошо | △ Редко используется |
| Трансформеры | △ Реже | ✓ Standard |
| RNN/LSTM | × Проблемы | ✓ Хорошо |
| Speed | Быстрее | Немного медленнее |
Преимущества и недостатки
BatchNorm Преимущества:
- Ускоряет обучение за счёт «noisy gradient» эффекта
- Действует как регуляризатор
- Классический выбор для CNN
- Хорошая скорость вычисления
BatchNorm Недостатки:
- Зависит от размера батча (проблема при батче = 1)
- Разные behaviour на train vs test
- Плохо работает с RNN (последовательности разной длины)
- Требует осторожности в распределённом обучении
LayerNorm Преимущества:
- Независим от батча
- Идеален для трансформеров и RNN
- Детерминированный
- Работает с батчем размером 1
LayerNorm Недостатки:
- Не даёт регуляризирующий эффект батча
- Исторически медленнее (хотя сейчас близко)
- Требует тщательной инициализации gamma/beta
Когда что использовать
Используй BatchNorm:
- CNN (ResNet, VGG, EfficientNet)
- Большой батч (32+)
- Есть достаточно данных
Используй LayerNorm:
- Трансформеры (BERT, GPT, Vision Transformer)
- RNN/LSTM/GRU
- Маленький батч или переменная длина
- Online learning
Гибридные подходы
# GroupNorm - компромисс между BatchNorm и LayerNorm
import torch.nn as nn
gn = nn.GroupNorm(num_groups=32, num_channels=64)
# Делит каналы на группы и нормализует в каждой группе
GroupNorm использует идею BatchNorm, но нормализует по группам каналов, а не по всему батчу. Это решает проблему маленьких батчей, сохраняя идею группировки.
Заключение
Выбор между BatchNorm и LayerNorm — это выбор между статистикой батча (эффективнее, но зависит от данных) и статистикой признаков (стабильнее, но менее выразительно). В современных архитектурах LayerNorm становится более универсальным благодаря развитию трансформеров, но BatchNorm остаётся стандартом для CNN.