Нейросети легко запоминают обучающую выборку. На собесе спрашивают, как это заметить и какие инструменты против этого есть, а в код-ревью любят ловить dropout и аугментации на валидации.
Как выглядит переобучение
Loss на трейне продолжает падать, а на валидации после минимума растёт. Сначала убедитесь, что валидация честная: без пересечений с трейном, из того же распределения, в режиме model.eval().
Данные и аугментации
Больше данных лучше любой регуляризации. Если их нет, аугментации создают новые варианты объектов, сохраняющие метку:
- картинки: кропы, отражения, повороты, цвет, RandAugment, mixup, CutMix;
- тексты: обратный перевод, маскирование, замена синонимов;
- звук: шум, сдвиги, SpecAugment.
Аугментация не должна менять класс: поворот на 180° превращает 6 в 9, отражение ломает текст на картинке.
Только на трейне. Валидация детерминирована: Resize, CenterCrop, та же нормализация, что на обучении.
Dropout
На обучении случайно обнуляет долю p активаций и масштабирует оставшиеся на 1/(1 - p). На инференсе выключен. При p = 0.2 множитель 1.25. Сеть не может полагаться на конкретные нейроны; можно думать о нём как об ансамбле подсетей.
Weight decay
Стягивает веса к нулю на каждом шаге. В AdamW отделён от адаптивного шага, типичные значения 0.01-0.1.
Early stopping
Следим за валидацией, останавливаемся, когда она не улучшается patience эпох, возвращаемся к лучшему чекпоинту. Валидация участвует в выборе, поэтому финальная оценка на тесте.
Label smoothing и mixup
- Label smoothing ε = 0.1 на 10 классов: цель 0.91 для верного класса и 0.01 для остальных. Модель меньше переуверена, часто лучше калибровка.
- Mixup: x = λx₁ + (1 - λ)x₂ и так же метки. CutMix вставляет кусок одной картинки в другую, метки смешивает по площади.
Что где используют
- CNN: аугментации главное, плюс weight decay, label smoothing, mixup, stochastic depth.
- Трансформеры среднего размера: dropout в attention и MLP, weight decay.
- Предобучение LLM: данных так много, что переобучения почти нет, dropout часто нулевой, weight decay остаётся.
- Fine-tuning на малых данных: маленький lr, weight decay, dropout, early stopping, LoRA.
Валидация в коде
model.eval()
correct = 0
with torch.no_grad():
for x, y in val_loader:
pred = model(x.to(device)).argmax(1)
correct += (pred == y.to(device)).sum().item()
accuracy = correct / len(val_loader.dataset)
model.train()
Частые ошибки
- Случайные аугментации на валидации.
- Забытый model.eval(): dropout делает метрику случайной.
- Аугментации, меняющие метку.
- Итоговая метрика как максимум по эпохам на валидации.
Что спросят на собесе
- Как работает dropout и почему на инференсе его выключают.
- Чем отличаются weight decay и L2 в Adam.
- Какие аугментации допустимы и почему не на валидации.
- Что такое label smoothing и mixup.
- План действий при переобучении.