Model Ensemble
모델 앙상블은 여러 모델의 예측을 결합해 더 정확하고 강건한 하나의 출력을 만듭니다. 투표, 평균화, 박스 융합, 장단점을 다룹니다.
모델 앙상블은 투표, 평균 또는 학습된 조합을 통해 학습된 여러 모델의 예측을 하나의 출력으로 결합하여 개별 모델의 오류를 상쇄합니다. 각 모델이 서로 다른 오류를 범하면 앙상블은 가장 성능이 좋은 모델보다 더 정확하고 강건해집니다. 이것이 앙상블이 머신러닝 경진대회에서 우세한 이유입니다. Netflix Prize는 여러 모델의 예측을 결합한 팀이 2009년에 우승했고, 2012년 ImageNet 챌린지에서 우승한 딥러닝 참가 모델은 컨볼루션 네트워크 7개의 예측을 평균하여 top-5 오류율 15.3%를 달성했습니다. 단점은 계산 비용입니다. 모든 입력에 대해 각 구성 모델을 실행해야 하므로 앙상블의 크기가 커질수록 메모리 사용량과 추론 지연 시간이 증가합니다.
모델 앙상블의 작동 방식#
앙상블은 구성 모델이 서로 다른 오류를 낼 때만 도움이 됩니다. 오류가 독립적인 모델의 출력을 평균하면 결합된 예측의 분산은 줄어드는 반면, 같은 입력에서 실패하는 모델을 결합해도 얻는 이점은 적습니다. 배깅은 랜덤 포레스트 결정 트리처럼 학습 데이터의 무작위 재표본으로 각 구성 모델을 학습해 다양성을 만듭니다. 부스팅은 XGBoost 및 LightGBM처럼 새 구성 모델이 이전 모델의 오류를 수정하도록 학습합니다. 딥 앙상블은 하나의 신경망을 서로 다른 무작위 시드로 복제해 학습하며, 예측의 분산으로 모델의 불확실성도 측정합니다. 컨볼루션 신경망과 비전 트랜스포머처럼 아키텍처를 결합하면 귀납적 편향이 다르고 오류의 상관관계가 낮은 모델을 구성할 수 있습니다.
결합 규칙은 구성 모델의 출력에 따라 달라집니다.
가지치기되지 않은 결정 트리처럼 분산이 큰 모델이 가장 큰 이점을 얻습니다. 이 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)를 적용하는 것입니다. 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년에 발표한 증류 논문에서는 음성 인식 모델 앙상블을 단일 모델로 압축하면서 앙상블 성능 향상의 상당 부분을 유지했습니다.










