[DACON] 대회 참여 후기

데이터 여행자·2021년 4월 4일
1

스터디

목록 보기
9/15
post-custom-banner
  • 대회 참여 후기라고 적기 애매한 후기네요.

시작

3월 12일 참여 대회를 결정하고 팀이 결성되었다. 나를 포함한 3명으로 구성된 해빙 예측 팀은 모두 첫 대회 참여이기 때문에 우려와 기대가 반반 섞인 마음으로 조별 모임을 시작하였다. 우리가 참여한 대회는 DACON의 '위성 영상을 활용한 북극 해빙 예측 AI 경진대회'이다.

1978년부터 위성 영상으로 관측된 북극 해빙 이미지를 이용하여 2019년(Public)과 2020년(Private)의 해빙 농도를 예측하는 것이다.

데이터

대회에서 사용되는 데이터는 학습 데이터의 월과 파일명이 적힌 train.csv, 훈련용 npy 데이터 (1978년~2018년 월별 482개 데이터)인 train 폴더가 있다. npy 파일은 '해빙 농도(0~250), 북극점(위성 관측 불가 영역), 해안선 마스크, 육지 마스크, 결측값 5개의 채널'로 구성되어 있다.

5개의 이미지 중 사용되는 이미지는 해빙 농도와 북극점을 나타낸 첫 번째와 두 번째 이미지이다.

베이스라인

대회를 위해 먼저 시작한 것은 참고할 베이스라인을 찾는 것이다. EDA 자료나 베이스라인 코드가 많아서 고민했지만 가장 자세하게 설명이 되어 있었던 베이스라인을 선택하였다.

선택한 베이스라인은 ConvLSTM2D를 이용한 자기회귀 모델을 사용하였으며 이미지의 크기가 크기 때문에 Encoder와 Decoder를 사용하여 이미지를 압축하여 처리하였고, 성능을 높이기 위해 U-Net 구조를 사용하였다. (참고: U-Net 구조 정리) U-Net 구조 안에서 Encoder로 사전 학습되지 않은 MobileNetV2를, Decoder로 pix2pix(참고: pix2pix 정리)의 upsampling 구조를 사용하였다.

모델 공부

베이스라인에 많은 모델이 사용되었기 때문에 각 모델에 대한 공부를 각자 하면서 매일 아침 혹은 저녁에 구글밋으로 모여 공부한 내용을 공유하였다. 모르는 부분은 퍼실님들께 질문도 하고, 블로그에 각자 정리하기도 하였다.

베이스라인 공부 및 추가 작업

모델 공부를 얼추 마무리한 후, 베이스라인의 코드를 연구하기 시작했다. 예상보다 코드가 어려워서 제대로 이해하지 못한 부분이 많았다. 왕언니의 도움을 받아 베이스라인을 이해하고 각자 할 일을 할당받았다. 내 경우에는 Learning rate scheduler와 Optimizer 등 하이퍼파라미터 수정 부분이었다. 베이스라인에 친절하게 적용할 수 있는 아이디어를 제시해 주었기 때문에 베이스라인에서 제시해준 내용을 토대로 하이퍼파라미터를 수정하였다.

하이퍼파라미터 수정

우선 Learning rate scheduler의 경우, cosine annealing을 사용하였고, Optimizer는 Adabelief(참고: Adabelief 정리)를 사용하였다. 그 결과 val_loss가 안정되는 모습을 발견할 수 있었다.

주어진 베이스라인을 그대로 사용하여 모델을 학습시키면 val_loss가 중간에 급격히 상승하는 현상이 일어났었다. 때에 따라 다르지만 val_loss가 10570715.0000 정도로 매우 높게 나오곤 했다. 그러나 하이퍼파라미터를 수정해주고 나서는 val_loss가 1 이하로 매우 안정적이 되었다. 안타깝게도 다양한 하이퍼파라미터를 적용했음에도 불구하고 점수가 크게 떨어지지는 않았다.

모델 구조 변경

그 후 모델 변경을 조원들과 함께 도전하였다. 베이스라인에서 추천한 대로 Encoder에 EfficientNet을 적용하거나 ConvLSTM2D를 Attention / Transformer로 대체하는 방법을 시도하려고 했다. 그러나 예상보다 모델 구조를 바꾸는 것이 쉽지는 않았다. 시도할 때마다 에러 메시지가 나왔고, 그 부분을 수정한 후에도 계속해서 에러 메시지가 나왔다. 다양한 방법을 시도해보았으나 결국 해결하지 못했다.

이미지 증식

데이터 증식 부분은 시도하지 못해 아쉬운 부분이다. 아이펠 프로젝트를 하다가 발견한 Albumentation을 사용하려고 하였으나 사정상 시도하지 못하였다.

어려웠던 점

우선 이미지의 크기가 커서 주피터 노트북으로는 실행되지 않았기 때문에 코랩을 사용해야 했다. 또한 베이스라인의 코드가 어려워서 내 수준에서는 이해가 잘 되지 않았다. 데이터셋 파이프라인이라는 개념이나 백본을 사용해서 모델을 구성하는 방법 등 처음 접해보는 것들이 많았기 때문에 이해하기가 어려웠다. 마지막으로 다양한 모델을 이해하는 것이 어려웠는데, 모델마다 각자의 특성이 있기 때문에 어떤 식으로 베이스라인을 수정해야 하는 것인지 알기 힘들었다.

마무리

중간에 포기한 대회이지만 대회 준비를 하면서 많은 것을 배웠다. 베이스라인을 공부하면서 아이펠에서 다룬 것 외에 다양한 모델과 하이퍼파라미터가 존재함과 실제로 적용하는 방법, 그리고 다양한 에러 메시지를 해결하는 법을 배웠다. 조원들과 약 보름간 함께 하면서 혼자서는 해보지 못할 경험을 한 것도 좋았다.

여러 사정으로 중간에 포기한 것은 아쉽다. 하지만 이번 대회 준비를 통해서 대회에 참여하기에는 실력이 많이 부족함을 깨달았고, 앞으로 더 열심히 공부해야겠다는 결심을 하게 되었다. 차근차근 더 많은 준비를 해서 다음에 다시 한 번 대회에 도전해 보고 싶다.

  • 추가: 오랜만에 데이콘에 들어가보니 대회는 끝이 났고, 결과가 나왔다. public: 71, private: 42. 베이스라인이 잘 만들어졌었다는 것을 확인할 수 있었다. 나도 언젠가는 베이스라인을 만들 수 있는 날이 왔으면...
post-custom-banner

1개의 댓글