본문 바로가기

모델/추천시스템

Neural Collaborative Filtering(2) - 알고리즘 및 결과

안녕하세요. 이번 시간에는 Neural collaborative Filtering 논문의 알고리즘과 실험결과에 대한 글을 쓰게 되었습니다.

 

참고한 자료는 다음과 같습니다.

dl.acm.org/doi/pdf/10.1145/3038912.3052569?casa_token=VM4gR4Yo_pAAAAAA:mwNCtCHyn5zvaRRSF888iwqbPp4kZ3-eDARlEpLU2ErUa75eiVjtjNXg0eWITlNda0BOLHGeCrZV6o4

 

Neural Collaborative Filtering | Proceedings of the 26th International Conference on World Wide Web

WWW '17 Paper Acceptance Rate 164 of 966 submissions, 17% Overall Acceptance Rate 2,771 of 13,232 submissions, 21%

dl.acm.org

General Framework

○ user-item 상호관계 $y_{ui}$를 모델링하기 위해 multi-layer 방식을 선택함

  ● 한 layer의 output은 다음 layer의 input으로 이어짐

    - 우리가 흔히 아는 deep learning 구조

그림 1. General Framework 구조

○ 구조

  ● bottom input layer : user feature vector인 $\textbf{v}_{u}^{U}$와 item feature vector인 $\textbf{v}_{i}^{I}$로 구성됨.

    - bottom input layer는 목적(content-based, neighbor-based 등)에 따라 customized 될 수 있음

    - 여기서는 순수하게 collaborative filtering setting만을 목적으로 하기 때문에 feature를 user와 item간 구분하는 용도로만 사용

      - one-hot encoding : sparse vector로 바꿈

        * 목적에 따라 다른 encoding 방법 사용 가능

  ● embedding layer : input layer 위에 있음

    - fully connected layer (input layer와의 관계를 말함)

    - user (또는 item) bottom input layer의 latent layer라 할 수 있음

    - 본격적인 neural collaborative filtering layer의 input으로 됨

  ● 마지막 hidden layer X : model의 능력을 결정함

  ● final output layer : 예상되는 score $\hat{y}_{ui}$을 예측함

  ● 학습 방법 : pointwise와 pairwise가 있는데, pairwise learning은 future work로 남겨둠

  ● NCF의 예측 모델을 식으로 만들면 다음과 같음

    - $\hat{y}_{ui} = f(\textbf{P}^{T} \textbf{v}_{u}^{U}, \textbf{Q}^{T} \textbf{v}_{i}^{I} | \textbf{P}, \textbf{Q}, \Theta_{f})$

      - $\textbf{P} \in R^{M \, \times \, K}$ 와 $\textbf{Q} \in R^{N \, \times \, K}$ : user와 item의 latent factor matrix

      - $\Theta_{f}$ : interaction function f의 모델 파라미터

      - f는 multi-layer neural network이므로 다음과 같이 식으로 만들어짐

        - $f(\textbf{P}^{T} \textbf{v}_{u}^{U}, \textbf{Q}^{T} \textbf{v}_{i}^{I}) = \phi_{out}(\phi_X(...\phi_2(\phi_1(\textbf{P}^{T} \textbf{v}_{u}^{U}, \textbf{Q}^{T} \textbf{v}_{i}^{I}))...))$

          - $\phi_{out}$ : output layer에서 mapping 함수

Learning NCF

