У меня есть вопрос о реализации Dropout в Keras / Tensorflow с оптимизацией мини-пакетного градиентного спуска, когда параметр batch_size
больше единицы. Оригинальный документ гласит:
Единственное отличие состоит в том, что для каждого учебного случая в мини-партии мы отбираем разбавленную сеть, отбрасывая единицы. Прямое и обратное распространение для этого учебного случая выполняется только в этой прореженной сети. Градиенты для каждого параметра усредняются по тренировочным кейсам в каждой мини-партии. Любой обучающий случай, в котором не используется параметр, вносит нулевой градиент для этого параметра.
Но как это реализовано в Keras? Как я понимаю, для каждого образца в пакете индивидуальный градиент рассчитывается в зависимости от текущей модели (как разные единицы измерения, которые отбрасываются для разных образцов). Затем, после обработки всех выборок из партии, для каждого веса соответствующие градиенты суммируются, эти суммы делятся на batch_size
и затем применяются к соответствующим весам.
Проходя по исходному коду, я не вижу, если и где он обрабатывается. В функции _process_single_batch
вычисляется общая \ средняя потеря партии и на основе этого градиента партии рассчитывается. Это прекрасно работает для моделей без слоя Dropout, но как насчет слоя Dropout, как запоминаются индивидуальные настройки модели для каждого образца (с выпадением разных нейронов), а затем учитываются при расчете градиентного спуска?
Я думаю, что я я что-то упустил, и я хочу быть уверен, что правильно понимаю реализацию Keras мини-пакетного градиентного спуска, когда задействован слой Dropout.