Neural Collaborative Filtering

文章主要讲述DNN在矩阵分解上的应用,针对传统Matrix Factorization Object公式拟合能力的不足,提出NCF网络框架来学习user-item间的交互。

传统MF的不足

可以认为MF是基于隐式向量的线性模型
neural_1
文中举了上图的简单例子证明MF的拟合能力不足,基于Jaccard来衡量用户间两两之前的相似度,用户vector $p_4$在右图中便无处安放,这便会产生ranking loss,不过用户向量是五维表示,作者在二维平面里来举例有点不妥当。

NCF框架

neural_3
这是作者提出的最终网路结构

  • 包含两个结构 MLP Layer($Multi-Layer Perceptron$)和 GMF Layer($Generalized Matrix Factorization$), 并对二者进行融合。
  • 两个网络拥有独立的Embedding,保证灵活性和表现
  • 对user和item vector同时进行了concatenate和multiply操作,特征学习比较全面

代码实现

文章提出的网络结构并不复杂,用keras实现起来很简洁,自己简单实现了一下

详细代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gmf_layer = multiply([mf_embedding_user, mf_embedding_item])
mlp_embedding_user = Embedding(user_num, self.mlp_dim)(user_input)
mlp_embedding_item = Embedding(item_num, self.mlp_dim)(item_input)
mlp_layer = concatenate([mlp_embedding_user, mlp_embedding_item])
mlp_layer = BatchNormalization()(mlp_layer)
mlp_layer = Dense(32)(mlp_layer)
mlp_layer = Dense(16)(mlp_layer)
mlp_layer = Dense(8)(mlp_layer)
mlp_layer = Dense(4)(mlp_layer)
mlp_layer = Dropout(0.5)(mlp_layer)
neumf_layer = concatenate([gmf_layer, mlp_layer])
neumf_layer = Flatten()(neumf_layer)
pred = Dense(1)(neumf_layer)

使用movielens进行了简单测试,效果尚可

RMSE MAE
NeuMF 0.9433 0.7485

优点

  • 既考虑用户和物品向量的连接,又兼顾二者的交互,模型学习能力更强
  • 灵活性,DNN较于传统算法的优势,就是非常方便学习异构数据,这里可以很方便将物品和用户的id Embedding替换为用户和物品属性特征进行学习

参考

  • Neural Collaborative Filtering