🔴 Сложный ⏱️ 50 минут

Переобучение и недообучение

📋 Содержание урока

Переобучение и недообучение 🎯

Представь, что ты запускаешь обучение своей первой модели — например, нейросети для классификации изображений или градиентного бустинга на табличных данных. Ты задал 100 эпох, налил кофе и открываешь график loss в реальном времени. Первые 10-15 эпох всё выглядит замечательно: и train loss, и validation loss дружно падают вниз, метрики растут, ты уже мысленно пишешь отчёт об успехе. А потом происходит развилка, которую видел практически каждый, кто хоть раз обучал модель дольше пяти минут: train loss как ни в чём не бывало продолжает ползти к нулю, а validation loss, коснувшись своего минимума где-то на эпохе 15-20, разворачивается и начинает расти. Кривые расходятся — модель на обучающей выборке становится всё лучше, а на данных, которые она не видела, всё хуже.

Это и есть переобучение (overfitting) в его самом узнаваемом виде — не абстрактное определение из учебника, а конкретная картинка на конкретном графике, которую ты будешь видеть тысячи раз за карьеру в Data Science. Модель на этом этапе не столько учится закономерности «как связаны признаки и целевая переменная», сколько запоминает частные, случайные особенности именно этих обучающих примеров — вплоть до конкретных значений шума. Она превращается в подобие ученика, который выучил наизусть ответы к пятидесяти задачам из учебника, но не освоил сам метод решения: на контрольной с теми же типами задач, но другими числами, он проваливается, хотя дома решал «на отлично».

У переобучения есть зеркальная противоположность — недообучение (underfitting), которое на графике выглядит иначе, но не менее узнаваемо: обе кривые, и train, и validation, останавливаются на высоком уровне ошибки и дальше почти не двигаются, как ни продолжай обучение. Здесь проблема не в том, что модель запомнила лишнее, а в том, что она физически не способна уловить закономерность — слишком простой инструмент для слишком сложной задачи. Попытка предсказать параболу прямой линией, разделить перекрёстно расположенные классы одной прямой границей, сжать сложную зависимость в нейросеть с двумя нейронами — всё это обречено остаться неточным независимо от объёма данных и числа эпох.

Переобучение и недообучение — это, пожалуй, самая частая практическая проблема во всём машинном обучении, ещё до того, как ты начинаешь думать про выбор архитектуры, тюнинг гиперпараметров или деплой в продакшн. Классический вопрос новичка на форумах — «почему моя модель показывает 99% accuracy на обучении и 61% на тесте?» — это стопроцентно переобучение, и таких вопросов задаются десятки тысяч каждый год. В этом уроке ты научишься уверенно распознавать обе проблемы по конкретным признакам — числовым и визуальным, — поймёшь формальную математическую причину происходящего через разложение ошибки на смещение (bias) и дисперсию (variance), и освоишь конкретный набор инструментов для лечения каждой из двух болезней.

История

Интуитивный предок идеи о переобучении гораздо старше самого машинного обучения. В XIV веке английский монах-философ Уильям Оккам сформулировал принцип, известный сегодня как «бритва Оккама»: не следует множить сущности сверх необходимости — если два объяснения одинаково хорошо описывают наблюдаемые факты, предпочтение стоит отдавать более простому. В статистике XX века этот философский принцип получил вполне конкретное практическое воплощение: если модель с сотней параметров и модель с пятью параметрами одинаково хорошо описывают данные, доверять стоит более простой — она с большей вероятностью уловила реальную закономерность, а не подогналась под шум конкретной выборки.

Формальный математический язык для описания компромисса между простотой и точностью модели появился гораздо позже. В 1992 году Стюарт Джеман (Stuart Geman), Эли Биненшток (Elie Bienenstock) и Рене Дурса (René Doursat) опубликовали статью «Neural networks and the bias/variance dilemma» («Нейронные сети и дилемма смещение/дисперсия»), в которой строго разложили ожидаемую ошибку предсказания на два конкурирующих источника — систематическое смещение модели (bias) и её чувствительность к конкретной обучающей выборке (variance). Их работа объяснила математически то, что практики уже видели на глаз: увеличение гибкости модели снижает одну составляющую ошибки, но неизбежно увеличивает другую, и где-то посередине лежит оптимум.

Параллельно, начиная с 1960-70-х годов, советские математики Владимир Вапник и Алексей Червоненкис разрабатывали теорию, которая сегодня носит их имена — VC-теорию (Vapnik-Chervonenkis theory). Она дала строгий язык для измерения «сложности» класса моделей (VC-размерность) и доказала теоретические границы того, насколько ошибка на новых данных может отличаться от ошибки на обучающей выборке в зависимости от этой сложности и объёма данных — работа легла в основу метода опорных векторов (SVM) и остаётся одним из фундаментов статистической теории обучения. Тема далека от того, чтобы считаться закрытой: в 2019 году Михаил Белкин (Mikhail Belkin) с соавторами описал феномен «double descent» — неожиданное повторное падение тестовой ошибки при дальнейшем увеличении числа параметров модели далеко за пределы точки интерполяции обучающих данных, что заставило заново пересмотреть интуицию о переобучении применительно к современным гигантским нейросетям.

Недообучение (underfitting)

Интуиция

Представь ученика, который выучил только правило «произведение двух положительных чисел положительно» и пытается применить именно это правило к любой задаче на уроке — включая те, где на самом деле нужно решать квадратное уравнение или работать с отрицательными числами. Инструмент, которым он владеет, категорически недостаточен для класса задач, который перед ним стоит: сколько бы примеров ему ни показали, он не сможет выдать правильный ответ, потому что сама его «модель мира» слишком простая.

