Сохраняется ли вероятность дропаута при конвертации модели в ONNX
Что проверяют
Понимаете ли вы разницу режимов обучения и вывода и что вообще попадает в экспортированный граф. Вопрос про дропаут здесь только повод: смотрят, знаете ли вы, почему на инференсе этот слой ничего не делает.
Как отвечать
При обычном экспорте вопрос снимается сам собой: дропаут в режиме вывода это тождественная функция. Используется inverted dropout, то есть активации делятся на 1 - p во время обучения, поэтому на инференсе ничего домножать не нужно. Экспорт выполняется из модели в режиме eval, и слой либо вырезается оптимизацией графа, либо остаётся узлом Dropout, у которого training_mode выставлен в false, а значение ratio при этом просто не влияет на результат. Так что «вероятность не сохранилась» это не потеря, а корректное поведение.
Когда это важно на практике. Если модель экспортировали в режиме обучения, на инференсе вы получите случайные выходы и невоспроизводимые предсказания. Проверяется просто: прогнать один и тот же вход дважды и сравнить результаты, а затем сверить выходы исходной модели и рантайма по максимуму абсолютного расхождения. Отдельный случай это MC Dropout, где дропаут нужен активным для оценки неопределённости, и тогда его сохранение делается сознательно и проверяется отдельно.
Где спотыкаются
Забывают перевести модель в eval перед экспортом и думают, что рискуют только дропаутом. Гораздо опаснее нормализация по батчу: в режиме обучения она считает статистики по текущему батчу, и на одиночном примере выход уезжает заметно сильнее.
Считают, что после конвертации выход надо домножить на вероятность сохранения нейрона. Не надо: масштабирование уже сделано на этапе обучения, и такая поправка испортит корректную модель.
Не сравнивают выходы до и после конвертации, а когда расхождение находится, списывают его на дропаут. Причина почти всегда другая: неподходящая версия opset, неверно объявленные динамические оси, другой препроцессинг или перевод весов в половинную точность.