○ pointwise 학습을 위해 squared loss를 가진 regression을 수행

  ● $L_{sqr} = \sum_{(u,i) \in y \cup y^{-}} w_{ui} (y_{ui} - \hat{y}_{ui})^{2}$

    - $y$ : Y에서 관측된 user와 item의 관계(점수)

    - $y^{-}$ : unobserved user and item 관계

    - $w_{ui}$ : instance $(u,i)$ 학습의 weight를 정의하는 hyperparameter

    - 보통 종속변수에 대해 regression에서는 정규분포를 가정하나 여기서는 0 또는 1값이라 맞지 않는 가정임

      - implicit data의 이진적 속성에 집중하는 pointwise NCF 학습에 대한 확률적 접근을 제안함

  ● 0,1의 값에 대한 고찰

    - 1은 item i와 user u가 관련있다는 의미

    - 0은 아니라는 의미

      => 얼마나 user u와 item i가 연관되었는지를 나타냄

    - NCF에 이러한 확률적 설명을 넣기 위해, likelihood function을 다음과 같이 정의함

      - $p(y, y^{-} | \textbf{P}, \textbf{Q}, \Theta_f) = \prod_{(u,i)\in y} \hat{y}_{ui} \prod_{(u,i)\in y^{-}} (1 - \hat{y}_{ui})$

    - log likelihood로 넣어 접근하면 다음과 같음

      - $L = -\sum_{(u,i) \in y} log \, \hat{y}_{ui} -\sum_{(u,i) \in y^{-}} log \, (1-\hat{y}_{uj})$

            $= -\sum{(u,i) \in y \cup y^{-}} y_{ui} log \, \hat{y}_{ui} + (1-y_{ui})log \, (1-\hat{y}_ui)$

  ● 위의 L이 objective function임

  ● SGD로 optimization함

  ● loss를 보면 binary cross-entropy loss와 같은데 이 loss 성능이 좋음을 나중에 나타냄

  ● negative instances $y^{-}$에 대해 각 iteration마다 unobserved dataset에서 균등하게 sampling 하여 observed한 data와 학습할 때 unobserved sample 개수를 통제함

Generalized Matrix Factorization (GMF)

○ input을 one-hot encoding으로 바꿨기 때문에 획득되는 embedding vector는 각 user와 item의 latent vector로 됨

  ● user latent vector $\textbf{p}_u$는 $\textbf{P}^{T}\textbf{v}^{u}_{U}$이며, item latent vector $\textbf{q}_{i}$는 $\textbf{Q}^{T}\textbf{v}_{i}^{I}$임

  ● 첫번째 neural CF layer의 mapping function은 다음과 같음

    - $\phi_{1} (\textbf{p}_{u}, \textbf{q}_{i}) = \textbf{p}_{u} ⊙ \textbf{q}_{i}$

      - ⊙ : vector의 element-wise product. 각 행렬의 원소값끼리만 곱하는 것을 의미합니다.

      - 그리고 나서 해당 vector를 output layer를 project 함

        - $\hat{y}_{ui} = a_{out}(\textbf{h}^{T}(\textbf{p}_{u} ⊙ \textbf{q}_{i}))$

          - $a_{out}$ : activation function

          - h : output layer의 weights

  ● h를 데이터로부터 학습시킨다면 다양한 종류의 MF를 만들게 됨. 이는 latent 차원의 중요성을 바꿈

  ● $a_{out}$을 non-linear function으로 하면 MF가 non-linear로 됨

    -> 즉, Matrix Factorization에 Deep learning에서 쓰이는 activation function과 weight를 활용해 MF를 변형 시키는 것임

  ● NCF 기반의 일반화된 MF 생성

    - $a_{out}$ : sigmoid function 사용

    - h : log loss로 학습

    -> GMF : Genearlized Matrix Factorization이라 명명

Multi-Layer Perceptron (MLP)

* 딥러닝의 MLP 부분이라 아시는 분들은 넘어가셔도 됩니다.

○ MCF에선 user와 item이 나뉘기 때문에 이를 합쳐야 함 : MLP에서 쓰는 concatenated vector를 hidden vector로 써서 합침.

