Заказ пакетной нормализации и отсева?


118

Первоначальный вопрос касался конкретно реализаций TensorFlow. Однако ответы относятся к реализации в целом. Этот общий ответ также является правильным для TensorFlow.

При использовании пакетной нормализации и выпадения в TensorFlow (особенно с использованием contrib.layers) нужно ли мне беспокоиться о порядке?

Кажется возможным, что, если я использую выпадение с немедленной нормализацией партии, могут возникнуть проблемы. Например, если сдвиг в пакетной нормализации тренируется к большим масштабным числам обучающих выходных данных, но затем тот же сдвиг применяется к меньшим (из-за компенсации за большее количество выходных данных) масштабным числам без выпадения во время тестирования, тогда это сдвиг может быть выключен. Компенсирует ли это слой пакетной нормализации TensorFlow автоматически? Или этого не происходит по какой-то причине?

Кроме того, есть ли другие подводные камни, на которые следует обратить внимание при использовании этих двух вместе? Например, если предположить , я использую их в правильном порядке , в отношении к вышесказанному (предполагая , что это правильный порядок), может ли быть проблема с использованием как пакетная нормализации и отсева на нескольких последовательных слоях? Я не сразу вижу в этом проблему, но, возможно, я что-то упускаю.

Спасибо много!

ОБНОВИТЬ:

Экспериментальный тест, кажется, предполагает, что порядок имеет значение. Я дважды запускал одну и ту же сеть только с нормой партии и обратным отсечением. Когда выпадение превышает норму партии, потери валидации, кажется, растут, поскольку потери обучения уменьшаются. В другом случае они оба падают. Но в моем случае движения медленные, поэтому все может измениться после дополнительных тренировок, и это всего лишь один тест. По-прежнему хотелось бы получить более точный и информированный ответ.

Ответы:


143

В Ioffe and Szegedy 2015 авторы заявляют, что «мы хотели бы убедиться, что для любых значений параметров сеть всегда производит активации с желаемым распределением». Таким образом, слой пакетной нормализации фактически вставляется сразу после слоя Conv / Fully Connected Layer, но перед подачей в ReLu (или любые другие виды) активации. Смотрите это видео примерно через 53 минуты для получения более подробной информации.

Что касается отсева, я считаю, что отсев применяется после слоя активации. На рисунке 3b для выпадающей бумаги коэффициент отсева / матрица вероятностей r (l) для скрытого слоя l применяется к нему на y (l), где y (l) - результат после применения функции активации f.

Таким образом, порядок использования пакетной нормализации и отсева:

-> CONV / FC -> BatchNorm -> ReLu (или другая активация) -> Dropout -> CONV / FC ->


63
Похоже, что даже Кристиан Сегеди теперь любит выполнять BatchNorm после ReLU (а не до него). Цитата Ф. Шолле, автора Keras: «Я не вернулся, чтобы проверить то, что они предлагают в своей исходной статье, но я могу гарантировать, что недавний код, написанный Кристианом, применяет relu до BN. Это все еще иногда является темой дебатов, тем не менее ". источник
pseudomarvin

3
А как насчет объединения, это будет происходить между батчнормом и активацией?
поводу

5
Кроме того, похоже, что точность может быть выше с BN после активации: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
видео удалено как-то!
blitu12345

10
В этой статье показано, что обычно прекращение приема BN приводит к худшим результатам, если не провести некоторую подготовку, чтобы избежать риска сдвигов дисперсии.
Haramoz 01

37

Как было отмечено в комментариях, удивительный ресурс , чтобы прочитать о порядке слоев здесь . Я просмотрел комментарии, и это лучший ресурс по теме, который я нашел в Интернете.

Мои 2 цента:

Dropout предназначен для полной блокировки информации от определенных нейронов, чтобы нейроны не коадаптировали. Итак, пакетная нормализация должна быть после выпадения, иначе вы передаете информацию через статистику нормализации.

