Dropout vs BatchNormalization - проблема стандартного отклонения
При смешивании этих слоев возникает большая проблема, особенно когда BatchNormalization
сразу после Dropout
.
Выпадения пытаются сохранить то же самое среднее значение выходов без пропусков, но это меняет стандартное отклонение, что приведет к огромной разнице в BatchNormalization между обучением и проверкой. (Во время обучения BatchNormalization
получает измененные стандартные отклонения, накапливает и сохраняет их. Во время проверки выпадения отключаются, стандартное отклонение больше не является измененным, а исходным. Но BatchNormalization
, поскольку оно находится в процессе проверки , не будет использовать статистику пакета, но сохраненную статистику, которая будет сильно отличаться от статистики пакета)
Итак, первое и самое важное правило: не ставьте BatchNormalization
после Dropout
(или SpatialDropout
).
Обычно я пытаюсь оставить по крайней мере два сверточных / плотных слоя без выпадения перед применением пакетной нормализации, чтобы избежать этого.
Dropout vs BatchNormalization - изменение нулей на другое значение
Также важно: роль Dropout
состоит в том, чтобы «обнулить» влияние некоторых весов следующего слоя. Если вы примените нормализацию после отсева, у вас больше не будет «нулей», а будет определенное значение, которое будет повторяться для многих единиц. И это значение будет варьироваться от партии к партии. Таким образом, несмотря на добавленный шум, вы не убиваете юнитов, как это должно делать чистое выпадение.
Dropout vs MaxPooling
Проблема использования обычного Dropout
перед MaxPooling
состоит в том, что вы обнуляете несколько пикселей, а затем MaxPooling
примет максимальное значение, отсортируйте игнорировать часть вашего отсева. Если у вас выпадет максимум пикселя, то объединение приведет ко второму максимуму, а не к нулю.
Итак, Dropout
до MaxPooling
снижает эффективность отсева.
SpatialDropout против MaxPooling
Но SpatialDropout
никогда не попадает в «пиксели», а только в каналы. Когда он попадает в канал, он обнуляет все пиксели для этого канала, таким образом, MaxPooling
также эффективно приведет к нулю.
Таким образом, нет разницы между пространственным выпадением до или после объединения. Целый «канал» будет нулевым в обоих порядках.
BatchNormalization vs Activation
В зависимости от функции активации, использование нормализации партии до того, как это может быть хорошим преимуществом.
Для активации 'relu'
нормализация делает модель отказоустойчивой на случай неудачи «все нули замораживают реляционный слой». Это также гарантирует, что половина единиц будет равна нулю, а другая половина будет линейной.
Для 'sigmoid'
или 'tahn'
BatchNormalization
гарантирует, что значения находятся в допустимом диапазоне, избегая градиентов насыщения и исчезновения (значения, которые находятся слишком далеко от нуля, будут почти плоскими область этих функций, вызывающая исчезающие градиенты).
Есть люди, которые говорят, что есть и другие преимущества, если вы сделаете наоборот, я не полностью осознаю эти преимущества, мне нравятся те, которые я очень упомянул.
Dropout vs Activation
С 'relu'
нет никакой разницы, можно доказать, что результаты в точности совпадают.
С активациями, которые не центрированы, например, 'sigmoid'
, помещая выпадение перед активацией, приведет не к "нулям", а к другим значениям. Для сигмоида окончательные результаты отсева до него будут 0,5.
Если вы добавите, например, 'tanh'
после отсева, у вас будут нули, но масштабирование, которое выпадает для сохранения того же среднего значения, будет искажено таном. (Я не знаю, если это большая проблема, но может быть)
MaxPooling vs Activation
Я не вижу здесь много. Если активация не очень странная, конечный результат будет таким же.
Выводы?
Есть возможности, но некоторые хлопотны. Я считаю следующий порядок хорошим и часто им пользуюсь
Я бы сделал что-то вроде
- Group1
- Conv
- BatchNorm
- Активация
- MaxPooling
- Dropout или SpatialDropout
- Group2
- Conv
- ---- - (в последней группе был выпадение, здесь нет BatchNorm)
- Активация
- MaxPooling
- Dropout или SpatialDropout (решите использовать или нет)
- После двух групп без выпадения
- можно снова использовать BatchNorm