Замовлення нормалізації та випадання партії?


116

Первісне питання стосувалося конкретно реалізацій TensorFlow. Однак відповіді стосуються загальної реалізації. Ця загальна відповідь також є правильною відповіддю для TensorFlow.

Якщо ви використовуєте нормалізацію партії та випадання в TensorFlow (зокрема, використовуючи contrib.layers), чи потрібно турбуватися про замовлення?

Мабуть, можливо, якщо я використаю випадання з подальшим негайно нормалізацією партії, можуть виникнути проблеми. Наприклад, якщо зсув нормалізації партії тренується до більшої кількості масштабів навчальних результатів, але тоді цей самий зсув застосовується до менших (за рахунок компенсації тим, що мають більше вихідних даних) масштабних чисел без відсіву під час тестування, то це зміна може бути вимкнено. Чи автоматично компенсує рівень нормалізації партії TensorFlow? Або це не відбувається з якихось причин, яких я пропускаю?

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

Дуже дякую!

ОНОВЛЕННЯ:

Експериментальний тест, схоже, підказує, що замовлення має значення. Я двічі запускав одну і ту ж мережу, лише з пакетною нормою та зворотним відмовою. Коли випадання перевищує норму партії, втрати валідації, схоже, збільшуються, коли втрати тренувань знижуються. Вони обоє йдуть в іншому випадку. Але в моєму випадку рухи повільні, тому все може змінитися після більше тренувань, і це лише один тест. Більш визначну та усвідомлену відповідь все ж оцінюватиме.

Відповіді:


143

У Ioffe та Szegedy 2015 автори заявляють, що "ми хотіли б переконатися, що для будь-яких значень параметрів мережа завжди виробляє активації з потрібним розподілом". Таким чином, рівень нормалізації партії фактично вставляється безпосередньо після шару Conv / повністю підключеного шару, але перед подачею в активацію ReLu (або будь-який інший тип). Перегляньте це відео близько 53 хвилин для отримання детальної інформації.

Що стосується відміни, я вважаю, що випадання застосовується після шару активації. У відсів паперової фігурі 3b, фактор відсів / матриця ймовірностей г (л) для прихованого шару л застосовується до нього на у (л), де у (л) є результатом після застосування функції активації п.

Отже, підсумовуючи, порядок використання партії нормалізації та випадання:

-> CONV / FC -> BatchNorm -> ReLu (або інша активація) -> випадання -> CONV / FC ->


63
Здається, що навіть Крістіан Сегеді любить виконувати BatchNorm після ReLU (не раніше). Цитата Ф. Чолле, автора Кераса: "Я не повернувся назад, щоб перевірити, що вони пропонують у своєму оригінальному документі, але можу гарантувати, що останній код, написаний Крістіаном, застосовує релю перед БН. Це все ще періодично тема дебатів, хоча ". джерело
псевдомарвін

3
Що з об'єднанням, чи буде це між бітчормом та активацією?
словазвідти

5
Крім того, схоже, що точність може бути вище, ніж BN після активації: github.com/cvjena/cnn-models/isissue/3
wordsforthewise

1
відео якось видаляється!
blitu12345

10
Цей документ показує, що нормально випадання з BN призводить до гірших результатів, якщо не проводиться певна умова, щоб уникнути ризику зміни змін.
Харамоз

37

Як було відзначено в коментарях, дивовижний ресурс , щоб прочитати про порядок шарів тут . Я пережив коментарі, і це найкращий ресурс на тему, яку я знайшов в Інтернеті

Мої 2 копійки:

Випадання призначене для блокування інформації з певних нейронів, щоб переконатися, що нейрони не адаптуються. Отже, нормалізація партії повинна відбуватися після випадання, інакше ви передаєте інформацію через статистику нормалізації.

Якщо ви подумаєте про це, у типових проблемах з ML, це причина, що ми не обчислюємо середнє та стандартне відхилення для цілих даних, а потім розділяємо їх на набори поїздів, тестів та перевірки. Ми розділяємо, а потім обчислюємо статистичні дані по набору поїздів і використовуємо їх для нормалізації та центрування валідації та тестування наборів даних

тому я пропоную схему 1 (тут враховується коментар псевдомарвіна щодо прийнятої відповіді)

-> CONV / FC -> ReLu (або інша активація) -> випадання -> BatchNorm -> CONV / FC

на відміну від схеми 2

-> CONV / FC -> BatchNorm -> ReLu (або інша активація) -> Dropout -> CONV / FC -> у прийнятій відповіді

Зверніть увагу, що це означає, що мережа за схемою 2 повинна демонструвати надмірну підгонку порівняно з мережею за схемою 1, але ОП провів деякі тести, як згадувалось у питанні, і вони підтримують схему 2


