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

20221103목-Last of Pstage

제로타이 2022. 11. 3. 20:05

간밤에

역시나, 같은 작가 다른 이름 사례가 존재한다. 몇 이름들을 검색해보면서 보이는 것들은 조금씩 수정을 가해줬으나.. 얼마 안 가 포기했다. 같은 성, 같은 이름을 공유하는 사람이 더러 있다. 최소한 톨킨은 혼자 그 성을 쓰지만, 다른 사람들은 그렇지가 않더라고. 거기에다 각 값들이 그렇게 크지 않은 주제에 총 갯수는 만 개가 넘어가니, 인간의 영역으로 할 수 있는 일은 아니다. 

데일리 스크럼

무얼 했는가? 오늘의 모더레이터가 없었지만, 다들 진행 상황을 공유하면서 어련히 흘러갔다. 어차피 1등 해봐야 의미 없다는 것을 알지만, 기왕이면 하는 게 좋잖냐, 다들 저마다의 계획을 세우고 알아서 자신의 일에 곧 몰두했다. 복기 님은 텍스트 데이터를 쓸 수 있도록 손보고, 희원 님은 내 모델을 조금 확인해보시려는 듯(놀랍게도 내가 그린 모델의 사고 방향이 Deep FM 모델과 유사하다고.. 내 모델에 대한 설명력이 갑자기 갖춰졌다!). 현욱 님은 내 모델과 여태 전처리된 파일을 위주로 확인을 해보시려는 것 같다. 

나는?

어제 다른 컬럼을 전처리하는 것은 힘들다는 것을 확인했고, 그럼 어제 시도해보려 했었던, 데이터를 분리해서 학습시키기 도전. 중간 과정을 캡쳐하지는 않았는데, 생각보다 쉽고 생각보다 어려웠다. 쉬웠던 것은, 애초에 전처리된 파일을 불러와서 모델을 학습시키면 된다는 것. 처음에는 어떻게 학습시키지 않을 놈들을 따로 분리해내나, 고민을 많이 했는데 막상 하려니 그런 간단한 방법이 있었다. 어려웠던 것은 그 나머지가 다 어려웠다. 뭔가 이해가 잘 가지 않는 에러가 많이 떴다. 문제 중 하나는 아무래도 처음에 책 데이터에서 이미지 없는 놈들을 없앴다가 생긴 문제인 것 같다. 그리고 이후에도 예측 단곗에서 이미지 있는 놈과 없는 놈을 구분하려는데 이걸 어떻게 구분해야할지가 또 난관이었다. 애매하게 context데이터를 다룰 때와 또 다르게 데이터가 저장이 돼있더라.
일단 결과적으로는 이미지가 없는 학습데이터 5만 개 가량을 분리해내  25만 개로 학습을 시작할 수 있었다.

그래서 학습을 돌려보니.. 시작은 이 모양이다.

그래도 조금씩 줄기는 하더니 이정도까지 내려오더라고. 오히려 현재 있는 모델들보다 더 잘 예측을 하고 있다는 뜻으로 받아들여도 될까?

-1은 내가 일부러 이미지 없는 값들에 대해서 일괄처리하도록 만들어둔 것이다. 그러나 다른 문제가 남아있다. 도대체 10점 만점에 51점 평점은 어떻게 내리는 거냐..? 이따구로 예측을 하면서 어떻게 검증 오차가 1.9까지 내려가는 것인지 당췌 이해가 가질 않는다.

그래서 일단 내가 한 전처리 없이, 다시 쌩으로 돌려보았다. 참고로

이런 옵션으로 돌리는 중이다.

어째 보니 값이 더 내려간다? 내가 한 것은 이미지 데이터가 없는 학습셋을 빼서 학습시킨 것밖에 없는데, 어떻게 검증 과정에서 오차가 내 것이 더 날 수가 있는가? 문제가 생길 만한 부분을 도려냈더니 상처가 더 크게 곪기라도 한단 말인가?
학습 셋이 5만개 줄어든 채로 학습한다는 게 뭐 엄청난 의미라도 지니고 있는 것인가? 
그러나 확실히는 모른다. 지금 오차는 저따구로 뜨지만, 또 안 속을 파보면 10점 만점에 굉장한 점수들을 주고 있는 값들이 많다. 이전에 현욱님이 이것을 리더보드에 제출했을 때 오차가 20정도로 나오는 것을 확인했으니 이것은 영 신뢰할 만하지 않다. 