Именно так ведёт себя недообученная модель машинного обучения. Она не «ленится» и не «путается в шуме» — у неё попросту не хватает выразительной способности (expressive power), чтобы уловить структуру, которая реально присутствует в данных.

Определение

Недообучение (underfitting) — ситуация, при которой модель обладает недостаточной сложностью (выразительной способностью) относительно реальной структуры данных и не может уловить даже основные закономерности в обучающей выборке. Признак: высокая ошибка одновременно и на обучающих, и на тестовых данных, причём эти ошибки близки друг к другу по величине.

Пример 1: линейная регрессия на параболических данных

Пусть истинная зависимость между признаком $x$ и целевой переменной $y$ параболическая: $y = 2 + 3x - 0{,}5x^2 + \varepsilon$, где $\varepsilon$ — небольшой случайный шум. Если обучить простую линейную регрессию $\hat{y} = a + bx$ на таких данных, она найдёт какую-то «среднюю» прямую, минимизирующую сумму квадратов отклонений, — но по самой своей природе прямая линия не способна повторить изгиб параболы. На части диапазона $x$ прямая будет систематически завышать предсказания, на другой части — систематически занижать. Ошибка на обучающей выборке останется большой ($\text{train MSE}$ порядка нескольких единиц), и на тестовой выборке ошибка будет примерно такой же — потому что модель одинаково плохо «не понимает» параболу что на знакомых, что на новых точках.

Пример 2: линейная граница на XOR-подобных данных

Пусть в задаче классификации точки одного класса лежат в верхнем правом и нижнем левом квадрантах координатной плоскости, а точки другого класса — в верхнем левом и нижнем правом (классическая XOR-структура). Логистическая регрессия строит только линейную разделяющую границу — прямую линию. Но никакая прямая не способна отделить диагонально расположенные кластеры друг от друга: любая прямая либо захватит примеры обоих классов с одной стороны, либо разрежёт один класс пополам. Итоговая accuracy на такой задаче застрянет около 50% — на уровне случайного угадывания, — причём и на обучающей, и на тестовой выборке одинаково плохо.

Пример 3: нейросеть с искусственно урезанной ёмкостью

Пусть перед тобой задача распознавания рукописных цифр MNIST (10 классов, изображения 28×28 пикселей). Если задать архитектуру с одним скрытым слоем всего из двух нейронов, у сети физически не хватит параметров, чтобы закодировать различия между десятью классами цифр. Сколько бы эпох ты ни обучал такую сеть, accuracy застынет в районе 30-40% и на обучающей, и на тестовой выборке — сеть просто не может представить нужную функцию, независимо от объёма данных.

Пример 4: чрезмерно сильная регуляризация

Даже модель с достаточной изначальной сложностью можно искусственно «оглупить» слишком агрессивной регуляризацией. Если в Ridge-регрессии задать коэффициент $\lambda$ огромным (скажем, $\lambda = 10^6$), штраф $\lambda\|w\|_2^2$ настолько доминирует над членом ошибки, что оптимизатору выгоднее занулить почти все веса, чем подгонять их под данные, — модель вырождается почти в константу, предсказывающую одно и то же среднее значение для любого входа. Формально это тоже недообучение, только вызванное не архитектурой, а гиперпараметром.

Почему это важно

Недообучение — хорошая новость и плохая новость одновременно. Хорошая: его легко диагностировать — обе кривые ошибки высокие и близкие друг к другу, никакого расхождения между train и test нет. Плохая: лечится оно не тюнингом гиперпараметров вроде learning rate, а принципиальным увеличением сложности модели или признакового пространства — то есть требует более серьёзного архитектурного решения, а не косметической правки.

Переобучение (overfitting)

Интуиция

Возьми того же ученика, но представь его в противоположной крайности: вместо того чтобы разобраться в методе решения задач, он вызубрил наизусть все пятьдесят примеров из учебника вместе с ответами — включая опечатки в условиях и случайные числа в конкретных задачах. На контрольной, где условия ровно те же пятьдесят задач, но с другими числами, он с треском проваливается: он не выучил закономерность «как решать такой тип задач», он выучил конкретные пары «вопрос → ответ» и не умеет обобщать их на новые вопросы того же типа.

Модель, склонная к переобучению, ведёт себя точно так же: вместо общей закономерности она подгоняет свои параметры под шум и случайные особенности именно тех конкретных примеров, которые попали в обучающую выборку.

Определение

Переобучение (overfitting) — ситуация, при которой модель обладает избыточной выразительной способностью относительно объёма и сложности реальных данных и начинает подстраиваться под шум и случайные особенности конкретной обучающей выборки вместо того, чтобы улавливать закономерность, обобщающуюся на новые данные. Признак: низкая ошибка на обучающей выборке, но заметно более высокая ошибка на данных, которые модель не видела при обучении.

Численный пример: полиномы разной степени на одних и тех же точках

Возьмём восемь обучающих точек, сгенерированных по истинной параболической зависимости $y = 2 + 3x - 0{,}5x^2$ с небольшим случайным шумом:

import numpy as np

x_train = np.array([-3, -2, -1, 0, 1, 2, 3, 4])
y_train = np.array([-11.2, -6.4, -1.1, 2.3, 4.2, 6.4, 6.2, 6.5])

x_test = np.array([-4, 5, 6])
y_test = np.array([-17.6, 4.9, 1.6])

for degree in [1, 2, 7]:
    coeffs = np.polyfit(x_train, y_train, degree)
    train_mse = np.mean((np.polyval(coeffs, x_train) - y_train) ** 2)
    test_mse = np.mean((np.polyval(coeffs, x_test) - y_test) ** 2)
    print(f"степень {degree}: train MSE = {train_mse:.2f}, test MSE = {test_mse:.2f}")

