우리 팀은 열정적인 팀이였다. 팀장을 맡은 분께서 처음부터 점수가 굉장히 잘 나왔고, 그 코드를 공유해주시면서 다같이 으쌰으쌰 다양한 모델과 하이퍼파라미터 등을 실험해볼 수 있었다. 그리고 각자 모델을 돌렸을 때 어떤 결과가 나왔고, 또 어떤 점이 달랐는지도 매일 피드백하며 공유했는데, 다른 분들께 "시간이 너무 오래 걸린다"는 얘기를 많이 들었다.
나는 처음에 학습데이터를 그대로 사용해서 돌려봤고, 그 다음에는 1570장의 학습데이터를 5배로 어그멘테이션시켜서 약 7800정 정도로 이것저것 실험을 했고, 어그멘테이션 기법을 늘려갈 때에도 10배, 1만 5000여장으로 학습을 시켰다. 그래서 그런지 에폭 하나 돌 때에도 2~3분 내외로 그렇게 오래 걸리지 않았는데, 다른 분들은 약 14만 장으로 오프라인 어그멘테이션으로 증강시켜서 실험을 하고, 하나 할 때마다 몇 시간씩 걸렸던 것이다.
그래서 이런 생각이 들었다.
학습할 데이터의 개수가 많아지면 많아질수록 모델의 학습 시간은 늘어난다. 물론 데이터 어그멘테이션을 많이 해서 다양한 데이터를 학습시키면 모델의 성능이 올라갈 것이다.
그런데 그 사이 어딘가에 최적점이 있지 않을까? 예를 들어서 데이터 이미지를 10개에서 100개 사이에서 실험을 한다고 했을 때, 10개에서 70개까지 늘릴 동안에는 성능이 쭉쭉 올라가는데, 70개에서 80개로 올렸을 때에는 시간은 더 오래걸리는데 학습 성능에 큰 차이가 없다면, 굳이 시간을 더 들여서 80개나 그 이상의 데이터로 학습할 필요가 없을 것이다.(데이터의 개수를 제외하고 다른 모든 변수는 동일하다는 전제하에)
이런 식으로, 만약 적정량의 데이터셋의 크기를 찾으면, 더 적은 데이터와 시간으로도 많은 실험을 할 수 있을 것이다. 여러 모델을 쓰고, 다른 어그멘테이션 기법을 사용해 (빠르게, 또는 효율적으로) 최적의 모델을 찾을 수 있을 것이고, 최적의 모델과 하이퍼 파라미터를 찾으면, 데이터셋을 다시 크게 늘려 모델에 학습시켜서 성능을 더 끌어올릴 수 있을 것이다.
그리고 이에 대해서 멘토님께 의견을 구했는데 이런 답변을 받았다.
대회 초반에는 토이셋을 하나 만들어서, 전체 데이터에서 밸리데이션 데이터셋과 경향이 일치하는지 확인하고, 모델도 처음부터 무거운 모델을 이용하기보다는 작고 가벼운 모델로 할 수 있는 실험들로 가설 검증을 먼저 합니다. (데이터 증강에 효과가 있는 방법은 무엇일까 와 같은 것들을 전체 데이터로 무거운 모델로 하기에는 효율이 떨어질 수 있어요.) 충분한 자원이 있다면 좋겠지만 제한된 자원과 시간이 짧을때는 위와 같이 실험하고나서 큰 모델에 적용하여 한 번 더 확인하는 방법으로 모델을 학습하기도 합니다.
다만, 이게 무조건 맞지는 않습니다. 작은 모델이나 작은 데이터셋은 각각 모델이 수렴할 수 없을만큼 어려운 문제일때가 있거나 데이터의 편중이 들어갈수도 있습니다. 그래서 가설 단계에서 토이셋으로 한 실험 중 불채택한것이 사실은 무거운 모델에서는 더 잘 될수도 있어서.. 결국에 무거운 모델과 많은 데이터에서 다시 학습을 또 해봐야 하는것 아니냐, 그러면 오히려 이전의 실험이 시간낭비 아니냐 할 수 있기도 합니다.
결국 선택의 문제!
일단 나는 성격이 급하고 빠르게 결과를 보는 것을 좋아하기 때문에ㅋㅋㅋ 최적의 데이터셋을 찾으려는 시도를 해보았다.
14만장의 이미지와 1.7만장의 이미지로 동일한 조건으로 학습시켰을 때 결과(코드는 모두 날아갔다... 미리 저장해뒀어야하는데ㅠ)
데이터셋 크기 | Train Loss | Train Acc | Train F1 | Val Loss | Val Acc | Val F1 |
14만 장 | 0.0074 | 0.9976 | 0.9976 | 0.0248 | 0.9923 | 0.9924 |
1.7만 장 | 0.0306 | 0.9901 | 0.9899 | 0.1619 | 0.9563 | 0.9553 |
정확도나 F1은 그렇게 큰 차이가 나지 않지만 Loss값이 차이가 좀 나는 걸 볼 수 있다. 14만장 기준으로 train acc - val acc는 약 0.5%(0.9976 - 0.9923 = 0.0053) 정도로 정확도가 차이가 나고 1.7만장에서는 약 3.4%(0.9901 - 0.9563 = 0.0338 ) 차이가 난다. 14만장의 이미지를 학습한 경우가 더 다양한 이미지를 학습했고, 1.7만장만 학습한 모델은 제한된 개수 때문인지, 좀더 과적합됐다고 볼 수 있다.
데이터셋의 크기가 클수록 Loss값은 감소하는 경향이 있지만, 어느 선에서 더이상 성능이 오르지 않는 선이 존재한다.
그래서 다양한 데이터셋 크기로 같은 조건에서 실험을 했다. 팀원들이 실험하고 있는 14만 장의 이미지, (데이터 어그멘테이션이 이미 강하게 들어가 있는 이미지들)를 기준으로 그 중에서 {10%, 25%, 50%, 75%, 100%}를 선택해서 학습에 활용하고, 성능 지표와 결과를 비교해보았다. 첫 에폭 때에는 차이가 좀 심했지만, 에폭이 6정도로 올라가니 비슷비슷해지는 모습을 보였다. (정확히는 폴드별로 미세한 차이가 있었으나 가장 잘나온 것 기준으로 함)
- 10%만 활용해서 학습을 시킬 때 Epoch [6/10] 한 에폭 당 10초
Train Loss: 0.0303, Train Acc: 0.9919, Train F1: 0.9918 Val Loss: 0.0295, Val Acc: 0.9905, Val F1: 0.9905 - 25% 학습시킬 때 Epoch [6/10] 한 에폭 당 25초
Train Loss: 0.0153, Train Acc: 0.9947, Train F1: 0.9947 Val Loss: 0.0219, Val Acc: 0.9934, Val F1: 0.9934 - 50% 학습시킬 때 Epoch [6/10] 한 에폭 당 50초
Train Loss: 0.0105, Train Acc: 0.9966, Train F1: 0.9966 Val Loss: 0.0150, Val Acc: 0.9946, Val F1: 0.9947
/75%는 6에폭까지 못가고 1에폭만 봄/ - 75% 학습시킬 때 Epoch [1/10] 한 에폭 당 1분 12초
Train Loss: 0.0360, Train Acc: 0.9887, Train F1: 0.9887 Val Loss: 0.0223, Val Acc: 0.9928, Val F1: 0.9928
50% 데이터로 학습시켰을 때 첫 에폭에서 F1 스코어가 0.97,
75% 데이터로 학습시킬 때에는 F1가 0.99로...(?) 에폭 하나만 돌았는데 엄청나네; 이상하다.. 어쨌든 50%를 에폭 3번 돌면 75% 한번 도는 효과가 나는 정도로 빠르게 올랐다.
10% (약 1.4만개) 사용 시: - Val Acc: 0.9905 (99.05%) - Train-Val 차이: 0.0014 (0.14%)
25% (약 3.5만개) 사용 시: - Val Acc: 0.9934 (99.34%) - Train-Val 차이: 0.0013 (0.13%) - 성능 향상: +0.29%
50% (약 7만개) 사용 시: - Val Acc: 0.9946 (99.46%) - Train-Val 차이: 0.0020 (0.20%) - 성능 향상: +0.12%
음 여기까지 하다가.. 실험을 마무리하지 못하고 임의로 50%만 가지고도 에폭만 충분히 돌리면 좋은 성능을 낼 수 있겠다는 생각을 가지고 다른 실험으로 넘어갔다. (워낙 내가 만든 아웃풋 점수가 좋지 않아서.. 빨리 점수 올리고 싶은 조급함에 떠밀렸다ㅠ)
이 외에 처음에 간단하게 테스트하기 위해 세팅한 것들
- 폴드 5개에서 3개로 줄이기 -> 최종 모델 학습시에만 5-fold 사용
- 각 폴드는 3 에폭만 학습
- 나중에 에폭 늘리는 경우, early stopping 설정
참고로 5개 폴드 모두 높은 성능이 나온다는 것은 모델이 데이터셋 전반에 걸쳐 안정적으로 학습된다는 의미 => 모델의 로버스트함을 주장할 수 있다. (특정 데이터에서만 우연히 좋은 성능이 나오는 것이 아니며, 여러 번의 검증을 통해 평균적인 성능을 파악할 수 있다.)
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
패스트캠퍼스 Upstage AI Lab 부트캠프 4기, "Upstage 경진대회 CV편" (1) | 2024.11.12 |
---|---|
[CV 문서 분류 대회] 어떤 사이클을 돌았나요? 사이클별 실험 정리 (0) | 2024.11.12 |
[CV 문서 분류 대회] 신뢰성 있는 validation set은 어떻게 만들지? (1) | 2024.11.09 |
[CV 문서 분류 대회] 셋째 날 정리: 임밸런스 데이터 맞춰주기 (0) | 2024.11.04 |
[CV 문서 분류 대회] 두 번째 날 정리 (0) | 2024.11.01 |