
딥러닝 모델 학습에서 가장 고질적인 문제 중 하나는 과적합(Overfitting)입니다. 모델이 학습 데이터에만 지나치게 최적화되어 실제 테스트 데이터에서는 성능이 떨어지는 현상을 방지하기 위해, 우리는 조기 종료(Early Stopping)라는 강력한 규제(Regularization) 기법을 사용합니다. PyTorch는 TensorFlow와 달리 빌트인 Early Stopping 함수를 제공하지 않기에, 개발자가 직접 로직을 설계해야 합니다. 본 가이드에서는 실무에서 즉시 활용 가능한 7가지 구현 예제와 함께 수치적 안정성을 확보하는 최적의 해결 방법을 제시합니다.
1. 조기 종료(Early Stopping)의 핵심 원리와 도입 이유
조기 종료는 검증 데이터셋의 손실(Validation Loss)이 더 이상 감소하지 않거나, 정확도(Accuracy)가 개선되지 않을 때 학습을 강제로 중단하는 기법입니다. 이는 불필요한 컴퓨팅 자원 낭비를 줄일 뿐만 아니라, 모델의 일반화(Generalization) 성능을 극대화하는 결정적인 역할을 합니다.
조기 종료 적용 전후의 성능 차이 요약
| 비교 항목 | 기본 전체 에포크 학습 | 조기 종료(Early Stopping) 적용 |
|---|---|---|
| 과적합 위험 | 매우 높음 (학습 후반부 성능 저하) | 매우 낮음 (최적점에서 중단) |
| 연산 자원 효율 | 낮음 (불필요한 에포크 수행) | 높음 (필요한 만큼만 학습) |
| 최종 모델 상태 | 마지막 에포크의 가중치 | 검증 성능이 가장 좋았던 시점의 가중치 |
| 학습 시간 | 설정된 값에 고정 | 데이터 난이도에 따라 유동적 단축 |
2. 실무 개발자를 위한 7가지 핵심 구현 Example
PyTorch 내부 라이브러리만을 활용하거나 외부 툴을 연동하여 조기 종료를 구현하는 7가지 구체적인 방법을 소개합니다.
Example 1: 클래스 기반의 표준 EarlyStopping 구현
가장 범용적으로 사용되는 방식입니다. 특정 patience(인내심) 동안 성능 개선이 없으면 학습을 멈춥니다.
import numpy as np
import torch
class EarlyStopping:
def __init__(self, patience=7, verbose=False, delta=0):
self.patience = patience
self.verbose = verbose
self.counter = 0
self.best_score = None
self.early_stop = False
self.val_loss_min = np.Inf
self.delta = delta
def __call__(self, val_loss, model):
score = -val_loss
if self.best_score is None:
self.best_score = score
self.save_checkpoint(val_loss, model)
elif score < self.best_score + self.delta:
self.counter += 1
if self.verbose:
print(f'EarlyStopping counter: {self.counter} out of {self.patience}')
if self.counter >= self.patience:
self.early_stop = True
else:
self.best_score = score
self.save_checkpoint(val_loss, model)
self.counter = 0
def save_checkpoint(self, val_loss, model):
torch.save(model.state_dict(), 'checkpoint.pt')
self.val_loss_min = val_loss
Example 2: 델타(Delta) 값을 활용한 미세 개선 무시
성능이 아주 미세하게 향상되는 경우를 '개선'으로 보지 않으려면 delta를 설정합니다.
# 0.01 이상의 손실 감소가 없으면 카운트를 올림
early_stopping = EarlyStopping(patience=5, delta=0.01)
Example 3: 정확도(Accuracy) 기준의 조기 종료
Loss가 아닌 Metric(정확도 등)이 낮아질 때 멈추도록 설정할 수 있습니다.
# score를 정확도로 설정할 경우 부호 반전 없이 처리
def __call__(self, val_acc, model):
score = val_acc
# 기존 loss 로직과 반대로 적용 가능
Example 4: 학습 루프 내 인라인(In-line) 구현
별도의 클래스 없이 간단하게 조건문으로 제어하는 방식입니다.
best_loss = float('inf')
trigger_times = 0
for epoch in range(epochs):
val_loss = validate()
if val_loss > best_loss:
trigger_times += 1
if trigger_times >= 5:
print("Early stopping!")
break
else:
best_loss = val_loss
trigger_times = 0
torch.save(model.state_dict(), 'best_model.pth')
Example 5: Learning Rate Scheduler와 연동
학습률을 먼저 줄여보고, 그래도 개선이 안 되면 종료하는 고도화된 전략입니다.
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=3)
# scheduler.step(val_loss) 이후 EarlyStopping 호출
Example 6: PyTorch Lightning의 내장 콜백 활용
PyTorch Lightning 프레임워크를 사용하면 단 한 줄로 해결됩니다.
from pytorch_lightning.callbacks import EarlyStopping
early_stop_callback = EarlyStopping(monitor="val_loss", patience=3, mode="min")
trainer = Trainer(callbacks=[early_stop_callback])
Example 7: 다중 메트릭(Multi-metric) 동시 모니터링
Loss와 Accuracy 두 가지를 모두 만족해야 멈추는 커스텀 로직입니다.
if (val_loss > best_loss) and (val_acc < best_acc):
trigger_times += 1
3. 조기 종료 시 주의해야 할 3가지 성능 차이 해결 포인트
- Warm-up 기간 확보: 학습 초기에는 Loss가 불안정하게 튀어 오를 수 있습니다. 최소 10~20 에포크는 조기 종료 로직이 작동하지 않도록
start_epoch조건을 거는 것이 안전합니다. - Best Model 복구: 조기 종료가 발생한 시점의 모델은 이미 성능이 꺾인 상태입니다. 반드시
checkpoint.pt에 저장해둔 최적의 가중치를load_state_dict()로 다시 불러와야 합니다. - Validation Split의 품질: 검증 데이터셋이 너무 작거나 편향되어 있으면 조기 종료 시점이 너무 빠르거나 늦어질 수 있습니다. 적절한 K-Fold 교차 검증과의 병행을 고려하십시오.
4. 결론: 최적의 학습 중단 타이밍 찾기
조기 종료는 단순히 학습을 일찍 끝내는 것이 아니라, 모델이 신호를 배우는 단계를 지나 소음(Noise)을 학습하기 시작하는 임계점을 포착하는 기술입니다. 실무에서는 patience를 전체 에포크의 10% 내외로 설정하고, delta를 통해 수치적 노이즈를 필터링하는 방식을 적극 추천합니다.
내용 출처 및 참고 문헌:
1. Prechelt, L. (1998). "Early Stopping — But When?". Neural Networks: Tricks of the Trade.
2. PyTorch Tutorials: "Saving and Loading Models".
3. Deep Learning Book (Ian Goodfellow, MIT Press).
4. GitHub Repository: 'pytorch-early-stopping' by Bjarten.
'Artificial Intelligence > 21. PyTorch' 카테고리의 다른 글
| [PYTORCH] SGD, Adam, AdamW 옵티마이저 선택 방법과 3가지 핵심 성능 차이 해결 (0) | 2026.04.04 |
|---|---|
| [PYTORCH] 학습률 스케줄러(Learning Rate Scheduler) 적용 방법 7가지와 성능 차이 해결 (0) | 2026.04.04 |
| [PYTORCH] 체크포인트(Checkpoint) 저장 및 불러오기 방법 7가지와 state_dict 차이 해결 (0) | 2026.04.04 |
| [PYTORCH] .pth 파일과 .pt 파일의 차이 및 체크포인트 관리 방법 7가지 해결 전략 (0) | 2026.04.04 |
| [PYTORCH] 모델 전체 저장 vs 가중치만 저장의 3가지 결정적 차이와 권장 방법 및 해결 전략 (0) | 2026.04.04 |