일단 세번째 학습 중. 첫학습은 이미지 없는 책을 학습에서 제외시키고, 이후 예측 과정에서도 혹여 이미지가 없는 책일 때 -1을 하도록 만들어뒀다. 두번째 학습은 디폴트. 세번째 학습은 -1만 하지 않고 다시 내가 한 처리 그대로 하는 중이다.

우습게도 값을 그럴싸하게 내뽑고 있는 녀석이 바로 이미지 데이터를 처리하지 않고 넣은 가운데 파일이다. CNN_FM에서는 분명 유저 id, isbn, 이미지 벡터를 쓰는 게 전부이다. 다른 것은 일체 고려되지 않는데, 이미지가 없는 놈이 들어간 게 그나마 더 그럴싸하게 학습이 된다는 것을 나는 도대체 어떻게 받아들여야 하는 것일까?
한편으로 다시 보니 둘의 결과가 너무도 다르다. 어떤 놈은 분명 전처리한 쪽이 더 그럴싸하게 값이 나오기도 했다. 

모를 땐, 일단 박아봐야 한다. 지금 알았는데, 유저와 아이템의 latent 차원을 많게 할수록 초반 오차가 심하다. 오히려 나는 표현력이 좋아질 것이라 생각했는데 결국 오차를 많이 내는 방향으로 나아간다니. 이게 나중에 학습이 진행되면서 역전이 되면 또 모를까, 역전이 안 된다는 게 가장 큰 문제이다. 이럴 거면 뭐하러 차원을 많게 하나.

조금 더 보기 쉽도록 로그를 씌웠다. 근데 막상 보니 아직 어떤 수렴점을 보이고 있지는 않은 것 같은데, 학습을 더 진행시키면 결과가 달라질 수도 있는 것일까? 
사실 가장 큰 문제인 이상값들, 이것들에 대한 대답이 안 되는 이상 이것을 우리의 답으로 삼기에는 너무나도 위험하다. 기껏 열심히 2점 오차 뚫어보겠다고 끙끙대다가 20점 오차 내는 답안을 합치는 건 너무 이상하잖냐.
다만 기회가 한번 주어진다면, 이상값들을 다 처리하고 남은 값들에 대해서만 앙상블을 진행하여 값을 내면 조금 새로운 결과가 나올 수도 있지 않을까 한다. 

그나저나 암만 봐도 차원을 많게 하니까 수렴도 빠른 것 같은데.. 적당한 차원이 좋다는 것일까.

음. 무작정 차원을 늘리고 에폭을 늘린다고 만사는 아니다. 어느 정도 가니까 학습이 완료돼서 슬슬 오버피팅이 일어날 조짐이 보인다. 근데 하필이면 또 마지막에 꺾이는 모습이 다시 나와서 일단 횟수를 늘려서 다시 시도. 결과물 파일을 눈으로 비교했을 때, 전반적으로 7,8점대에 많이 값을 올려둔 것을 확인할 수 있었다. 내가 보기에 이것은 확실히 긍정적인 시그널이다. 학습셋의 전체 분포를 확인했을 때도 거의 7,8점이 주류였기에 웬만해서는 비슷하게 점수가 나와야 한다고 생각한다. 그러나 그럼에도 이상값은 계속 존재했다. 이런 값은 애써 무시하는 게 옳은 선택이라고 잠정적인 결론을 내리고 있다. 아무리 내가 학습을 시켜도 모델은 그런 값들이 없도록 처리하지 못 한다.

이번에는 임베딩 차원을 깊게 만들어보았다. 마음 같아서는 아예 CNN 층을 한 층 더 파보고 싶은데, 그것을 지금 감당해낼 시간이 없다. 아무튼 늘리니까 빠른 속도로 내려오고 있는 오차를 확인할 수 있었다. 되도록 이상한 값 없이 최상의 결과를 내서 한번에 앙상블시켜보고 싶다.

gpu 전력 사용량이 순간 거의 96퍼를 찍던데, 이거 괜찮은 거 맞을까..

놀랍게도 점차 오버피팅이 되고 있는 듯한 모습이 그려진다. 나는 분명 임베딩 차원을 늘린 것밖에는 한 것이 없는데, 차원이 늘어나니 오히려 오버피팅?