○ 위의 framework에 접목하면 다음과 같음

  ● $\textbf{z}_{1} = \phi_{1}(\textbf{p}_{u}, \textbf{q}_{i}) = {\textbf{p}_{u} \choose \textbf{q}_{i}}$

  ● $\phi_{2}(\textbf{z}_1) = a_{2}(\textbf{W}_{2}^{T} \textbf{z}_1 + \textbf{b}_2), ...$

      $\phi_{L}(\textbf{z}_{L-1}) = a_{L}(\textbf{W}_{L}^{T} \textbf{z}_{L-1} + \textbf{b}_{L})$

      $\hat{y}_{ui} = \sigma(\textbf{h}^{T}\phi_{L}(\textbf{z}_{L-1}))$

    - $\textbf{W}_{x}, \textbf{b}_x, a_{x}$ : x번째 layer에서 weight matrix, bias vector, activation function

      - activation function : ReLU가 가중치 update 값이 0이 되는 현상을 줄이기 때문에 이를 선택함

        - 특히 sparse data이기 때문에 이를 더 신경 씀

        - ReLU가 다른 activation function보다 조금 더 좋은 성능 보임

  ● 아래에서부터 위로 갈 때 점점 layer의 neuron 개수를 줄여가는 방식 선택

    - 더 추상적인 feature를 잘 학습할 수 있음

Fusion of GMF and MLP

○ MLP와 GMF가 같은 embedding layer를 공유하여 interaction function의 결과를 합침

○ 형태

  ● $\hat{y}_{ui} = \sigma(\textbf{h}^{T}a(\textbf{p}_u ⊙ \textbf{q}_i+W {\textbf{p}_u \choose \textbf{q}_i}+\textbf{b}))$

두 모델이 embedding을 공유하는 것은 fusion model은 성능을 제한 할 수 있음

  ● 이는 GMF와 MLP가 같은 크기의 embedding을 사용해야 하는 것을 암시(?)하지만 dataset에 대해 최상의 embedding 사이즈가 두 모델에게는 서로 달라 이 해결책은 안됨

  ● embedding을 따로 학습시켜 마지막 hidden layer에서 두 모델을 합치는 방식을 사용

  ● 식

    - $\phi^{GMF} = \textbf{p}_{u}^{G} ⊙ \textbf{q}_{i}^{G}$

    - $\phi^{MLP} = a_{L}(\textbf{W}_{L}^{T}(a_{L-1}(...a_{2}(\textbf{W}_{2}^{T} {\textbf{p}_{u}^{M} \choose \textbf{q}_{i}^{M}} + \textbf{b}_{2})...)) +\textbf{b}_L)$

    - $\hat{y}_{ui} = \sigma(\textbf{h}^{T} {\sigma^{GMF} \choose \sigma^{MLP}})$

      - $\textbf{p}_{u}^{G}, \textbf{q}_{i}^{G}$ : GMF와 MLP에서 user embedding 부분

  ● 기타

    - MLP layer에서 ReLU를 activation function으로 사용

    - 이 모델은 MF의 선형성과 DNN의 non-liearnity를 결합한 것임

    - 표준적인 back-propagation으로 학습

    - NeuMF, Neural Matrix Factorization이라 명명

○ 합친 결과

Pre-training

○ NeuMF의 목적함수가 non-convexity하여, gradient-based 최적화 방법은 local minimum에 수렴함

  ● 초기값이 수렴과 성능에 중요한 영향 미침

  ● GMF와 MLP에 pre-trained model을 사용

○ 방법

  ● GMF, MLP를 random 초기화하여 수렴할 때까지 학습함

  ● 학습된 파라미터를 NeuMF의 파라미터 초기값으로 사용

  이후 output layer 파라미터 부분만 학습됨

    - 두 모델의 weight가 합쳐지는 부분

    - 식 : $\textbf{h} <- {\alpha \textbf{h}^{GMF} \choose (1-\alpha) \textbf{h}^{MLP}}$

      - $\textbf{h}^{GMF}, \textbf{h}^{MLP}$ : pre-trained 된 GMF와 MLP의 h 의미

      - $\alpha$ : hyperparameter

○ GMP, MLP 학습에 Adam 사용

  ● vanilla SGD보다 더 빠르게 수렴시킴

  learning rate tuning의 pain을 경감시킴

pre-trained 시킨 이후 NeuMF 학습은 vanilla SGD로 함

  ● Adam은 updating한 parameter들에 대한 적절한 momentum 정보를 저장해야 하는데, NeuMF를 최적화하는데 적합하지 않다고 판단

실험

