Проблема урокаВ уроке 1.4.2 мы научились описывать обучение как минимизацию функции потерь. Но если обучающая ошибка становится очень маленькой, означает ли это, что модель действительно научилась решать задачу? Не обязательно. Слишком простая модель может не уловить закономерность, а слишком сложная — запомнить особенности конкретной выборки. Разберём, как диагностировать обе проблемы.
Что уже известноВы уже знаете, как модель использует параметры, что такое функция потерь и зачем данные разделяют на обучающую, проверочную и тестовую выборки. Здесь мы используем эти понятия, чтобы оценивать не только качество подгонки, но и способность модели работать с новыми объектами.

Результаты обучения

1. Две ошибки вместо одной

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

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

Потеря на обучающей выборкеJ_train(θ) = (1 / n_train) Σ ℓ(yᵢ, f(xᵢ; θ))
Обучающие точкиСлишком просто, Хорошее соответствие, Подгонка под шумОбучающие точкиСлишком простоХорошее соответствиеПодгонка под шум
Слишком просто · Хорошее соответствие · Подгонка под шум

2. Недообучение: модель не уловила закономерность

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

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

Потеря на проверочной выборкеJ_val(θ) = (1 / n_val) Σ ℓ(yⱼ, f(xⱼ; θ))

3. Приемлемое обучение: закономерность переносится

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

Проверочная ошибка не обязана быть ниже обучающей. Регуляризация, dropout и другие методы могут намеренно усложнять поведение модели во время обучения, поэтому train loss иногда оказывается выше. Сравнивайте значения в контексте конкретного алгоритма и одинакового способа вычисления метрики.

4. Переобучение: модель подстроилась под выборку

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

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

Train loss / Validation lossЛучшая эпохаЭпохи обученияTrain lossValidation lossЛучшая эпоха
Train loss and Validation loss can move in different directions as training continues.

5. Кривые обучения и ранняя остановка

По мере обучения train loss часто продолжает уменьшаться. Validation loss сначала может снижаться, а затем перестать улучшаться и начать расти. Это один из типичных сценариев переобучения. Ранняя остановка (early stopping) выбирает момент, когда проверочная метрика достигла лучшего значения, и восстанавливает соответствующие параметры модели.

Нельзя выбирать эпоху по тестовой выборке. Для early stopping используется validation-набор или внутренний механизм валидации. На практике задают patience — сколько эпох ждать улучшения, — чтобы не реагировать на единичное колебание. Если validation loss шумный, полезно смотреть на динамику и повторяемость, а не на один скачок.

Разрыв обобщенияΔ = J_val − J_train

6. Сложность модели: компромисс, а не соревнование

Увеличение сложности часто позволяет лучше подогнать обучающие данные, поэтому train error обычно снижается. Но validation error может сначала уменьшаться, а после некоторой точки расти: модель начинает описывать случайные особенности выборки. Это иллюстрация компромисса между смещением (bias) и разбросом (variance), а не универсальный закон для каждой модели и датасета.

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

Сложность моделиОшибкаСложность моделиTrainValidation
Train error may keep falling while Validation error rises after the useful complexity range.

7. Что делать: сначала диагноз, затем метод

Если высоки и train, и validation loss, проверьте недостаточную выразительность модели, признаки, регуляризацию и сходимость оптимизации. Если train loss низкий, а validation loss заметно выше или растёт, проверьте утечку, шум и различия выборок; затем рассмотрите упрощение модели, регуляризацию, больше разнообразных данных, аугментацию или early stopping.

Не применяйте все способы одновременно. Меняйте один фактор за раз, фиксируйте validation-протокол и сравнивайте результат. Дополнительные данные помогают не всегда: они должны быть релевантными и представлять будущие условия. Регуляризация тоже не универсальное лекарство — слишком сильная регуляризация может вернуть модель к недообучению.

