Model Ensemble
模型集成将多个模型的预测组合成一个更准确、更稳健的输出。内容涵盖投票、平均、框融合和权衡。
模型集成会通过投票、平均或学习得到的组合方式,将多个训练模型的预测合并为一个输出,从而抵消各个模型的错误。当集成成员犯下不同错误时,集成模型会比其中表现最好的成员更准确、更稳健,这也是集成方法在机器学习竞赛中占据主导地位的原因:Netflix Prize 于 2009 年由一个融合多个模型预测结果的团队获胜;而赢得 2012 年 ImageNet 挑战赛的深度学习方案,则通过平均七个卷积网络的预测结果,将 top-5 错误率降至 15.3%。其代价是计算开销:每个成员都要处理每个输入,因此内存用量和推理延迟会随着集成规模增大。
模型集成的工作原理#
只有当集成成员犯下不同错误时,集成才有帮助。对误差相互独立的模型输出取平均,可以降低组合预测的方差;而在相同输入上失效的模型,组合起来几乎没有收益。装袋法通过让每个成员在训练数据的随机重采样上训练来增加多样性,例如由决策树组成的随机森林;提升法则训练每个新成员来纠正前序成员的错误,例如 XGBoost和 LightGBM。深度集成会使用不同随机种子训练同一个神经网络的多个副本,而这些模型预测结果的离散程度也能衡量模型的不确定性。组合不同架构(例如卷积神经网络和视觉 Transformer)会带来不同的归纳偏置,使成员的错误相关性更低。
组合规则取决于各成员的输出类型:
未剪枝的决策树等高方差模型最能从集成中受益。这个 scikit-learn示例训练了五棵仅随机种子不同的树,并对它们预测的概率取平均:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# Five decision trees that differ only in their random seed, which changes the features each split considers
trees = [DecisionTreeClassifier(max_features="sqrt", random_state=seed) for seed in range(5)]
for tree in trees:
tree.fit(X_train, y_train)
print("Single trees:", ", ".join(f"{tree.score(X_test, y_test):.3f}" for tree in trees))
# Ensemble: average the predicted class probabilities and pick the most likely class
probabilities = np.mean([tree.predict_proba(X_test) for tree in trees], axis=0)
accuracy = (probabilities.argmax(axis=1) == y_test).mean()
print(f"Ensemble of 5: {accuracy:.3f}")在 899 张留出的数字图像上,单棵树的得分介于 0.736 和 0.805 之间,而五棵树组成的集成得分为 0.901,高于任何单个成员,因为每棵树都在不同图像上出错。
目标检测器集成#
目标检测集成还必须合并边界框:多个模型通常会在略有不同的位置检测到同一个物体。最简单的方法是汇集所有模型的边界框并应用非极大值抑制 (NMS),保留每组重叠框中置信度最高的边界框。加权框融合则会根据置信度对重叠框的坐标进行加权平均,使每个模型都能参与确定最终位置。Ultralytics YOLO26在预测过程中集成了类似功能:使用 augment=True时,检测器会以原始尺寸、83% 和 67% 的比例处理图像,其中 83% 尺寸的图像还会进行左右翻转,然后通过 NMS 合并三组边界框。以下示例以相同方式集成两个尺寸不同的 YOLO26 模型:
import torch
from torchvision.ops import batched_nms
from ultralytics import YOLO
# Two YOLO26 models of different sizes make different mistakes
models = [YOLO("yolo26n.pt"), YOLO("yolo26s.pt")]
results = [model("https://ultralytics.com/images/bus.jpg")[0] for model in models]
# Pool the boxes from both models
boxes = torch.cat([result.boxes.xyxy for result in results])
scores = torch.cat([result.boxes.conf for result in results])
classes = torch.cat([result.boxes.cls for result in results])
# Keep the highest-scoring box in each overlapping group of the same class
keep = batched_nms(boxes, scores, classes, iou_threshold=0.5)
print(f"{len(boxes)} boxes from both models, {len(keep)} after fusion")两个模型都检测到的边界框会合并为一个,而仅由一个模型检测到的物体也会保留下来;这就是检测器集成提高召回率的方式。
应用场景#
- 医学图像分析:诊断模型会组合多个网络以提高灵敏度,而成员之间的预测分歧会标记出需要放射科医生复核的病例。
- 竞赛与基准测试:Kaggle 和类似排行榜上的获胜方案通常会对采用不同架构、随机种子和数据折训练的模型取平均,因为准确率的提升足以抵消额外的计算开销。
- 自动驾驶汽车:感知系统会组合各有所长的模型,例如基于摄像头的检测器和基于激光雷达的检测器;一个模型漏掉的物体仍可能被另一个检测到。
模型集成与相关术语的比较#
- 集成学习:整体技术的同义词。“模型集成”通常指最终组合起来的模型集合。
- 模型合并:将兼容模型的权重取平均,合并为一个网络,之后只需付出单个模型的运行成本。
- 专家混合模型 (MoE):由学习得到的路由器将每个输入分配给少数专家子网络,从而在不让每位专家都处理每个输入的情况下增加模型容量。
- 知识蒸馏:训练单个学生模型模仿教师模型,教师模型可以是完整的集成模型。Geoffrey Hinton、Oriol Vinyals 和 Jeff Dean 在 2015 年发表的蒸馏论文中,将一个语音识别模型集成压缩为单个模型,同时保留了集成模型的大部分性能提升。










