Глубокое обучение

Регуляризация: Dropout, BatchNorm

Цели урока

  • Применять Dropout и понимать разницу train/eval режимов
  • Объяснить как BatchNorm стабилизирует обучение глубоких сетей
  • Выбирать между BatchNorm и LayerNorm для разных архитектур
  • Строить pipeline аугментации для задач CV и NLP

Модель 95% на train, 60% на test - классическое переобучение. Добавить Dropout - 92% / 85%. Добавить BatchNorm - 94% / 88%. Добавить augmentation - 93% / 91%. Разница между запоминанием и обучением - в трёх техниках из этого урока.

  • **ResNet, EfficientNet:** BatchNorm после каждого conv слоя - основа стабильности
  • **GPT, BERT:** LayerNorm в каждом трансформер блоке без исключений
  • **ImageNet SOTA:** RandAugment + MixUp + CutMix - стандартный набор аугментаций
  • **Fine-tuning LLM:** Dropout 0.1 + weight decay 0.01 - защита pretrained весов

Dropout и Batch Normalization

В 2014 году Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever и Ruslan Salakhutdinov опубликовали Dropout, который случайно отключает нейроны во время обучения, мешая их co-adaptation - дешёвый регуляризатор, ставший повсеместным. Через год, в 2015 году, Sergey Ioffe и Christian Szegedy из Google предложили Batch Normalization, нормализующий активации слоя по мини-батчу. BatchNorm позволил использовать гораздо большие learning rate и обучать значительно более глубокие сети, и до сих пор остаётся базовым блоком современных свёрточных архитектур.

Предварительные знания

  • Цикл обучения и разделение train/validation
  • Overfitting и компромисс bias-variance
  • Обучение по мини-батчам и обновления градиентов
  • Backpropagation: как нейронные сети учатся
  • Оптимизация: SGD -> AdamW

Dropout: случайное отключение нейронов

Модель запомнила обучающие данные наизусть, но не умеет обобщать. Один из признаков - нейроны специализировались: нейрон A срабатывает только на «кот», нейрон B только дополняет A. Уберите A - B бесполезен. **Dropout** случайно отключает нейроны на каждом шаге - заставляет нейроны учиться независимо.

**Inverted Dropout** - реализация в PyTorch: при обучении активации делятся на (1-p), при инференсе ничего не меняется. Это удобнее: не нужно масштабировать веса при переключении в eval mode.

**Dropout как ensemble:** математически dropout при инференсе эквивалентен усреднению по 2^N подсетям (N = число нейронов). Каждая маска создаёт уникальную сеть - ensemble бесплатно.

model.eval() отключает Dropout. Что происходит с весами при этом переключении в PyTorch?

Batch Normalization

Глубокая сеть с 50 слоями: после каждого слоя распределение активаций смещается и растягивается (internal covariate shift). К 50-му слою сигнал либо взрывается, либо затухает. **Batch Normalization** нормализует выход каждого слоя прямо во время обучения, делая обучение глубоких сетей стабильным.

**BatchNorm имеет эффект регуляризации** - каждый sample нормализуется относительно своего батча, что добавляет шум (разные батчи = разные статистики). Этот шум работает как слабый регуляризатор. Поэтому с BatchNorm иногда уменьшают Dropout или убирают его.

BatchNorm в режиме eval() использует другую статистику чем в train(). Какую?

Layer Normalization

Языковая модель обрабатывает предложения разной длины. BatchNorm нормализует по батчу - но в NLP батч содержит последовательности разной длины с паддингом, и статистика по батчу некорректна. **Layer Normalization** нормализует каждый пример независимо - по всем признакам одного sample, не по батчу.

Почему трансформеры используют LayerNorm, а не BatchNorm?

Data Augmentation

Модель переобучилась на 10,000 изображений кошек. Все фото - кошки на диване, смотрящие вправо. На реальных фото кошек модель ошибается. Проблема - не размер датасета, а его разнообразие. **Data Augmentation** создаёт новые вариации из существующих данных, увеличивая эффективный размер датасета.

**Правила augmentation:** 1) применять только при train, не при eval. 2) Augmentation должна быть label-preserving (flip кота - всё ещё кот; но vertical flip часто нарушает смысл). 3) MixUp и CutMix дают +0.5-1% accuracy почти бесплатно - стоит добавить.

Data augmentation применяется только при обучении, не при инференсе. Почему?

Регуляризация в DL

  • Dropout: случайно отключает нейроны при train - заставляет сеть работать без костылей
  • BatchNorm: нормализует по батчу - стабилизирует градиенты в глубоких сетях, есть эффект регуляризации
  • LayerNorm: нормализует по признакам каждого sample - работает для NLP и переменной длины
  • Data Augmentation: случайные трансформации при train - расширяет эффективный датасет
  • MixUp/CutMix: смешивание сэмплов - +0.5-1% accuracy почти бесплатно

Связанные темы

Регуляризация работает вместе с правильным оптимизатором и архитектурой.

  • Оптимизация: SGD -> AdamW — AdamW + weight decay - ещё один метод регуляризации
  • Свёрточные сети (CNN) — BatchNorm - стандартный компонент CNN архитектур
  • Трансформеры — LayerNorm + Dropout - встроены в каждый трансформер блок

Вопросы для размышления

  • Когда стоит убрать Dropout если уже используется BatchNorm?
  • Pre-LayerNorm vs Post-LayerNorm в трансформерах - в чём практическая разница?
  • Как подобрать правильную интенсивность аугментации не подбирая вручную?

Связанные уроки

  • dl-09 — Weight decay в AdamW сам по себе регуляризация
  • dl-04 — BatchNorm - стандартный компонент CNN-архитектур
  • ml-08-regularization — L1 и L2 штрафы из классического ML переносятся сюда
  • ml-21-bagging-boosting — Dropout работает как ансамбль прореженных сетей
  • prob-11-normal — BatchNorm масштабирует активации к нормальному распределению
  • stat-01-sampling
Регуляризация: Dropout, BatchNorm

0

1

Войти