Если прогнать такой код, картина получится показательная и типичная для подобных экспериментов:

  • Степень 1 (прямая линия): train MSE $\approx 3{,}8$, test MSE $\approx 4{,}5$. Обе ошибки высокие и близки друг к другу — классическое недообучение: прямая физически не может повторить изгиб параболы ни на обучающих, ни на новых точках.

  • Степень 2 (парабола — совпадает с истинной моделью): train MSE $\approx 0{,}15$, test MSE $\approx 0{,}20$. Обе ошибки низкие и близкие друг к другу — золотая середина: модель уловила именно ту закономерность, что и порождала данные, и шум, оставшийся в обучающей ошибке, объясняется только случайными отклонениями $\varepsilon$.

  • Степень 7 (максимально возможная для 8 точек): train MSE $= 0{,}00$, test MSE — сотни или тысячи, катастрофически большая величина. Дело в том, что через любые 8 точек общего положения можно провести полином седьмой степени, проходящий точно через каждую из них: у системы из 8 уравнений с 8 неизвестными (коэффициентами полинома) есть точное решение, и обучающая ошибка обнуляется полностью. Но между точками, а особенно за пределами обучающего диапазона (там, где расположены тестовые точки $x=-4, 5, 6$), полином высокой степени начинает вести себя неустойчиво — стремительно взлетать и падать (родственный эффект называется феноменом Рунге). Модель «идеально» описала восемь конкретных чисел ценой полной бессмысленности предсказаний где-либо ещё.

Это ровно та зависимость, о которой шла речь в задании урока: степень 1 — недообучение, степень 20 (или любая степень, близкая к числу точек и выше) — переобучение, а степень 3-4 в задачах с более богатыми данными обычно оказывается золотой серединой между этими крайностями.

Признак на графике обучения: расхождение train loss и validation loss

В контексте итеративного обучения (нейросети, градиентный бустинг) переобучение проявляется не как разовое число, а как процесс, разворачивающийся во времени — по эпохам или итерациям. Классический график выглядит так: по оси X — номер эпохи, по оси Y — значение функции потерь (loss). Кривая train loss почти всегда монотонно убывает — оптимизатор буквально для того и существует, чтобы уменьшать ошибку на данных, которые он видит. А кривая validation loss убывает вместе с ней только до определённого момента — условно, эпохи $K$, — после чего начинает расти, даже если train loss продолжает падать.

Момент, где кривые расходятся, называют иногда «overfitting elbow» (локоть переобучения): до него модель ещё учит обобщающуюся закономерность, после него она начинает использовать дополнительную ёмкость для того, чтобы всё точнее подгоняться под шум конкретных обучающих примеров, что для новых данных уже не помогает, а вредит. Именно это наблюдение — что оптимальная точка остановки лежит там, где validation loss достигает минимума, а вовсе не там, где заканчивается заранее заданное число эпох, — лежит в основе техники ранней остановки (early stopping), о которой подробнее пойдёт речь дальше в этом уроке.

Пример: дерево решений без ограничения глубины

Алгоритм построения дерева решений по умолчанию (без ограничения max_depth) продолжает дробить обучающую выборку до тех пор, пока каждый лист не станет чистым — то есть будет содержать примеры только одного класса, в пределе по одному обучающему примеру на лист. Итоговое дерево показывает 100% accuracy на обучающей выборке — оно буквально запомнило, к какому классу относится каждый конкретный обучающий пример, включая ошибочно размеченные и аномальные случаи. На тестовых данных, где таких же точных комбинаций признаков уже не встретится, accuracy обычно оказывается заметно ниже, а иногда драматически ниже.

Пример: k-ближайших соседей с $k=1$

Алгоритм k-NN с параметром $k=1$ классифицирует любую новую точку по классу единственного ближайшего к ней обучающего примера. Граница решения при этом становится предельно изрезанной — она огибает каждый отдельный выброс и каждую шумную точку в обучающей выборке отдельным «карманом». Обучающая ошибка при $k=1$ формально равна нулю (ближайший сосед точки — она сама), но граница решения настолько чувствительна к шуму, что на новых данных ошибка заметно возрастает.

Пример: большая нейросеть на маленьком датасете

Нейросеть с несколькими миллионами обучаемых параметров, обучаемая без регуляризации на датасете из нескольких сотен изображений, обладает колоссальным избытком ёмкости относительно объёма данных. Она способна выучить обучающую выборку практически наизусть (в пределе — запомнить каждую отдельную картинку вместе с её меткой), демонстрируя accuracy, близкую к 100% на train, при этом на validation accuracy может оставаться на уровне, немногим превышающем случайное угадывание.

Почему это важно

Переобучение опасно именно потому, что маскируется под успех: метрика на обучающей выборке выглядит превосходно, и неопытный практик может отчитаться об «отличной модели», даже не взглянув на отложенную выборку. Разрыв между train- и validation-метриками — это первый и самый надёжный сигнал того, что модель в её текущем виде для продакшна непригодна, сколько бы впечатляюще ни выглядела её ошибка на данных, которые она уже видела.

Компромисс смещение-дисперсия (bias-variance tradeoff)

Интуиция

Представь мишень для дартса и четыре игрока, каждый из которых бросает по пять дротиков.

  • Дротики первого игрока ложатся плотной кучкой точно в центр мишени — низкое смещение, низкая дисперсия. Это идеальная модель.

  • Дротики второго игрока ложатся плотной кучкой, но заметно в стороне от центра, скажем, в левом верхнем секторе — низкая дисперсия, но высокое смещение. Это недообученная модель: она стабильна (мало меняется от выборки к выборке), но систематически промахивается мимо истинного значения.

  • Дротики третьего игрока разбросаны широко по всей мишени, но в среднем их «центр тяжести» приходится ровно на яблочко — низкое смещение, но высокая дисперсия. Это переобученная модель: в среднем по многим гипотетическим обучающим выборкам она была бы точна, но конкретное обучение на конкретных данных даёт очень нестабильный, сильно скачущий результат.

  • Дротики четвёртого игрока разбросаны широко и вдобавок смещены от центра — и высокое смещение, и высокая дисперсия. Это худший возможный случай.

