대학교 AI 이론 수업 내용 중 K-Fold Cross-Validation 내용 정리해보고자 한다.
실제로는 많은 경우에 한 가지 모델만 가지고 hyper parameter들을 바꿔가면서 하기보다는 여러가지 후보가 될 만한 모델을 선정한다.
여러가지 후보가 될만한 모델을 고려해보고 각각의 모델에 대해 training 시켜본 후 우리의 문제에서 가장 generalization한 문제를 좋게 보여줄만한 모델을 선택하는 과정.
모델 선정을 할 때에는 parameter를 업데이트하는데 사용하는 데이터(train data)를 활용하면 별로 도움이 되지 않음. 그래서 validation set을 사용한다.
Training set | 모델의 parameter를 업데이트 하는 데 사용 |
---|---|
Validation set | 개발 중에 쓰는 데이터(hyper parameter 업데이트 하는 데 사용) |
Test set | 개발 후에 쓰는 데이터 |
Training set과 Validation set
딥러닝 모델은 training set에 대해 어느정도 overfitting이 일어날 수 밖에 없으니까 training set에 대해서 fitting된 모델을 validation set에다가 test해보고 그것으로 hyperparmeter를 업데이트함.
Test set
Test data는 딱 한 번만 건드려야 되는 데이터다. 하지만 실제로 여러번 활용 하게 됨. 아주 엄격한 의미에서 test data를 만드는 것은 어려움
ex) 의료인공지능 같은 경우 그러한 과정이 필요한데 신약개발할 때, 제품으로 나오려면 임상실험을 해야 되기 때문.
⇒ 그래서 K등분 하여 subset을 한 번씩 추출하여 모든 데이터에 대해 검증해보는 방식을 사용하는 것으로 생각 됨.
방법
K-Fold Cross-Validation 결과
K번의 실험을 거치면서 K개의 parameter가 나오게 됨
K번 실험해서 전부 다 만족스럽고 이 과정을 통해서 hyperparameter를 잘 찾아 냈으면 최종 모델을 선정하여 제품을 출시한다!
일반학습 : epoch3 (k-fold경우와 비교하기 위해 3으로 설정)
K-fold cross validationb : epoch:1, k = 3
pytorch-lightning에서 교차 유효성 검사를 사용하는 방법을 찾을 수 없었음.
미션 코드의 KfoldDataloader도 커스텀제작한 것으로 보임.
게다가 단순히 k번 반복하여 fit(학습) 시킴.
따라서 단순히 k번만큼 (eppch = k) 다른 trainset과 다른valid를 사용하여 학습시킨 뒤 dev로 평가하는 게 K-fold 이고
train이랑 valid 고정시켜놓고 (처음에 설정한 일정 비율대로) 학습진행 후 dev로 평가한 것들을 평균내는 것이 일반 학습임.
공통점은 train데이터를 train과 valid로 나눈다는 점과 평가를 dev로 한다는 점.
이번 P-stage STS 대회에서 미션과제로 소개되어 다시 한 번 정리해보았다. 이처럼 실제로 현업에서 제한된 데이터를 가지고 제품을 출시하려 할 때, 굉장히 유용한 기법이라는 생각이 들었다. 대회를 진행하며 이러한 K-Fold Cross-Validation기법을 실제 제품을 출시하기 위해 모델의 generealization 성능을 올린다고 생각하며 모델을 학습시키며 적용해 봐야겠다고 생각했다.
이미지 출처: https://scikit-learn.org/stable/modules/cross_validation.html,