Глубокие сети стали обучаемыми благодаря трём вещам: правильной инициализации, нормализации и residual-связям. На собесе спрашивают, зачем они нужны, чем BatchNorm отличается от LayerNorm и где ломается BatchNorm.
Затухание и взрыв
Градиент ранних слоёв это произведение множителей по всем слоям выше. Если типичный множитель меньше 1, градиент экспоненциально затухает, если больше 1, взрывается до NaN.
Инициализация
Цель: сохранить дисперсию активаций и градиентов от слоя к слою.
- Xavier (Glorot): Var(w) = 2 / (fan_in + fan_out), для tanh и сигмоиды.
- He (Kaiming): Var(w) = 2 / fan_in, для ReLU: она обнуляет половину сигнала, поэтому дисперсию удваивают.
Одинаковые веса (в том числе нули) не разрушают симметрию нейронов. Смещения обычно инициализируют нулями.
BatchNorm
На обучении для каждого канала:
x̂ = (x - μ_батча) / √(σ²_батча + ε)
y = γ·x̂ + β
Параллельно копятся скользящие μ и σ². На инференсе (model.eval()) используются они.
Плюсы: быстрее и стабильнее обучение, можно брать больший learning rate. Ловушки:
- забыли model.eval(): предсказание объекта зависит от соседей по батчу;
- батч из 2-4 объектов: шумные статистики, лучше GroupNorm или SyncBatchNorm;
- последовательности разной длины и генерация по одному токену: неудобно.
LayerNorm и RMSNorm
LayerNorm нормирует признаки каждого объекта отдельно, не завися от батча, и одинаково ведёт себя на обучении и инференсе. Поэтому это стандарт трансформеров и RNN.
RMSNorm делит на корень из среднего квадрата без вычитания среднего и без β. Дешевле и не хуже, используется во многих LLM.
Residual-связи
y = x + F(x)
Градиент проходит по тождественной ветке без затухания (dy/dx = I + dF/dx), а блоку достаточно выучить поправку. До ResNet более глубокие простые сети учились хуже даже на трейне.
Pre-LN и Post-LN
В исходном трансформере нормализация после residual-суммы (Post-LN): глубокие модели капризны и требуют аккуратного warmup. В Pre-LN нормализация стоит внутри ветки, x + F(LN(x)), residual-поток чистый, обучение стабильнее. Большинство современных LLM используют pre-norm.
Gradient clipping
Если общая норма градиентов больше порога, все градиенты масштабируются вниз. Защищает от взрыва, особенно в RNN и трансформерах. Вызывается после backward и до step.
Частые ошибки
- Валидация без model.eval() у модели с BatchNorm.
- BatchNorm при крошечном батче.
- Инициализация Xavier для глубокой сети на ReLU без нормализации.
- Клиппинг до backward или после step.
Что спросят на собесе
- Почему градиенты затухают и взрываются, как с этим борются.
- Xavier против He.
- Как работает BatchNorm на обучении и инференсе, чем LayerNorm лучше для трансформеров.
- Зачем residual-связи, что такое Pre-LN.