Bias-Variance Tradeoff
Компромисс между смещением и разбросом разбивает ожидаемую ошибку предсказания на смещение, разброс и шум, объясняя, почему не справляются и слишком простые, и слишком сложные модели.
Компромисс между смещением и дисперсией описывает, как ожидаемая ошибка модели на новых данных распадается на две части, которые противоположным образом зависят от сложности модели. Смещение — это ошибка, возникающая из-за слишком упрощенных предположений, не позволяющих уловить реальную закономерность, что приводит к недообучению. Дисперсия — это ошибка, вызванная чувствительностью к конкретным обучающим данным, что приводит к переобучению. Повышение гибкости модели обычно уменьшает смещение и увеличивает дисперсию, поэтому минимальная суммарная ошибка достигается при промежуточной сложности. Стюарт Геман, Эли Биненсток и Рене Дурсата применили эту идею к машинному обучению в статье 1992 года «Нейронные сети и дилемма смещения/дисперсии».
Разложение ошибки#
Для разложения берут один и тот же тип модели и обучают его много раз, каждый раз на новом обучающем наборе из того же источника. При квадратичной ошибке ожидаемая ошибка в заданной точке точно раскладывается на три слагаемых. Квадрат смещения — это квадрат разницы между истинным значением и средним предсказанием по всем таким обучающим наборам; у линейной регрессии, примененной к нелинейной зависимости, смещение остается высоким независимо от объема данных. Дисперсия показывает, насколько предсказания разбросаны вокруг собственного среднего от одного обучающего набора к другому; у глубоких деревьев решений и больших нерегуляризованных нейронных сетей она высока. Третье слагаемое, неустранимый шум, — это случайность в самих метках, которую не может убрать ни одна модель.
Повторное обучение позволяет напрямую измерить оба слагаемых. В этом примере на NumPy полиномы степеней 1, 3 и 12 обучаются на 1 000 наборах по 20 зашумленных точек синусоиды:
import numpy as np
rng = np.random.default_rng(0)
x = np.linspace(0, 1, 20) # 20 training inputs, evenly spaced
x_test = np.linspace(0, 1, 200)
true_curve = np.sin(2 * np.pi * x_test)
for degree in [1, 3, 12]:
# Fit the same polynomial degree to 1,000 training sets that differ only in their label noise
predictions = []
for _ in range(1000):
y = np.sin(2 * np.pi * x) + rng.normal(0, 0.3, x.size)
predictions.append(np.polyval(np.polyfit(x, y, degree), x_test))
predictions = np.array(predictions)
# Bias^2: squared gap between the average fit and the truth; variance: spread of fits around their average
bias_sq = np.mean((predictions.mean(axis=0) - true_curve) ** 2)
variance = np.mean(predictions.var(axis=0))
print(f"Degree {degree:2d}: bias^2 = {bias_sq:.3f}, variance = {variance:.3f}")Для прямой квадрат смещения равен 0,205, а дисперсия — всего 0,008. Кубический полином почти точно аппроксимирует синусоиду в среднем: квадрат смещения снижается до 0,005, а дисперсия удваивается до 0,016. У полинома степени 12 измеримое смещение отсутствует, но дисперсия составляет 0,074, потому что кривая подстраивается под шум в каждом примере. У кубического полинома минимальная суммарная ошибка, и каждая модель также несет неустранимую дисперсию шума, равную 0,09.
Как определить смещение и дисперсию#
Ошибки на обучающей и валидационной выборках показывают, какое слагаемое преобладает. Высокая ошибка на обеих выборках указывает на смещение. Низкая ошибка на обучающей выборке и намного более высокая на валидационной указывают на дисперсию. Кривые обучения, на которых обе ошибки сопоставлены с объемом обучающих данных, позволяют различить эти случаи: разрыв у модели с высокой дисперсией сокращается по мере роста объема данных, а две кривые модели с высоким смещением быстро сходятся к высокой ошибке и остаются там. В процессе обучения Ultralytics YOLO аргумент fraction задает обучение на части обучающей выборки, например на fraction=0.25 первых изображениях, составляющих четверть набора, тогда как для валидации используется вся валидационная выборка. Поэтому несколько запусков YOLO26 на возрастающих долях данных позволяют построить кривую обучения для пользовательского набора данных.
Как управлять компромиссом#
Дисперсию снижают увеличение объема данных, аугментация данных, регуляризация, например уменьшение весов и дропаут, ранняя остановка, а также усреднение множества моделей, как в бэггинге и случайных лесах. Смещение снижают увеличение модели, более развитая разработка признаков, ослабление регуляризации, более длительное обучение и бустинг, который добавляет модели для исправления ошибок текущего ансамбля. Настройка гиперпараметров и кросс-валидация помогают выбрать настройки, при которых оба слагаемых сбалансированы на отложенных данных.
Классическая U-образная кривая тестовой ошибки в зависимости от сложности применима к фиксированному семейству моделей, например к полиномам возрастающей степени. Сильно переопараметризованные нейронные сети могут выйти за ее пределы: тестовая ошибка растет по мере приближения модели к размеру, достаточному для точной подгонки под каждую обучающую точку, а затем снова снижается при дальнейшем увеличении модели. Этот эффект называется двойным спуском. Смещение и дисперсия по-прежнему складываются в ошибку, но дисперсия больше не растет равномерно с числом параметров.
Статистическое смещение и другие виды смещения#
Смещение в этом компромиссе — это свойство алгоритма обучения применительно к задаче. Смещение в ИИ означает систематическую несправедливость по отношению к группам людей, а смещение набора данных — несоответствие обучающих данных условиям развертывания, например когда ночных записей дорожного движения недостаточно. Статистическое смещение модели может быть низким, но модель все равно может быть несправедливой: она способна точно подстроиться под искаженный набор данных, включая его искажения.










