| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 디퓨전 모델
- ML
- GAN
- AL/ML
- Spectral
- 제어기억장치
- 허프만
- gcn
- 마이크로명령어
- 명령어사이클
- 딥러닝
- 지식그래프
- GNN
- 생성모델
- 그래프푸리에변환
- 논문리뷰
- 변분추론
- 컴퓨터구조
- 대회
- 허프만인코딩
- VAE
- 추천시스템
- GFT
- AIMERS
- 정보엔트로피
- AI해커톤
- 제어유니트
- AI
- ELBO
- lgaimers
- Today
- Total
유사컴공님의 블로그
LG Aimers 7기 AI해커톤 본선진출 후기! [온라인 예선] 본문

3학년 여름방학 동안 꽤 신경을 많이 쏟았던 LG Aimers 7기 해커톤이 저번주에 끝났다!
최종적으로 예선은 818명중 23등으로 마무리하였고 본선은 6등까지 올라갔지만 마지막에는 public score기준 9등, private score 기준 14등으로 마무리하게 되었다. 사실 참여하면서 너무 즐거웠어서 끝나자마자 이 즐거웠던 기억을 바로 기록하고 깨닫게 된 교훈도 바로 복습을 하고 싶었지만 이리저리 치이다보니 이제서야 남기게 되었다...

사실 이 해커톤은 방학에 할 게 많아 참여할 생각이 없었는데 해커톤에 참여하기 전에 국내 AI분야에서 굉장히 유명하신 교수님들의 강의를 제공한다는 것이 매력적으로 다가와 참여하게 되었다. 또한 우수한 성적을 낸 참여자들에게 LG그룹 채용 연계과 두둑한(?) 상금을 주는 것이 탐났었다..ㅋㅋㅋ

강의는 Mathmatic for AI, Causality, 지도학습, 강화학습, SCM 등등으로 이루어졌었다. (뭔가 더 있었던 것 같긴한데 기억이 안 난다..) 강화학습 부분의 강의를 못 들었었는데 그때 본가간다고 너무 바쁘기도 했고 어려워 보여서 미루다가 놓쳐버렸던 기억이 난다. 잘 모르는 부분을 위주로 들었어야하는데, 아는 부분만 들어버린 꼴이 되었다..그래도 Causality는 열심히 들었다.

그리고 대망의 온라인 해커톤이 시작되었다. 온라인 해커톤은 예선의 단계로 8~900팀 정도 참가했는데 이 중 30팀만이 본선 오프라인 해커톤에 올라갈 수 있었다. 같이 참여하기로 했던 친구가 있어서 적당히 열심히 하면 본선은 갈 수 있을 줄 알았는데 상위 3%까지밖에 못 간다는 것을 알고 바로 게시판에서 팀원을 구하기 시작했다...
(솔직히 가르쳐주고 시키는 거라 그냥저냥 할만할 줄 알았는데 팀원 모집글 보니 수상이나 연구 경력도 많고 잘 하시는 분들이 정말 많았다...심지어 이런 분들이 Aimers 이전기수 해커톤에서 아쉽게 본선을 못 가서 이번엔 꼭 가고싶다고 하는 걸 보니 내가 너무 만만하게 봤구나싶었음...)

온라인 해커톤 시작하기 전에 시간이 조금 남았어서 이때 본가에 있었는데 이것저것 찾아봤던 기억이 난다..!
딥러닝을 주로 공부했어서 트랜스포머 기반의 시계열 예측 모델인 GateFormer와 BasisFormer에 대해서 알아봤었다. 하지만 조사한 딥러닝 모델들은 아래의 이유로 쓰일 수 없게 되었다.

(근데 또 본선 가보니 1등은 딥러닝을 야물딱지게 잘 활용했더라...)

데이터셋을 받아보니 주어진 피쳐가 정말 그냥 날짜와 메뉴, 판매량이 모두였다... 심지어 주어진 기간은 1년5개월..ㅋㅋㅋㅋㅋ 게다가 메뉴 개수가 193개나 되는데 21일 입력을 받고 7일간 193개의 메뉴를 수요예측을 하는 것이 문제였다. 심지어 SMAPE라는 듣도보도 못한 score를 줘서 더욱 당황


