Overfitting
Переобучение возникает, когда модель запоминает обучающие данные, включая шум, и не справляется с новыми данными. Узнай, как его выявить и какие методы помогают его предотвратить.
Переобучение возникает, когда модель машинного обучения настолько точно подстраивается под обучающие данные, что усваивает шум и особенности именно этих примеров наряду с реальными закономерностями. Переобученная модель хорошо оценивается на данных, на которых обучалась, и заметно хуже — на новых данных; величина этого разрыва показывает степень переобучения. В терминах смещения и дисперсии переобучение означает высокую дисперсию: предсказания модели слишком сильно зависят от конкретных примеров, которые ей довелось увидеть.
Как распознать переобучение#
Характерный признак — растущий разрыв между результатами на обучающих и валидационных данных. На кривых обучения, построенных по эпохам, ошибка на обучении продолжает снижаться, а ошибка на валидации сначала выходит на плато, а затем растет; валидационные метрики, такие как средняя точность (mAP), перестают улучшаться или ухудшаются. В классическом примере небольшого масштаба к 12 зашумленным точкам, взятым из синусоиды, подгоняют полиномы двух разных степеней:
import numpy as np
from numpy.polynomial import Polynomial
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, 12)
y_train = np.sin(2 * np.pi * x_train) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)
y_test = np.sin(2 * np.pi * x_test)
for degree in (3, 9):
fit = Polynomial.fit(x_train, y_train, degree)
train_mse = np.mean((fit(x_train) - y_train) ** 2)
test_mse = np.mean((fit(x_test) - y_test) ** 2)
print(f"Degree {degree:2d}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}")Полином 9-й степени достаточно гибкий, чтобы подстроиться под шум: ошибка на обучении снижается с 0.0356 до 0.0148, но ошибка на тесте вырастает в десять раз — с 0.0182 до 0.1859.
Переобучение и недообучение#
Недообучение — противоположная проблема: модель слишком проста или обучалась слишком мало, чтобы уловить закономерности в данных, поэтому она плохо работает и на обучающих, и на валидационных данных. Сравнение ошибок помогает различить эти случаи и выбрать разные способы исправления.
Распространённые причины#
- Слишком высокая емкость модели для имеющихся данных: Нейронная сеть с миллионами параметров может просто запомнить несколько сотен изображений.
- Шумные или неверно размеченные данные: Пропущенные рамки, неправильные классы и выбросы дают модели ошибки для подгонки, которых в реальном мире нет.
- Слишком долгое обучение: После усвоения полезных закономерностей дополнительные эпохи в основном подгоняют оставшийся шум.
- Ограниченный набор обучающих данных: Детектор, обученный только на дневных изображениях с одной камеры, может привязаться к фону и освещению этой камеры и не распознавать объекты на новом участке.
Как предотвратить переобучение#
- Больше и разнообразнее данных: Дополнительные реальные примеры — самое прямое решение, а аугментация данных увеличивает разнообразие за счет отражения, масштабирования, перекрашивания и смешивания существующих изображений.
- Регуляризация: Затухание весов штрафует большие значения весов, а дропаут случайным образом отключает нейроны во время обучения, не позволяя какой-либо одной характеристике стать незаменимой.
- Меньшие или предварительно обученные модели: У меньшей модели меньше возможностей для запоминания, а перенос обучения с замороженными ранними слоями сокращает число весов, которые нужно обучить на небольшом наборе данных.
- Ранняя остановка: Оценка на валидационных данных после каждой эпохи и остановка обучения, когда результат перестает улучшаться, не дают модели продолжать обучение на шуме.
- Честная оценка: Кросс-валидация дает более надежную оценку ошибки обобщения на небольших наборах данных, а отдельная тестовая выборка выявляет переобучение на валидационных данных при подборе гиперпараметров.
В обучении Ultralytics YOLO ранняя остановка настраивается аргументом patience: запуск завершается, если валидационная метрика качества не улучшается в течение указанного числа эпох (для детекции это mAP50-95), а веса лучшей эпохи сохраняются как best.pt, даже если обучение продолжается до конца.
from ultralytics import YOLO
# Загрузи предварительно обученную модель YOLO26n
model = YOLO("yolo26n.pt")
# Разрешить до 100 эпох, но остановить обучение после 20 эпох без улучшения на валидации
results = model.train(data="coco8.yaml", epochs=100, patience=20)Значение по умолчанию — patience=100; для наборов данных менее чем с 1 000 изображений в рекомендациях по дообучению YOLO26 предлагается epochs=50 с patience=20.
Переобучение и смежные понятия#
- Утечка данных: пересечение обучающих и оценочных данных, скрывающее переобучение. Если почти идентичные кадры одного видео попадают и в обучающую, и в валидационную выборки, модель, запомнившая обучающий набор, всё равно хорошо показывает себя на валидации, а проблема обнаруживается только после развёртывания. Разбиение по видео или сценам предотвращает это.
- Обучение на поверхностных признаках: Модель опирается на ложный признак, например водяной знак или фон, присутствующий и в обучающих, и в валидационных данных. Результаты на валидации выглядят хорошими, но модель не справляется с новыми данными, где этого признака нет.










