Как dropout помогает избежать переобучения в нейросетях
Что проверяют
Понимаете ли вы механику dropout, а не только слова «борется с переобучением». Обычно следом спрашивают, что происходит с dropout на инференсе и почему лосс на трейне с ним бывает выше, чем на валидации.
Как отвечать
На каждом шаге обучения слой обнуляет каждую активацию с вероятностью p. Маска случайная и меняется от батча к батчу, так что сеть каждый раз обучается как немного другая подсеть с общими весами.
Почему это помогает:
- нет коадаптации: нейрон не может рассчитывать, что конкретный сосед всегда исправит его ошибку, поэтому признаки получаются самостоятельнее и устойчивее;
- неявный ансамбль: обучение идёт на огромном числе подсетей, а инференс полной сетью приближённо усредняет их предсказания;
- шум как регуляризатор: модели сложнее запомнить конкретные примеры трейна.
Деталь, которую любят спрашивать. В PyTorch и Keras реализован inverted dropout: оставшиеся активации на обучении умножаются на 1/(1-p), чтобы сохранить матожидание. На инференсе слой ничего не делает, поэтому в PyTorch важно переключать model.train() и model.eval().
Практика: p около 0,5 классически ставят на полносвязные слои, в трансформерах типично 0,1, на входах и свёртках берут меньше. Для свёрточных карт есть Dropout2d, он выключает каналы целиком, потому что соседние пиксели сильно коррелируют. В рекуррентных сетях маску держат одинаковой по шагам времени. Ещё приём: оставить dropout включённым на инференсе и прогнать пример несколько раз (MC dropout), разброс ответов даёт оценку неопределённости.
Где спотыкаются
Забывают model.eval() при валидации и в проде. Предсказания становятся случайными и хуже, а причину ищут в данных.
Утверждают, что dropout ускоряет обучение, раз часть нейронов выключена. Вычисления идут по всей матрице, маска лишь обнуляет результат, а сходимость обычно медленнее, эпох нужно больше.
Путают смысл параметра. В PyTorch и современном Keras p или rate это доля выключаемых нейронов, а в старом TensorFlow 1 был keep_prob, доля оставляемых. И не упоминают, что при большой выборке, сильной аугментации или вместе с BatchNorm dropout часто уменьшают или убирают вовсе.