Если задуматься, в типичных задачах машинного обучения это причина того, что мы не вычисляем среднее значение и стандартное отклонение по всем данным, а затем разбиваем их на наборы для обучения, тестирования и проверки. Мы разделяем, а затем вычисляем статистику по набору поездов и используем их для нормализации и центрирования проверочных и тестовых наборов данных.

поэтому я предлагаю схему 1 (здесь учитывается комментарий псевдомарвина о принятом ответе)

-> CONV / FC -> ReLu (или другая активация) -> Dropout -> BatchNorm -> CONV / FC

в отличие от схемы 2

-> CONV / FC -> BatchNorm -> ReLu (или другая активация) -> Dropout -> CONV / FC -> в принятом ответе

Обратите внимание, что это означает, что сеть по схеме 2 должна показывать переоснащение по сравнению с сетью по схеме 1, но OP провела некоторые тесты, упомянутые в вопросе, и они поддерживают схему 2.


Соответствующее обсуждение Reddit по размещению BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Но разве это не испортит вашу статистику BN, поскольку вы будете рассчитывать ее после того, как будет применен отсев, чего не будет во время тестирования?
ZakJ 01

@ZakJ Думаю, что нет. Поскольку мы рассчитываем BN на единицу (для каждой внутренней функции), и, кроме того, он масштабируется, чтобы компенсировать выпадение.
рвение

@ZakJ правильный. См. Ответ Мохаммеда Аделя и этот документ здесь: arxiv.org/pdf/1801.05134.pdf . По сути, слои пакетной нормализации учатся противодействовать ковариантному сдвигу в данных, который больше не существует, когда Dropout отключен во время тестирования.
skeller88

@ skeller88 Я не читал газету. В верхней части моей головы я думаю, что если у вас есть BN до того, как вы выпадете, это существенно портит намерение слоя BN, поскольку функция BN заключается в предоставлении стандартизированных данных для следующего уровня.
MiloMinderbinder

12

Обычно просто опускайте Dropout(когда у вас есть BN):

  • «BN устраняет необходимость Dropoutв некоторых случаях, потому что BN интуитивно обеспечивает те же преимущества регуляризации, что и Dropout»
  • "Такие архитектуры, как ResNet, DenseNet и т. Д., Не используют Dropout

Для получения более подробной информации обратитесь к этой статье [ Понимание дисгармонии между отсеиванием и пакетной нормализацией путем сдвига дисперсии ], как уже упоминалось @Haramoz в комментариях.


насчет MLP, полезно ли их комбинировать.
DINA TAKLIT

1
@DINATAKLIT Когда действительно не хватает данных для обучения, на мой взгляд, ДА.
xtluo

@xtulo, ты имеешь в виду эту работу, когда их маленькая дата? как если бы я читал, что пакетная нормализация лучше работает с большими наборами данных! Я немного запутался :!
ДИНА ТАКЛИТ

1
@DINATAKLIT Вы what about MLPs is it useful to combine themимели в виду это в своем предыдущем комментарии Is it useful to combine Dropout and BN when using MLPs? Я считаю, что это в основном зависит от размера вашей модели и количества имеющихся у вас обучающих данных.
xtluo

@xtulo да, я имею в виду, полезно ли комбинировать Droupout и BN, да, я согласен с вашим последним ответом.
DINA TAKLIT

6

Я нашел статью, в которой объясняется дисгармония между Dropout и Batch Norm (BN). Ключевая идея - это то, что они называют «сдвигом дисперсии» . Это связано с тем, что отсев ведет разное поведение между этапами обучения и тестирования, что смещает входную статистику, которую изучает BN. Основную идею можно найти на этом рисунке, взятом из этой статьи . введите описание изображения здесь

Небольшую демонстрацию этого эффекта можно найти в этом блокноте .


3
Как это отвечает на вопрос?
nbubis

