Какую проблему решает батч-нормализация
Что проверяют
Знаете ли вы, что именно делает слой BatchNorm при обучении и при инференсе, и отличаете ли исходную гипотезу авторов от того, что известно сейчас. Следом спрашивают, почему в трансформерах используют LayerNorm, а не BatchNorm.
Как отвечать
Задача: сделать обучение глубокой сети стабильнее и быстрее. Механика:
- нормализация по батчу: для каждого канала считаются среднее и дисперсия по мини-батчу, активации приводятся к нулевому среднему и единичной дисперсии,
epsзащищает от деления на ноль; - обучаемые параметры: затем применяются масштаб
gammaи сдвигbeta, так что сеть может восстановить нужное распределение, если нормализация мешает; - два режима: при обучении берутся статистики текущего батча, а параллельно копятся скользящие средние
running_meanиrunning_var. На инференсе послеmodel.eval()работают именно они. В PyTorch по умолчаниюmomentum=0.1иeps=1e-5.
Что это даёт на практике: можно брать больший learning rate, сеть меньше зависит от инициализации весов, появляется слабый регуляризующий эффект из-за шума статистик батча.
Про причину говорите аккуратно. Авторы в 2015 году объясняли эффект снижением internal covariate shift, но более поздние работы показали, что BatchNorm этот сдвиг заметно не уменьшает, а главный вклад, по-видимому, в сглаживании ландшафта функции потерь. Упомянуть обе версии сильнее, чем пересказать одну как факт.
Ограничения: на маленьких батчах статистики шумные, в рекуррентных сетях и трансформерах нормализация по батчу неудобна. Там берут LayerNorm или RMSNorm, в детекции с малым батчем GroupNorm. Bias у свёртки перед BatchNorm лишний, его отключают через bias=False.
Где спотыкаются
Забывают перевести модель в eval() перед валидацией. Метрики скачут и зависят от состава батча.
Выдают internal covariate shift за доказанную причину эффекта.
Ставят BatchNorm при батче из одного-двух объектов, например при дообучении большой модели на слабой карте, и удивляются нестабильности.