Відповідна дискусія в Reddit про розміщення BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Але хіба це не зіпсує вашу статистику BN, оскільки ви будете їх обчислювати після того, як буде застосовано випадання, що не буде у випадку тесту?
ZakJ

@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

Більш детально див. Цей документ [ Розуміння дисгармонії між випаданням та нормалізацією партії за допомогою варіації Shift ], про що вже згадував @Haramoz в коментарях.


як щодо MLP, чи корисно їх поєднувати.
DINA TAKLIT

1
@DINATAKLIT Коли у вас дійсно недостатньо даних про навчання, на мою думку, ТАК.
xtluo

@xtulo Ви маєте на увазі цю роботу, коли їхній малий датест? як, якщо я читав, що пакетна нормалізація працює краще з великими наборами даних! Я трохи розгублений:!
DINA TAKLIT

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

Я знайшов документ, який пояснює дисгармонію між випаданням і Batch Norm (BN). Ключова ідея - це те, що вони називають "зміною дисперсії" . Це пов'язано з тим, що відмова має різну поведінку між фазами навчання та тестування, що зміщує вхідну статистику, яку вивчає BN. Основну думку можна знайти в цій фігурі, яка взята з цієї статті . введіть тут опис зображення

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


3
Як це відповідає на питання?
nbubis

1
У статті подано 2 потенційні стратегії: - Застосовуйте випадання (лише) після всіх шарів BN - Змініть випадання на більш стійку до дисперсії форму
user3641187

@nbubis Я думаю, що це відповідає на це опосередковано. Здається, пропонують взагалі не використовувати їх разом ("пояснює дисгармонію між випаданням і Batch Norm (BN)").
NelsonGon


2

Правильний порядок: Конв> Нормалізація> Активація> Випадання> Об'єднання


2

Conv - Активація - DropOut - BatchNorm - Pool -> Test_loss: 0.04261355847120285

Conv - Активація - DropOut - Пул - BatchNorm -> Test_loss: 0.050065308809280396

Conv - Активація - BatchNorm - Пул - DropOut -> Test_loss: 0.04911309853196144

Conv - Активація - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Conv - BatchNorm - Активація - DropOut - Пул -> Test_loss: 0.038886815309524536

Conv - BatchNorm - Активація - Пул - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Активація - Пул -> Test_loss: 0.05142546817660332

Conv - DropOut - Активація - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Conv - DropOut - Активація - Пул - BatchNorm -> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - Активація - Пул -> Test_loss: 0.03238215297460556


Навчався на наборі даних MNIST (20 епох) з двома згортковими модулями (див. Нижче), після чого кожен раз

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

У шарів згортки розмір ядра розміром (3,3), прокладка за замовчуванням elu; Пул - це MaxPooling біля басейну (2,2). Втрата є, categorical_crossentropyі оптимізатор є adam.

Відповідна ймовірність відсіву 0.2або 0.3, відповідно. Обсяг карт карт 32або 64відповідно.

Редагувати: Коли я відкинув Dropout, як рекомендовано в деяких відповідях, він сходився швидше, але мав гіршу здатність до узагальнення, ніж коли я використовую BatchNorm та Dropout.


Через стохастичний характер НН недостатньо просто грати з одним тренуванням. Коли ви проходили б близько 100 тренувань і брали середній результат - результати будуть більш точними.
GensaGames

0

ConV / FC - BN - Sigmoid / tanh - випадання. Якщо функцією активації є Relu або іншим способом, порядок нормалізації та випадання залежить від вашого завдання


0

Я прочитав рекомендовані статті у відповіді та коментарях з https://stackoverflow.com/a/40295999/8625228

З точки зору Ioffe та Szegedy (2015), використовуйте лише BN у структурі мережі. Лі та ін. (2018) дають статистичний та експериментальний аналіз, що спостерігається зміна дисперсії, коли практикуючі застосовують Dropout перед BN. Таким чином, Li et al. (2018) рекомендую застосовувати Dropout після всіх шарів BN.

З точки зору Іоффе та Сегеді (2015), BN розташований всередині / перед функцією активації. Однак Chen та ін. (2019) використовують шар ІС, який поєднує випадання та BN, та Chen et al. (2019) рекомендує використовувати BN після ReLU.

На фоні безпеки я використовую Dropout або BN лише в мережі.

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

Іоффе, Сергій та Крістіан Сегеді. 2015. «Нормалізація партії: прискорення глибокої підготовки до мережі за рахунок зменшення внутрішнього коваріатного зсуву». CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .

Лі, Сян, Шуо Чен, Сяолін Ху і Цзянь Ян. 2018. „Розуміння дисгармонії між нормами випадання та партії за допомогою варіації“. CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.