Level 2 마무리
- 부스트캠퍼가 된지 어느덧 15주가 지나, 마지막 Level(과정)만을 남겨두고 있다. 지난 포스팅에서 Lv1 첫 프로젝트 회고를 작성했고 이번 포스팅에서는 Lv2 마지막 경진대회형 프로젝트에서 진행한 작업 과정, 그리고 정신적 성장을 위한 KPT 회고까지 작성해보려 한다.
- 이번 대회는 추천시스템 벤치마크 데이터셋인 MovieLens 데이터를 바탕으로 영화 추천 시스템을 구축해, 높은
Recall@10
값을 도출하는 것이 최종 목표이다.
문제 정의/목표
- 문제: 사용자의 영화 시청 이력을 기반으로 다음에 시청할 영화 및 좋아할 영화를 Top-K 형태로 추천해야 한다.
- 목표: 정의한 문제의 핵심은 다음에 시청할 영화와 중간에 비어있는 timestamp에 시청했을 영화를 예측하는 것으로, sequential recommendation과 static recommendation을 모두 고려해야 한다는 점이다.
나는 이 중 데이터의 representation을 학습하는 AutoEncoder 기반 static recommendation과 PyTorch 기반 추천 알고리즘 라이브러리인 RecBole의 활용에 집중했다.
목표달성을 위해 사용한 지식과 기술
- VAE 모델에 대해서 깊게 이해하게 됐다. 특히 RecVAE는 기존 추천 VAE에 새로운 인사이트까지 적용한 모델이라 encoder, decoder용 optimizer를 별도로 둔다던지, 이전 에폭의 encoder를 사용하기 위해 prior encoder를 저장하는 클래스를 따로 선언하는 것과 같은 다양한 시도들을 접했다.
- RecVAE 모델을 대회 데이터셋에 맞게끔 수정해 팀이 미리 정했던 프로젝트 모듈 구조에 맞추어 모델을 구현했다.
RecBole
- general, static, sequential 등의 다양한 모델들을 거시적으로 사용할 수 있게끔 RecBole이라는 프레임워크를 활용해 데이터 정의, 모델 훈련, 테스트까지 수행할 수 있는 RecBole 모듈을 구축했다.
Ensemble Learning
- 정의한 문제는 static한 특성과 sequential 특성을 모두 고려해야 한다. 따라서 static model과 sequential model의 결과를 적절히 앙상블하면 성능이 개선될 것이라는 가설을 세워 실험을 진행했다.
내가 한 행동의 결과로 어떤 지점을 달성하고, 어떠한 깨달음을 얻었는가?
- RecBole 라이브러리 모듈을 구축할 때, 한국어로 된 레퍼런스가 많이 없어서 구축 과정에서 RecBole 라이브러리의 공식 문서와 깃허브를 참고했다. 그 과정에서 영문 레퍼런스를 직접 분석해서 나의 프로젝트에 자유롭게 적용하는 경험을 쌓을 수 있어 좋았다.
⇒ RecBole 라이브러리를 활용하자 다양한 모델의 성능을 빠른 시간 내에 검증할 수 있었고, 선형 모델 EASE가 우수한 성능을 내는 것을 확인했다. 추후 앙상블 과정에서도 EASE 모델을 활용하는 등 팀의 성능 향상에 기여했다. - RecVAE 모델을 모듈화하는 과정에서 PyTorch의 데이터 모듈로 불러오도록 코드를 작성했는데, 주피터 환경에서 진행한 실험에 비해 학습 속도가 저하되고 성능이 안 좋게 나오는 이슈가 있었다.
PyTorch의 데이터 관련 모듈을 배제하고 sparse matrix 데이터를 Batch 객체로 생성해 모델의 인풋으로 넣자, 베이스라인 대비 성능을 70% 향상시킬 수 있었다. (baseline: 0.0853, RecVAE modular: 0.1499)
⇒ 다양한 시도를 적용해보는 것도 중요하지만, 기존 환경에서 진행한 실험에 비해 눈에 띄게 성능이 부족하다면 목표 달성을 위해 빠르게 포기하는 것도 중요하다는 것을 깨달았다. - RecVAE 실험 과정에서 성능을 극대화하기 위해 WandB sweep 프레임워크를 활용했다.
⇒ Bayesian search 방식으로 sweep hyperparameter search를 진행한 후,batch_size = 480, dropout_rate = 0.5, latent_dim: 200, lr: 0.0001824
로 가장 이상적인 하이퍼 파라미터를 찾을 수 있었다.
전과 비교해서, 내가 새롭게 시도한 변화는 무엇이고, 어떤 효과가 있었는가?
- GitHub issue, branch 관리
- 팀원들과 충돌 없이 원활한 코드 관리를 위해 issue 기능과 issue 번호로 브랜치를 생성하는 기능을 적극 활용했고, 마지막에 main 브랜치로 모두 합병하는 과정이 훨씬 수월해졌다.
- 쉘 스크립트
- 모델 학습, WandB sweep 과정에서 리눅스 쉘 스크립트을 활용해 학습부터 submission file generate까지 실험 과정을 자동화해 공수를 축소하고 다른 작업에 집중할 수 있었다.
- 하드 보팅 앙상블
- 앙상블하려는 모델의 추천 아이템 중 교집합을 제외한 아이템들을 정렬하기 위해 RRF score, Ranking, Model Weight 등 다양한 인사이트를 도입해 기법 별로 결과를 비교할 수 있었다.
마주한 한계는 무엇이며, 바탕으로 새롭게 시도해볼 것은 무엇인가?
- 추천 시스템 도메인 특징 상 train/valid/test data를 split하는 방법이 다양한데, Temporal Global Split과 같이 유저 모두에게 공통된 시간축을 반영하는 방법을 사용해보지 못한 점이 아쉽다.
- 고민하는 지점을 해결하기 위해 하이퍼파라미터 튜닝 뿐만 아니라, 모델링 단계에서 구조를 바꾸어보는 등의 시도를 해보고 싶다.
- 새로운 metric을 정의해 Online 환경에서 활용되는 CVR, CTR rate를 Offline 환경에도 도입하고 싶다.
KPT 회고
Keep(+):
- 모델 모듈화 과정에서 포기하고 싶은 순간이 많았는데, 오기가 생겨서 끝까지 붙잡고 있었다. 결국 끝을 보고 완성하니 성취감을 느낄 수 있었다.
Problem(-):
- 프로젝트 세팅을 진행하느라 알고리즘 공부에 소홀해진 점이 아쉽고, 지난주 팀 회고에 작성했던 모델을 구현하지 않은 점이 아쉽다.
- 스트레스를 굉장히 많이 받은 프로젝트였다. 스트레스 관리까지도 능력의 일부라고 생각하게 되었다.
Try(!):
- 다음 프로젝트에는모델에 새로운 레이어를 쌓거나, 임베딩을 추가하는 등 모델을 직접 건드려서 성능을 개선시켜보고 싶다.
Level 03의 나의 목표
- 코드 퀄리티 신경 쓰기
- 솔선수범해서 팀의 추진력 유지하기
- 멋지고 재밌는 프로젝트 완성하기 🩵
'AI' 카테고리의 다른 글
[부스트캠프 AI Tech] RecSys Level 04 - 자영업자를 위한 가게 음악 추천 솔루션:Tune Your Shop(최종 프로젝트) 회고 (0) | 2025.02.19 |
---|---|
KL Divergence - 두 확률분포의 차이 계산하기 (4) | 2024.12.16 |
[부스트캠프 AI Tech] RecSys Level 01 KPT 회고 (0) | 2024.09.29 |
[Python] 자연어처리 - TfidfVectorizer (0) | 2024.07.30 |
[RecSys] Latent Factor 알아보기 (0) | 2024.03.26 |