간단히 요약하자면,
상세 과정
- Train을 5개 폴드로 나누기
- 전체 Train 데이터를
train_1
,train_2
, …,train_5
로 나눔
- 전체 Train 데이터를
- Fold별 모델 학습 및 Best 모델 저장
- 각 Fold에서 4개는 학습, 나머지 1개는 Fold-Validation으로 사용하여 Best Model 저장
Fold 학습 데이터 검증 데이터(Fold 내부) 저장 대상 1 2, 3, 4, 5 1 Best model #1 2 1, 3, 4, 5 2 Best model #2 3 1, 2, 4, 5 3 Best model #3 4 1, 2, 3, 5 4 Best model #4 5 1, 2, 3, 4 5 Best model #5 - 각 실험에서 validation loss 기준으로 best epoch, model 저장
- 고정된 validation set으로 모델 평가
- 위에서 저장한 5개의 Best model을 이용해, 고정된 validation set을 평가
python# 예시: 5개 모델의 softmax 예측 결과를 평균 final_pred = np.mean([model1_pred, model2_pred, ..., model5_pred], axis=0)
- 실험별로 모델 성능 평가 방식
- 가장 일관되게 좋은 성능을 보인 모델 1개 선택
- validation macro f1 가장 높고
- train-val gap이 과하지 않고
- Train 성능 평가 → best model 5개로 train set 한덩이를 평가(validation holdout set 평가하듯이)
- test(가능할 경우) 성능도 나쁘지 않은 모델
- 가장 일관되게 좋은 성능을 보인 모델 1개 선택
단일 모델 vs Fold Ensemble
학습 데이터 비율 | 기대 효과 | 위험 요소 | |
단일 모델(full train) | 100% | 최대 학습 정보 | 일반화 판단 어려움 |
fold ensemble(5-fold) | 80% per model | 일반화 추정 ⬆️ | 모델당 학습량 ⬇️ |
- fold 수를 증가시키면, 학습에 더 많은 데이터 사용이 가능해져서 개별 모델의 성능 향상을 기대해볼 수도 있음
→ 다만, 학습 횟수가 늘어나서 시간도 오래 걸림
전통적인 CV와 다른 점
💡
전통적인 K-Fold CV
- 전체 데이터를 K개로 균등 분할
- 각 분할을 validation set으로, 나머지를 학습에 사용
- K번 학습 → 각 fold의 평가 metric 평균을 최종 성능 지표로 사용
→ 즉, 모델 학습과 성능 추정을 동시에 수행
💡
딥러닝에서의(위의) 방식
- validation set은 따로 보존(
holdout
)
- train set 내부에서만 fold 나눔 → fold별로 best model을 저장
- 보존한 validation set으로 여러 모델의 평균 성능을 측정
왜 딥러닝에서는 전통적인 K-Fold CV가 힘든지?
딥러닝에서는 일반적으로 Validation Loss
기준으로 Early Stopping/Best Model 저장을 수행
이 과정에서 validation 데이터를 학습 흐름에 반복적으로 사용하기 때문에, 전통적인 완전히 미지의 holdout set
이라는 개념과는 다름
선택한 방식이 일반화 평가에 유효한지?
원리 | 설명 |
분산 완화 | 여러 학습 데이터 조합에서 얻은 모델들의 결과를 평균냄으로써 ”운좋은 모델”이나 “운 나쁜 모델”에 의존하지 않음 |
과적합 방지 판단 | 특정 데이터에 과적합된 모델이 있다면, 고정된 validation set에서 다른 모델들과 비교해 성능이 떨어짐. 즉, overfitting 모델의 영향을 완화함 |
안정성 향상 | validation 성능이 여러 모델에서 일관되게 높게 나타날수록, 새로운 데이터에도 잘 작동할 가능성이 높음 |
cv 대안 | 딥러닝 특성상 full cv는 어렵지만, validation set 하나로만 일반화 성능을 측정하는 의존성을 줄이며, 일반화 성능을 추정할 수 있음 |