Model Ensemble
モデルアンサンブルは、複数のモデルの予測を組み合わせ、より高精度で堅牢な1つの出力を生成します。投票、平均化、ボックス融合、トレードオフを解説します。
モデルアンサンブルは、複数の学習済みモデルの予測を、投票、平均、または学習済みの組み合わせによって1つの出力に統合し、個々のモデルの誤りを相殺する手法です。構成モデルの間で誤りが異なれば、アンサンブルは最良の構成モデルよりも高精度で頑健になります。そのため、アンサンブルは機械学習のコンペティションで広く使われています。Netflix Prizeでは、2009年に多数のモデルの予測を組み合わせたチームが優勝しました。また、2012年のImageNetチャレンジで優勝したディープラーニングのエントリーは、7つの畳み込みネットワークの予測を平均し、top-5エラー率15.3%を達成しました。代償は計算コストです。すべての入力に対して各構成モデルを実行するため、アンサンブルの規模が大きいほどメモリ使用量と推論レイテンシが増加します。
モデルアンサンブルの仕組み#
アンサンブルの効果が得られるのは、構成モデルが異なる誤りをする場合に限られます。誤差が独立したモデルの出力を平均すると、予測を組み合わせたときの分散は小さくなります。一方、同じ入力で誤るモデル同士を組み合わせても、効果はほとんどありません。バギングでは、ランダムフォレストの決定木のように、学習データをランダムに再サンプリングして各モデルを学習することで多様性を生み出します。ブースティングでは、XGBoostやLightGBMのように、新しいモデルが前のモデルの誤りを修正するよう学習します。ディープアンサンブルでは、1つのニューラルネットワークを異なる乱数シードで複製して学習し、予測のばらつきからモデルの不確実性も測定できます。畳み込みニューラルネットワークとビジョントランスフォーマーのように異なるアーキテクチャを組み合わせると、帰納バイアスが異なるモデルがそろい、誤差の相関を低くできます。
組み合わせ方法は、構成モデルの出力形式によって異なります。
枝刈りしていない決定木など、分散の高いモデルは特に効果を得られます。このscikit-learnの例では、乱数シードだけが異なる5つの決定木を学習し、予測確率を平均します。
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の範囲ですが、5つすべてを組み合わせたアンサンブルは0.901で、どの構成モデルよりも高くなります。これは、各決定木が異なる画像で誤るためです。
物体検出器のアンサンブル#
物体検出のアンサンブルでは、複数のモデルが同じ物体を少しずつ異なる位置で検出するため、ボックスも統合する必要があります。最も単純な方法は、各モデルのボックスをまとめて非極大値抑制 (NMS)を適用し、重なり合う各グループの中で最も信頼度が高いボックスを残すことです。重み付きボックス融合では、信頼度で重み付けして重複するボックスの座標を平均し、すべてのモデルの予測を最終位置に反映します。Ultralytics YOLO26では、予測時に関連するアンサンブル機能を組み込んでいます。augment=Trueを指定すると、検出器は画像を元のサイズ、83%、67%の各スケールで処理し、83%の画像は左右反転します。その後、3組のボックスをNMSで統合します。この例では、サイズの異なる2つの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")両方のモデルが検出したボックスは1つに統合され、一方のモデルだけが検出した物体は統合後も残ります。これによって検出アンサンブルの再現率が向上します。
用途#
- 医用画像解析:診断モデルでは複数のネットワークを組み合わせて感度を高め、構成モデル間の判定の不一致を、放射線科医が確認すべき症例の特定に利用します。
- コンペティションとベンチマーク:Kaggleなどのリーダーボードで優勝するソリューションでは、異なるアーキテクチャ、乱数シード、データ分割で学習したモデルの予測を平均することが一般的です。精度向上が追加の計算コストを上回るためです。
- 自動運転車:認識システムでは、カメラベースの検出器とLiDARベースの検出器など、それぞれ異なる強みを持つモデルを組み合わせます。一方が見逃した物体を、もう一方が検出できる可能性があります。
モデルアンサンブルと関連用語の比較#
- アンサンブル学習:手法全体を指す同義語です。「モデルアンサンブル」は通常、組み合わせて得られるモデルの集合を指します。
- モデルマージ:互換性のあるモデルの重みを平均して1つのネットワークに統合し、単一モデルと同等の計算コストで実行できるようにします。
- Mixture of Experts (MoE):学習されたルーターが各入力を少数の専門サブネットワークに振り分けるため、すべての入力で全専門家を実行せずにモデルの容量を増やせます。
- 知識蒸留:単一の生徒モデルを学習させ、教師モデル(アンサンブル全体の場合もあります)を模倣させます。Geoffrey Hinton、Oriol Vinyals、Jeff Deanが2015年に発表した蒸留論文では、音声認識モデルのアンサンブルを単一モデルに圧縮し、アンサンブルの性能向上の大部分を維持しました。