아무튼 간단히 EDM을 해보니 역시 피쳐가 적고 리조트의 수요예측이라는 local한 상황의 특징때문인지 수요가 지멋대로 왔다갔다하고 주기성이 있긴하지만 정확하게 예측을 하기가 힘들었다. 일별 편차도 너무 커서 오차 역시 당연히 컸었다...그래도 주간기준의 매출은 변동성이 크지 않다는 것을 이용해서 주간총매출 예측모델을 만들고 해당 모델의 예측을 7로 나눈 뒤, 편차를 일별보정 모델을 만들어 최종 예측을 만드는 전략을 세웠다. (이렇게 만들면 오차분산을 두 모델이 나눠서 분담하면서 최종 오차분산이 많이 줄어들지 않을까하는 직관에서 나온 전략이었는데 관련 연구를 찾아보니 실제로 그렇다고 하더라)
또 안 팔리다가 특정 일수에 갑자기 스파이크를 찍어버리는 메뉴들도 간간히 있어 해당 주차의 최고매출 예측
모델을 따로 만들어 기존 모델이 갑자기 과도하게 높은 수요를 예측할 때 clipping해주었다.

대회 둘쨋날, 고수들이 많이 들어오지 않았을 때 혼자 먼저 만들어 제출해 본 모델이 리더보드 7등을 찍었다. 솔직히 등수가 내려갈 거라고는 생각했는데 이 등수를 본선에서야 되찾게 될 줄은 몰랐다. (본선 때 6등/820까지 올라감..ㅋㅎ)

아무튼 그 이후로는 팀원들과 함께 가장 성능이 좋은 모델과 상관계수가 낮으면서도 성능이 괜찮은 모델들을 만들어 앙상블 하기 위해 계속 노력했었다. 사실 글로는 굉장히 빨리 지나가지만 이 과정에서 오만가지 기법과 논문을 서칭하고 시행착오를 겪고 하는 것이 굉장히 힘들었었다. EDM과 피쳐엔지니어링도 계속 다시 했었고...
솔직히 이런 과정을 거치고 나니 절대 혼자서는 못해먹겠다라는 생각이 들었다.. 이런 생각이 내가 무능력한가라는 생각까지 이어지긴 했지만 다시 생각해보니 모두가 팀을 이루어서 참여하는 대회니까 뭐ㅋㅋ 그리고 예선 끝나고 보니 팀장으로서 여러가지 귀찮은 행정적인(?) 일들도 많이 했고 1인분은 충분히 한 것 같아서 이런 생각은 예선이 끝나고 사라졌었다.

딥러닝에 편파적으로 AI를 공부하다보니 머신러닝 모델에 대해서는 대강 알고있긴 했지만 자세히 알지 못했다. 이번 해커톤에서 Gradient boosting tree 계열의 모델인 Catboost모델을 활용했는데 이번 기회에 GBM모델에 대해서도 자세히 공부를 할 수 있게 되었다. GBM은 회귀의 경우 먼저 제일 처음에는 그냥 평균을 예측한 다음에 해당 잔차를 다음 트리로 학습하는 부스팅 모델이다. 이 과정을 리프 별로 계속 반복하는데 이 과정에서 오차를 그냥 오차를 쓰는 것이 아니라 오차의 기울기를 사용한다. MSE가 아닌 다른 손실함수도 최적화하기 위해 오차 그 자체가 아닌 오차의 기울기를 활용해 경사하강법을 진행한다(MSE의 경우는 절대 오차 그 자체가 그냥 기울기가 된다). 그래서 이름에 Gradient가 들어갔었던 것이다.

