일지/네부캠 AI 4기(22.09.19~23.02.14)

20221104금-Pstage발표,랩업

제로타이 2022. 11. 5. 01:45

데일리 스크럼

어제에 대한 간략한 회포를 풀고, 오늘 무얼 할 건지에 대해서 이야기를 나눴다. 막상 프로젝트가 끝나니 뭐 해야 하지? 싶더라고. 이야기나온 것은 희원 님 발표 돕기. 각자 여태 해온 것들에 대한 간략한 정리를 해주면 좋을 것 같다. 그러니 나는 동건 모델과 CNN_FM 처리 과정에 대한 이야기를 하면 될 것 같다.

동건 모델

만든 과정, 계기

베이스라인 코드로 제시되었던 모델이 7개나 되었기에, 이런 다양한 모델들을 체험해보고 되도록 이 모델 중에서 유의미한 결과를 내기를 바라는 것으로 출제진의 의도를 파악했다. 모델이 각각 학습하여 예측을 한 결과를 합치는 앙상블 역시 이미 제공이 되어있었지만, 여태 배웠던 모델들이 기존의 모델들의 결합으로 이뤄지기도 한다는 것에서 착안해서 모델 차원에서 앙상블하는 느낌을 살릴 수 있지 않을까 생각하고, 결합을 시도하게 됐다.
데이터를 쓸 때는 최대한 다양한 정보를 써야 한다는 것과 모델에 있어서는 딥러닝을 써야 한다는 일종의 고정 관념이 있었는데, 막상 코드를 보니 제시된 딥러닝 모델에서는 context 데이터를 활용하지 않는 것을 보고, fm 계열의 모델과 딥러닝 계열의 모델을 합쳐야겠다는 생각을 하게 됐다.

가장 먼저 한 작업은 다른 코드들을 해치지 않도록 나만의 모델을 만들어서 스페셜 미션의 EDA 내용을 토대로 전처리를 해주는 것이었다. 이상 없이 작동되는 것을 확인하고 나니 코드를 손 보는 것에 더욱 자신감이 생겨서 본격적으로 짬뽕을 할 궁리를 시작했다. 참고로 그다지 결과는 좋지 않았다.

가장 처음 만든 모델은 FFM과 WDN의 조합이었다. 기존에 있던 WDN 모델을 완전하게 복사 붙어넣기한 후에 조심히 FFM에서 쓰이는 인자와 모델을 그대로 넣어주고, 마지막에는 단순하게 +를 해주었다. 그러나 결과는 오히려 더 안 좋아졌다. 그러나 이때는 아직 인자를 단 하나도 수정한 적이 없는 결과였기에 임베딩 차원을 늘리거나 에폭을 늘리는 등의 시도로 더 좋은 결과를 낼 수 있을 것이란 막연한 상상을 했고, 인자를 대폭 늘리는 방향으로 과감하게 시도를 했다.

몇 번 인자를 다양하게 주고, 조금씩 전처리 보완을 하면서 실험을 반복하다가 문득 DCN이 층을 더 깊게 할 수 있는 모델이란 것을 알게 됐고, 이에 WDN보다 DCN이 더 의미 있을 수도 있겠다는 생각에 무작정 시도를 하게 됐다. 방식은 이전과 비슷하게 다 된 DCN에 FFM 뿌리기를 시전했다!

이 시기가 저번주 목요일이었고, 정말 간단한 발상에서 생각보다 좋은 결과가 나오는 것을 확인했다. 정확하게 앙상블과 같은 방식은 아니지만, 아무래도 그런 비슷한 효과를 낸 것이 아닌가 짐작하고 있다. 엄청난 계획을 세운 것이 아니라 단순하게 코드를 쪼작거리다 우연히 얻어낸 모델의 결과라 깊은 분석은 진행하지 못 했다.

CNN_FM

사실 이것은 마지막 날, 어제 부랴부랴 짜낸 내용이라 많은 실험을 해보지는 못 했다.

