Ensemble
Ансамблевое обучение объединяет предсказания нескольких моделей с помощью бэггинга, бустинга или стекинга, добиваясь меньшей ошибки, чем у каждой модели по отдельности.
Ансамблевое обучение обучает несколько моделей для одной задачи и объединяет их предсказания голосованием, усреднением или обучаемым комбинирующим алгоритмом в один результат, который обычно точнее и стабильнее результата любой отдельной модели. Это работает, потому что разные модели допускают разные ошибки, а их объединение устраняет часть ошибок каждой из них. В 1995 году Андерс Кро и Йеспер Веделсби строго доказали это для усреднённых регрессионных моделей: квадратичная ошибка ансамбля равна средней ошибке его моделей за вычетом среднего расхождения между ними и ансамблем. Следовательно, усреднённый ансамбль никогда не уступает средней модели, а улучшение обеспечивается разнообразием моделей ансамбля.
Бэггинг, бустинг и стекинг#
Большинство ансамблей в машинном обучении относятся к трём семействам, каждое из которых по-разному влияет на компромисс между смещением и дисперсией.
Бэггинг, сокращение от bootstrap aggregating, предложил Лео Брейман в 1996 году. Он независимо обучает каждую модель на бутстрэп-выборке, полученной из обучающего набора с возвращением, а затем усредняет результаты или выбирает ответ голосованием, что главным образом уменьшает дисперсию. Бэггинг подходит для нестабильных моделей, например глубоких деревьев решений, а в случайном лесе Бреймана 2001 года при каждом разбиении дополнительно выбирается случайное подмножество признаков, чтобы деревья были ещё менее похожи друг на друга.
Бустинг обучает модели последовательно: каждая следующая сосредоточена на ошибках ансамбля, накопленных к этому моменту, что в основном уменьшает смещение. AdaBoost, созданный Йоавом Фройндом и Робертом Шапире, повышает вес неправильно классифицированных примеров перед обучением следующего слабого алгоритма. Градиентный бустинг Джерома Фридмана подбирает каждое новое дерево по градиенту функции потерь. Этот подход лежит в основе XGBoost, LightGBM и CatBoost — моделей, которые по-прежнему показывают лучшие результаты на многих табличных наборах данных.
Стекинг, или обобщение с помощью стекинга, предложил Дэвид Волперт в 1992 году. Мета-модель, часто логистическая регрессия, учится объединять разнородные базовые модели по их предсказаниям на отложенных фолдах и придаёт больший вес тем моделям, чьи предсказания на отложенных данных надёжнее всего.
В этом примере scikit-learn сравниваются одиночное дерево и по одному ансамблю каждого семейства на наборе данных о диагностике рака молочной железы с использованием 5-кратной перекрёстной проверки:
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
X, y = load_breast_cancer(return_X_y=True) # 569 tumors, 30 measurements each
forest = RandomForestClassifier(n_estimators=200, random_state=0)
boosting = GradientBoostingClassifier(random_state=0)
models = {
"Single decision tree": DecisionTreeClassifier(random_state=0),
"Bagging (random forest)": forest,
"Boosting (gradient boosting)": boosting,
# Stacking: a logistic regression learns how to combine the forest and the boosted trees
"Stacking": StackingClassifier([("forest", forest), ("boosting", boosting)], LogisticRegression()),
}
for name, model in models.items():
print(f"{name}: {cross_val_score(model, X, y, cv=5).mean():.3f}")Одиночное дерево показывает результат 0.917, случайный лес — 0.960, градиентный бустинг — 0.963, а стекинг — 0.963. Каждый ансамбль примерно вдвое сокращает ошибку дерева. Стекинг сравнялся с более сильной моделью: 16 из 23 опухолей, ошибочно классифицированных случайным лесом, также неверно классифицируют модели бустинга, поэтому мета-модели почти нечего использовать для устранения разногласий.
Ансамбли в глубоком обучении и компьютерном зрении#
Глубокие ансамбли обучают несколько нейронных сетей с разными случайными начальными значениями и усредняют их выходные данные. В 2017 году Баладжи Лакшминараянан и его коллеги из DeepMind показали, что это повышает точность и улучшает оценку неопределённости, поскольку модели сильнее всего расходятся на входных данных, не похожих на обучающие. В обнаружении объектов объединяют ограничивающие рамки нескольких детекторов с помощью подавления немаксимумов (NMS) или объединения ограничивающих рамок с весами, которое усредняет пересекающиеся рамки, а не оставляет только рамку с наибольшей уверенностью. Ансамбли разных архитектур часто используют в анализе медицинских изображений и конкурсных решениях, где точность важнее стоимости инференса.
Стоимость растёт с каждым участником ансамбля, что ограничивает его применение на устройствах периферийного ИИ. Дистилляцию знаний отчасти предложили как решение этой проблемы: Джеффри Хинтон, Ориол Виньялс и Джефф Дин обучали одну модель воспроизводить усреднённые выходные данные ансамбля. Более дешёвая альтернатива — Dropout: обучение с ним приблизительно эквивалентно усреднению экспоненциального числа прореженных подсетей.
Ансамбли, супы моделей и смеси экспертов#
Ансамбль моделей обычно означает объединение отдельно обученных сетей на этапе инференса — наиболее распространённый в глубоком обучении вид ансамблевого обучения. Супы моделей и другие методы объединения моделей усредняют веса, а не предсказания. Это позволяет сохранить стоимость одной модели, но работает только для моделей, дообученных на одних и тех же предобученных весах. Смесь экспертов (MoE) обучает экспертов совместно с маршрутизатором, который направляет каждый вход лишь нескольким из них, поэтому эксперты специализируются, а не решают каждый всю задачу целиком.
Как показали Павел Измайлов и его коллеги в 2018 году, усреднение весов в ходе одного запуска обучения приближает ансамбль контрольных точек этого запуска при стоимости одной модели. Обучение Ultralytics YOLO использует этот подход при каждом запуске YOLO26: оно поддерживает экспоненциальное скользящее среднее весов, обновляемое после каждого шага оптимизатора с коэффициентом затухания, постепенно растущим до 0.9999. Среднее значение используется для проверки и сохраняется в best.pt и last.pt вместо исходных весов.










