공부/AIFFEL

Exploration 17 : 다음에 볼 영화 예측하기

dong_dong_2 2021. 3. 15. 11:45

1. 들어가며
    - Session-Based Recommendation
       1) 오늘은 전자상거래 플랫폼에서 많이 사용하고 있는 Session-Based Recommendation에 대해 알아보겠다.
       2) 고객에게 그 고객과 유사한 다른 고객이 좋아하는 상품을 추천해 주는 전략이 언제나 유효할까? 이런 추천 전략에의 기존 전제에는 한가지 맹점이 있다. 바로 고객의 선호가 고정된 것이라고 보는 것이다.
       3) 하지만 알다시피 고객의 마음은 항상 변할 수 있다. 그래서 전자상거래 플랫폼에서는 "지금 고객이 좋아할 만한 상품"을 추천해 주는게 좋다. 그럼 어떻게 이런걸 할 수 있을까?
       4) Session-Based Recommendation은 말 그대로 세션 데이터를 기반으로 유저가 다음에 클릭 또는 구매할 아이템을 예측하는 추천을 말한다.
       5) Session이란 유저가 서비스를 이용하면서 발생하는 중요한 정보를 담은 데이터를 말하며, 서버 쪽에 저장된다.
       6) 유저의 행동 데이터들은 유저측 브라우저를 통해 쿠키의 형태로 저장되는데 쿠키는 세션과 상호작용하면서 정보를 주고 받는다.
       7) 이번 자료에서는 세션을 브라우저가 종료되기 전까지 유저의 행동을 담은 시퀀스 데이터와 같은 의미로 사용하겠다.
    - 추천 시스템을 주로 다루는 학회 RecSys에서는 매년 추천을 주제로 대회를 개최한다.
    - 2015년도에는 YOOCHOOSE 라는 추천 엔진 솔루션 회사에서 E-Commerce 데이터를 공개했다. 오늘은 이 데이터를 활용할 것이다.
    - 이 데이터는 몇가지 주목할 점이 있다.
       1) 유저에 대한 정보를 전혀 알 수 없다. (성별, 나이, 장소, 마지막 접속 날짜, 이전 구매 내역 등)
       2) 아이템에 대한 정보도 전혀 알 수 없다. (실제로는 어떤 물건인지, 사진이나 설명, 가격 등)
    - 이와 달리 유저에 대한 정보를 알 수 있는 경우는 보통 Sequential Recommendation이라고 구별해서 부른다.
    - 유저와 아이템의 추가 정보를 Sequential Recommendation 모델에 적용하는 분야는 Context-Aware 라는 키워드로 활발히 연구되고 있다.
    - 또한, E-Commerce 데이터의 경우 다음의 특징이 있다.
       1) 비로그인 상태로 탐색하는 유저가 많다.
       2) 로그인 상태로 탐색한다고 할지라도 접속할 때 마다 탐색하는 의도가 뚜렷하게 다르다.
2. Data Preprocess
    - Data Load
       1) 여기서는 데이터를 불러와 살펴보고 주요 통계치들을 살펴봤다.
       2) 이번 자료에는 Click 데이터에 있는 Session Id, TimeStamp, ItemId 칼럼만 사용한다.
    - Session Length
       1) 여기서는 각 세션이 대략 몇 개의 클릭 데이터를 갖는지 살펴봤다.
       2) 여기서 session_length란 같은 SessionId를 공유하는 데이터 row의 개수를 의미한다.
       3) 여기서 SessionId란 브라우저에서 웹서버로 접속할 때 항상 포함하게 되는 유저 구분자이다.
    - Session Time
       1) 유저들의 소비 패턴은 금방 변한다. 이런 이유 때문에 추천시스템을 구축할 때에는 최근 소비 트론드를 학습하는 것이 중요하다.
    - Data Cleansing
       1) 위에서 살펴보니 길이가 1인 세션도 많았다. 우리의 목적은 유저가 최소 1개 이상 클릭했을 때 다음 클릭을 예측하는 것이니 길이가 1인 세션은 제거했다.
       2) 또한 너무 적게 클릭된 아이템은 이상한 아이템일 수 있으니 제거했다.
    - Train / Valid / Test split
       1) 모델 평가를 위해 Valid Set과 Test Set을 만들었다.
       2) 추천 시스템은 지금 잘 예측하는게 중요하다. 그래서 Test는 마지막 1일 기간을, Valid는 마지막 2일것으로 나눴다.
