Оптимизация
Нормализация как предобусловливание
BatchNorm, LayerNorm, RMSNorm — одна арифметика, разные оси, и зачем это оптимизации
Одна арифметика, разные оси
Все нормализующие слои делают одно и то же:
Различаются они только тем, по каким осям берутся и . Записанные формулами, они выглядят почти одинаково и потому не запоминаются; нарисованные как разбиение решётки — различаются сразу.
Переключите на RMSNorm и посмотрите на цифры внимательно: среднеквадратичное по строке равно единице, а среднее — нет (около на этих данных). Это и есть вся разница между LayerNorm и RMSNorm, и именно поэтому RMSNorm дешевле: не нужно считать среднее и не нужно протаскивать его через обратный проход.
Почему это относится к оптимизации
Название урока — не метафора. Нормализация меняет обусловленность задачи, и это её главный эффект.
Простейший случай — стандартизация входов из урока 050. Признаки с масштабами и дают ; после нормировки падает до десятков. Нормализующие слои делают то же самое, но внутри сети, где вручную не достать: активации середины сети никто не стандартизует заранее, а их масштабы разъезжаются по ходу обучения.
Три конкретных механизма:
- выравнивание масштабов активаций → выравнивание кривизны по параметрам → меньшее ;
- сглаживание ландшафта. Работа Santurkar и др. измерила это прямо: с BatchNorm ландшафт лосса вдоль направления шага заметно менее «изломан», то есть эффективная меньше и допустимый шаг больше;
- инвариантность к масштабу весов. Умножьте веса слоя перед нормировкой на — выход не изменится вовсе, потому что нормировка поделит на то же . Значит, направление весов важно, а их длина — нет.
Третий пункт имеет неожиданное следствие. Раз масштаб весов не влияет на выход, а weight decay всё равно уменьшает норму, то decay в нормализованной сети работает не как регуляризатор в обычном смысле: он управляет эффективным learning rate. Норма весов уменьшается → градиент относительно нормы растёт → эффективный шаг растёт. Это одна из причин, по которой weight decay и learning rate в таких сетях не независимы.
Historical note: не covariate shift
Изначальное объяснение BatchNorm — «уменьшает internal covariate shift» — не подтвердилось. Santurkar и др. показали это экспериментом: если после BatchNorm специально добавить шум, восстановив сдвиг распределений, обучение всё равно остаётся быстрым. Значит, дело не в сдвиге.
Стоит держать это в голове как пример: приём работает, а объяснение, с которым он был предложен, оказалось неверным. Работающая практика — не доказательство теории, стоящей за ней.
Что выбирают и почему
| слой | усреднение по | зависит от батча | где применяют |
|---|---|---|---|
| BatchNorm | оси batch | да | свёрточные сети, большие батчи |
| LayerNorm | признакам | нет | трансформеры |
| RMSNorm | признакам, без центрирования | нет | современные LLM |
| GroupNorm | группе признаков | нет | детекция, малые батчи |
Столбец «зависит от батча» — решающий. BatchNorm вносит связь между примерами: результат для одного зависит от того, кто ещё попал в батч. Отсюда все его практические сложности:
- на инференсе батча нет, приходится хранить running statistics — и режимы обучения и
вывода становятся разными, что регулярно даёт баги (забытый
model.eval()); - при малом батче оценки и шумны, и качество падает;
- в рекуррентных сетях и при переменной длине последовательности осмысленной оси batch просто нет.
LayerNorm ничего этого не имеет, потому что считает статистику внутри одного примера. Именно поэтому трансформеры используют его, а не BatchNorm, — и это выбор про воспроизводимость и независимость примеров, а не про качество нормировки.
Pre-norm против post-norm
Последняя деталь, важная для глубоких сетей. Нормировку можно поставить до блока или после:
У pre-norm остаётся чистый residual-путь от входа к выходу, по которому градиент проходит без прохода через нормировку. Это делает глубокие стеки обучаемыми без warmup и с меньшей аккуратностью в подборе шага. Post-norm даёт немного лучшее качество при удачной настройке, но заметно капризнее на большой глубине — поэтому современные модели почти все pre-norm.
Источники
- Santurkar и др. — How Does Batch Normalization Help Optimization? — Дело не в internal covariate shift, а в сглаживании ландшафта
- Zhang, Sennrich — Root Mean Square Layer Normalization — RMSNorm и что даёт отказ от центрирования
Проверки
0 из 2По какой оси и зачем
Отметьте все верные утверждения о нормализующих слоях.
LayerNorm против RMSNorm
Реализуйте
normalise_row(values, centre)— нормировку одной строки признаков. Верните[mean_out, rms_out, first, last]:- если
centreравно1, это LayerNorm: вычтите среднее и поделите на , где — дисперсия с делителем ; - если
centreравно0, это RMSNorm: поделите на , не вычитая среднее; - ;
mean_out,rms_out— среднее и среднеквадратичное результата;first,last— первый и последний нормированные элементы.
Проверки, которые обязаны выполняться: у LayerNorm
mean_outравно нулю, аrms_out— единице; у RMSNorm единице равно толькоrms_out.Загрузка редактора…
Ctrl/⌘ + Enter- если