지난글까지는 계속해서 여러 가설을 세우고 실험해봤다면 이번글에서는 최종적으로 제출한 결과에 대해서 되돌아보는 글을 작성해보려고 한다.
모델 선정
일단 offline 데이터 증강으로 8만 장으로 늘리고 efficiencenet에서 다양한 모델을 사용해 봤다.
우리는 EfficientNet 중에서 B0 ~ B4, S, M을 학습할 때 주로 사용했다. 나머지는 이미지 크기가 너무 커져서 서버 메모리 부족으로 돌아가지도 않았다....
그리고 ViT, ResNet도 사용해 봤는데 EfficientNet만큼 학습속도가 빠른 게 없고 성능도 그렇게 좋게 나오지 않아서 우리는 주로 EfficientNet을 활용해서 사용했다.
KFold & Soft voting, Hard voting
모델을 학습시키면서 KFold의 유의미한 성능 개선을 봐서 우리는 KFold는 계속 가져가기로 했다.
학습 시간이 길어지긴 했지만 성능에 유의미한 영향을 줬고 중간중간 fold별로 epoch을 돌면서 각각의 모델을 pkl 파일로 생성해서 중간중간 soft voting과 hard voting을 진행했다.
soft voting과 hard voting은 모델 앙상블 기법 중 하나로 여러 모델의 예측을 결합해 최종 예측을 도출하는 방식이다.
Hard Voting
Hard voting은 각 모델이 예측한 클래스를 기준으로 다수결을 통해 최종 예측을 결정한다.
예를 들어, 모델 3개가 각각 Class A, Class B, Class A를 예측했다면, 최종 예측은 Class A가 된다. 즉, 각 모델의 예측 결과 중 가장 많이 나온 클래스가 최종 클래스가 된다. Hard voting은 분류 문제에서 주로 사용된다.
Soft Voting
Soft voting은 각 모델이 예측한 확률 값을 기반으로 최종 클래스를 결정한다. 각 클래스에 대한 확률을 합산한 뒤 평균을 내어 확률이 가장 높은 클래스를 최종 예측으로 결정한다.
예를 들어, 모델 3개가 각각 Class A에 대한 예측 확률을 0.6, 0.7, 0.8로 예측했다면, Class A의 평균 확률은 0.7이 된다. 이렇게 모든 클래스에 대한 평균 확률을 비교해 가장 높은 확률을 가진 클래스를 선택한다. Soft voting은 모델들이 클래스별 확률 예측을 지원할 때 사용 가능하며, hard voting에 비해 더 세밀한 정보 반영이 가능하다.
실제로 성능 개선에 더 큰 영향을 준건 Soft Voting을 이용한 방법이라 최종 제출 때는 Soft Voting을 사용했다.
Mixup
이전에 Mixup과 CutMix를 각 epoch마다 돌아가며 적용했는데 학습시간이 너무 오래 걸려서 아예 Mixup만 고정으로 해놓고 모델을 학습시켰다.
WandB 적용
WandB가 뭔지는 알고있다가 경진대회 후반부에 적용을 하게 되었다.
이제 막 도입한 시점이어서 가장 기본적인 기능밖에 사용하지 않았지만 그럼에도 불구하고 각 모델 학습한걸 한눈에 확인할 수 있고 각각의 파라미터나 성능도 추적이 가능해서 훨씬 더 학습에 도움이 되었다.
그리고 팀원들을 초대하면 각자 어떤 실험을 돌리고 로그까지 실시간으로 보이니까 각자 어떤 실험을 하고 한눈에 알아보기 너무 좋았다.
한 가지 아쉬운 점은 WandB에 정말 다양한 기능들이 있는데 그것들을 못 사용해 봤다는 점이다.
다음 프로젝트때부터는 최적의 하이퍼파라미터를 찾아주는 sweep 기능도 사용해보고 싶다.
그리고 각 폴드 돌때마다 예측 결과를 뽑아서 실제 이미지를 저장할 수도 있고 오분류를 시각화하는 기능도 있다고 들었다. 오분류를 시각화함으로써 오류가 발생한 패턴을 더 쉽게 확인하고 모델 개선에 사용하면 좋을 것같다라는 생각이 들었다.
파라미터
모델 파라미터중에서 Learning Rate는 거의 고정으로 두고 - (모델에 따라 달라지는) image size - Epoch - batch_size - num_workers 들을 각 실험마다 상황에 맞게 고치면서 진행했다.
활성화 함수는 Adam을 선택했고 learning rate scheduler로는 CosineAnnealingLR, 손실 함수로는 CrossEntropyLoss를 사용했다.
- CosineAnnealingLR
- CosineAnnealingLR는 학습률을 단계적으로 감소시키는 스케줄러다. 학습이 진행됨에 따라 학습률을 줄여 최적화 성능을 높이는데 도움이 된다. CosineAnnealing 방식은 cosine 곡선에 따라 학습률을 변화시켜, 학습 후반부에 학습률이 작아지며 모델이 더 안정적으로 수렴할 수 있도록 돕는다.
이 외에도 엄청 다양한 방법들을 적용해 봤는데 현재 상황에서 가장 성능이 좋게 나온 것들은 위 조합이었다.
최종 등수
public 데이터셋으로 검증하는 mid Leaderboard에서는 3등을 했고
private 데이터셋으로 검증하는 final Leaderboard에서는 3등을 했다.
최종적으로 두개의 모델을 제출하게 되는데 하나는 public score가 가장 높게 나왔던 모델을 선택했고, 다른 하나는 로컬에서 돌렸을 때 가장 성능이 좋게 나온 모델(public score가 로컬 정확도보다 낮게 나와서 public에서는 베스트가 아닌 모델,,,)을 선택해서 제출했다.
실제로 제출하고 경진대회가 끝나고 보니 public점수가 가장 높은것보다 로컬에서 정확도가 더 높았던 모델이 private 데이터셋에서도 더 좋은 성능을 보였다.
자체 평가 및 회고
학습목표 달성을 위한 노력
- 직전 강의에서 들었던 모든 내용을 적용해보려고 시도해 봤다. 가장 기본적인 CNN 코드부터 전이학습, 데이터 증강 등등 실제로 코드를 작성하면서 경진대회에 맞는 코드를 작성해 봤다.
- 데이터 분석, 증강(offline, online), 모델 학습, 추론 거의 모든 단계별로 새로운 시도들을 적용해 봤다는 점에서 큰 성장을 한 것 같다.
전과 비교하여 새롭게 시도한 점
- 이전에는 모델 추적을 MLFlow로 했었는데 이번에는 조금 더 다양한 기능이 있는 WandB를 적용해 봤다. 아직 MLFlow의 기능을 자세히 알진 못하지만 WandB는 하나의 실험에 여러 fold를 각각 기록해서 모든 fold를 한 번에 비교할 수 있는 그래프도 제공하고 각 폴드별로 이미지도 저장할 수 있어서 조금 더 한눈에 시각화가 되는 게 좋았다.
마주한 한계와 아쉬운 점
- 경진대회 후반으로 갈수록 더 다양한 방법을 알게 되고 더 해볼 만한 게 더 많아졌는데 절대적인 시간이 부족해서 시도 못한 방법도 있었다.
- 조금 더 검색하고 이것저것 찾아보지 못한 게 아쉽다. 내 상식에서 이렇게 하면 좋을까? 하고 가설을 세우고 실험을 하는 것도 중요한 경험이었다고 생각은 들지만 그래도 조금 더 좋은 방법, 다양한 가설들을 보면서 나의 식견을 넓히는 것도 중요하다고 깨달았다.
- 하이퍼파라미터 튜닝을 위한 AutoML도 시간상 적용하지 못한 것도 아쉽다.
- 그리고 가설을 세우고 실험을 하기 전에 먼저 학습 데이터셋을 분석하고 테스트 데이터셋을 분석하는 기간을 좀 가졌으면 더 좋았을 거라는 아쉬움도 남았다. 실제로 대회 주최 측에서 wrap-up을 진행하면서 말씀해 주신 게 데이터를 분석하다 보면 test 데이터셋은 거의 대부분 rotation이 들어가 있어서 학습 데이터셋을 augmentation을 진행할 때 회전을 주면 성능이 개선되는 걸 느꼈을 거라는 말을 들으면서 실제로 그런 분석을 하지 못한 게 아쉬웠다. 그래서 다음부터는 학습/테스트 데이터셋을 분석하며 이 둘의 관계를 파악하고 데이터 중심으로 생각해 봐야겠다고 느꼈다.
- 모델 앙상블 부분에서도 아쉬운 점이 있는데 더 다양한 모델과 더 다양한 파라미터들을 조절해서 모델 앙상블을 시도해 봤다면 어땠을까라는 아쉬움도 있다.
한계/교훈을 바탕으로 다음 경진대회에서 시도해보고 싶은 점
- 다음 경진대회에서는 팀원끼리 공유할 수 있는 서버를 만들어 모두 어떤 실험을 하고, 어떤 가설을 세우고 진행하는 건지 조금 더 공유가 되었으면 좋겠다.
- 조금 더 상세한 가설을 세우고 데이터 분석부터 들어가서 알맞은 가설을 세우는 것도 중요하다고 생각이 들었다.
다른 팀들도 우리가 시도한 범위에서 여러 가지 변형을 통해 성능개선을 이루었는데 그중 새로웠던 건 cutout 비율을 조절할 수 있다는 거였다. 그리고 이 비율을 조절한 팀이 2등을 차지했다.
학습할 때 cutout 비율을 낮춘 게 성능개선에 도움을 줬는데 아마 cutout 비율을 작게 줘서 문서형 이미지의 글자를 잘 살리게 되었고 그 글자를 잘 캐치해 모델 성능개선에 큰 도움이 된 거라고 예측해 본다.
그리고 또 한 가지 느낀 점은 결국 모델이 좋은 게 성능도 좋게 나온다는 것도 느꼈다.
이렇게 약 2주 동안 진행한 경진대회가 끝났다. 중간에 진짜 왜 더 모델개선이 안될까 하는 멘붕에 빠졌었는데 그래도 팀원과 같이 소통하면서 여러 돌파구를 찾으며 점점 모델 개선이 향상되는 경험을 하니 기분이 좋았다.
'Upstage AI Lab 4기' 카테고리의 다른 글
Dialogue Summarization (일상 대화 요약) 경진대회 2주차 + 자체 평가 및 회고 (1) | 2024.12.01 |
---|---|
Dialogue Summarization (일상 대화 요약) 경진대회 1주차 (1) | 2024.11.28 |
[CV 경진대회] offline 데이터 증강 그리고 하이퍼파라미터 수정 (7) | 2024.11.07 |
[CV 경진대회] TTA 실패기,,, (0) | 2024.11.04 |
[CV 경진대회] K-fold 적용 (0) | 2024.11.04 |