블로그 첫 글을 자랑글로 시작해보고자 합니다 ㅎㅎㅎㅎㅎ

무려 4개월 전에 참여했던 케글 대회를 이제야 블로그를 만들면서 업로드 하게 되었네요😅

 

Kaggle Competition에 처음 참여했었던 경험과 과정, 후기를 남겨보려고 해요.

 

우선 잘 정리하진 못했지만 제 나름대로 정리했던 GitHub은 링크로 남겨놓을게요 ㅎㅎ

 

GitHub - thsckdduq/my_project

Contribute to thsckdduq/my_project development by creating an account on GitHub.

github.com

제가 처음으로 참여했던 대회는 Open set Image Recognition 대회로 두 가지(Image Classification, Object Detection)의 Task가 섞여있는 대회였습니다.

 

Happywhale - Whale and Dolphin Identification | Kaggle

 

www.kaggle.com

 

 Kaggle 대회는 데이터 분석을 하는 사람들에게 엄청난 스펙으로 작용한다고 듣고 참여했고, 결과적으로 은메달을 받으면서 처음 참여했던 Kaggle 대회치고는 매우 좋은 성적을 얻었다고 생각합니다.

 

 

Tips

 제가 Kaggle 대회를 겪으면서 Kaggle 메달을 따는데 제일 중요했다고 생각하는 것을 3가지만 뽑아보라고 한다면,

- 시간투자

- 컴퓨팅 파워

- Discussion 및 Code 정독 + 해당 Competition에 사용하는 주된 Paper에 대한 이해

이렇게 생각합니다.

 

 Kaggle 대회는 진짜 세계에서 내놓는 실력자가 다 모인 대회인데 처음 참여하는 저로써 그들과 비교해서 강점으로 내세울 것이 많은 시간을 쏟는 것밖에 없었습니다. 그래서 5명의 참여했던 대회에서 밤낮없이 2달 동안 저희들은 매일 Discussion과 모든 Code를 읽었습니다. Discussion에 나오는 내용중에 이번 대회에서 효과가 좋을 것 같은 이론같은 경우에는 Search를 통해 Code 구현을 다 해보고, 성능이 높아지는 이론을 채택해 모델을 차츰차츰 완성해 나갔습니다. 우리나라의 공모전이나 대회같은 경우에는 Communication 하는 공간이 잘 활용이 안되지만, Kaggle에서는 실력자 분들이 매우 친절하게 설명을 해주고, 질문에 대해서도 답변을 잘해줘서 그걸 활용하는 것이 메달을 따는데 가장 효과적으로 작용했다고 생각합니다.

 

 그리고 두번째로 컴퓨팅 파워를 꼽았는데 아무래도 Kaggle Competition의 경우 Data가 워낙 크기도 하고, 참여했던 대회는 Image 데이터로 60GB가 넘는 양이었습니다...😂 이미지 장수는 train data 51,033장, test data 27,956장 이었습니다. 사용해야 하는 모델도 엄청 큰 모델을 사용해야 하다 보니 training을 한번 하는데 12시간 이상이 걸렸고, 한정된 시간에 실험할 것은 너무 많아 컴퓨팅 파워는 무조건 필요합니다. 저희는 따로 server를 받아서 쓸 수 있는 환경이 제공되어서 GPU가 딸려있는 8개의 서버를 제공받아 진행해서 수월하게 진행할 수 있었지만, 만약 그럴 여건이 안된다면, Colab에서 제공하는 TPU를 활용하여 TPU 사용시간만 다 사용하셔도 충분히 실험을 다 할 수 있을것이라고 생각합니다. 그래서 이건 있으면 좋지만, 없어도 할 수는 있다! 정도로 생각해요.

 

 그리고 마지막으로 제일 중요했던 점입니다. 앞서 말했던 것처럼 Kaggle은 Communication 공간이 활성화가 매우 잘 되어 있습니다. Code에 나온 내용만 따라서 코딩을 해보는것만으로도 동메달은 딸 수 있다고 생각하고, Discussion에 나오는 내용을 찾아보면서 논문의 내용을 구현해보고, 새로운 내용을 배우는 것도 엄청 많았습니다. 실제로 해당 대회에서 엄청난 효과가 있었던 이론도 있고, 아닌 이론도 있었지만, 새로운 이론을 그만큼 많이 접해보고, 구현할 일이 다시 있을까 생각할 정도로 많은 내용의 이론을 구현했습니다.

 

Experiment

 

Solution

Contents

