Что делать, если нормализация партии используется в режиме обучения при тестировании?

Нормализация партии имеет различное поведение на этапе обучения и тестирования.

Например, при использовании 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.

Другие вопросы по тегам