Как масштабируют активации при отключении дроп-аута на инференсе
Что проверяют
Понимаете ли вы, зачем вообще масштабировать активации и в какой момент это делается в современных фреймворках. Хороший ответ различает классический и инвертированный дроп-аут, а следом обычно спрашивают, что будет, если забыть model.eval().
Как отвечать
Суть в матожидании. На обучении каждый нейрон зануляется с вероятностью p и выживает с вероятностью 1 - p, поэтому следующий слой привыкает ко входу со средним (1 - p) * a. На инференсе работают все нейроны, и без поправки вход вырос бы в 1 / (1 - p) раз. Поправить можно в одном из двух мест:
- классический вариант: на обучении маска без масштабирования, на инференсе выходы (или веса слоя) умножаются на
1 - p. Так было описано в исходной статье; - инвертированный дроп-аут: выжившие активации делятся на
1 - pпрямо на обучении,a * mask / (1 - p), а на инференсе слой ничего не делает. Матожидание сохраняется, потому чтоE[mask] = 1 - p.
Инвертированный вариант реализован в torch.nn.Dropout и в keras.layers.Dropout: в режиме обучения выходы умножаются на 1 / (1 - p), а на инференсе (model.eval() в PyTorch, training=False в Keras) слой просто пропускает вход. Выгода практическая: код инференса не зависит от p, и модель экспортируется без поправок.
Если попросят написать руками, на NumPy это маска np.random.rand(*a.shape) >= p, затем a * mask / (1 - p) в режиме обучения и просто a на инференсе.
Хорошее дополнение: Monte Carlo dropout, когда дроп-аут намеренно оставляют включённым на инференсе и усредняют несколько проходов, чтобы оценить неопределённость предсказания.
Где спотыкаются
Умножают выходы на 1 - p поверх PyTorch или Keras. Масштабирование уже сделано на обучении, и ручная поправка занижает активации второй раз.
Путают смысл параметра. В PyTorch p и в Keras rate означают вероятность выключить нейрон, а в первом TensorFlow был keep_prob, вероятность оставить. Отсюда формулы с перевёрнутым коэффициентом.
Забывают model.eval() перед валидацией. Дроп-аут продолжает работать, предсказания становятся случайными, метрики скачут от прогона к прогону, а BatchNorm вдобавок продолжает обновлять свои статистики.