www.notion.so

 기본적인 Solution은 해당 노션에 정리해놨습니다. 전처리는 Yolo v5를 활용해서 Data에서 필요한 부분들을 Crop하였고, 이후 모델은 CNN기반의 Backbone 모델에 ArcFace를 붙혀 Embedding 학습을 시키고, 학습시킨 Embedding 값을 Nearest Neighbor을 통하여 Cosine Similarity를 계산하고, 그 값에 대한 threshold를 지정해서 새로운 개체에 대한 정의를 했습니다.

 우선 기본적으로 ArcFace에 대한 이해가 매우 중요했고, ArcFace 논문에 대한 토론만 일주일은 넘게 했던것 같습니다. ArcFace 논문에 대한 내용을 정리하는건 다음에 시간이 나면 하는걸로 하고... 임펙트가 있었던 몇가지의 방법이 있었는데, 전부 Discussion이나 순위권의 사람들의 예전 코드를 보면서 얻었던 내용이었습니다.

 Backbone 모델로는 EfficientNet의 5가지 모델을 사용했고, ArcFace 들어가기 직전의 Embedding을 평균내서 ensemble을 진행하였습니다. ArcFace를 직접적으로 써본것도 유용했지만, ArcFace를 이용하여 학습시킨 Embedding을 Cosine Similarity를 통하여 계산한다는 것이 매우 신기한 경험이었습니다. 저는 이 내용을 ArcFace의 경우 비슷한 Embedding을 비슷한 각도에 위치시키는 것이고, 이에 대해서 Cosine Similarity를 같은 개체의 기준을 정하는 것으로 이해를 했습니다. Data가 Open Set이었던 대회여서 활용했던 방법이었고, 굉장히 신선한 경험이었습니다.

 

Review

 대회가 끝나고 제일 아쉬웠던 점은 생각했던 실험을 전부 진행하지 못했다는 점이 제일 아쉬웠는데요... 물론 그 실험들이 전부 대회의 성적에 영향을 미치지는 않았겠지만, 이때 안써보면 다시 공부하기는 쉽지않을것 같다는 생각이 들어서 아쉬웠어요😢 좀 더 효율적으로 모델을 훈련했다면 생각했던 실험들을 다 경험해 볼 수 있었는데...라는 생각이 많이 드네요. 처음부터 너무 큰 모델로 실험을 하기도 했고, 모든 data를 다 사용해서 실험을 해서 나중에 다시 모델과 데이터에 최적화 시킬 일은 없었지만, 한번의 실험이 잘못되면 시간을 너무 많이 소모했던것 같습니다. 그래서 다음에 참여하게 된다면 제일 작은 모델에 기존의 Data와 분포를 비슷하게 해서 Sample Data를 만들어서 실험을 진행할 것 같습니다. 

 그리고 금메달 구간의 Solution과 저희 팀의 Solution의 가장 큰 차이점은 아무래도 Dataset의 전처리랑 사용방법이었습니다. 모델적으로는 저희의 모델이 좀 더 성능이 잘나오는 모델이었던것 같은데 (시간을 엄청 쏟아부어서 모델을 만들어서.....), 금메달 구간의 Solution은 전처리 방식을 여러가지로 해서 모델을 학습시킨 내용이었습니다. 저희도 여러가지 방법으로 전처리를 진행도 해보고, 다른 데이터로 학습한 모델을 Ensemble해서 사용을 해보았지만 왜 한 모델에 그 데이터를 다 넣을 생각을 못했는지 모르겠습니다. 금메달 구간의 Solution을 보고 이게 짬의 차이라고 생각을 했고, 이번에 금메달의 제일 좋은 기회였던것 같은데 너무 아쉬웠습니다.

 그래도 Kaggle 대회를 진행하면서 새로운 논문을 읽고, 구현도 해보고, 팀원들끼리 서로 이해한걸 토론하면서 잘못 이해하고 있던 부분들도 다시 이해해가고, 다시 적용해보고, 실험도 이것저것 많이 해보고, AI에 대한 공부를 이렇게 깊게 해볼 기회가 흔치 않을거라고 생각하는데 그런점에서 너무 유익한 시간이었습니다. Kaggle 대회를 혼자 나가서 부딪혀보는것도 좋지만, 마음이 잘 맞을 팀원과 함께 나가면 더 대회에 몰두하는 계기가 될 수 있을거라고 생각합니다. 이번 Kaggle Competition은 첫번째 대회였던만큼 부족한 점도 많았고, 아쉬웠던 점도 많았는데 그만큼 배운것도 많고, 얻은 것도 많은 대회였습니다.