Что делать, если нормализация партии используется в режиме обучения при тестировании?
Нормализация партии имеет различное поведение на этапе обучения и тестирования.
Например, при использовании tf.contrib.layers.batch_norm в тензорном потоке, мы должны установить другое значение для is_training
в другой фазе.
Мой вопрос: что, если я все еще установлен is_training=True
при тестировании? То есть, что если я все еще использую режим обучения на этапе тестирования?
Причина, по которой я задаю этот вопрос, заключается в том, что выпущенный код Pix2Pix и DualGAN не установлен is_training=False
при тестировании. И кажется, что если is_training=False
устанавливается при тестировании, качество генерируемых изображений может быть очень плохим.
Кто-нибудь может объяснить это пожалуйста? Благодарю.
1 ответ
Во время обучения слой BatchNorm пытается сделать две вещи:
- оценить среднее значение и дисперсию всего учебного набора (статистика населения)
- нормализовать входные значения и дисперсию, чтобы они вели себя как гауссов
В идеальном случае во второй точке можно использовать статистику совокупности всего набора данных. Тем не менее, они неизвестны и изменяются во время обучения. Есть также некоторые другие проблемы с этим.
Обходной путь делает нормализацию ввода
gamma * (x - mean) / sigma + b
на основе статистики мини-партии mean
, sigma
,
Во время обучения для приближения статистики населения используется скользящее среднее мини-групповой статистики.
Теперь оригинальная формулировка BatchNorm использует приблизительное среднее значение и дисперсию всего набора данных для нормализации во время вывода. Поскольку сеть является фиксированной, приближение mean
а также variance
должно быть довольно хорошо. Несмотря на то, что теперь представляется целесообразным использовать статистические данные о населении, это важное изменение: от статистики мини-партий до статистики всех данных обучения.
Это очень важно, когда партии не используются или имеют очень маленькие размеры партий во время обучения. (Но я также наблюдал это для партий размером 32).
Предложенная BatchNorm неявно предполагает, что обе статистики очень похожи. В частности, обучение по мини-пакетам размером 1, как в pix2pix или dualgan, дает очень плохую информацию о статистике населения. Здесь есть случаи, когда они могут содержать совершенно разные значения.
Имея теперь глубокую сеть, поздние уровни ожидают, что входные данные будут нормализованными пакетами (в смысле статистики мини-пакетов). Обратите внимание, что они обучены этому конкретному виду данных. Но использование статистики всего набора данных нарушает предположение при выводе.
Как решить эту проблему? Либо также используйте статистику мини-пакетов во время вывода, как в реализациях, которые вы упомянули. Или используйте BatchReNormalization, который вводит 2 дополнительных условия для устранения разницы между мини-партией и статистикой популяции, или просто используйте InstanceNormalization (для задач регрессии), который фактически идентичен BatchNorm, но обрабатывает каждый пример в пакете индивидуально и также не использует статистика населения.
Я также имел эту проблему во время исследования и теперь использую для задачи регрессии слой InstanceNorm.