그러더니 갑자기 다시 내려가냐..? RMSE, 검증셋, 학습셋 전부다 지표가 줄어들고 있다. 일단 냅둬보길 잘했을지도.. 근데 이것이 무얼 뜻하는 것인지 모르겠다. 나랑 지금 밀당하는 건가..?
혹시 ai도 무슨 우매함의 봉우리를 넘어서 깨달음의 고원으로 가고 있기라도 한 건가..?

피어세션

16시 이후로는 모든 팀원이 줌에 접속한 채로 같이 붙어서 서로 이야기하며 프로젝트의 말미를 장식했다.

! 놀랍게도 10이 훌쩍 넘어가던 값들이 없어졌다. 이게 로컬 미니멈을 통과하는 과정인 것인가?! 무언가 좋은 결과가 나오고 있는 것 같은데, 아무래도 더 해봐야 알 것 같다.

에폭을 150번으로 일단 늘려봤다. 정말 계속 떨어지더라. 나는 이게 무얼 뜻하는 지에 대해서 아직은 확신이 없다. 다만 모든 값들이 0과 10 사이의 값으로 바뀌었기에 이건 확실히 유의미한 결과를 도출하고 있다고 생각할 수 있을 것 같다. 

남은 시간 동안 팀원들과 나는 무엇을 했는가? 먼저 복기 님은 deep conn 모델을 계속 손보고, 결과물을 만들어냈다. 현욱 님은 여태 만들어진 결과물들을 정리하고 합치고 테스트하는 역할을 맡았다. 희원님은 동건 모델(.. 이게 최종까지 쓰일 줄이야)에서 최적의 값이 더 나올 수 있는지 체크하셨다. 나는 내가 만든 CNN_FM 모델이 자동으로 앙상블되지 않는 것을 감안하여 직접 앙상블을 하는 코드를 짰다. 

우리가 제출할 수 있는 남은 기회는 6번이었고, 이것을 알차게 쓰기 위해 많은 이야기를 나누고 어떻게 어떤 모델을 앙상블할 지 계속 고민했다. 그 과정을 다 기록하기에는 멀티태스킹이 안 돼서 힘들었기에, 최종적인 결과가 어떻게 되었는지만 써봐야겠다.

일단 앙상블 준비는 이렇게 하였다. 처음 시작은 모델 3개를 합쳐보는 것이었다. 최종적인 catboost와 deepconn, cnn_fm을 합쳐보는 작업. 다만 cnn_fm에서는 이미지 데이터가 없는 것에 대해 일체 학습을 진행하지 않았기에 그런 것에 대해서 좋은 결과를 내지 못할 것이라 생각해서 전부 -1 처리를 해뒀기에, 그것에 대한 후처리가 필요했다.
일단 파일들의 전처리로, 10을 넘어가거나 0보다 작은 값들은 전부 10이나 0으로 고정을 시켜줬다. 

이후에 앙상블하는 과정. 희원 님이 이 코드를 짜주셨는데, 일단 우리가 설정한 가중치에 맞춰서 값들은 다 더해준다. 그 후에 cnn_fm에서 -1 처리된 값들을 다시 다른 3 파일만의 지분을 더한 값으로 치환해주는 방식.

처음 냈던 결과는 개차반..이걸 보고 나서 이거 뭔가 조진 것 같다 싶었다. 그리 열심히 했는데 결과가 이따위라니.. 그러나 우리에게는 더 이상 남은 선택지가 없었고, 그래서 있는 파일들끼리 그냥 조합을 해가면서 좋은 결과를 도출하려고 시도했다. 2.12를 뚫은 것은 앙상블의 힘이었고, 시간이 부족했으니 그저 어떤 파일을 어떤 가중치로 조합해야 좋을지에 대한 고민을 하며 보낸 것.

대충 이러한 갖은 노력을 다 했다. 한번은 deep_conn을 빼보기도 하고, 한번은 cat의 지분을 높여보기도 하고, 하는 등. 근데 어떻게 해도 어제 이뤄낸 결과 이상의 값을 낼 수는 없더라고. 우리에게 기회가 조금 더 있었더라면, 시간이 조금 더 있었더라면 더 놀라운 결과를 낼 수 있었을 지도 모른다. 
뭐, 어쩌겠냐! 아무튼 갖은 분투 속에서 우리는 할 수 있는 최선을 다했고, 그 과정을 즐겼다!