리더보드에 제출할 때 무려 지표가 20이 넘는 것을 확인했는데, 그 이유는 바로 이미지가 아닌 것을 이미지로써 학습에 활용하는 데에서 발생하는 문제가 아닐까 생각했다. 이미지가 없는 책을 학습을 할 때 생기는 문제와 마찬가지의 차원에서 이미지가 없는 책에 대해서 평점을 예측을 할 때도 의도하는 대로 예측이 이뤄지지 않을 것이라 생각했고, 이를 위한 처리를 시도했다.

먼저 이미지가 없는 책에 대해 학습을 한다는 문제는 이미지 없는 책을 제외한 데이터를 사용하는 방식으로 해결했다. 따라서 학습셋에서는 25만 개 가량의 데이터만 사용이 되었다.
남은 문제는 이미지 없는 책에 대한 평점을 예측하는 것을 해결하는 것이었다. 이미지만을 학습한 모델은 이미지에 대해서만 예측을 해야한다고 판단했고, 이에 이미지가 없는 책에 대해서는 철저하게 모델이 무시할 필요가 있었다.

그 해결 방법은 다음과 같다. 배치사이즈에 맞춰 들어오는 데이터에 대해 모델이 예측을 진행할 때 일일히 이미지가 있는 것과 없는 것을 구분해내는 것은 어렵다고 판단했다. 왜냐하면 배치 사이즈 내에서 데이터를 구분하여 값을 매기게 된다면 들어온 그대로 정렬을 하기가 힘들어질 것이라고 생각되었기 때문이다. 따라서 처음부터 배치 사이즈를 1로 넣어서 한번에 한 데이터씩 처리하도록 예측의 방식을 틀었다.

이후 모델의 예측 단계에서 조건문을 걸어 해당 데이터가 no_exitst, 즉 이미지가 없는 책일 경우에 명확하게 -1이라고 표기해 이후에 후처리가 가능하도록 코드를 추가했다. 이를 통해 순서는 지켜지면서 원하는 값들은 -1이 정확하게 들어가도록 결과물을 만들어낼 수 있었다.
데이터는 어찌 처리했지만, CNN_FM의 모델의 가장 큰 문제는 0~10점을 아득히 벗어나는 값이 계속 있었다는 것이었다. 누가 10점 만점의 평점에서 30점이나 되는 평점을 내린단 말인가?

처음에는 단순하게 인자들을 대폭 늘려주면 좋은 결과가 나오지 않을까 하여 임베딩 차원을 늘려보기도 하고, latent 차원을 늘리기도 했다. 그러나 어떻게 해도 이상값은 계속 안에 들어있었고 포기를 하려던 찰나..

임베딩 차원을 대폭 늘린 모델이 점차 성능이 떨어지는 듯한 모습이 나오기 시작했다.

그러더니 갑자기 한번 팍 치솟은 후에 급격히 다시 성능이 좋아지는 모습이 그려졌다. 모델이 더닝 크루거 효과마냥 우매함의 봉우리를 거쳐 깨달음의 고원으로 가는 듯한 모습이 그려졌고, 이에 모델이 어떤 로컬 미니멈과 관련된 값을 극복하는 것이라고 판단하여 에폭을 많이 늘려 학습을 지속했다. 결과적으로 150까지 학습을 진행했고, -1 처리한 것 이외에는 값들이 다 정상적으로 나오는 것을 확인했고, 이후에 앙상블을 하는 과정에서 알차게 활용했지만, 유의미한 결과는 얻을 수 없었다.

스페셜 피어세션

대회가 끝난 이후 진행된 스페셜 피어세션. 당연히 대회에 대한 이야기를 나누면서 어떤 식으로 사고를 하고 방향을 잡았는지 공유했다. 자세한 내용은 역시 일기장에! 들어보니까 다들 생각한 방향이나 시도한 것들이 비슷하면서도 굉장히 달랐다. 만약에 여기 있는 모든 사람들이 모여서 집단지성으로 프로젝트를 진행했다면 과정에 따라서는 더 좋은 결과를 볼 수도 있지 않았을까 싶은 생각이 든다.

