В предыдущих постах я объяснил, как работает Batch Norm, и показал, как его можно использовать в тензорном потоке. В этом посте я расскажу о лучших практиках, советах и ​​приемах, а также о том, что нужно запомнить, чтобы завершить эту серию о пакетной нормализации. Так что давайте!

Все приведенные здесь примеры также находятся в репозитории github с пояснениями. Вы можете попробовать эти записные книжки.



ilango100 / batch_norm
batch_norm - Мои эксперименты с пакетной нормализацией github.com



В предыдущем посте, в котором я предоставил ссылки для экспериментов с CNN, если бы вы запустили его в состоянии по умолчанию, точность модели не повысилась бы сразу, что сделало бы BN бесполезным. Это потому, что я не установил важный гиперпараметр - Momentum of BN. Итак, начнем с этого.

Импульс

Как обсуждалось ранее, импульс - это важность, придаваемая предыдущему скользящему среднему при вычислении среднего населения для вывода. Если вы не можете понять, что такое импульс, это не что иное, как сглаживание, которое мы можем настроить в Tensorboard. Импульс - это «запаздывание» в среднем и дисперсии обучения, поэтому шум из-за мини-пакета можно игнорировать.

По умолчанию для импульса будет установлено высокое значение около 0,99, что означает большое отставание и медленное обучение. Когда размер партии небольшой, нет. шагов бега будет больше. Такой высокий импульс приведет к медленному, но устойчивому обучению (большему запаздыванию) скользящего среднего. Так что в этом случае это полезно.

Но когда размер пакета больше, как я использовал, то есть 5K изображений (из 50K) за один шаг, количество шагов меньше. Также статистика мини-партии в основном такая же, как и у населения. В это время импульс должен быть меньше, чтобы среднее значение и дисперсия обновлялись быстро. Следовательно, основное правило таково:

Небольшой размер партии = ›Высокий импульс (0,9–0,99)

Большой размер партии = ›Низкий импульс (0,6–0,85)

Для большого размера пакета еще лучше схема обратный импульс распада, где импульс очень меньше в начале и продолжает увеличиваться по мере продолжения обучения:

В записной книжке Colab, которую я предоставил, теперь вы можете установить импульс как гиперпараметр и посмотреть, как проходит обучение.

Масштаб и сдвиг

Параметры масштабирования и сдвига применяются к нормализованным значениям, чтобы сдвинуть распределение с нуля. Это в основном полезно, когда BN используется перед активацией. В настоящее время BN широко применяется после активации, поэтому этими параметрами можно пренебречь. Для этого можно использовать тензорный поток:

Разница в том, что нет необходимости изучать 2 дополнительных параметра с каждым слоем batch_norm и, следовательно, дополнительное ускорение. Также приводит к меньшим параметрам и более тонким моделям. Вы можете видеть изменения в точности и времени обучения с масштабом и без шкалы и смещения с этим Colab Notebook.

BN до нелинейности = ›Использовать масштаб, сдвиг

BN после нелинейности = ›Масштаб, смещение не требуется

BatchNorm и Dropout

До сих пор мы использовали только пакетную нормализацию и увидели, что наша модель перекрывает данные. Мы также узнали, что BN может обеспечить только слабую регуляризацию, которую следует использовать в дополнение к любой другой регуляризации, такой как Dropout. Но как мы можем использовать Dropout и BatchNorm вместе?

Disharmony between Dropout and Batch Normalization - в этой статье подробно изучаются проблемы, возникающие при одновременном использовании dropout и BN. Наилучший вывод заключается в том, что дропаут следует использовать только после всех слоев BN, то есть на конечных плотных слоях. BatchNorm не следует использовать после выпадающего слоя.

Как мы видим, при использовании BN после выпадения точность не стабильна. Dropout следует использовать в конце сети, где BN не может появиться после этого.

Использовать выпадение после всех слоев BN

Этот блокнот Colab предоставляет вам основу, чтобы проверить, как работает batchnorm после выпадения и в идеале.

Пакетная перенормировка

Пакетная перенормировка - это еще один метод, используемый, когда размер пакета очень мал, например, 32, 64 и т. Д. При этом взятие среднего значения и дисперсии для мини-пакета может быть слишком подвержено ошибкам, и, следовательно, скользящая статистика берется для самого обучения. Это приводит к более точному обучению. Но тогда вам нужно установить другой набор гиперпараметров, например импульс для этой скользящей статистики.

Чтобы включить пакетную перенормировку в Tensorflow, установите для параметра renorm значение True, а также установите renorm_momentum:

Крошечный размер партии = ›Использовать пакетную перенормировку

Обновить статистику перемещения

Одна из важных вещей, которые люди часто забывают при использовании пакетной нормализации, - это то, что они забывают обновлять скользящее среднее во время обучения. Таким образом, во время тестирования значения вывода для среднего и дисперсии отсутствуют, что приводит к низкой точности.

В тензорном потоке добавьте операции обновления в зависимости от шага обучения:

Обобщить:

  1. Соответственно установите импульс.
  2. Используйте масштабирование и сдвиг только при необходимости.
  3. Правильно использовать дропаут: дропаут применяется после всех слоев BN.
  4. Если размер партии очень мал, используйте перенормировку партии.
  5. Не забывайте обновлять статистику населения во время тренировки.

На этом мы завершаем серию статей о пакетной нормализации. Если у вас есть какие-либо вопросы или предложения, не стесняйтесь комментировать.