Условие
Объясните, как работает Dropout, почему он регуляризует и почему нужен inverted-dropout scaling.
Решение
Подход
Dropout (Srivastava et al., 2014): на каждом forward pass случайно зануляем нейроны с вероятностью p. Эквивалентно умножению на маску m_i ~ Bernoulli(1-p):
y_i = m_i · x_i · w_i
При inference используем все нейроны → ожидаемая активация в 1/(1-p) раз больше, чем на train. Решение: inverted dropout — на train делим на 1-p:
y_train = (m / (1-p)) · x · w
Тогда E[y_train] = E[y_test], scaling согласован.
Регуляризация
Dropout эквивалентен обучению ансамбля экспоненциального числа sub-сетей (по всем подмножествам нейронов). На inference мы берём «approximate average» — это bayesian model averaging.
Также можно интерпретировать как multiplicative noise: forces нейроны быть полезными в любой комбинации, мешает co-adaptation.
Реализация
import torch.nn as nn
import torch
class MLPWithDropout(nn.Module):
def __init__(self, in_dim, hidden=128, p=0.5):
super().__init__()
self.fc1 = nn.Linear(in_dim, hidden)
self.drop1 = nn.Dropout(p)
self.fc2 = nn.Linear(hidden, hidden)
self.drop2 = nn.Dropout(p)
self.fc3 = nn.Linear(hidden, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.drop1(x) # на train зануляет p%, делит на (1-p)
x = torch.relu(self.fc2(x))
x = self.drop2(x)
return self.fc3(x)
model.train() # включает dropout
model.eval() # выключает: все нейроны, scaling не нужен (inverted)Где применять
- Fully-connected слои: p=0.5 классика.
- Conv: dropout редко, лучше BatchNorm + augmentation.
- Recurrent: variational dropout (одна маска на time-step).
- Output слой: НЕ применяем.
Подводные камни
model.eval()забыли → на validation dropout всё ещё активен, метрики «прыгают», score занижен.- p слишком большой → underfit. p=0.3-0.5 классика для MLP.
- Combining с BatchNorm: dropout перед BN ломает статистики BN. Обычно: Linear → BN → ReLU → Dropout.
- MC-Dropout: можно использовать на inference для оценки uncertainty (запускать model в
train()режиме N раз). - На маленьких сетях dropout вредит больше чем помогает; на больших — must-have.
Эталонный ответ
Dropout зануляет нейроны с вероятностью p; inverted dropout делит на (1-p) на train, чтобы E[activation] совпадало на train/test. Регуляризация = обучение экспоненциального ансамбля sub-сетей, на inference приближаем weight averaging. Применять с BN правильно: Linear → BN → ReLU → Dropout.