다음과 같은 목적을 가지고 실험

 제안한 NCF는 최신의 implicit collaborative filtering 방법보다 성능이 좋을까?

 제안하는 최적화 구조(log loss with negative sampling)로 어떻게 추천작업을 할 것인가?

 더 깊은 hidden layer는 user-item 상호작용 data에 대해 학습에 더 도움이 될까?

실험 셋팅

2개의 dataset 사용

  ● MovieLens (http://grouplens.org/datasets/movielens/1m/)

    - 1백만개 rating 데이터 사용

    - 최소 20개 이상 투표한 유저 대상

    - user가 item에 점수 줬으면 1, 아니면 0으로 함

  ● Pinterest (https://sites.google.com/site/xueatalphabeta/academic-projects)

    - original data가 매우 크지만 sparse하여 최소 20개 이상 점수를 준 user만 데이터로 사용

      - 최종 : 55,187 user와 1,500,8009 상호작용 데이터

평가방법

○ leave-one-out 평가방식 채택 : 다른 논문에서 쓰인 방법을 인용

   각 user에 대해 특정 사람의 마지막에 평가한 데이터를 test로 함

    - random으로 samaple한 100개 item(각 user가 평가하지 않은(?))에 대해 순위 매김 : 평가 동안 모든 user에 대해 모든 item에 랭크를 주는 것은 너무 시간 소모가 크기 때문

○ Ranked list의 performace : Hit Ratio(HR)과 Normalized Discounted Cumulative Gain (NDCG) 사용

  ● 따로 언급이 없으면 2개 metric 모두 상위 10개를 잘라서 test item이 상위 10개에 존재하는지 확인

    - NDCG : top rank에 더 높은 점수를 주어 순위 할당함

비교 모델 : ItemPop, ItemKNN, BPR, eALs

Parameter Setting

○ 각 user에서 1개의 상호작용을 random 추출하여 hyper parameter tuning으로 사용

positive instance 1개당 negative instance 4개 sampling

loss function : log-loss

○ NCF 모델 

  ● 가우시안 분포(0, 0.01)로 파라미터 초기화

  ● mini-batch(Adam)

  ● parameter

    - mini-batch : 128,256,512,1024로 실험

    - learning rate : 0.0001, 0.0005, 0.001, 0.005로 실험

    - last hidden layer(predictive factors) : 8,16,32,64로 실험

      - 값이 클수록 overfitting 되는 현상이 심화됨

    - 별도 언급이 없으면 MLP에 대해 3개 hidden layer 사용

      - 만약 predictive factors가 8이면 <- 16 <- 32로 됨

    - embedding size : 16

NeuMF 모델

  ● a = 0.5

결과 비교

○ Figure 4의 HR@10과 NDCG@10을 보면 모든 predictive factors에서 NeuMF가 모든 경우 우수한 성능 보임

Figure 5는 Top-K개 추천 리스트의 Performance를 보여줌

  ● One-sample paired t-test를 수행했을 때 유의성 0.01 기준, 다른 모델에 비해 성능이 우수하다는 것을 증명함

Pre-training의 utility

○ Pre-training 했을 때, 성능이 Movie-lens에서 2.2%, Pintereset에서 1.1% 증가함

Log-loss with negative sampling

○ Positive data 1개당 Negative sampling은 1개보다는 3~6개까지가 최상의 성능을 보여줌

Layer를 Deep하게 쌓는 것은 성능개선에 영향을 주는가?

○ 표를 보면 Layer 개수가 4일 때 제일 좋은 성능을 나타내는 것으로 보아 Layer를 깊게 쌓을수록 성능이 향상되는 것을 볼 수 있음

○ activation function의 경우도 non-linear인 ReLU가 linear activation function보다 높은 성능을 보임

 

여기까지가 Neural Collaborative Filtering 논문에 대한 설명이었습니다.

실험 Setting과 결과 부분이 좀 미흡한 부분이 있어 다음에 코드 구현할 때 수정할 예정입니다.

다음에는 코드 구현과 결과를 가져오도록 하겠습니다.

질문있으시거나 잘못된 부분 있으면 말씀해주세요!