Формальное разложение ошибки

Пусть истинная зависимость имеет вид $y = f(x) + \varepsilon$, где $\varepsilon$ — случайный шум с $E[\varepsilon] = 0$ и $\mathrm{Var}(\varepsilon) = \sigma^2$, не зависящий от обучающей выборки. Модель $\hat{f}(x)$ обучена на случайной обучающей выборке $D$, поэтому сама $\hat{f}(x)$ — случайная величина: для разных выборок $D$ (взятых из того же распределения) обучение даёт разные конкретные функции.

Распишем ожидаемую квадратичную ошибку предсказания в фиксированной точке $x$, усреднённую по случайности выборки $D$ и случайности шума $\varepsilon$ в тестовой точке:

$$E_{D,\varepsilon}\bigl[(y - \hat{f}(x))^2\bigr]$$

Представим разность $y - \hat{f}(x)$ как сумму трёх слагаемых, добавив и вычтя $E_D[\hat{f}(x)]$ — ожидаемое предсказание модели, усреднённое по всем возможным обучающим выборкам:

$$y - \hat{f}(x) = \bigl(f(x) - E_D[\hat{f}(x)]\bigr) + \bigl(E_D[\hat{f}(x)] - \hat{f}(x)\bigr) + \varepsilon$$

Обозначим первое слагаемое через $-\mathrm{Bias}(\hat{f}(x))$, где $\mathrm{Bias}(\hat{f}(x)) = E_D[\hat{f}(x)] - f(x)$ — систематическое отклонение среднего предсказания модели от истинного значения. Второе слагаемое имеет нулевое среднее по определению ($E_D$ от него равен нулю), а третье — шум $\varepsilon$ с нулевым средним, не зависящий от выборки $D$. Возводя сумму в квадрат и беря математическое ожидание, все три попарных произведения обнуляются (в силу независимости и нулевых средних), и остаётся:

$$E_{D,\varepsilon}\bigl[(y - \hat{f}(x))^2\bigr] = \underbrace{\bigl(E_D[\hat{f}(x)] - f(x)\bigr)^2}_{\text{Bias}^2} + \underbrace{E_D\bigl[(\hat{f}(x) - E_D[\hat{f}(x)])^2\bigr]}_{\text{Variance}} + \underbrace{\sigma^2}_{\text{irreducible error}}$$

Три слагаемых имеют ясный практический смысл. $\mathrm{Bias}^2$ — квадрат систематической ошибки: насколько в среднем предсказание модели отклоняется от истины из-за того, что класс моделей слишком беден (прямая линия принципиально не может описать параболу, как бы её ни обучали). $\mathrm{Variance}$ — насколько сильно предсказание модели меняется в зависимости от конкретной случайной обучающей выборки: чем гибче модель, тем сильнее она «подстраивается» под шум конкретных данных и тем сильнее разбрасываются её предсказания от выборки к выборке. $\sigma^2$ — неустранимая ошибка (irreducible error), заложенная в самих данных случайным шумом $\varepsilon$: её нельзя убрать никаким улучшением модели, потому что она не связана с моделью вообще.

Связь со степенью полинома

Вернёмся к примеру с полиномиальной регрессией и посмотрим на три составляющие ошибки при разной степени полинома:

  • Степень 1: высокий $\mathrm{Bias}^2$ (прямая систематически не может повторить параболу — она недообучена вне зависимости от конкретной выборки), низкая $\mathrm{Variance}$ (какую бы обучающую выборку из того же распределения ни взять, оптимальная прямая будет примерно одной и той же — простая модель устойчива к шуму конкретной выборки).

  • Степень 2 (соответствует истинной модели): низкий $\mathrm{Bias}^2$ (класс парабол содержит истинную зависимость, поэтому систематического отклонения почти нет), умеренная $\mathrm{Variance}$ (модель достаточно гибкая, чтобы улавливать закономерность, но не настолько гибкая, чтобы гоняться за каждым шумовым выбросом).

  • Степень 7 (или выше): $\mathrm{Bias}^2$ близок к нулю на обучающих точках (модель проходит через них точно), но $\mathrm{Variance}$ становится огромной — небольшое изменение обучающей выборки (другой шум в тех же восьми точках) приводит к совершенно другому набору коэффициентов и, соответственно, к совершенно другим предсказаниям за пределами обучающего диапазона.

Суммарная ошибка $\mathrm{Bias}^2 + \mathrm{Variance} + \sigma^2$ минимальна где-то посередине этого спектра — именно поэтому задача выбора «правильной» сложности модели формально и называется компромиссом смещение-дисперсия: уменьшая одну составляющую (делая модель гибче), мы почти неизбежно увеличиваем другую.

Почему это важно

Разложение bias-variance даёт не просто красивую формулу, а конкретный диагностический инструмент: если ошибка модели высока и на train, и на test — проблема в высоком bias (лечится усложнением модели); если ошибка низкая на train, но заметно выше на test — проблема в высокой variance (лечится регуляризацией, увеличением данных или упрощением модели). Умение отличать эти два случая на практике экономит массу времени, которое иначе ушло бы на попытки «полечить» недообучение методами, работающими против переобучения, и наоборот.

Как бороться с переобучением и недообучением

Способы борьбы с переобучением

