추천 시스템 5 — Basic Ranking Model

김희규
6 min readJan 8, 2022
Susanne Jutzeler 님의 사진, 출처: Pexels

지난 글에서는 TFRS를 이용해서 간단한 Retrieval Model을 만들었습니다. 이번 글에서는 Ranking Model을 구현한 다음 Retrieval Model을 통해서 뽑아낸 100개의 추천 영화들을 Ranking Model을 이용해서 더 정확하게 순위를 매겨서 추천 결과를 개선해보겠습니다.

이전 Basic Retrieval Model 코드와 거의 유사하며, 이 글에서는 일부 바뀐 부분만 표시하겠습니다. 전체 코드는 여기에 있습니다.

Ranking Model 구조

랭킹 모델은 이전의 Retrieval Model에서 마지막 Dot Product를 제거한 후 User Feature와 Item Feature를 이어붙인(concatenate) 뒤 완전연결층(Fully-Connected Network)을 거쳐 실제 rating을 예측하는 regression 모델로 학습합니다.

때문에 이전에 ratings 데이터를 불러올 때 user_id와 movie_id만을 빼뒀는데, user_rating도 같이 포함해야 합니다.

Tensorflow 모델 코드는 아래와 같습니다. 이전과 동일하게 user model와 item model을 만들고 이 둘을 이어붙여서 예측하는 Regression 모델도 만듭니다. 제가 TFRS 예제와는 다르게 embedding dimension을 64로 늘렸습니다.

이제 학습을 위한 task를 살펴보겠습니다. Retrieval Model의 task는 Retrieval이었지만 Ranking Model의 task는 Ranking입니다. Regression으로 예측된 rating과 실제 rating의 MSE(Mean Squared Error)를 objective로 학습합니다. 측정 지표도 Top-K Accuracy가 아닌 RMSE(Root Mean Squared Error)입니다. 학습 task가 포함된 TFRS 모델은 아래와 같습니다.

TF 모델(RankingModel)은 rating을 예측하는 역할만을 수행하고, Task가 포함된 TFRS 모델(MovielensRankingModel)은 TF 모델의 예측결과와 실제 rating와의 loss를 계산하여 학습시키는 역할을 합니다.

학습은 50에폭을 했습니다. Train RMSE는 0.83, Test RMSE는 0.87로 더 학습해도 Train RMSE가 감소하지 않고, Test RMSE는 증가하기 시작해서 살짝 오버피팅되었습니다.

Retrieval Model과 함께 써보기

Retrieval Model을 이전과 동일하게 구현한 후에(코드만 살짝 정리했습니다). BruteForce를 이용하여 100개의 결과를 추천받습니다. 이후 추천 결과를 Ranking Model로 전달해서 rating을 예측하고, 예측된 rating을 바탕으로 TOP 100을 재정렬해봅니다.

Ranking 모델을 이용한 추천 결과 살펴보기

추천 결과에서 학습 데이터셋에 포함된 결과를 우선 제외하지 않고, User 24의 Retrieval 결과를 먼저 살펴보겠습니다.

사용자가 4.0점을 줬던 영화들이 Retrieval Ranking 1,2,3등에 있는걸 알 수 있습니다. 그렇다면 예측된 rating으로 다시 정렬해보겠습니다.

이번에는 사용자가 5.0점을 준 영화들이 Predicted Rating Ranking 2, 4등에 있고, 4점을 준 영화들이 아래로 밀려났다는 걸 알 수 있습니다.

Box Plot으로 랭킹 이동을 비교해보면, 사용자가 평점 5점을 준 영화는 비교적 순위가 상승했고, 사용자가 평점 3,4점을 줬던 영화는 순위가 하락했습니다. 이번에는 학습에 포함된 영화들을 추천에서 제외하고 순위를 매겨보겠습니다.

6개의 영화가 TOP 100에 포함됬습니다. TOP 20에는 6, 13위에 두 영화가 포함되어있습니다.

예측된 rating으로 정렬해보니, TOP 20에는 영화 1개밖에 남지 않았습니다. 사용자가 5점을 줬던 영화들이 4점을 준 영화보다 위에 있기는 하지만, 4위였던 “Dead Man Walking”이 40위로 떨어져버렸습니다.

train에 포함되지 않은 결과를 보고 비교해보니 아쉽습니다. Ranking 모델을 더 개선한다면 사용자가 실제로 좋아하는 영화가 더 높은 rank를 갖도록 개선할 수 있을 것입니다. 또한 train set에는 포함되어있지 않은 사용자가 평가한 영화는 총 14개입니다. 그 중 6개만 TOP 100에 포함됬는데 더 많은 결과가 TOP 100에 포함되도록 Retrieval Model도 더 개선해야 할 것입니다.

이번 글에서는 간단한 Ranking Model을 구현해서 Retrieval 결과를 개선하는 모델을 구현했습니다. 다음 글에서는 ScaNN을 이용해서 Retrieval을 더 빠르게 하는 방법에 대해서 알아보고, 그 이후에 Retrieval Model과 Ranking Model을 개선해보겠습니다.

참고

--

--

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.