[Recommender System] Neural Collaborative Filtering
2025.06.01 - [Data & Research] - [Recommender System] Table of Contents
앞선 포스팅에서 Matrix Factorizaton(MF)등의 Collaborative filtering을 소개했었죠? 그런데 대부분의 user-item 상호작용 matrix는 관찰된 데이터가 극히 적어 대부분의 공간이 비어있는 상태입니다. 이러한 희소성(sparsity)은 모델이 user나 item에 대한 충분한 정보를 학습하는 것을 방해하여 예측 모델의 효율성을 저하시킵니다. 이와 밀접하게 관련된 것이 Cold start 문제입니다. 학습 데이터에 존재하지 않는 새로운 item이나 상호작용 이력이 거의 없는 신규 user의 경우, 모델이 해당 entity에 대한 유의미한 임베딩(Embedding)을 생성하거나 정확한 예측을 수행하기 어렵습니다. 이런 상황에서 MF와 같이 "선형적" 패턴만을 잡아낼 수 있는 모델을 사용하는 것은 한계가 있는데요, 비선형적 패턴을 잡아내기 위해 collaborative filtering에 딥러닝 구조를 입힌 대표적인 추천시스템이 Neural collaborative filtering 입니다.
https://arxiv.org/abs/1708.05031
Neural Collaborative Filtering
In recent years, deep neural networks have yielded immense success on speech recognition, computer vision and natural language processing. However, the exploration of deep neural networks on recommender systems has received relatively less scrutiny. In thi
arxiv.org
이 논문의 저자들은 먼저 기존 협업필터링(MF)의 한계점을 지적하면서 이야기를 시작합니다. 예시에서 Data matrix의 user간 유사성을 생각해보면 \(u_{4}\) 와의 유사성이 가장 높은 순대로 \(u_{1}\), \(u_{3}\), \(u_{2}\)이었지만 이것이 latent space로 오면서는 유사성의 순위가 역전될 수도 있다는 점을 지적합니다(\(p_{1}\), \(p_{2}\), \(p_{3}\)). 결국에 user와 item 간의 복잡한 관계를 low dimension에 압축해 넣으면서 정보가 소실된다는 건데 이걸 보완한답시고 latent vector의 dimension을 올리자니 여러 부작용들 (curse of dimensionality, overfitting 등)이 발생하게 된다는 것이죠. 이에 대한 솔루션으로 Neural network 구조를 제안합니다.
사실 제안 자체는 명쾌합니다. Non-linear 효과도 잡아낼 수 있는 MLP layer를 만들어서 GMF의 선형적 상호작용 모델링 능력과 MLP의 비선형적 상호작용 모델링 능력을 결합한 하이브리드 모델을 써보자는 아이디어 입니다. GMF는 전통적인 MF의 내적(dot product) 연산을 일반화한 형태로, 특정 조건(활성화 함수가 항등 함수이고 출력 가중치가 모두 1인 경우)에서 표준 행렬 분해 모델과 동일해질 수 있습니다. 이러한 설계는 GMF가 전통적인 MF와 신경망 사이의 다리 역할을 수행하고 있다는 것을 보여줍니다. MF의 핵심적인 선형 모델링 강점을 신경망 구조 내에서 유지하면서도, 활성화 함수나 학습 가능한 출력 가중치와 같은 추가적인 유연성을 부여해서 퍼포먼스를 끌어올릴 수 있다는 것이죠.
$$
\phi^{GMF} = \mathbf{p}_u^G \odot \mathbf{q}_i^G,
$$
$$
\phi^{MLP} = a_L(\mathbf{W}_L^T(a_{L-1}(...a_2(\mathbf{W}_2^T\begin{bmatrix} \mathbf{p}_u^M \\ \mathbf{q}_i^M \end{bmatrix} + \mathbf{b}_2)...)) + \mathbf{b}_L),
$$
$$
\hat{y}_{ui} = \sigma(\mathbf{h}^T \begin{bmatrix} \phi^{GMF} \\ \phi^{MLP} \end{bmatrix}),
$$
NCF에서 목적함수나 최적화 방식은 맥락에 따라 맞추어 결정해주면 됩니다. 예를들어 평점을 맞추는 문제라면 mse를 손실함수로 사용할 수도 있고 개별 아이템의 절대적인 점수보다는 아이템 쌍 간의 상대적인 순서(relative order)를 최적화하는 데 중점을 둔다면 Bayesian Personalized Ranking을 사용하는 식입니다. 최적화 방법론 역시 기본적으로 Stochastic gradient descent를 사용하되 상황에 맞추어 변형해 사용할 수 있습니다.
한 가지 짚어보고 넘어갈만한 부분이 Negative sampling입니다. 사실 negative sample은 엄청나게 많을 텐데 이 많은 녀석들을 다 항에 넣어 계산하는 것은 비효율적이겠죠. 이를 위해 negative sample은 일부만 추출해서 positive sample과 함께 training 시키는 방법이 negative sampling인데, Negative sampling의 주요 과제는 실제 Negative feedback을 정확하게 식별하는 것과, 모델 훈련의 정확도, 효율성, 안정성 사이의 균형을 맞추는 것이라 할 수 있겠죠. 이러한 문제에 대응하기 위해 최근 연구에서는 요소 인지 샘플링(factor-aware sampling), 분리된 음성 샘플링(disentangled negative sampling), 하드 음성 샘플링(hard negative sampling)과 같은 고급 전략들이 제안되고 있습니다.
참고로 Negative sampling 전략도 아래와 같이 조금 다르게 가져가 볼 수 있습니다.
- 'random': 관찰되지 않은 item 중에서 무작위로 Negative sample을 선택합니다.
- 'unconsumed': 대상 사용자가 이전에 소비하지 않은 item 중에서 샘플링합니다.
- 'popular': 인기 있는 item을 Negative sample로 선택할 확률을 높입니다. 이는 모델이 인기 있는 item을 잘못 추천하는 것을 방지하는 데 도움이 될 수 있습니다.
저자들의 논문코드(TensorFlow/Keras)는 아래 링크로 연결됩니다.
https://github.com/hexiangnan/neural_collaborative_filtering
GitHub - hexiangnan/neural_collaborative_filtering: Neural Collaborative Filtering
Neural Collaborative Filtering. Contribute to hexiangnan/neural_collaborative_filtering development by creating an account on GitHub.
github.com
Pytorch버전도 구현해 놓은 사람이 있으니 참고하면 될 것 같습니다.
https://github.com/yihong-chen/neural-collaborative-filtering
GitHub - yihong-chen/neural-collaborative-filtering: pytorch version of neural collaborative filtering
pytorch version of neural collaborative filtering. Contribute to yihong-chen/neural-collaborative-filtering development by creating an account on GitHub.
github.com