NCF-2017年WWW
概述
作者
作者是何向南,发表了许多关于推荐的文章,之前在新加坡国立大学,现在在中国科学技术大学。
Neural Collaborative Filtering(NCF)在他主页上可以找到该论文以及code、ppt.
简介
本文没有考虑文本等辅助信息,其实就对评分矩阵做的分析,准确的说是一篇隐反馈的论文。通过形式化用于协同过滤的神经网络建模方法来解决问题。专注于隐性反馈(implicit feedback),通过参考观看视频,购买产品和点击项目等间接反映用户偏好的行为。与显性反馈(explicit feedback)(i.e. 评级和评论)相比,隐性反馈可以自动跟踪,从而更容易为内容提供商所收集。但是,由于隐性反馈不能反映用户的满意度,并且负反馈(negative feedback 将所有未观察到的条目视作负反馈,或者从没有观察到条目中抽样作为负反馈实例 ),存在自然稀疏(natural scarcity)问题,使得这个问题更具挑战性。
本文模型
Implicit data
y
u
i
=
{
0
,
o
t
h
e
r
w
i
s
e
.
1
,
i
f
i
n
t
e
r
a
c
t
i
o
n
(
u
s
e
r
u
,
i
t
e
m
i
)
i
s
o
b
s
e
r
v
e
d
;
y_{ui}=\{_{0,otherwise.}^{1,if\ interaction(user\ u,item\ i)is\ observed;}
yui={0,otherwise.1,if interaction(user u,item i)is observed;
这里
y
u
i
y_{ui}
yui 为 1 表示用户 u 和项目 i 存在交互记录;然而这并不意味着 u 真的喜欢 i。同样的,值 0 也不是表明 u 不喜欢 i,也有可能是这个用户根本不知道有这个项目。这对隐性反馈的学习提出了挑战,因为它提供了关于用户偏好的噪声信号。虽然观察到的条目至少反映了用户对项目的兴趣,但是未查看的条目可能只是丢失数据,并且这其中存在自然稀疏的负反馈。
损失
论文中提到了两种损失函数,这也由该论文是做top10推荐的原因,排名算法
为了估计参数
Θ
\Theta
Θ,现有的方法一般是遵循机器学习范例,优化目标函数。在文献中最常用到两种损失函数:逐点损失(pointwise loss)和成对损失 (pairwise loss) 。由于显性反馈研究上丰富的工作的自然延伸,在逐点的学习方法上通常是遵循的回归模式,最小化
y
^
u
i
\hat y_{ui}
y^ui及其目标值
y
u
i
y_{ui}
yui 之间的均方误差。同时为了处理没有观察到的数据,他们要么将所有未观察到的条目视作负反馈,要么从没有观察到条目中抽样作为负反馈实例。对于成对的学习,做法是,观察到的条目应该比未观察到的那些条目的排名更高。因此,成对学习最大化观察项
y
^
u
i
\hat y_{ui}
y^ui和未观察到的条目
y
u
i
y_{ui}
yui之间的差距,而不是减少
y
^
u
i
\hat y_{ui}
y^ui和
y
u
i
y_{ui}
yui之间的损失误差。
矩阵分解的弊端
MF(Matrix Factorization)用一个潜在特征向量实值将每个用户和项目关联起来。令
p
u
p_u
pu 和
q
i
q_i
qi 分别表示用户 u 和项目 i 的潜在向量;MF评估相互作用
y
u
i
y_{ui}
yui 作为
p
u
p_u
pu 和
q
i
q_i
qi 的内积:
y
^
u
i
=
f
(
u
,
i
∣
p
u
,
q
i
)
=
p
u
T
q
i
=
∑
k
=
1
K
p
u
k
q
i
k
\hat{y}_{ui}=f(u,i|\mathbf{\mathrm{p}_{u}},\mathbf{\mathrm{q}_{i}})=\mathbf{\mathrm{p}_{u}^{T}}\mathbf{\mathrm{q}_{i}}=\sum_{k=1}^{K}p_{uk}q_{ik}
y^ui=f(u,i∣pu,qi)=puTqi=k=1∑Kpukqik
这里的 K 表示潜在空间(latent space)的维度。正如我们所看到的,MF模型是用户和项目的潜在因素的双向互动,它假设潜在空间的每一维都是相互独立的并且用相同的权重将它们线性结合。因此,MF可视为潜在因素(latent factor)的线性模型。
MF的弊端:
本文提到内积函数(inner product function)限制了MF的表现力:
- 由于MF将用户和项目映射到同一潜在空间中,两个用户之间的相似性也可以用内积,或者潜在向量之间的角度的余弦值来衡量
- 不失一般性,我们使用Jaccard系数作为MF需要恢复的两个用户的真实状况之间的相似度。
如果MF模型将 u4 放在了 最接近 u1 的位置(下图右边的虚线展示了两种不同的摆放 u4 的方式,结果一样),那么会使得 u4 相比与 u3 更接近于 u2 (显然,根据下图左边,u4 应该更接近 u3),这会导致很大的排名误差(ranking loss)。
如果要解决这个问题,我们需要增加K的维度,但是这样就会导致过拟合问题
那么我们需要学习一种新的交互函数(interation function)来代替内积运算函数,解决这一局限性。
our model
我们利用多层感知模型来学习user-item的一种交互函数
f
f
f:
y
^
u
i
=
f
(
p
u
,
q
i
)
\hat y_{ui}=f(p_u,q_i)
y^ui=f(pu,qi)
Input layer
输入为稀疏特征的user( v u v_u vu)和item( v i v_i vi)向量,这个向量就可以包含user和item的属性和文本的特征。(本论文只用了user和item的ID最为输入,为one-hot-encoding)
Embedding layer
这个没啥其实Embedding本身可以理解为学习到输入的一个稠密表达的方法f,(就是要从数据中自动学习到输入空间到Distributed representation空间的f映射 )
Neural CF layer
这一块其实就是用多层感知机来获取用户和项目之间的潜在交互特征,这一块就是前面的替代内积那种low的交互方式,而用这种非线性的感知来更好的获取两者的联系。
至于网络结构的设计,一种常见的解决方案是设计一个塔式模型,其中,底层是最宽的,并且每个相继的层具有更少的神经元数量(如上图)。(设计这种结构的)前提是,通过在更高层使用少量的隐藏单元,它们可以从数据中学习到更多的抽象特征。根据经验,我们搭建这样的塔结构:对于更高的层,相比于之前一层,缩减一半规模。
output layer
直接输出交互的结果分数
输出
Generalized Matrix Factorization GMF
广义的MF其实就是NCF的一个变体,其实就是Neural CF layer只有一层,且输出层为全连接层,且没有bias。
由于输入层是用户(项目)ID中的一个one-hot encoding编码,所获得的嵌入向量可以被看作是用户(项目)的潜在向量。我们用
P
T
v
u
U
P^Tv^U_u
PTvuU表示用户的潜在向量$ p_u$ ,
Q
T
v
i
I
Q^Tv^I_i
QTviI表示项目的潜在向量$ q_i$ ,我们定义第一层神经CF层的映射函数为:
ϕ
1
(
p
u
,
q
i
)
=
p
u
⊙
q
i
\phi_{1}\left({\bf{p}}_{u},{\bf{q}}_{i}\right)={\bf{p}}_{u}\odot{\bf{q}}_{i}
ϕ1(pu,qi)=pu⊙qi
其中
⊙
\odot
⊙表示向量的逐元素乘积。然后,我们将向量映射到输出层:
y
^
u
i
=
a
o
u
t
(
h
T
(
p
u
⊙
q
i
)
)
\widehat{y}_{ui}=a_{out}\left({\bf h}^{T}\left({\bf{p}}_{u}\odot{\bf{q}}_{i} \right)\right)
y
ui=aout(hT(pu⊙qi))
其中
a
o
u
t
a_{out}
aout 和
h
h
h分别表示输出层的激活函数和连接权重。注意:这里用的激活函数是非线性的,而在MF中是内积运算是线性的。
多层感知机MLP
简单地对向量的连接不足以说明用户和项目之间的潜在特征,这对协同过滤建模来说是不够的。为了解决这个问题,我们提出在向量连接上增加隐藏层,使用标准的MLP(多层感知机)学习用户和项目潜在特征之间的相互作用。在这个意义上,我们可以赋予模型高水平的灵活性和非线性建模能力,而不是GMF(广义矩阵分解)那样的简单使用逐元素相乘的内积来描述用户和项目之间的潜在交互特征。更确切地说,我们的NCF框架下的MLP模型定义为:
z
1
=
ϕ
1
(
p
u
,
q
i
)
=
[
p
u
q
i
]
{\bf{z}}_{1}=\phi_{1}\left({{\bf{p}}_{u}},{{\bf{q}}_{i}}\right)=\begin{bmatrix}{{{\bf{p}}_{u}}}\\{{{\bf{q}}_{i}}}\end{bmatrix}
z1=ϕ1(pu,qi)=[puqi]
ϕ
2
(
z
1
)
=
a
2
(
W
2
T
z
1
+
b
2
)
,
\phi_{2}({\bf{z}}_{1})=a_{2}\left({\bf{W}}_2^T{\bf{z}}_{1}+{\bf b}_{2}\right),
ϕ2(z1)=a2(W2Tz1+b2),
.
.
.
.
.
.
......
......
ϕ
L
(
z
L
−
1
)
=
a
L
(
W
L
T
z
L
−
1
+
b
L
)
,
\phi_{L}({\bf{z}}_{L-1})=a_{L}\left({\bf{W}}_L^T{\bf{z}}_{L-1}+{\bf b}_{L}\right),
ϕL(zL−1)=aL(WLTzL−1+bL),
y
^
u
i
=
σ
(
h
T
ϕ
L
(
z
L
−
1
)
)
\widehat{y}_{ui}=\sigma\left({\bf{h}}^{T}\phi_{L}\left({\bf{z}}_{L-1}\right)\right)
y
ui=σ(hTϕL(zL−1))
这里的
W
x
W_x
Wx,
b
x
b_x
bx 和
a
x
a_x
ax 分别表示 x 层的感知机中的的权重矩阵,偏置向量(神经网络的神经元阈值)和激活函数。对于MLP层的激活函数,可以选择sigmoid,双曲正切(tanh)和ReLU,等等,我们的实验结果表明,ReLU的表现略好于双曲正切函数tanh和sigmoid。
结合GMF和MLP的NCF(重点)
一个直接的解决方法是让GMF和MLP共享相同的嵌入层(Embedding Layer),然后再结合它们分别对相互作用的函数输出。这种方式和**著名的神经网络张量(NTN,Neural Tensor Network)**有点相似。具体地说,对于结合GMF和单层MLP的模型可以公式化为:
y
^
u
i
=
σ
(
h
T
a
(
p
u
⊙
q
i
)
+
W
[
p
u
q
i
]
+
b
)
.
\widehat{y}_{ui}=\sigma({\bf h}^{T}a({\bf p}_u\odot{\bf q}_i)+{\bf W}\begin{bmatrix}{{\bf p}_u}\\{{\bf q}_i}\end{bmatrix}+{\bf b}).
y
ui=σ(hTa(pu⊙qi)+W[puqi]+b).
共享GMF和MLP的嵌入层可能会限制融合模型的性能。例如,它意味着,GMF和MLP必须使用的大小相同的embedding(embedding,这里指的应该是潜在向量维度);对于数据集,两个模型的最佳嵌入尺寸差异很大,使得这种解决方案可能无法获得最佳的组合(如下图:)。
为了使得融合模型具有更大的灵活性,我们允许GMF和MLP学习独立的embedding,并结合两种模型通过连接他们最后的隐层输出。
ϕ
G
M
F
=
p
u
G
⊙
q
i
G
,
ϕ
M
L
P
=
a
L
(
W
L
T
(
a
L
−
1
(
.
.
.
a
2
(
W
2
T
[
p
u
M
q
i
M
]
+
b
2
)
.
.
.
)
)
+
b
L
)
,
y
^
u
i
=
σ
(
h
T
[
ϕ
G
M
F
ϕ
M
L
P
]
)
\phi^{GMF}={\bf p}_u^G\odot{\bf q}_i^G,\\\phi^{MLP}=a_{L}(W_L^T(a_{L-1}(...a_{2}(W_2^T\begin{bmatrix}{{\bf p}_u^M}\\{{\bf q}_i^M}\end{bmatrix}+{\bf b}_2)...))+{\bf b}_L),\\\widehat{y}_{ui}=\sigma({\bf h}^T\begin{bmatrix}{\phi^{GMF}}\\{\phi^{MLP}}\end{bmatrix})
ϕGMF=puG⊙qiG,ϕMLP=aL(WLT(aL−1(...a2(W2T[puMqiM]+b2)...))+bL),y
ui=σ(hT[ϕGMFϕMLP])
这里的
p
u
G
p^G_u
puG 和
p
u
M
p^M_u
puM 分别表示 GMF 部分和 MLP 部分的user嵌入(user embedding);同样的,
q
i
G
q^G_i
qiG 和
q
i
M
q^M_i
qiM 分别表示item的嵌入。如之前所讨论的,我们使用ReLU作为 MLP层的激活功能。该模型结合MF的线性度和DNNs的非线性度,用以建模user-item之间的潜在结构。我们将这一模式称为“NeuMF”,简称神经矩阵分解(Neural Matrix Factorization)。该模型的每个模型参数都能使用标准反向传播(back-propagation)计算。
训练网络
由于NeuMF的目标函数的非凸性,使得基于梯度的优化方法只能找到局部最优解。初始化(initialization)在深度学习模型的收敛性和性能的方面起到了重要的作用。由于 NeuMF 是 GMF 和 MLP 的组合,我们建议使用 GMF 和 MLP 的预训练模型来初始化NeuMF。
我们首先训练随机初始化的 GMF 和 MLP 直到模型收敛。然后,我们用它们的模型参数初始化 NeuMF 相应部分的参数。唯一的调整是在输出层,在那里我们将两者用权重连接起来:
h
←
[
α
h
G
M
F
(
1
−
α
)
h
M
L
P
]
h\leftarrow\begin{bmatrix}{\alpha{\bf h}^{GMF}}\\{(1-\alpha){\bf h}^{MLP}} \end{bmatrix}
h←[αhGMF(1−α)hMLP]
这里
h
G
M
F
h_{GMF}
hGMF 和
h
M
L
P
h_{MLP}
hMLP 分别表示 GMF 和 MLP 模型预训练的 h 向量;
α
\alpha
α是一个超参数,用来权衡两个预训练模型(的比重)
贡献
- 提出了一种神经网络结构来模拟用户和项目的潜在特征,并设计了基于神经网络的协同过滤的通用框架NCF。
- MF可以被解释为NCF的特例,并利用多层感知器来赋予NCF高水平的非线性建模能力。
实验小技巧
我们分析一下每个函数:1)sigmoid函数将每个神经元的输出限制在(0,1),这有可能限制该模型的性能;并且它存在过饱和的问题,当输出接近1或者0的时候,神经元就会陷入停止学习的困境(这里应该指的是“早停的问题”)。2)虽然双曲正切是一个更好的选择,并已被广泛使用,但它只是在一定程度上缓和了sigmoid的问题,因为它可以被看作是sigmoid的缩放的版本( t a n h ( x / 2 ) = 2 σ ( x ) − 1 tanh(x/2)=2σ(x)−1 tanh(x/2)=2σ(x)−1)。3)因此,我们选择ReLU,它更具生物合理性(biologically plausible),并且已经被证明不会导致过饱和;此外,它支持稀疏的激活(sparse activations),非常适合稀疏的数据,使模型不至于过拟合。
评价指标
创新点
最大的创新点就是抛弃了内积的方式
代码
待更新!!!!