피어세션

간단하게 스페셜 피어세션 때 이야기한 것들 공유하고, 팀 회고지 작성. 모더레이터인 희원 님은 발표 준비 때문에 바쁜 관계로 내가 주도적으로 팀 회고지를 모아서 제출했다. 이후에는 서버가 닫히기 전 우리가 여태 했던 것들을 백업하기 위해 깃을 좀 만지는 작업을 했는데, 뭔가 원활하게 흘러가지는 않았다. 생각으로는 코드만 일치시켜서 만드는 게 아무래도 낫지 않을까 싶기는 하다. csv파일도 올려서 하면 될 거 같은데, 아직 깃을 다루는 게 익숙치를 않으니까 우여곡절을 좀 겪은 듯.

마스터클래스

6조 발표(1등)

학습셋과 테스트셋의 전체 모양을 보고 완전히 랜덤하게 잘랐다고 판단, 검증셋을 잘 활용하는 것이 유용하다는 결론을 내림.
결측률이 99.99699퍼센트되는 희소 행렬이 만들어진다. 그래서 MF는 사용이 불가능하다. 
베이스라인 모델들을 전부 값을 확인해 봤을 때,

이 정도의 결과를 얻었다. 

이후 catboost 사용. 왜 썼는가? 딥러닝을 사용하기에는 너무나도 희소하다. 분류에 강한 boost모델을 사용하기로 결심. 이때 범주형 데이터가 많으므로, 범주형에 강한 catboost 사용.

데이터 전처리를 어떻게 했는가?
나이 별로 평점이 좀 달라 보였다. 결측값은 NULL로 만든 후에 범주형으로 군집화. 
왜 결측을 유의미한 값으로 보았는가. 책 데이터 언어 결측값이 유의미한 차이가 있었다. 그래서 그것 자체를 범주로 만들었다. 이렇게 간단한 전처리만으로 catboost를 했는데 쉽게 RMSE 2.14를 달성함.

이후 다양한 딥러닝 모델을 모색. 일단 FFM은 콜드 스타트를 잘 대처함. 여기에 DCN을 적용. 즉, 동건 모델 활용! 허허 내 모델을 사용해줬다니 뭔가 머쓱하다!

wandb로 파라미터 튜닝이 가능함.

각 인자의 상관관계를 보여줄 수 있는 그래프. 이런 것들을 간단하게 파악할 수 있다.
optuna도 사용. 주어진 범위 내에서 좋은 파라미터를 찾아주는 함수. 위에서 경향성을 파악한 후에 이 함수를 통해 tuning을 진행했다.
클래스가 매우 불균형했다. 그래서 K-fold를 사용하는 게 효과적이라 판단하고 그리 했다. 

피드백

시간 관계 없는 데이터라면 K-fold 방식은 매우 효과적이다. ffm과 dcn을 합친 게 매우 독창적이라고 해주셨는데, 어.. 이건 조금 기분 좋을지도.
deep_conn은 텍스트 데이터를 활용한다. 근데 학습셋과 테스트셋의 분포가 많이 다르기 때문에, 얼리 스타핑을 적절히 해야만 했을 것이다. 

우리 발표

희원 님이 정말 잘 발표해주심! 아니 근데 동건 모델 이름 볼 때마다 웃기네..ㅋㅋ 그냥 내 모델이야! 하면서 간단하게 지은 이름인데.. 이게 발표까지 쓰이다니.

피드백

평균으로 채우거나 빈도수가 높은 값으로 채우기. 전처리로 결측을 채우는 게 정말 어려운 일이다. 나름의 재밌는 분석을 잘 했다. 다양하게 가설을 세우고 다양하게 전처리, 군집화를 통해서 데이터를 건드리는 게 유의미한 결과를 내뿜을 때가 있다. 왜 CNN_FM이 갑자기 중간에 확 뛰었는가? 배치 사이즈의 문제일 확률이 크다. 학습률을 또 잘 조정하는 것이 유의미할 것이다. 