Больше данных. Самый прямой способ снизить дисперсию модели — увеличить объём обучающей выборки. Чем больше данных, тем труднее сложной модели «запомнить» их все вместо того, чтобы выучить закономерность, и тем стабильнее становятся её параметры от выборки к выборке. В примере с полиномом седьмой степени: если бы вместо 8 точек было 800, тот же полином седьмой степени уже не смог бы пройти точно через каждую точку и был бы вынужден искать компромиссную кривую, гораздо ближе к истинной параболе.

Регуляризация L1/L2. Как ты уже видел в уроке 291 про проксимальные методы, штрафы $\lambda\|w\|_2^2$ (Ridge) и $\lambda\|w\|_1$ (Lasso) добавляют к функции потерь дополнительное слагаемое, которое «наказывает» модель за слишком большие по модулю веса. Геометрически это ограничивает пространство допустимых решений, не давая оптимизатору подгонять коэффициенты под мельчайшие случайные колебания обучающих данных. L1-регуляризация, как показывает формула мягкого порогового отображения (soft thresholding), доказанная в уроке 291, дополнительно зануляет маловажные веса целиком, тем самым упрощая модель за счёт отбора признаков, а не только их сжатия к нулю.

Упрощение модели. Уменьшение числа параметров напрямую — меньшая глубина дерева решений (max_depth), меньшее число слоёв или нейронов в сети, более низкая степень полинома — снижает избыточную гибкость модели относительно объёма данных.

Ранняя остановка (early stopping). Как было показано на графике train/validation loss выше, момент расхождения кривых — это ровно та точка, где стоит прекратить обучение. Практически это реализуется отслеживанием validation loss на каждой эпохе и сохранением весов модели в точке её минимума (часто с «терпением», patience — числом эпох без улучшения, после которого обучение останавливается принудительно). Ранняя остановка — по сути дешёвая форма регуляризации: она не даёт оптимизатору времени на то, чтобы «дообучиться» до подгонки под шум.

Dropout. В нейросетях приём dropout на каждом шаге обучения случайным образом «выключает» (обнуляет) часть нейронов слоя с некоторой вероятностью $p$ (типично 0,2-0,5). Это не даёт отдельным нейронам чрезмерно «специализироваться» на запоминании конкретных обучающих примеров и вынуждает сеть распределять полезную информацию более избыточно и устойчиво по разным нейронам — на выводе (инференсе) dropout отключается, а веса масштабируются, чтобы компенсировать разницу.

Аугментация данных. В задачах с изображениями, звуком или текстом можно искусственно расширить обучающую выборку случайными преобразованиями исходных примеров (поворот, обрезка, изменение яркости изображения; синонимическая замена слов в тексте), которые не меняют истинную метку, но добавляют разнообразия и мешают модели зацепиться за случайные пиксельные или текстовые артефакты.

Ансамблирование. Методы вроде бэггинга (например, случайный лес) усредняют предсказания множества независимо обученных моделей с высокой дисперсией; усреднение снижает итоговую дисперсию ансамбля, не увеличивая существенно смещение — прямое практическое следствие формулы разложения ошибки.

Кросс-валидация. Подбор силы регуляризации, глубины дерева и других гиперпараметров, влияющих на сложность модели, надёжнее делать не на единственном валидационном разбиении, а через кросс-валидацию — подробно этот инструмент разбирается в уроке 306, но важно уже сейчас понимать: именно кросс-валидация даёт стабильную оценку того, где заканчивается разумная сложность модели и начинается переобучение.

Способы борьбы с недообучением

Усложнение модели. Прямая противоположность упрощению: увеличить глубину дерева, число слоёв и нейронов сети, степень полинома, перейти от линейной модели к модели с нелинейными взаимодействиями признаков (например, от линейной регрессии к градиентному бустингу).

Больше признаков и feature engineering. Если модель не способна уловить закономерность из-за того, что важная информация вообще не представлена во входных признаках, помогает добавление новых признаков — полиномиальных комбинаций существующих, агрегатов, доменных признаков, построенных на основе экспертного понимания задачи.

Меньше регуляризации. Если недообучение вызвано слишком большим $\lambda$, простое снижение коэффициента регуляризации возвращает модели свободу подгоняться под реальные закономерности данных.

Более долгое обучение. Иногда недообучение — не архитектурная проблема, а проблема недостаточного числа итераций: если и train loss, и validation loss всё ещё заметно убывают к концу заданного числа эпох, возможно, модели просто не дали доучиться, и первым шагом стоит попробовать увеличить число эпох, прежде чем усложнять архитектуру.

Снятие искусственных ограничений. Проверь, не установлен ли на модель слишком строгий явный лимит сложности — чрезмерно маленький max_depth у дерева, слишком узкое «бутылочное горлышко» в архитектуре автоэнкодера, слишком агрессивный дропаут для объёма имеющихся данных.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Модель показывает accuracy 62% на обучающей выборке и 60% на тестовой. Что это за проблема?


Задание 2: Модель показывает accuracy 98% на обучающей выборке и 71% на тестовой. Что это за проблема?


Задание 3: На графике обучения train loss монотонно убывает всё время, а validation loss убывает до эпохи 12, а затем начинает расти. В какой примерно точке стоит остановить обучение при использовании early stopping?


Задание 4: Какая степень полинома из набора {1, 3, 20} при подгонке под 10 обучающих точек с умеренным шумом с наибольшей вероятностью даст переобучение?


Задание 5: Линейная регрессия обучена на данных с истинной квадратичной зависимостью. Train MSE = 4,1, test MSE = 4,3. Это недообучение или переобучение?


Задание 6: Дерево решений обучено без ограничения max_depth на выборке из 200 примеров. Train accuracy = 100%. Какого поведения стоит ожидать на test accuracy и почему?


Задание 7: Назови составляющую ошибки (bias или variance), которая доминирует у модели k-NN при $k=1$.


Задание 8: Назови составляющую ошибки, которая доминирует у линейной модели, применённой к существенно нелинейной зависимости.


