안녕하세요. 이번 시간에는 Neural collaborative Filtering 논문의 알고리즘과 실험결과에 대한 글을 쓰게 되었습니다.
참고한 자료는 다음과 같습니다.
General Framework
○ user-item 상호관계 $y_{ui}$를 모델링하기 위해 multi-layer 방식을 선택함
● 한 layer의 output은 다음 layer의 input으로 이어짐
- 우리가 흔히 아는 deep learning 구조
○ 구조
● 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과 결과 부분이 좀 미흡한 부분이 있어 다음에 코드 구현할 때 수정할 예정입니다.
다음에는 코드 구현과 결과를 가져오도록 하겠습니다.
질문있으시거나 잘못된 부분 있으면 말씀해주세요!
'모델 > 추천시스템' 카테고리의 다른 글
Item-Based Collaborative Filtering Recommendation Algorithms (구현) (2) | 2020.12.02 |
---|---|
Item-Based Collaborative Filtering Recommendation Algorithms (1) (0) | 2020.12.01 |
Neural Collaborative Filtering(1) - 도입부 (0) | 2020.11.10 |
추천시스템 - Incremental Singular Value Decomposition Algorithms(2) (0) | 2020.10.14 |
추천시스템 - Incremental Singular Value Decomposition Algorithms(1) (0) | 2020.10.12 |