Регуляризованная цель обученияJ_total(θ) = J_train(θ) + λ Ω(θ)
Проверить разбиениеПроверить разбиение → Сравнить train / validation → Найти причину → Изменить один факторПроверитьразбиениеСравнить train /validationНайтипричинуИзменить одинфактор
Проверить разбиение → Сравнить train / validation → Найти причину → Изменить один фактор

8. Небольшой эксперимент с полиномиальной моделью

Сравним модели разной сложности на одной синтетической задаче. Линейная модель может оказаться слишком простой для волнообразной зависимости; полином умеренной степени способен описать её лучше; полином высокой степени может начать реагировать на шум и отдельные точки. Конкретные значения зависят от случайного разбиения — поэтому важно сравнивать train и validation, а не объявлять одну степень универсально лучшей.

В примере validation используется для выбора сложности. После выбора подхода итоговую оценку следует выполнить на отдельной test выборке, которая не участвовала в подборе. В реальной работе также проверяют несколько разбиений или используют кросс-валидацию, если объём данных позволяет.

Пример: сравнение полиномиальных моделей разной сложности

Python · NumPy · scikit-learn
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

rng = np.random.default_rng(7)
X = np.sort(rng.uniform(0, 1, 36)).reshape(-1, 1)
y = np.sin(2 * np.pi * X[:, 0]) + rng.normal(0, 0.18, len(X))

X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.25, random_state=7
)

for degree in (1, 4, 12):
    model = make_pipeline(
        PolynomialFeatures(degree=degree, include_bias=False),
        LinearRegression()
    )
    model.fit(X_train, y_train)
    train_mse = mean_squared_error(y_train, model.predict(X_train))
    val_mse = mean_squared_error(y_val, model.predict(X_val))
    print(degree, round(train_mse, 3), round(val_mse, 3))

Первая колонка — степень полинома, затем MSE на обучающей и проверочной выборках. С ростом степени обучающая ошибка может снижаться, но проверочная не обязана следовать за ней. Запустите пример несколько раз с другим random_state и сравните устойчивость. Не используйте validation как окончательный test.

Практическое задание

Посмотрите на два эксперимента. В первом train loss = 0.42 и validation loss = 0.45; во втором train loss = 0.08 и validation loss = 0.91. При одинаковой метрике и сопоставимых выборках второй случай требует проверки на переобучение. Но прежде чем менять архитектуру, убедитесь, что разбиение корректно, нет утечки и validation набор отражает ожидаемые условия.

Источники и дополнительное чтение

Словарь урока

01НедообучениеUnderfitting

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

02ПереобучениеOverfitting

Подстройка модели под частные особенности и шум обучающей выборки в ущерб работе на новых данных.

03ОбобщениеGeneralization

Способность модели сохранять качество на новых объектах из целевой области применения.

04Обучающая потеряTraining loss

Значение функции потерь на данных, использованных для подбора параметров.

05Проверочная потеряValidation loss

Значение функции потерь на отдельной выборке для выбора модели и настройки.

06Разрыв обобщенияGeneralization gap

Разница между ошибкой на проверочных и обучающих данных при сопоставимом измерении.

07Сложность моделиModel capacity

Способность семейства моделей выражать разнообразные зависимости.

08СмещениеBias

Систематическая ошибка, связанная с ограничениями модели или предположениями.

09ДисперсияVariance

Чувствительность обученного результата к изменениям обучающей выборки.

10Ранняя остановкаEarly stopping

Остановка обучения по динамике validation-метрики с сохранением лучшего состояния.

Самопроверка

Вопрос 1

Если train loss и validation loss оба высоки, что вероятнее всего следует проверить первым?

Вопрос 2

Какой сигнал типичен для переобучения?

Вопрос 3

Для чего используют validation выборку?

Вопрос 4

Почему не следует многократно подбирать модель по test выборке?

Вопрос 5

Что может уменьшить переобучение?

Вопрос 6

Что означает большой generalization gap?

Вопрос 7

Какое действие может помочь при недообучении?

Вопрос 8

Правда ли, что низкая train loss доказывает хорошее качество на новых данных?