Задание 9: В Ridge-регрессии коэффициент регуляризации увеличили с $\lambda=0{,}01$ до $\lambda=1000$, и train accuracy упала с 95% до 55%, а test accuracy — с 80% до 54%. Что произошло?


Задание 10: Какая из формул связывает ожидаемую ошибку предсказания с bias, variance и шумом?

Продвинутые задания (11–20)

Задание 11: Три модели дали на одной и той же тестовой точке со средним истинным значением $f(x)=10$ следующие предсказания в трёх независимых экспериментах с разными обучающими выборками: модель A — 9,8 / 10,1 / 9,9 (среднее 9,93); модель B — 6,0 / 14,0 / 10,0 (среднее 10,0); модель C — 4,9 / 5,1 / 5,0 (среднее 5,0). Сопоставь каждой модели характер bias и variance.


Задание 12: Модель показывает следующие MSE по эпохам обучения: эпоха 5 — train 2,1, val 2,3; эпоха 20 — train 0,9, val 1,0; эпоха 50 — train 0,2, val 1,8; эпоха 100 — train 0,05, val 3,4. На какой примерно эпохе начинается переобучение?


Задание 13: У тебя есть датасет из 300 изображений и нейросеть с 5 миллионами параметров, обучаемая без какой-либо регуляризации. Train accuracy быстро достигает 100%, val accuracy застревает на 58%. Предложи минимум три конкретных способа улучшить ситуацию.


Задание 14: Логистическая регрессия на задаче с явно нелинейной границой классов показывает accuracy 61% на train и 60% на test. Предложи минимум два способа исправить ситуацию.


Задание 15: Для квадратичной функции потерь и модели $\hat{f}(x)$, обученной на трёх разных выборках, получены предсказания в точке $x_0$: 7, 9, 8. Истинное значение $f(x_0) = 8$. Посчитай Bias и Variance (используй среднее по трём значениям как оценку $E_D[\hat f(x_0)]$).


Задание 16: Для той же точки $x_0$ с истинным значением $f(x_0)=8$ другая модель на тех же трёх выборках даёт предсказания 12, 13, 11. Посчитай Bias и Variance.


Задание 17: Случайный лес (bagging над деревьями решений) обычно показывает меньшую variance, чем одно глубокое дерево решений, при сравнимом bias. Объясни, за счёт какого механизма это достигается.


Задание 18: Модель А регуляризована сильным L1-штрафом ($\lambda=5$) и показывает train MSE 3,0, test MSE 3,2. Модель Б без регуляризации на тех же данных показывает train MSE 0,1, test MSE 9,5. Какую модель стоит выбрать и почему, и что стоит попробовать дальше?


Задание 19: У нейросети train loss и val loss обе продолжают падать к концу заданных 30 эпох, не показывая признаков расхождения или выхода на плато. Это недообучение, переобучение или ни то, ни другое? Что делать дальше?


Задание 20: Объясни, почему увеличение объёма обучающей выборки обычно уменьшает variance модели, но почти не влияет на её bias.

Задания-челлендж (21–30)

Задание 21: У тебя датасет из 150 строк и 40 признаков. Ты обучаешь линейную регрессию без регуляризации и получаешь train $R^2 = 0{,}99$, test $R^2 = 0{,}20$. Объясни природу проблемы и предложи план действий из минимум четырёх шагов.


Задание 22: Опиши, как будет выглядеть кривая обучения (learning curve — зависимость ошибки от объёма обучающей выборки, а не от эпох) для модели с высоким bias и для модели с высокой variance.


Задание 23: Приведи пример из практики, где недообучение возникает не из-за архитектуры модели, а из-за проблемы с признаками, и объясни, как её выявить.


Задание 24: Модель градиентного бустинга с 1000 деревьями и глубиной каждого дерева 10 показывает подозрительно хороший train ROC-AUC = 0,999 и test ROC-AUC = 0,71 на бинарной классификации. Предложи минимум три конкретных гиперпараметра, которые стоит изменить, и в какую сторону.


Задание 25: Объясни своими словами, почему early stopping можно рассматривать как форму регуляризации, даже если явного штрафного слагаемого в функции потерь нет.


Задание 26: У тебя есть два эксперимента с одинаковой архитектурой сети и одинаковыми данными, отличающиеся только силой dropout: эксперимент A — dropout 0,1, train/val accuracy 96%/78%; эксперимент Б — dropout 0,5, train/val accuracy 85%/83%. Какой эксперимент предпочтительнее для деплоя и почему, а какие риски есть у второго при ещё большем dropout?


Задание 27: Дан набор из 6 точек с истинной линейной зависимостью $y=2x+1$ плюс небольшой шум. Обучены полином степени 1 и полином степени 5. У какого из них train MSE будет ниже и почему это не обязательно означает, что он лучше?


Задание 28: Опиши стратегию выбора числа эпох и коэффициента регуляризации одновременно, не полагаясь на единичное train/val разбиение, и объясни, зачем это нужно.


Задание 29: Приведи пример, когда очень простая модель (например, линейная регрессия) не переобучается практически никогда, даже на маленьких данных, а очень сложная модель (глубокая нейросеть) может переобучиться даже на относительно большом датасете. Объясни за счёт какого параметра это происходит.


Задание 30: Собери воедино: опиши по шагам, как ты будешь диагностировать и лечить проблему, если после первого обучения модели видишь train accuracy 99,5%, val accuracy 68%, а после снижения сложности модели val accuracy выросла до 74%, но всё ещё заметно отстаёт от train accuracy (92%).

Частые ошибки

Ошибка: «Высокий train accuracy — это всегда хорошо, чем ближе к 100%, тем лучше модель»