QnA

이후! 사전 질문 처리. tmux를 통해서 서버를 켜두고 내 컴은 끌 수 있게 하는 방법이 있다. nohup, byobu도 있다!
프로젝트를 진행할 때 예측력과, 해석력 두 가지 방향으로 갈 수 있다. 해석력에 투자한다면 EDA에 시간을 들이는 것이 당연하다. 가설과 검정은 항상 그런 실패 과정을 거치기 마련이다. 
적은 값들을 아예 others로 치부하는 것은 꽤나 좋은 경우가 나온다. 이게 콜드스타트하고도 연관이 되기도 한다. 
대회는 어려운 편이다. 결측률이 너무나도 높다. 모델이 쉽게 학습을 하지 못한다. 2.1점 정도만 도달해도 잘했다고 생각하신다고. 0.02점 못 올린 게 너무나도 아쉽다! 으으..

회고 및 다짐

성연 님이 내 아이디어에서 착안해서 점수를 올린 것에 대해서 사과를 하셨는데, 난 사실 사과할 거리가 절대 아니라고 생각하고 있어서 조금 당황했다. 일단 상금이 걸린 대회도 아닌데 팀 단위로 진행하지만 큰 차원에서는 다 함께 힘을 합치는 게 좋은 것 아니겠나. 그래서 내 아이디어는 누군가 물어보기만 한다면(사실 물어보지 않아도 떠벌리고 다닌 것 같기도..?) 모두에게 다 공개했다. 저번주 금요일 오프라인에 있었던 5조 분들은 아마 동건 모델을 이미 다 알고 있을 것이다. 내가 해온 것을 공유하는 과정에서 투명하게 다 밝혔기 때문이다. 애초에 나는 그것을 나만의 아이디어라고 조금도 인식하고 있지 않았다는 것. 나는 이 아이디어를 처음 떠올린 게 나라는 그 사실만 가지고 있으면 됐지 누가 이 아이디어를 활용하든 말든 상관하지 않는다. 그리고 무엇보다, 성연 님 팀은 그 애매한 아이디어를 통해 이 정도밖에 해내지 못한 나를 뛰어넘어 그것을 더 깊게 연구하고 활용해서 결과적으로 더 나은 모델로 만들어내는데 성공했다. 그러면, 뭐 시작은 동건 모델(애초에 동건 모델이라 이름은 붙였지만, 엄밀하게는 잘 만들어진 FFM과 DCN을 갖다쓴 것이니 온전한 내 창조물도 아니다)이었다 쳐도 끝은 6조 모델인 것이지, 내가 그것에 대해 나의 지분을 들이미는 것도 참 웃긴 것 아니겠나. 나는 동건 모델이 2.16보다 더 아래까지 성능을 발휘할 수 있다는 것에 굉장히 놀랐다. 이건 분명 나는 해내지 못한, 성연 님 팀이 연구하고 갈고닦아 만들어낸 결과물이다. 아니 그리고 무엇보다 애초에 나는 코드로 내 아이디어를 공유한 적도 없다... 그저 말로만 이러한 아이디어가 있었다 공유한 것일 뿐이니 어찌 생각해도 내가 성연 님한테 배신감을 느끼거나 사과 받을 상황이 아니라고 생각했다. 
뭐 아무튼 성연 님이 그런 것으로 먼저 dm을 주셔서 새삼 섬세하신 분이라는 생각이 들었다. 내가 혹여 그런 것에 기분 나빠할까봐 먼저 연락을 취해온 것이니 나를 배려하고자 한 것 아니겠나. 내가 그런 상황이었다면 나는 연락할 생각을 하지도 않고 있었을 것 같다. 조금도 문제될 부분이 아니라고 생각하니까. 평소에도 좋은 분이라 생각했지만, 내 생각보다 더 좋은 인물이더라고. 그래서 나는 만약 이게 내가 별난 놈이라 이런 것에 신경 안 썼을 뿐이고 사실 내가 기분 나빠해야 할 상황이라는 것이 대세의 의견이라고 친다면, 나는 그 기분 나빠야 할 마음을 대가로  바쳐 성연 님이라는 인연을 얻었노라고 생각하기로 했다. 비록 같은 팀은 아니지만, 언젠가라도 새로운 만남, 새로운 관계에서 이어지고 연결하게 될지도 모른다! 이번에 한번 그 인연의 끈을 맺어둔 것이다. 모쪼록 이런 많은 인연들을 쌓아나가고 싶다.

