내가 보려고 만든 블로그

<Recommendation> BPR , Bayesian Personalized Ranking 구현 본문

Recommendation/모델링

<Recommendation> BPR , Bayesian Personalized Ranking 구현

정의김 2022. 8. 16. 21:23

기존에 MF 방법의 경우 관찰되지 않은 평점을 예측하고 높은 평점을 기록한 상품에 랭킹을 매기는 방식으로 유저에게 상품을 추천하는 방식을 사용하였다. 하지만 , 이러한 방법에는 2가지 문제점이 있다. 

먼저 , 유저가 좋아하는 상품에 랭킹을 매기는 문제를 평점으로 접근을 하는 것이 과연 옳은 접근법인가?

두번째로, 실제 유저에게 추천을 할 때 1,2,3,4,5 정도까지의 랭킹이 중요할텐데 MSE등을 통해 평가를 한다면 상위 랭킹이 아닌 유저가 선호한다고 볼 수없는 순위인 20등, 21등 .... 등의 상품에 대해서도 MSE 값을 줄이기 위해 모델이 동작하게 되므로 모델의 효율성이 떨어진다. 

이러한 점을 해결하기 위해 나온것이 바로 Bayesian Personalized Ranking 이다.

BPR에서는 implicit feedback 상황에서의 추천을 다루며 다음과 같이 3가지를 가정한다.

- 1. 유저가 평가한 상품끼리는 선호를 비교 할 수 없다.  ( U1이 I1 , I2 두 상품에 대하여 어떤 것을 더 선호하는지는 알 수 없음 . )

- 2.  마찬가지로 유저가 평가하지 않은 상품끼리도 선호를 비교할 수 없다. ( U1이 I3 , I4 두 상품에 대하여 어떤 것을 더 선호하는지는 알 수 없음 . )

- 3 . 하지만 , 유저가 평가한 상품은 평가하지 않은 상품보다는 선호하는 상품이다. (U1이 I3보다는 I1을 선호할 것이다. )

 

위 가정을 따라 3번가정을 pair wise loss로 구현한다 . I1에 대하여 예를 들면,  (U1, I1 ,I3) 의 pair에 대해서는 I1이 I3보다 나으므로 1의 값을 return 할 수 있게 하고 , I4에 대해서는 0의 값을 리턴하도록 학습을 하는 것 이다. 

 

BPR Loss function :

여기서 보통 추천문제에서 유저가 평가하지 않은 상품이 평가한 상품에 비해 매우 많으므로 평가하지 않은 상품들에 대해서는 negative sampling을 진행하여 학습을 시킨다. word2vec에서 네거티브 샘플링을 통해 학습시키는 것과 같은 방법임.

구현 코드는 아래에 첨부하였음. MF방식을 사용하여 weight 를 업데이트 하되 무작위로 네거티브 샘플링을 한후 bpr 로스를 통해 학습하는 방식으로 구현하였음.

https://github.com/todtjs92/Search_and_Recommendation/tree/master/BPR

 

GitHub - todtjs92/Search_and_Recommendation

Contribute to todtjs92/Search_and_Recommendation development by creating an account on GitHub.

github.com