Dropout и Batch Normalization на собеседовании Data Scientist
Карьерник — 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 · μ_Bmomentum — обычно 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 веса.
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. Просто убери слой.
Связанные темы
- Deep Learning на собесе DS
- Регуляризация L1 и L2 на собесе DS
- Loss функции на собесе DS
- Bias-variance trade-off на собесе DS
- Подготовка к собесу Data Scientist
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+ вопросами для собесов.