그리고 이것이 최종 결과물, 우리는 최종 2등! 성연 님네의 높은 벽을 도저히 뚫을 수 없었다.. 어떤 방법을 선택하셨을지 정말 궁금하다. 마지막에는 기왕이면 1등을 해보고 싶다는 마음으로 의지를 불태웠는데, 결과는 2등이지만 뭐 어떠냐. 새롭고 즐거운 경험, 그리고 도전을 했다는 것만으로도 나는 충분히 만족한다. 
계속 해보고 싶었던, 데이터 분리 후 학습시키는 것을 성공했다는 것이 무엇보다 지금의 내 기분을 고양시키고 있다. 조금만 시간이 더 있었다면 콜드 스타트 유저에 대해서도 시도를 해보았을텐데 그것을 못한 것이 조금 아쉽긴 하네.

콜유들이 보고자 하는 카테고리는? 출판사는? 책 년도는?연령대 별로 보는 카테고리-- 이건 어렵다. 콜드 스타트 유저의 정보 파악하기.콜드 스타트 아이템의 정보는 쉽게 확인할 수 있을 것. 쓰레기값을 치환하는 것은 새로운 범주화에 포함될 수도 있다. 출판사 역시출판 년도에 따른 어떤 유의미한 변화가 있을까?
언어와 지역의 연관성을 확실하게 파악해보고 싶다. 범주별 변화가 있는가? 년도에 따른 변화가 있는가? 평점에 대한 변화도 변화지만, 빈도의 변화도 체크해볼 수 있을 것 같다.

여기는 내가 프로젝트 내에 계속 시도해봐야한다고 생각하면서 남겨둔 것들. 이룬 것들을 하나씩 지워나가면서 했는데 아직 이만큼 남기는 했다. 어느 정도는 많이 줄어들기는 했구나. 나쁘지는 않네.

끝나고..

결국 우리가 최종 2등 팀이 됨에 따라, 그리고 1등 팀이 발표를 자원하고 다른 자원한 팀이 없던 지라 우리에게 발표 제안 DM이 날아왔다. 금요일 모더레이터는 희원 님이었던지라, 희원 님의 의사에 따라 우리는 발표를 하게 됐다! 근데 정말 어떻게 발표를 해야할지 살짝 나는 감이 오질 않는다.. 마지막에 시도했던 것들은 분명히 재밌었고, 이야기해볼 만한 것 같은데, 정말 내가 그냥 야매로 만들었던 동건 모델은 뭐 어떻게 발표해야 하는 거냐..
희원 님에게 부담이 아무래도 많을 것 같은데 같이 하면서 부담을 덜 수 있는 방향으로 뭔가를 하는 게 좋을 것 같다.

랩업 리포트를 쓰면서 나머지 부분들을 마저 회고해보자!

회고 및 다짐

무던히 바쁘게 보냈다. 결국 수면을 거스르지는 않고 프로젝트를 마쳤는데, 역시 나는 잠은 확실히 자두는 편이 낫다. 월, 화에는 정말 피곤해서 힘들었는데 그래도 마지막에는 풀 컨디션이어서 다행. 내가 정말 하얗게 불태웠는가? 나를 혹사시키지 않는 범위에서는, 충분히 그리 한 것 같다. 피로하지 않게 하는 것이 최선이라 생각했고, 최대한 그 목표에 충실하게 해왔으니까 이 정도면 만족할 만큼 노력했노라고 말할 수 있을 것 같다.
우리만의 시각이란 것이 있었을까? 내일 우리 팀이 발표를 하게 되겠지만, 다른 팀의 시각도 엿보고 싶다. 어떻게 접근을 했고 어떤 발상을 했는지. 그래서 어떤 해결책을 내놓았는지. 정말 궁금하다. 왕도라는 게 있지는 않겠지만, 제출자들이 어떤 풀이를 원했는지, 어떤 목표치까지 달성할 것을 예상했는지도 궁금하다.

아직도 한참이나 부족하다. 코드들을 능숙하게 짜낼 수 없었고, 쓸 수 있는 다양한 모델들을 전부 시도해보지는 못 했다. 그럼에도 새로운 경험들이 더해지면서 또 새로이 발전했다. 그러니 오늘은 여기에서 그치고 내일부터 다시 새롭게 나의 부족한 점들을 보완해나가자. 희원님 발표 준비도 기왕이면 도우면 좋겠고 다시 강의 정리도 하면서 복습을 하자고. 
당장은 이제 이 술꾼은 간단하게나마 한 잔 걸치며 회포를 풀어야겠다!