Правильно: сам по себе высокий train accuracy ничего не говорит о качестве модели в продакшне — важно смотреть на разрыв между train и validation метриками

💡 Почему: модель, идеально подогнанная под обучающую выборку, может оказаться совершенно бесполезной на новых данных — именно это и есть переобучение

Ошибка: «Если модель переобучилась, нужно просто обучать её меньше эпох, и точка»

Правильно: ранняя остановка — лишь один из инструментов; если разрыв train/val очень большой, часто требуется дополнительно регуляризация, больше данных или упрощение архитектуры

💡 Почему: одна ранняя остановка не устраняет избыточную ёмкость модели относительно объёма данных — она лишь ограничивает, как далеко модель успеет зайти в подгонке под шум

Ошибка: «Недообучение и переобучение — это выбор одной крайности из двух, и надо просто определиться»

Правильно: это два конца одного спектра сложности модели, и цель — найти оптимальную точку где-то посередине, а не выбрать один из полюсов

💡 Почему: компромисс bias-variance по своей природе непрерывен — оптимум чаще всего лежит не на краю диапазона сложности, а в его середине

Ошибка: «Регуляризация всегда полезна, поэтому её нужно добавлять по максимуму»

Правильно: избыточная регуляризация переводит модель из переобучения в недообучение — сила регуляризации сама является гиперпараметром, который нужно подбирать

💡 Почему: слишком большой коэффициент $\lambda$ заставляет модель занижать все веса вплоть до полной потери способности подстраиваться под реальную закономерность

Ошибка: «Достаточно один раз посмотреть на train/test метрики в конце обучения, чтобы понять всё»

Правильно: динамика по эпохам (кривая обучения) даёт гораздо больше информации, чем финальные числа — например, показывает момент, где начался разворот validation loss

💡 Почему: два прогона с одинаковыми финальными train/test числами могут иметь совершенно разную историю обучения, и только график покажет, где именно и почему пошло не так

Ошибка: «Переобучение — проблема только больших сложных моделей вроде глубоких нейросетей»

Правильно: переобучиться может даже простая модель, если данных крайне мало относительно числа параметров (как в примере с полиномом седьмой степени на восьми точках)

💡 Почему: переобучение определяется соотношением сложности модели и объёма данных, а не абсолютной «навороченностью» алгоритма самого по себе

Главное запомнить

✅ Недообучение (underfitting) — модель слишком простая, ошибка высокая и на train, и на test, кривые близки друг к другу

✅ Переобучение (overfitting) — модель слишком сложная относительно данных, ошибка низкая на train, но заметно выше на test

✅ Классический признак переобучения на графике: train loss продолжает убывать, а validation loss, достигнув минимума, начинает расти — расхождение кривых

✅ Ожидаемая ошибка раскладывается как $E[(y-\hat f(x))^2] = \mathrm{Bias}^2 + \mathrm{Variance} + \sigma^2$, и недообучение соответствует высокому bias, переобучение — высокой variance

✅ Численный пример с полиномами показывает суть наглядно: степень 1 — недообучение, степень, близкая к числу точек — переобучение, средняя степень — золотая середина

✅ Против переобучения работают: больше данных, регуляризация L1/L2, упрощение модели, ранняя остановка, dropout, аугментация, ансамблирование

✅ Против недообучения работают: усложнение модели, больше признаков, меньше регуляризации, более долгое обучение

✅ Ранняя остановка — это форма регуляризации: она ограничивает, как далеко оптимизатор успевает зайти в подгонке под шум обучающей выборки

✅ Соотношение сложности модели и объёма данных важнее абсолютной «навороченности» алгоритма — переобучиться может даже простая модель на слишком малых данных

✅ Диагностика начинается с разрыва между train- и validation-метриками — это самый надёжный практический сигнал состояния модели

Связь с темами курса

Что нужно было знать до этого урока

Этот урок напрямую опирается на уроки 301-303, где были заложены базовые понятия машинного обучения — что такое обучающая выборка, признаки, метки и чем supervised learning отличается от unsupervised. Без понимания того, что модель обучается на конкретной выборке и должна применяться затем к новым данным, сама постановка проблемы обобщения не имела бы смысла.

Что изучить дальше

Следующий урок 305 разбирает разбиение данных на train/validation/test — практический протокол, который позволяет честно измерять именно то расхождение между обучающей и тестовой ошибкой, о котором шла речь в этом уроке. Урок 306 про кросс-валидацию даст более надёжный способ оценивать эту разницу, когда данных не так много, чтобы просто «пожертвовать» большим куском под фиксированную валидацию.

Связь с L1/L2-регуляризацией и проксимальными методами

В уроке 291 про проксимальные методы ты уже видел механику Ridge- и Lasso-регуляризации на уровне формул: штраф $\lambda\|w\|_2^2$ сжимает веса к нулю плавно, а штраф $\lambda\|w\|_1$ благодаря излому в нуле способен занулять их точно, попутно отбирая признаки (мягкое пороговое отображение, soft thresholding). В контексте этого урока та же самая математика получает совершенно конкретную практическую цель: регуляризация — это один из главных рычагов управления положением модели на шкале bias-variance. Увеличивая $\lambda$, ты сдвигаешь модель в сторону большего bias и меньшей variance (в пределе — к недообучению при слишком большом $\lambda$, как было показано в задании 9); уменьшая $\lambda$, ты возвращаешь модели гибкость ценой роста variance (в пределе — к переобучению при $\lambda \to 0$ на сложной модели). Подбор оптимального $\lambda$ через кросс-валидацию — это буквально поиск минимума суммы $\mathrm{Bias}^2+\mathrm{Variance}$ по одному конкретному гиперпараметру.

Связь с ранней остановкой

