Переобучение и регуляризация
Центральная драма всего машинного обучения: модель, идеальная на обучающих данных, может быть бесполезной на новых. Как это диагностировать по кривым ошибок и чем лечить — от L1/L2 до early stopping — спрашивают на каждом собеседовании.
Интуиция: зубрёжка против понимания
Два студента готовятся к экзамену. Первый зазубрил ответы на все задачи из прошлогоднего сборника — на них он безупречен, но на новой задаче беспомощен. Второй понял принцип: на знакомых задачах он изредка ошибается в арифметике, зато решает и новые. Первый — переобученная (overfitting) модель: она выучила не закономерность, а сами данные вместе с их шумом. Есть и третий персонаж — студент, который вообще не готовился: он плох и на старых, и на новых задачах. Это недообучение (underfitting) — модель слишком проста, чтобы уловить закономерность.
Формальный язык для этой истории — компромисс смещения и разброса (bias-variance trade-off). Смещение (bias) — систематическая ошибка слишком простой модели: прямая в принципе не может описать синусоиду. Разброс (variance) — чувствительность модели к конкретной обучающей выборке: полином 15-й степени, обученный на другом наборе тех же 20 точек, выглядел бы совершенно иначе. Увеличивая сложность модели, мы уменьшаем bias, но раздуваем variance; лучшее качество на новых данных — где-то посередине.
Как диагностировать
Главный инструмент — сравнение ошибки на train и на отложенной выборке (validation/test):
- Обе ошибки высокие и близкие — недообучение: модель слишком проста, учить дольше бессмысленно, нужна более выразительная модель или признаки.
- Train низкая, validation заметно выше — переобучение: модель запомнила шум. Разрыв (generalization gap) — его размер и есть градусник.
- По ходу обучения train падает, а validation достигла минимума и начала расти — момент, когда модель перешла от выучивания закономерности к запоминанию шума.
Пройди степени слева направо при λ = выкл: d = 1 — недообучение (обе ошибки велики), d = 4–6 — золотая середина, d = 13–15 — кривая пролезает через каждую train-точку, train-ошибка почти ноль, а test взлетает. Это U-кривая вживую. Теперь на d = 15 добавь L2: λ ≈ 10−3…10−1 прижимает веса, кривая разглаживается, и test-ошибка возвращается к разумной — регуляризация вылечила переобучение без смены модели.
Чем лечить переобучение
- Больше данных. Самое надёжное лекарство: шум перестаёт быть «закономерностью», когда примеров много.
- Проще модель. Меньше параметров, меньше степень, меньше глубина дерева — вручную режем variance.
- Регуляризация (regularization). Оставляем модель сложной, но штрафуем большие веса, добавляя к лоссу штраф:
L2 (ridge): L + λ·Σ wj2 · L1 (lasso): L + λ·Σ |wj|L2 равномерно прижимает все веса к нулю, но не обнуляет их. L1 из-за «острого угла» модуля в нуле выталкивает часть весов ровно в ноль — получается встроенный отбор признаков (feature selection). Коэффициент λ управляет силой: λ = 0 — нет штрафа, слишком большой λ — недообучение.
- Ранняя остановка (early stopping). Следим за validation-ошибкой по эпохам и останавливаем обучение в её минимуме, не дожидаясь, пока модель начнёт запоминать шум.
- Кросс-валидация (k-fold cross-validation). Не лекарство, а честный градусник: делим данные на k частей, k раз обучаемся на k−1 частях и валидируемся на оставшейся, метрики усредняем. Оценка надёжнее одного сплита — критично на малых данных при подборе λ и сложности модели.
- Для нейросетей — свои приёмы (dropout, аугментации): о них — в теме про практику обучения.
- «Как отличить переобучение от недообучения?» — по паре ошибок train/val: большой разрыв — overfitting, обе высокие — underfitting.
- «Чем L1 отличается от L2?» — L1 зануляет веса и отбирает признаки, L2 равномерно уменьшает все веса; L2 гладкая и удобнее для оптимизации.
- «Что делать, если модель переобучилась?» — по нарастанию стоимости: регуляризация/early stopping → упростить модель → собрать больше данных.
- «Зачем k-fold, если есть train/val split?» — на малых данных один сплит шумный; усреднение по k фолдам даёт устойчивую оценку и позволяет честно подобрать гиперпараметры.