모델을 학습할 때, 일반적으로 일정 시간마다 모델의 상태(state_dict)를 저장해 둡니다. 이걸 "checkpoint"라고 하죠. Checkpoint averaging은 학습이 끝나기 전 마지막 N개의 체크포인트의 파라미터(weight, bias 등)를 평균내어 하나의 모델로 만드는 기법입니다.
아래는 PyTorch에서 마지막 5개의 모델 체크포인트를 불러와 파라미터를 평균 내는 코드입니다.
import torch
from collections import OrderedDict
# 체크포인트 파일 경로들
checkpoint_paths = [
"checkpoint1.pt",
"checkpoint2.pt",
"checkpoint3.pt",
"checkpoint4.pt",
"checkpoint5.pt"
]
# 누적 저장할 딕셔너리
avg_state_dict = None
num_ckpt = len(checkpoint_paths)
for path in checkpoint_paths:
checkpoint = torch.load(path, map_location="cpu")
state_dict = checkpoint["model"] if "model" in checkpoint else checkpoint # 키는 상황에 따라 다름
if avg_state_dict is None:
avg_state_dict = OrderedDict()
for key in state_dict:
avg_state_dict[key] = state_dict[key].clone()
else:
for key in state_dict:
avg_state_dict[key] += state_dict[key]
# 평균 내기
for key in avg_state_dict:
avg_state_dict[key] /= num_ckpt
# 저장
torch.save({"model": avg_state_dict}, "averaged_model.pt")
model = MyModel()
model.load_state_dict(torch.load("averaged_model.pt")["model"])
좋은 질문이에요! Checkpoint Averaging(모델 평균화)과 Ensemble(앙상블)은 모두 성능을 높이기 위한 대표적인 기법이지만, 성격과 성능 측면에서 차이가 있습니다. 비교해서 정리해드릴게요.
항목 | Checkpoint Averaging | Ensemble |
---|---|---|
정의 | 여러 시점의 동일한 모델 weight를 평균내어 하나의 모델로 만듦 | 서로 다른 모델 (또는 seed/epoch이 다른 같은 모델) 여러 개의 출력을 평균 또는 투표 |
결과 | 단일 모델 (weight가 평균된 모델) | 여러 모델을 동시에 사용 (추론 시 여러 번 forward pass) |
계산량 | 추론 시 모델 1개만 사용 → 빠름 | 추론 시 모델 N개 forward → 느림 |
구현 복잡도 | 간단 (단일 모델 저장) | 복잡 (모델 여러 개 유지 & 추론 시 ensemble 필요) |
항목 | 설명 |
---|---|
일반화 성능 | 둘 다 향상되지만, 일반적으로 Ensemble이 더 높습니다. |
계산 효율 | Checkpoint Averaging이 훨씬 효율적입니다 (메모리/시간 적게 사용) |
실용성 | Checkpoint Averaging은 싱글 모델처럼 다룰 수 있어 배포, 파인튜닝에 유리 |
즉,
예를 들어 번역 모델을 학습했다고 해봅시다.
성능 차이는 이렇게 나타날 수 있어요 (예시):
모델 방식 | BLEU Score (성능 지표) |
---|---|
마지막 체크포인트만 사용 | 28.5 |
Checkpoint Averaging | 29.7 |
5-Model Ensemble | 31.2 |
즉, checkpoint averaging도 성능을 확실히 개선시켜 주지만, full ensemble보다는 살짝 떨어집니다. 대신 추론 속도는 훨씬 빠르죠.
대부분의 경우, model averaging은 단일 모델(single checkpoint)보다 성능이 더 좋습니다.
하지만 “항상” 그런 건 아니고, 몇 가지 조건이 맞아야 평균화가 효과를 발휘합니다. 아래에서 왜 그런지, 언제 좋은지 구체적으로 설명드릴게요.
딥러닝 모델의 학습 과정에서는 손실(loss)이 줄어들다가도 미세하게 요동치는 구간이 많습니다. 특히 학습 후반부에는 validation 성능이 안정적이지 않을 수 있죠. 예를 들어:
이때 마지막 checkpoint만 쓰면, 운 좋게 잘 나온 모델을 쓸 수도 있지만 운이 나쁘면 성능이 낮은 모델을 쓸 수도 있어요.
→ model averaging은 여러 checkpoint의 weight를 평균 내어, 일종의 “중립적인” 모델을 만드는 효과가 있습니다.
→ 이는 모델이 local minimum 한 곳에 overfit 되는 것을 방지하고, 일반화 성능을 높여줍니다.
다음은 연구나 실험에서 자주 관찰되는 결과입니다:
모델 | Accuracy / BLEU / etc. |
---|---|
마지막 checkpoint만 사용 | 88.2 |
model averaging (5개) | 89.1 |
model averaging (10개) | 89.3 |
즉, 보통은 0.5% ~ 1.5% 정도 성능 향상이 있는 경우가 많습니다. 특히 큰 모델에서는 그 차이가 더 뚜렷하게 나타나는 경향이 있습니다.
조건 | 기대 효과 |
---|---|
모델 크기 클수록 | ✅ 평균화 효과 더 큼 (불안정성 커지기 때문) |
학습이 충분히 되었을 때 | ✅ 후반부 체크포인트들이 좋은 점 근처에 있음 |
overfitting이 우려될 때 | ✅ 평균화로 regularization 효과 |
반대로, 학습이 덜 되어 있을 때나 checkpoint 간 편차가 너무 클 경우에는 효과가 없거나 오히려 약간 떨어질 수도 있어요.