Early stopping, представленная в этом уроке как реакция на расхождение train/validation loss, — ещё один инструмент управления той же самой шкалой, только не через штраф в функции потерь, а через число итераций оптимизации. У обоих механизмов общая логика: не дать оптимизатору «доехать» до точки, где обучающая ошибка была бы предельно низкой ценой абсолютной непригодности модели для новых данных. Именно поэтому регуляризацию и раннюю остановку часто комбинируют — например, тренируют сеть с dropout и L2-штрафом одновременно, отслеживая validation loss для финальной остановки.

Где это нужно в жизни

📈 Кредитный скоринг и антифрод. Модель, переобученная на исторических данных о мошеннических транзакциях, может идеально «предсказывать» прошлое, но пропускать новые схемы обмана, которых не было в обучающей выборке, — банки специально держат отдельные, регулярно обновляемые holdout-выборки для честной оценки.

🏥 Медицинская диагностика. Модель, переобученная на данных одной клиники (со специфическим оборудованием, протоколами съёмки снимков), может показывать блестящие метрики внутри этой клиники и полностью проваливаться при переносе на данные другой больницы — классический пример того, почему разрыв train/test критичен именно в областях с высокой ценой ошибки.

🛒 Рекомендательные системы. Модель, слишком точно подстроенная под историю кликов конкретных пользователей за прошлый месяц, рискует «зацикливать» рекомендации на уже просмотренном и терять способность предлагать релевантный новый контент — здесь баланс bias-variance напрямую влияет на бизнес-метрики вовлечённости.

🤖 Соревнования по машинному обучению (Kaggle). Одна из самых частых ловушек начинающих участников — подгонка модели под публичный лидерборд (public leaderboard), который сам по себе представляет лишь часть тестовых данных: модель, «переобученная» под паблик-скор, нередко резко падает в рейтинге на приватном лидерборде (private leaderboard) после его раскрытия.

Интересные факты

  • Феномен «double descent», описанный Михаилом Белкиным с соавторами в 2019 году, показывает, что классическая U-образная кривая bias-variance — не вся картина: для некоторых очень больших моделей (в первую очередь глубоких нейросетей) тестовая ошибка после точки, где модель начинает точно интерполировать все обучающие данные, может снова начать убывать при дальнейшем росте числа параметров — открытие, заставившее заново обсуждать интуицию о переобучении применительно к современным гигантским моделям.

  • Классический эксперимент по переобучению можно провести буквально вручную на бумаге: через любые $n$ точек общего положения на плоскости можно провести полином степени $n-1$, проходящий точно через каждую из них, — это чисто алгебраический факт (решение системы линейных уравнений относительно коэффициентов), не имеющий отношения к «интеллекту» модели, но объясняющий, почему высокая степень полинома при малом числе точек детерминированно даёт нулевую обучающую ошибку.

  • VC-размерность, введённая Вапником и Червоненкисом, позволяет доказать теоретические границы генерализации даже без привязки к конкретному распределению данных: например, для класса линейных классификаторов в $d$-мерном пространстве VC-размерность равна $d+1$, что даёт строгую математическую причину, почему линейным моделям для надёжного обобщения требуется данных пропорционально меньше, чем моделям с гораздо большей VC-размерностью.

  • В соревнованиях Kaggle разница между public и private лидербордом — это, по сути, наглядная иллюстрация переобучения на уровне выбора модели (не только её параметров): участники, слишком агрессивно подбирающие решение под видимую часть тестовых данных, регулярно занимают призовые места в публичном рейтинге и резко проваливаются после раскрытия закрытой части — явление настолько известное, что получило собственное прозвище «shake-up».

Лайфхаки

  • Всегда строй график train и validation loss/accuracy по эпохам, а не смотри только на финальные числа — момент расхождения кривых расскажет о переобучении гораздо раньше и точнее, чем одна итоговая метрика.

  • Если у тебя мало данных и модель показывает подозрительно идеальный train score, в первую очередь проверь соотношение числа параметров модели к числу обучающих примеров — часто перед тобой не «прорыв», а буквально аналог полинома седьмой степени на восьми точках.

  • Не путай регуляризацию гиперпараметра с архитектурными решениями: если после увеличения $\lambda$ и train, и val метрики одновременно и сильно просели — ты перешёл границу между лечением переобучения и созданием недообучения, стоит вернуться на шаг назад.

  • Используй раннюю остановку с разумным «терпением» (patience), а не жди первого же ухудшения val loss на одну эпоху — небольшие колебания на графике нормальны из-за случайности стохастического обучения, и слишком нервная остановка может прервать обучение раньше оптимума.

  • Перед тем как усложнять архитектуру модели при подозрении на недообучение, сначала исключи более простые причины: возможно, не хватает числа эпох обучения, признаки закодированы плохо (не нормализованы, содержат ошибки), или регуляризация выставлена слишком агрессивно — усложнение архитектуры должно быть последним шагом, а не первым рефлексом.

  • Держи в голове мишень для дартса как быстрый ментальный тест при разборе любого нового результата модели: спроси себя не «насколько точна модель в среднем», а отдельно «насколько она смещена» и «насколько она нестабильна от выборки к выборке» — это сразу подскажет, в какую сторону двигать сложность.

Переобучение и недообучение — это не разовая техническая деталь, которую можно один раз выучить и забыть, а линза, через которую полезно смотреть на буквально каждую модель, которую ты когда-либо обучишь. Умение с первого взгляда на график train/validation loss понять, что происходит с моделью, и знание конкретного набора инструментов для каждой из двух проблем — это тот практический навык, который отличает уверенного практика от новичка, радующегося случайному стопроцентному train accuracy. В следующем уроке ты увидишь, как правильно организовать сами данные — через разбиение на train, validation и test, — чтобы иметь возможность честно измерять именно тот разрыв между обучением и обобщением, о котором шла речь здесь.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!