Dropout и Batch Normalization на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать на собесе

Dropout и BatchNorm — две техники, появляющиеся в любой нейросети. На собесе DS обязательно: «зачем dropout», «формула BatchNorm», «отличие train и eval mode», «почему BatchNorm не работает на batch=1». Senior — нюансы LayerNorm, GroupNorm, момент выбора.

Главная боль без понимания — DS забыл model.eval() перед inference, BatchNorm использует mini-batch статистику на одном объекте, метрики прыгают, кажется что модель сломалась.

Dropout: идея и формула

Идея (Hinton 2012). Во время тренировки случайно «отключать» (зануляем) часть нейронов с вероятностью p. Сеть учится не полагаться на конкретный нейрон, что снижает overfit.

Формула (training):

h̃ᵢ = mᵢ · hᵢ
mᵢ ~ Bernoulli(1-p)

m — бинарная маска. С вероятностью 1-p нейрон активен.

Inverted dropout (стандартный вариант, sklearn / PyTorch):

h̃ᵢ = mᵢ · hᵢ / (1-p)

Деление на 1-p сохраняет среднее значение активации. Это позволяет на inference (без dropout) использовать те же веса без масштабирования.

Где ставить:

  • После dense / conv слоёв (до или после activation — разница небольшая).
  • В современных архитектурах часто только в финальных слоях (между attention и residual в Transformer).
  • В CNN dropout менее популярен, чем BatchNorm — иногда обе вместе.

Стандартные p:

  • 0.2-0.5 для dense.
  • 0.1-0.2 для CNN.
  • 0.1 для Transformer.
  • Слишком большое p (> 0.5) часто хуже — недо-обучение.

Train vs eval mode для Dropout

Train. Маска применяется случайно.

Eval (inference). Dropout отключён, веса не масштабируются (благодаря inverted dropout).

model.train()    # dropout активен
loss = criterion(model(X_batch), y_batch)
loss.backward()

model.eval()     # dropout отключён
with torch.no_grad():
    preds = model(X_test)

Забыть eval() — типичный баг. Inference будет шумным, метрики прыгают.

Monte Carlo Dropout. Намеренно оставить dropout активным на inference, делать N forward passes, усреднять. Даёт оценку uncertainty модели — полезно в Bayesian DL.

Batch Normalization: формула

Идея (Ioffe-Szegedy 2015). На каждом слое нормализовать активации по batch dimension. Делает обучение быстрее и стабильнее.

Алгоритм для каждого канала / нейрона:

μ_B = (1/m) Σᵢ xᵢ
σ²_B = (1/m) Σᵢ (xᵢ - μ_B)²

x̂ᵢ = (xᵢ - μ_B) / √(σ²_B + ε)

yᵢ = γ · x̂ᵢ + β

γ, β — обучаемые параметры (scale и shift). Возвращают сети возможность не нормализовать (если выгоднее).

Что нормализуется.

  • Conv: по spatial dims + batch (per channel).
  • Dense: по batch (per neuron).
  • ε — для стабильности (типично 1e-5).

Эффекты:

  • Снижает internal covariate shift.
  • Ускоряет сходимость в 5-10× раз (можно учиться с большим lr).
  • Действует как лёгкая регуляризация.
  • Снижает зависимость от инициализации.

Train vs eval для BatchNorm

Главное место для ошибок.

Train. Используется текущая mini-batch статистика. Параллельно обновляется running_mean и running_var через exponential moving average.

running_mean = (1-momentum) · running_mean + momentum · μ_B

momentum — обычно 0.1.

Eval. Используются накопленные running_mean, running_var (не считаем по batch).

Почему важно: на inference batch размером 1 — статистика по одному объекту нулевая (variance=0), всё ломается. На eval mode используем накопленные за training статистики.

Тонкость fine-tuning. При fine-tune часто фиксируют BN-параметры (bn.eval() или freeze):

for m in model.modules():
    if isinstance(m, nn.BatchNorm2d):
        m.eval()
        # или: m.weight.requires_grad = False

Иначе BN на маленькой выборке считает плохие running stats и портит pretrained веса.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Layer Norm и другие нормы

LayerNorm (Ba 2016). Нормализует по feature dim, не по batch.

μ = (1/d) Σ xⱼ      (по feature dim для одного объекта)
σ² = ...

Когда LayerNorm:

  • Transformer (стандарт).
  • RNN — BatchNorm с разными размерами sequence неудобен.
  • Маленькие batch sizes — BN деградирует.

Group Norm. Нормализация по группам каналов. Не зависит от batch — стабильно даже на batch=2.

Instance Norm. Каждый объект и канал отдельно — для style transfer.

Weight Norm. Перепараметризация весов, без нормализации активаций.

RMSNorm (сейчас популярно в LLM). Без вычитания среднего, только scaling. Дешевле LayerNorm.

Когда что выбирать

CNN на средних batch (32+):

  • BatchNorm.

CNN на маленьких batch (< 8) или distributed training:

  • GroupNorm — стабильнее.

Transformer / LLM:

  • LayerNorm (или RMSNorm в новых).

RNN:

  • LayerNorm.

Style transfer / generative:

  • InstanceNorm, GroupNorm.

Без нормализации.

В небольших dense сетях, на хорошо нормализованных входах, иногда лучше без — экономит вычисления.

Частые ошибки

Забыть model.eval(). BN использует mini-batch stats на test, метрики шумят. Dropout добавляет случайность.

model.train() забыли вернуть. На следующей эпохе обучение идёт без dropout / с running stats — деградация.

Inference на batch=1 с BN в train mode. σ²_B = 0, NaN в forward. Всегда eval перед inference.

BN перед residual connection. Стандарт после ResNet — BN после каждого conv до activation. До ReLU обычно эффективнее.

Dropout перед output layer на классификации. Реже эффективен. Лучше регуляризация других слоёв.

Большой p dropout. > 0.5 часто хуже — модель недо-обучается.

Замораживать BN на fine-tune без eval(). Если вы только requires_grad=False, но не eval(), BN всё равно обновляет running stats. Делайте оба.

Использовать BatchNorm после LayerNorm. Стек норм путает обучение. Выбирай одну.

p=0 в dropout. Это не «отключить регуляризацию», это identity. Просто убери слой.

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

FAQ

Dropout перед или после активации?

В оригинальной статье — после. На практике разница мала. В Transformer — после dense / attention, перед residual.

Можно ли использовать BN и Dropout вместе?

Можно, но порядок важен (BN → ReLU → Dropout — стандарт). Иногда BN сам действует как регуляризация и Dropout не нужен.

LayerNorm для CNN?

Не стандарт. Для CNN работает GroupNorm с группой 32 или BatchNorm. LayerNorm в конце CNN перед classification head — иногда встречается.

Что такое Sync BatchNorm?

В distributed training каждый GPU видит свой кусок batch — статистика BN неточная. SyncBN синхронизирует статистики между GPU.

Почему BatchNorm не работает на batch=1?

Variance = 0, делим на 0 → NaN. Также теряется stats регуляризации. Решение — GroupNorm или больший batch.

Это официальная информация?

Нет. Статья основана на оригинальных статьях (Srivastava 2014 «Dropout», Ioffe-Szegedy 2015 «BatchNorm», Ba 2016 «LayerNorm») и документации PyTorch.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.