3. 논문소개(GRU4REC)
    - 이번에 사용할 모델은 2016년 ICLR에 공개된 SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORK이다.
    - 여러 RNN 계열의 모델(e.g. LSTM)이 있겠지만 저자가 실험했을 때 GRU가 제일 성능이 좋았다고 한다.
    - 그리고 Embedding Layer를 사용하지 않았을 때가 사용했을 때보다 성능이 좋았다고 한다.
    - 이번에도 Embedding Layer를 사용하지 않고 Ont-hot-Encoding만 사용하겠다.
    - 대신 추천 데이터의 특징 몇 가지를 살려 모델링 하겠다.
       1) Session-Parallel Mini-Batches
          (1) Session의 길이는 매우 짧은 것들이 대부분이다. 그러나 매우 긴 것도 있다.
          (2) 이 세션들을 데이터 샘플 하나로 보고 mini-batch를 구성하여 input으로 넣는다면 길이가 제일 긴 세션의 연산이 끝날 때까지 짧은 세션들은 기다려야한다.
          (3) 논문의 저자는 대신 Session-parallel Mini-Batches를 제안한다. 이름처럼 Session이 끝날 때까지 기다리지 않고 병렬적으로 계산한다는 것이다.
       2) SAMPLING ON THE OUTPUT
          (1) Negative Sampling와 같은 개념이다.
          (2) Item의 수가 많기 때문에 Loss를 계산할 때 모든 아이템을 비교하지 않고 인기도를 고려하여 Sampling한다. 이번에는 구현하지 않았다.
       3) Ranking Loss
          (1) Session-Based Recommendation Task를 여러 아이템 중 다음 아이템이 무엇인지 Classification하는 Task로 생각할 수 있다.
          (2) 그러나 여러 아이템을 관련도 순으로 랭킹을 매겨서 높은 랭킹의 아이템을 추천하는 Task로도 생각할 수 있다.
          (3) 추천 시스템 연구 분야에서는 이렇게 Ranking을 맞추는 objective function에 대한 연구가 있었고 논문의 저자 역시 이런 Loss를 사용했다.
          (4) 이번에는 Classification Task를 보고 Cross-Entropy Loss를 사용했다.
4. Data Pipeline
    - 위에서 개념을 정리해 본 Session-Parallel Mini-Batches를 구현했다.
    - SessionDataset
       1) 데이터가 주어지면 세션이 시작되는 인덱스를 담는 값과 세션을 새로 인덱싱한 값을 갖는 클래스를 만들었다.
    - SessionDataLoader
       1) iterator, generator를 사용하여 SessionDataset 객체를 받아서 Session-Parallel mini-batch를 만드는 클래스를 만들었다.
5. Modeling
    - Evaluation Metric
       1) 모델 성능 평가를 위한 지표를 만들었다.
       2) 모델 성능에 대한 지표로 precision이나 recall이 있는데 여기서는 각각 확장된 개념인 Mean Average Precision@k와 recall@k를 사용했다.
       3) 그리고 순서에 민감한 지표인 MRR, NDCG 같은 지표도 사용했다.
    - Model Architecture
       1) 논문에서 소개한 모델 구조를 구현했다. 모델 구조가 간단한 편으로 Funtional하게 모델을 만들었다.
       2) 학습 진행률을 모니터링하기 위해 tqdm를 사용했다.
    - Model Training
       1) 지금까지 준비한 데이터셋과 모델을 통해 학습을 했다. 3epochs만 했는데도 1시간가량이 걸렸다.
    - Inference
       1) 학습이 완료된 다음 테스트셋에 대해서 검증을 했다.
6. 프로젝트 - Movielens 영화 SBR
    - 이번에는 Movielens 1M Dataset을 기반으로 위에서 배운 내용을 실습했다.