Собесов

Сценарий ML: механизм Dropout с математикой

ML / Data ScienceOverfitting и регуляризацияСредняяMiddle

Условие

Объясните, как работает 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 слой: НЕ применяем.

Подводные камни

  1. model.eval() забыли → на validation dropout всё ещё активен, метрики «прыгают», score занижен.
  2. p слишком большой → underfit. p=0.3-0.5 классика для MLP.
  3. Combining с BatchNorm: dropout перед BN ломает статистики BN. Обычно: Linear → BN → ReLU → Dropout.
  4. MC-Dropout: можно использовать на inference для оценки uncertainty (запускать model в train() режиме N раз).
  5. На маленьких сетях dropout вредит больше чем помогает; на больших — must-have.

Эталонный ответ

Dropout зануляет нейроны с вероятностью p; inverted dropout делит на (1-p) на train, чтобы E[activation] совпадало на train/test. Регуляризация = обучение экспоненциального ансамбля sub-сетей, на inference приближаем weight averaging. Применять с BN правильно: Linear → BN → ReLU → Dropout.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти