Первоначальный вопрос касался конкретно реализаций TensorFlow. Однако ответы относятся к реализации в целом. Этот общий ответ также является правильным для TensorFlow.
При использовании пакетной нормализации и выпадения в TensorFlow (особенно с использованием contrib.layers) нужно ли мне беспокоиться о порядке?
Кажется возможным, что, если я использую выпадение с немедленной нормализацией партии, могут возникнуть проблемы. Например, если сдвиг в пакетной нормализации тренируется к большим масштабным числам обучающих выходных данных, но затем тот же сдвиг применяется к меньшим (из-за компенсации за большее количество выходных данных) масштабным числам без выпадения во время тестирования, тогда это сдвиг может быть выключен. Компенсирует ли это слой пакетной нормализации TensorFlow автоматически? Или этого не происходит по какой-то причине?
Кроме того, есть ли другие подводные камни, на которые следует обратить внимание при использовании этих двух вместе? Например, если предположить , я использую их в правильном порядке , в отношении к вышесказанному (предполагая , что это правильный порядок), может ли быть проблема с использованием как пакетная нормализации и отсева на нескольких последовательных слоях? Я не сразу вижу в этом проблему, но, возможно, я что-то упускаю.
Спасибо много!
ОБНОВИТЬ:
Экспериментальный тест, кажется, предполагает, что порядок имеет значение. Я дважды запускал одну и ту же сеть только с нормой партии и обратным отсечением. Когда выпадение превышает норму партии, потери валидации, кажется, растут, поскольку потери обучения уменьшаются. В другом случае они оба падают. Но в моем случае движения медленные, поэтому все может измениться после дополнительных тренировок, и это всего лишь один тест. По-прежнему хотелось бы получить более точный и информированный ответ.
источник
Как было отмечено в комментариях, удивительный ресурс , чтобы прочитать о порядке слоев здесь . Я просмотрел комментарии, и это лучший ресурс по теме, который я нашел в Интернете.
Мои 2 цента:
Dropout предназначен для полной блокировки информации от определенных нейронов, чтобы нейроны не коадаптировали. Итак, пакетная нормализация должна быть после выпадения, иначе вы передаете информацию через статистику нормализации.
Если задуматься, в типичных задачах машинного обучения это причина того, что мы не вычисляем среднее значение и стандартное отклонение по всем данным, а затем разбиваем их на наборы для обучения, тестирования и проверки. Мы разделяем, а затем вычисляем статистику по набору поездов и используем их для нормализации и центрирования проверочных и тестовых наборов данных.
поэтому я предлагаю схему 1 (здесь учитывается комментарий псевдомарвина о принятом ответе)
-> CONV / FC -> ReLu (или другая активация) -> Dropout -> BatchNorm -> CONV / FC
в отличие от схемы 2
-> CONV / FC -> BatchNorm -> ReLu (или другая активация) -> Dropout -> CONV / FC -> в принятом ответе
Обратите внимание, что это означает, что сеть по схеме 2 должна показывать переоснащение по сравнению с сетью по схеме 1, но OP провела некоторые тесты, упомянутые в вопросе, и они поддерживают схему 2.
источник
Обычно просто опускайте
Dropout
(когда у вас естьBN
):Dropout
в некоторых случаях, потому что BN интуитивно обеспечивает те же преимущества регуляризации, что и Dropout»Dropout
Для получения более подробной информации обратитесь к этой статье [ Понимание дисгармонии между отсеиванием и пакетной нормализацией путем сдвига дисперсии ], как уже упоминалось @Haramoz в комментариях.
источник
what about MLPs is it useful to combine them
имели в виду это в своем предыдущем комментарииIs it useful to combine Dropout and BN when using MLPs
? Я считаю, что это в основном зависит от размера вашей модели и количества имеющихся у вас обучающих данных.Я нашел статью, в которой объясняется дисгармония между Dropout и Batch Norm (BN). Ключевая идея - это то, что они называют «сдвигом дисперсии» . Это связано с тем, что отсев ведет разное поведение между этапами обучения и тестирования, что смещает входную статистику, которую изучает BN. Основную идею можно найти на этом рисунке, взятом из этой статьи .
Небольшую демонстрацию этого эффекта можно найти в этом блокноте .
источник
Основываясь на исследовательском документе, для повышения производительности мы должны использовать BN перед применением Dropout.
источник
Правильный порядок: Conv> Normalization> Activation> Dropout> Pooling.
источник
Конв - Активация - 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 сверточными модулями (см. Ниже), каждый раз с последующим
Сверточные слои имеют размер ядра
(3,3)
, заполнение по умолчанию, активацияelu
. Pooling - это MaxPooling у бассейна(2,2)
. Убыток есть,categorical_crossentropy
а оптимизатор естьadam
.Соответствующая вероятность отсева равна
0.2
или0.3
соответственно. Количество карт функций равно32
или64
соответственно.Изменить: когда я отбросил Dropout, как рекомендовано в некоторых ответах, он сходился быстрее, но имел худшую способность к обобщению, чем когда я использую BatchNorm и Dropout.
источник
ConV / FC - BN - сигмовидная / tanh - выпадение. Если функция активации - Relu или иное, порядок нормализации и отключения зависит от вашей задачи.
источник
Я прочитал рекомендуемые статьи в ответе и комментарии 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 .
источник