В чем разница дропаута и батч-нормализации
Что проверяют
Понимаете ли вы, что это инструменты с разными задачами: dropout борется с переобучением, а батч-нормализация стабилизирует и ускоряет обучение. Следом почти всегда спрашивают, как оба слоя ведут себя на инференсе и можно ли ставить их рядом.
Как отвечать
Разведите механизмы и режимы работы:
- dropout: на обучении обнуляет каждый нейрон с вероятностью
pи масштабирует оставшиеся на1/(1-p)(inverted dropout, так сделано в PyTorch и Keras). На инференсе слой ничего не делает. По сути это обучение ансамбля подсетей с общими весами; - BatchNorm: приводит активации к нулевому среднему и единичной дисперсии по мини-батчу, затем применяет обучаемые
gammaиbeta. На обучении берёт статистики текущего батча и параллельно копитrunning_meanиrunning_var, которые работают на инференсе; - режимы: в PyTorch оба слоя переключаются через
model.train()иmodel.eval(). Забытыйeval()даёт шумные предсказания от dropout и статистики одного батча вместо накопленных; - регуляризация: у BatchNorm она побочная, из-за шума оценок по батчу, а у dropout это основная цель;
- совместное использование: dropout перед BatchNorm создаёт расхождение дисперсии между обучением и инференсом (variance shift), поэтому dropout ставят после блоков с нормализацией или ближе к классификатору.
Добавьте контекст: в трансформерах вместо BatchNorm используют LayerNorm, она не зависит от размера батча и длины последовательности. В ResNet-подобных сетях с BatchNorm dropout часто оставляют только перед последним слоем или убирают совсем.
Где спотыкаются
Говорят, что BatchNorm «нормализует входные данные». Нормализуются активации внутри сети на каждом слое, а обучаемые gamma и beta позволяют частично эту нормализацию отменить.
Не знают, что происходит на инференсе. Фраза «dropout всегда отключает половину нейронов» сразу выдаёт отсутствие практики.
Не учитывают размер батча. На батче из двух-четырёх примеров оценки среднего и дисперсии шумные, BatchNorm работает плохо, и тогда берут GroupNorm или LayerNorm.