, LayerNorm, RMSNorm: стабилизация распределения активаций, без которой глубокие сети почти не обучаются.
Ключевые тезисы
- зависит от и плохо работает при батче 1–2 и в рекуррентных сетях.
- нормирует по признакам одного объекта — стандарт .
- RMSNorm убирает вычитание среднего и работает быстрее при том же качестве.
Какую задачу решает
В глубокой сети распределение входов каждого слоя постоянно уезжает: обновились веса ниже — изменилось всё выше. Слой вынужден гоняться за движущейся целью, и чем глубже сеть, тем хуже. фиксирует масштаб активаций, приводя их к нулевому среднему и единичной , а затем возвращая сети свободу двумя обучаемыми параметрами.
Практический эффект оказался куда шире исходной мотивации: делает поверхность потерь глаже, позволяет брать в разы больше, снижает чувствительность к инициализации и частично заменяет . Без неё современные глубокие сети попросту не обучаются.
Модель на валидации внезапно даёт мусор, хотя на обучении всё отлично. Причина: забыли model.eval(), и нормализует по статистикам текущего . При батче из одного объекта равна нулю, нормализованная — тоже, и предсказание превращается в константу. То же случается, если батч валидации отсортирован по классу: статистики уезжают, и метрика падает без всякой связи с качеством модели.
Подробный разбор
| Слой | Статистика по | Где применяется |
|---|---|---|
| батчу для каждого канала | ||
| признакам одного объекта | , | |
| GroupNorm | группе каналов | малые батчи в CV |
| RMSNorm | без вычитания среднего | современные |
ведёт себя по-разному на обучении и (там используются накопленные статистики) — это источник классических багов при экспорте модели.
Изначальное объяснение через internal covariate shift оказалось неполным. Сегодня основной эффект связывают со сглаживанием ландшафта потерь: делает поверхность более предсказуемой, что позволяет брать больший .
- Позволяет обучать глубокие сети без тщательной настройки инициализации.
- даёт побочный регуляризующий эффект за счёт шума .
- Pre-norm ( до подслоя) в устойчивее post-norm при большой глубине.
| Слой | train() | eval() |
|---|---|---|
| статистики текущего , обновление running mean/var | накопленные running-статистики, обновления нет | |
| часть активаций зануляется | отключён полностью | |
| , GroupNorm | поведение одинаковое | поведение одинаковое |
model.eval() # BN → running stats, Dropout → off
with torch.inference_mode(): # не строить граф и не хранить активации
logits = model(x)
...
model.train() # вернуть режим обучения перед следующей эпохойКлассические симптомы забытого eval(): метрики на валидации скачут от запуска к запуску, а предсказание для одного и того же объекта зависит от того, с кем он попал в . При батче размера 1 в train-режиме и вовсе вырождается.
Где применяется
- после и до — стандартная связка ResNet и всего, что из него выросло.
- перед и feed-forward (pre-norm). Без этого глубокие модели требуют тонкой настройки разогрева.
- Маленькие батчи и с батчем 2–4: ломается на шумных статистиках, берут GroupNorm.
- по времени неприменим, LayerNorm работает на каждом шаге независимо.
Плюсы, минусы и альтернативы
Плюсы
- Позволяет поднять в разы и сократить время сходимости.
- Снимает чувствительность к инициализации весов.
- Даёт лёгкий регуляризующий эффект за счёт шума (у ).
- Делает возможным обучение сетей глубиной в сотни слоёв.
Минусы
- зависит от : на маленьких батчах статистики шумны и качество падает.
- Разное поведение в режимах обучения и — источник классических багов (
model.eval()забыли). - Добавляет вычисления и синхронизацию между устройствами при распределённом обучении.
- Взаимодействует с неочевидным образом: масштаб весов перед теряет смысл.
Брать, если
- Практически всегда в глубокой сети — вопрос только в том, какой вариант.
- и большой — ; и переменная длина — LayerNorm; маленький батч — GroupNorm.
Не брать, если
- меньше 8 и вы всё же ставите — почти гарантированная деградация.
- Модель очень мелкая (два-три слоя): выигрыша не будет, а поведение усложнится.
Чем заменяют
Видеолекции
Записи университетских курсов, где эта тема звучит. Где у записи есть тайм-коды, ссылка открывает её с нужной секунды; где их не проставили — с начала.
Связанные темы
Стабильность обучения нейросетей
Gradient Clipping85%
Обрезка градиента · Оптимизация обученияОграничение нормы градиента перед шагом оптимизатора — простейшая защита от расходимости обучения.
Mixed Precision85%
Смешанная точность · Оптимизация обученияОбучение в fp16 или bf16 при накоплении в fp32: двукратная экономия памяти и заметное ускорение.
Backpropagation85%
Обратное распространение ошибки · Глубокое обучениеЭффективное вычисление градиентов по всем параметрам сети за один обратный проход с помощью правила цепочки.
Learning Rate Scheduling85%
Расписание скорости обучения · Оптимизация обученияИзменение шага по ходу обучения: большой в начале для исследования, малый в конце для точной настройки.
Numerical Methods85%
Численные методы · ОсновыКомпьютер считает приближённо. Понимание точности float, устойчивости и обусловленности спасает от NaN и «необъяснимых» расхождений.
Всё, что названо в описании, разобрано здесь же или в соседней теме — переходы под каждым определением.
BatchNorm
Нормализует по батчу для каждого канала. Даёт лучший результат на свёрточных сетях, но требует большого .
Разбор ниже: Чем отличаютсяLayerNorm
Нормализует по признакам внутри одного объекта. От не зависит — стандарт для и .
Разбор ниже: Чем отличаютсяОбучаемые и
Возвращают сети возможность выбрать нужный масштаб и сдвиг: не отнимает выразительность.
Разбор ниже: Почему это помогаетСкользящие статистики
на использует накопленные средние, а не статистики , — отсюда разное поведение в train и eval.
Разбор ниже: Чем отличаютсяRMSNorm
без вычитания среднего: дешевле и в больших языковых моделях работает не хуже.
Разбор ниже: Чем отличаютсяТема встречается в тесте по направлениям — ошибки приведут обратно на эту страницу.
Глава «Глубокое обучение» последний раз правилась . Нашли ошибку — напишите.