Что такое дроп-аут и как он реализуется?
Что проверяют
Понимаете ли вы, что дропаут делает на обучении и на инференсе, и сможете ли написать его сами. Раз вопрос из блока кодинга, после определения обычно просят реализовать слой на NumPy и спрашивают, зачем нужно масштабирование.
Как отвечать
Дропаут это регуляризация: на каждом шаге обучения каждый нейрон слоя обнуляется с вероятностью p. Сеть не может опереться на отдельные нейроны и их сговор, по сути обучается ансамбль прореженных подсетей с общими весами.
Детали реализации, ради которых спрашивают:
- inverted dropout: выжившие активации делят на
1 - p, чтобы математическое ожидание выхода не менялось. Тогда на инференсе слой просто пропускает данные; - режимы: на инференсе дропаут выключен. В PyTorch это
model.eval(), в Keras слой смотрит на флагtraining; - маска: новая на каждом шаге и для каждого элемента батча, в обратном проходе градиент идёт только через выжившие нейроны.
На NumPy это пара строк: mask = (np.random.rand(*x.shape) >= p) / (1 - p), на обучении возвращаем x * mask, в backward умножаем градиент на ту же маску, на инференсе возвращаем x.
Что сказать про практику:
- параметр:
nn.Dropout(p=0.5)в PyTorch иkeras.layers.Dropout(rate=0.5)задают долю обнуляемых нейронов. В TF 1.xtf.nn.dropoutпринималkeep_prob, долю оставляемых, отсюда путаница; - значения: около 0.5 для полносвязных слоёв классических сетей, 0.1 в трансформерах. В свёрточных сетях чаще берут
Dropout2d, который выключает каналы целиком, или обходятся без дропаута; - MC Dropout: если оставить дропаут включённым на инференсе и прогнать пример много раз, разброс ответов даёт оценку неопределённости модели.
Где спотыкаются
Забывают про масштабирование и не могут объяснить, почему без него на инференсе меняется масштаб активаций.
Не вызывают model.eval() перед валидацией, и метрики скачут от запуска к запуску.
Ставят дропаут перед BatchNorm. Нормализация копит статистику на прореженных активациях, а на инференсе получает активации с другой дисперсией, и качество падает. В таких сетях дропаут ставят после последнего слоя нормализации.