Какие слои работают по-разному во время обучения и инференса
Что проверяют
Понимаете ли вы, что модель в PyTorch или Keras работает в двух режимах, и знаете ли, какие слои от него зависят. Следом почти всегда спрашивают, что будет, если забыть переключить модель в режим инференса перед валидацией.
Как отвечать
Назовите слои и сразу опишите разницу в поведении:
- Dropout: на обучении обнуляет активации с вероятностью
p. Во всех современных фреймворках это inverted dropout: оставшиеся значения умножаются на1/(1-p)ещё во время обучения, поэтому на инференсе слой просто пропускает вход без изменений; - BatchNorm: на обучении нормализует по среднему и дисперсии текущего батча и обновляет скользящие
running_meanиrunning_var(в PyTorch сmomentum=0.1). На инференсе берёт только накопленные статистики, и ответ перестаёт зависеть от соседей по батчу; - стохастические слои: DropPath (stochastic depth) в трансформерах и ConvNeXt,
GaussianNoiseи слои аугментации Keras вродеRandomFlipработают только при обучении; - LayerNorm и GroupNorm: статистики считаются по самому примеру, поэтому поведение в обоих режимах одинаковое. Это одна из причин, почему в трансформерах берут LayerNorm.
Покажите, как режим переключается: model.train() и model.eval() в PyTorch, аргумент training при вызове слоя в Keras. Проговорите, что torch.no_grad() и torch.inference_mode() отключают градиенты, но режим слоёв не меняют. Сильный плюс: упомянуть MC Dropout, когда dropout намеренно оставляют включённым на инференсе для оценки неопределённости, и дообучение с замороженной BatchNorm.
Где спотыкаются
Говорят, что dropout на инференсе масштабирует выходы. Так было в исходной статье, но фреймворки давно масштабируют на обучении, и на инференсе слой ничего не делает.
Считают, что torch.no_grad() уже переводит модель в режим оценки. В итоге метрики на валидации прыгают от запуска к запуску, а статистики BatchNorm незаметно подстраиваются под валидационные данные.
Не знают про слабость BatchNorm на маленьком батче. BatchNorm1d в режиме обучения на батче из одного примера падает с ошибкой, а на батче из нескольких примеров статистики шумные, и лучше взять GroupNorm или заморозить слой.