그리고 예선 마감 당일... 30등까지 본선에 갈 수 있는데 우리는 44등인가 그랬었던 것 같다. ㅋㅋㅋ 그 날 아침에 눈을 떴는데 본선 못 갈 거 같아서 엄청 우울해했던 게 기억난다.
원래는 validation셋을 좀 빼서 예측한 결과를 토대로 [앙상블 SMAPE+각 모델 간의 상관계수]라는 식을 세워 이를 이 식을 최소화하는 optimizing 문제로 접근하여 모델들의 가중치를 구하는 방법을 써볼랬는데 제출파일은 10개월치에 대한 예측이고, 학습셋이 17개월밖에 안 되는 관계로 validation셋을 많이 빼기가 곤란하였다. 그렇다고 1개월만 빼서 가중치를 구하자니 10개월을 예측해야하는데 너무 데이터에 fit한 결과가 나올 것 같았다.
그래서 각 모델의 score와 상관계수만으로 구할 수 있는 선형계획법이나 이차계획법을 적용해볼까했는데 가만보니 SMAPE는 절댓값 함수라 이런 최적화 방식을 사용할 수가 없었다.

아무튼 그래서 위의 말도 안되는 상관계수맵을 보고 직감으로 새벽까지 팀원들과 가중치를 맞춰보기 시작했다ㅋㅋㅋㅋ 1일 제출 제한횟수가 5회였다. 여기서 팀원의 새로운 모델을 한번 내고 앙상블 모델 한 번 내서 2회를 쓰고 3번이 남은 상태였다. 이때 낸 앙상블 모델이 44->38등으로 올려줬던 것 같다. 이대로는 본선에 갈 수 없는 상황... 그런데 시간날 때마다 앙상블해서 제출해보면서 얻은 미친 직감이 이때 발휘되었다. (본선을 가보니, 우승하신 분들은 처음부터 모델간의 장단점을 상쇄시켜줄만한 모델들을 의도적으로 만든 뒤에 앙상블하였다.)

저 많은 상관계수맵에서 고른 다섯개의 모델중에 하필 고른 그 가중치가 바로 38->20등을 만들어주었다!!
score로 치면 0.478->0.465(낮을수록 좋음)였다! 예선마감 4시간 전 새벽이라 본선이 거의 확정인 상황ㅋㅋㅋㅋ
(그리고 예선 끝나고 심심해서 앙상블 후보군 파일을 10개정도 더 조합해서 내봤는데 아무리 내도 저 점수를 뛰어넘는 파일이 나오질 않았다. 제출 3회 남은 상황에서 그냥 신이 빙의된 게 아니면 말이 안됨...) 아무튼 그리고 그 다음 날 보니 public score는 20등 그대로였고 private score 뜬 거 보니 23등이 되어있었다. 운 나빠서 10등 이상 떨어졌으면 사실 못 갈 수도 있었을 수도?

아무튼 이렇게 본선진출의 마지막 단계 코드검증을 위해
ppt 및 코드 제출 대상자가 되었다.



얼레벌레 팀원들과 피피티 벼락치기를 해서 만들어주고,,사실 코드 검증을 제대로 못했었다. 모델 학습하는데 시간이 너무 오래 걸렸고 여러 모델들을 한 파일에 통합하는 것도 여간 쉬운 일이 아니었다. 그리고 제출코드에서 정말 말도 안되는 억까가 발생하는데...

진짜 이게 말이 되나ㅋㅋ predict(pool)이라는 코드가 카톡으로 보내지면서 이모지로 predict🎱로 바꼈고, (몰랐는데 당구가 영어로 pool이란다 ㅋㅋ) 저걸 다시 코랩에 복붙하면서 predict(당구)로 바뀐 거다... 급하게 제출하느라 제출하고 나서 알았고, 이를 데이콘 측에 설명을 했더니 이미 인지하고 있는 부분이고 수정해서 검증하겠다라는 답변을 받았다. 그 분들도 얼마나 어이가 없으셨을까

레전드 억까와 억빠 끝에 드디어 본선진출이 확정되었다. 이때 너무 기뻣던 것 같다. 드디어 키트 받는건가..라는 생각. 그리고 몰랐는데 본선 진출하면 1인당 100만원씩 주는 것이엇다. 뭔가 방학동안의 노고를 보상받는 느낌이 들어서 너무 기뻤다.
아무튼 온라인보다 더 재밌었던 오프라인 후기는 다음에 올릴 예정
