프로젝트 1 - 모델 개선
- 데이터
- 모델
- 학습, 추론
- 아쉬운 점
모델
EfficientNet-b0 사용. 후반 모델은 파라미터가 너무 많아서...
pretrained 상태로 가져와서 모델의 fc레이어(분류기)를 task에 맞게 18class로 교체하고 fine tuning 적용함.
Loss
CrossEntropyloss, F1 Loss 시도해 봄. F1 Loss를 썼을 때 성능이 더 좋았음.
Optimizer
AdamW의 일반화 능력이 Adam보다 낫다고 해서 AdamW를 사용
Hyperparameter
batch size : 16
Epoch : 5
LR : 1e-4, lr scheduler를 사용해 10스텝마다 decay
LR scheduler
StepLR 사용
gradient accumulation
4스텝동안 gradient를 누적해서 batch size가 64인 것처럼 적용
validation
단일 모델
학습용 데이터셋에서 랜덤하게 떼어낸 20% 검증셋으로 분리함. 이 때 같은 인물의 사진이 학습셋과 검증셋에 나뉘어 들어가지 않도록 함.
stratified k-fold validation
sklearn
모듈의 StratifiedKFold.split()
메소드를 사용하여 k=5로 학습셋과 검증셋을 분리함. 따로 처리하지 않았기 때문에 같은 인물의 사진이 학습셋과 검증셋에 나뉘어 들어갈 가능성이 있음.
가장 아쉬운 점이라면 테스트셋을 가져올 때 shuffle 옵션을 True로 했던 문제를 일찍 발견하지 못했던 것이다. 시간을 많이 잡아먹었다.
신기한 점은 오류를 해결하고 나서 맨 처음에 제출했던, 별 다른 처리를 하지 않은 EfficientNet 모델이 정확도나 f1 score 면에서 가장 나았다는 것이다. 이 부분도 많이 아쉬운데, stratified k-fold validation을 적용해서 앙상블할 때 데이터 유출을 막기 위한 처리를 따로 하지 않았다. 데이터가 검증셋으로 유출되어서 일반화 성능이 낮아진 것일지도 모르겠다.
실험할 때 상황을 잘 통제하지 못했던 점도 아쉽다. soft voting과 hard voting을 각각 테스트해볼 때 시드를 고정하고 학습시켜서 동일한 조건에서 확인해 봤다면 더 좋았을 것이다. 그 밖에는 다른 LR scheduler를 적용해 보거나 서로 다른 모델로 앙상블하는 등의 시도를 해 보지 못한 점이 아쉽다.