아, 그것과 별개로 마스터님이 모델 차원에서 합치는 것이 신선한 발상이라고 말씀해주실 때는 뭔가 뿌듯했다! 발화의 대상은 내가 아니었지만 충분히 내게도 주어진 칭찬으로 여겨도 되지 않을까?!

드디어 첫 프로젝트가 완전히 끝을 맺었다. 랩업 리포트를 아직 다 작성하지 못 했는데, 주말에 약속이 많이 잡혀있어 더 부지런히 작성해야했다는 생각이.. 크흠. 이번 프로젝트를 통해서 나는 무엇을 얻었을까? 단순하게 이야기하자면 그저 많은 것을 얻었노라 하겠는데, 랩업 리포트에도 쓸 겸 조금더 고찰해보자. 
먼저 내 실력에 대한 부분으로는 판다스와 matplotlib에 대한 능숙함이 조금 생겼다. 첫 주차에는 EDA를 해야한다는 생각은 있는데 코드로 그것을 어떻게 써야할지를 모르니 정말 막막해서 한숨만 나왔다. 그래서 일단 닥치고 스페셜 미션에 나온 것들이라도 따라해야겠다는 일념으로 코드를 일일히 베껴서 쳤는데 그러는 과정에서 조금씩 판다스의 문법에 친해지게 되었다. 또한 인공지능에게 패배한(...) k-donggun 클러스터링을 하는 이틀의 시간은 조금 더 코드를 효율적으로 짜는 것에 대한 고민을 하게 만들어줬던 것 같다(성훈이 형은 여기에서 더 나아가서 아예 프로그램을 만들었더라..). 이 과정을 거치면서 나는 내가 생각하는 문제의식을 조금 더 선명하게 비춰낼 수 있게 하는 힘을 얻은 것 같다. 물론 아주 기초적인 수준에서밖에 하지 못하지만, 계속 연습한다면 또 더 나아진 모습이 되어있지 않을까!
또한 모델을 다루는 것에도 살짝 익숙해졌다. 아직 쌩으로 모델을 직접 써보라 하면 쓰지는 못할 것 같은데(내가 이것을 의식하는 이유가, 멘토님이 취업할 때 RNN을 직접 구현하라는 요구가 있었다고 해서..), 그래도 이전보다는 모델의 작동 방식을 더 빠르게 캐치하고 다룰 수 있다. 2주차 강의 때 파이토치에 대한 강의를 들으면서 모델이 작동하는 순서에 대해 데이터셋과 데이터로더, 모델 학습 단계를 거친다는 언급이 있었던 것으로 기억한다. 여태 갖은 과제들이 전부 그렇게 구현이 되어있었지만 여즉껏 나는 그런 부분에 대해서 명확하게 인식하지 못 했다. 하지만 이번 프로젝트에서 데이터를 분리하는 개념을 고민하면서 이런 부분에 대해 더 알아보는 시간을 가질 수 있었다. 직접 대회를 하지 않았다보니 대회 코드를 직접 볼 일도 그다지 없었고 여태 대회가 어떻게 진행되는지에 대해 막연한 상상만 가지고 있었는데, 상세하게 코드가 어떤 식으로 작성되는지 알게 되었다는 게 또 하나의 큰 수확이라고 하겠다.
협업, 소통 부분에서도 얻은 게 조금 있다. 여태 대학에서 주로 해본 것은 혼자 지독하게 방 안에 틀어박혀 논문을 뒤지고 책에 밑줄 그어가며 인용할 부분 발췌해서 레포트를 쓰는 것이었으니, 팀으로서의 협업은 이번이 거의 처음인 꼴이다. 처음이었던 만큼 초반에는 솔직히 어떻게 협업을 해야할지 감이 잘 잡히지 않았다. 내가 생각하는 것과 타인이 생각하는 문제의식은 달랐고, 그런 상태에서 이뤄지는 협업에 대해 나는 각자 할 거 하고 취합하는 게 협업인 것일지도 모르겠다는 생각도 들었다. 따지자면 위키 문서를 쓰는 일 같은 것이다. 각자가 각자의 글을 쓰지만 결과적으로 집단 지성의 글이 되는 것 같은 협업. 생각해보면 42에서 했던 팀플도 딱 그정도 수준에서 진행했지. 하지만 주말부터 본격적으로 이뤄졌던 협업은 분담이 어느 정도 애매했을 지는 몰라도 적어도 확실하게 팀으로서 분담을 하여 진행하는 협업이었다. 이 과정에서 분담을 한다는 게 무엇인지 조금이나마 알게 되었고, 분담을 하게 되면 어떤 것들을 소통하면 좋을지 더 많은 고민을 하게 됐다. 다 각자 알아서 공부하고 취합할 때는 다들 알 것이라 생각하며 과감히 넘길 부분도 분담의 상태에서는 나만이 알고 있는 것이라 생각하고 가급적 자세하게 공유를 할 필요가 있다. 한편으로 나만 알고 있는 채 필요한 결과를 중점적으로 간략하게 과정만 이야기해야 하는 것도 있기 마련이다. 아직은 미숙하지만, 앞으로 더 경험을 쌓으면서 이런 부분에 대해서도 성숙한 내가 되고 싶다. 
또한 나와는 다른 시각을 가진 사람들과의 소통은 내 사고를 더 유연하게 해주었고, 이를 통해 나는 새로운 생각의 활로를 개척할 계기를 얻을 수 있었다. 결측치를 메꾸는 방식, boost모델을 사용하는 방법, wandb를 사용하는 방법. 이것은 비단 우리 팀에 대해서 한정하는 것이 아니라 프로젝트의 아이디어를 공유했던 다른팀의 인연에 대해서도 그러하다. 오프라인에서 이야기를 나눈 성연 님과 5조 분들과의 소통은 내게 정말 큰 도움이 되어주었다. 모난 성격에 항상 잘하지는 못하지만 그래도 앞으로도 다양한 사람들과 이야기를 나누며 기발한 아이디어와 참신한 생각, 접근 방식을 내 속에 함양시키고 싶다!

일단 얻은 것에 대한 부분은 여기까지. 더 있을 것 같은데, 슬슬 눈이 감겨서 잘 안 떠오른다. 
부단히 노력했다. 첫 술에 배부를 순 없지만, 첫 단추를 잘 꿰어야 한다고 의식하면서 더 노력했던 것 같다. 첫 프로젝트 경험, 완벽할 수는 없지만 여기에서 뿌린 씨앗이 장차 나를 지탱할 거목이 되어줄 것이다. 괜히 시작이 반이라는 것이 아니다. 일단 시작하는 것 자체가 중요하기도 하지만, 그 시작을 잘 닦는 것도 중요한 것이다. 
일생지계 재어유, 일년지계 재어춘, 일일지계 재어인이라 했다. 이제 막 출발점에 오른 내 개발 경험을 본격적으로 쌓아나가보자고.

'일지 > 네부캠 AI 4기(22.09.19~23.02.14)' 카테고리의 다른 글

20221108화-4~5, 살아남기  (2) 2022.11.08
20221107월-8주차! 1~3  (4) 2022.11.08
20221103목-Last of Pstage  (2) 2022.11.03
20221102수-10th of Pstage  (4) 2022.11.03
20221101화-9th of Pstage  (3) 2022.11.02