1
В документе представлены 2 возможные стратегии: - Применить Dropout (только) после всех слоев BN - Изменить Dropout на более устойчивую к дисперсии форму
user3641187,

@nbubis Я думаю, что это косвенный ответ. Кажется, предлагается вообще не использовать их вместе («объясняет дисгармонию между Dropout и Batch Norm (BN)»).
NelsonGon



2

Конв - Активация - DropOut - BatchNorm - Пул -> Test_loss: 0.04261355847120285

Конв - Активация - DropOut - Пул - BatchNorm -> Test_loss: 0.050065308809280396

Конв - Активация - BatchNorm - Пул - DropOut -> Test_loss: 0.04911309853196144

Конв - Активация - BatchNorm - DropOut - Пул -> Test_loss: 0,06809622049331665

Conv - BatchNorm - Activation - DropOut - Pool -> Test_loss: 0.038886815309524536

Conv - BatchNorm - Activation - Pool - DropOut -> Test_loss: 0.04126095026731491

Конв - BatchNorm - DropOut - Активация - Пул -> Test_loss: 0,05142546817660332

Conv - DropOut - Activation - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Conv - DropOut - Activation - Pool - BatchNorm -> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - Activation - Pool -> Test_loss: 0.03238215297460556


Обучен на наборе данных MNIST (20 эпох) с 2 сверточными модулями (см. Ниже), каждый раз с последующим

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

Сверточные слои имеют размер ядра (3,3), заполнение по умолчанию, активация elu. Pooling - это MaxPooling у бассейна (2,2). Убыток есть, categorical_crossentropyа оптимизатор есть adam.

Соответствующая вероятность отсева равна 0.2или 0.3соответственно. Количество карт функций равно 32или 64соответственно.

Изменить: когда я отбросил Dropout, как рекомендовано в некоторых ответах, он сходился быстрее, но имел худшую способность к обобщению, чем когда я использую BatchNorm и Dropout.


Из-за стохастичности нейронных сетей недостаточно просто поиграть с одной тренировкой. Когда вы проведете около 100 тренировок и возьмете среднее значение - результаты будут более точными.
GensaGames

0

ConV / FC - BN - сигмовидная / tanh - выпадение. Если функция активации - Relu или иное, порядок нормализации и отключения зависит от вашей задачи.


0

Я прочитал рекомендуемые статьи в ответе и комментарии https://stackoverflow.com/a/40295999/8625228

С точки зрения Иоффе и Сегеди (2015), в сетевой структуре следует использовать только BN. Ли и др. (2018) приводят статистический и экспериментальный анализ, что существует сдвиг дисперсии, когда практикующие используют Dropout до BN. Таким образом, Li et al. (2018) рекомендуют применять Dropout после всех слоев BN.

С точки зрения Иоффе и Сегеди (2015), BN находится внутри / перед функцией активации. Однако Chen et al. (2019) используют слой IC, который сочетает отсев и BN, а Chen et al. (2019) рекомендует использовать BN после ReLU.

В целях безопасности использую Dropout или BN только в сети.

Чен, Гуанъюн, Пэнфэй Чен, Юйцзюнь Ши, Чан-Ю Се, Бенбен Ляо и Шэнъюй Чжан. 2019. «Переосмысление использования пакетной нормализации и отсева при обучении глубоких нейронных сетей». CoRR абс / 1905.05928. http://arxiv.org/abs/1905.05928 .

Иоффе, Сергей и Кристиан Сегеди. 2015. «Пакетная нормализация: ускорение глубокого обучения сети за счет уменьшения внутреннего ковариантного сдвига». CoRR абс / 1502.03167. http://arxiv.org/abs/1502.03167 .

Ли, Сян, Шо Чен, Сяолинь Ху и Цзянь Ян. 2018. «Понимание дисгармонии между отсеиванием и нормализацией партии с помощью сдвига дисперсии». CoRR абс / 1801.05134. http://arxiv.org/abs/1801.05134 .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.