Latent factor model: matrix factorization

2022. 5. 15. 10:20AI/Machine learning

    목차
반응형
                    Serious
                       ^
                       | Amadeus
        The Color      |
         purple        |        Avengers
                       |
                       |
                       |            
        Sens and       | Ocean's    Lethal
        Sensibility    | 11         Weapon
    geard <------------+---------------------> geared 
    toward             |                       toward females   |                       males
                       The lion
                       king
                       |
          The          |     Independence
         Princess      |     day
          Diary        |
                       v               Dumb and Dummer
                    Funny

 

모든 영화를 2가지 관점으로 분류

남성취향, 여성취향

or

진지한 영화, 재밌는 영화

 

영화를 벡터로 mapping

 

Latent factor model: matrix factorization

CF는 대표적인 '메모리 기반'의 추천 알고리즘이다. 반면에 Matrix Factorization은 '모델 기반'의 추천 알고리즘이다. 

이는 Utility matrix에서 latent 즉, 잠재 factor들을 학습하여 각 item의 특징이 무엇인지를 파악하는 것이다. 

 

장점

학습 이후 '추론'은 매우 빠르게 수행할 수 있다. 

 

단점

많은 계산이 필요하다. 

 

 

utility matrix R에서 user와 (Q) item(P)를 추출 (분해)

이후,  R 내 빈곳 (no rating)을 Q row와 R column의 내적으로 예측한다.

 

Utility Matirx R를 두 matrix의 곱으로 표현

 

R = Q ⋅ P^T

 

Q   : Q의 각 row는 사용자 한 명

P^T : 각 column은 하나의 item

 

latent space mapping

 

fully connected neural network rating matrix2개의 matrix로 분해하는 방법

사용자 잠재요인 행렬(User matrix)과 아이템 잠재요인(Item matrix)행렬로 분해

 

P x Q^T를 하면 Rhat이 되며 이는 R의 예측치

Rhat이 최대한 R에 가까운 값이 되도록 하는 PQ를 구하면 이것이 추천 모델이됨

 

k = 2인 경우 (잠재요인이 2)

    Ÿ   사용자와 영화의 특성을 두 개의 요인으로 나타냄

 

SGD 사용한 MF 알고리즘

MF의 핵심은 주어진 사용자, 아이템의 관계를 가장 잘 설명하는 P, Q 행렬로 분해하는 것

  • K의 개수를 정하고, (이는 직관적으로 혹은 다양한 실험을 통해 결정)
  • K에 따라 P(M x K)Q (N x K) 행렬을 만들고 초기화 (random한 값으로 초기화)
  • P, Q 행렬로 예측 평점인 Rhat을 구하고 이와 실제 평점간의 오차를 구해 이를 줄이는 P, Q 값으로 갱신
  • 오차 수준이 미리 정한 임계치 이하가 되던가, 특정 반복 횟수에 도달 시까지 반복하여 학습

예측 오차

오차에 대한 RMSE

P와 Q로 편미분 하여 gradient를 계산

미분된 gradient로 p와 q를 갱신하여 오차가 줄어들게 함

 

연산 반복시 마다 실제 평점이 존재하는 모든 (pi, qj) 조합에 대해 예측값과 오차를 계산 후 piqjupdate하면 점차 오차가 줄어들어 정확한 PQ 행렬을 얻게됨

 

overfitting을 막기 위해서 "regulariztion" 항(베타)을 추가함

pi와 qj로 편미분한 값으로 갱신

전체 평균 값의 갱신

 

 

구현 코드

SGD 부분

    def sgd(self):
        for i, j, r in self.samples:
            prediction = self.get_prediction(i, j)
            e = (r - prediction)

            self.b_u[i] += self.alpha * (e - self.beta * self.b_u[i])
            self.b_d[j] += self.alpha * (e - self.beta * self.b_d[j])

            self.P[i, :] += self.alpha * (e * self.Q[j, :] - self.beta * self.P[i,:])
            self.Q[j, :] += self.alpha * (e * self.P[i, :] - self.beta * self.Q[j,:])

 

 

반응형

'AI > Machine learning' 카테고리의 다른 글

비트코인 가격 예측 모델  (0) 2024.01.12
Surprise  (0) 2022.05.15
데이터 마이닝 1  (0) 2022.05.14
CF model with visual information  (0) 2022.03.27
언어모델  (0) 2022.03.13