💡 本次解读的文章是 2019 年发表于 SIGIR 的一篇基于图卷积神经网络的用户物品协同过滤推荐算法论文, 论文将用户-物品交互信息建模为二分图,提出了一个基于二分图的推荐框架 Neural Graph Collaborative Filtering(NGCF),有效地将协作信号以显式的方式注入到嵌入过程中,并利用 GNN 捕捉高阶交互信息,以此提高预测的效果。
一、本文贡献
(1)说明了在基于模型 CF 方法的嵌入中显式地利用协作信号的重要性;
(2)提出了一种高阶、显式编码协助信号的图神经网络推荐框架 NGCF;
(3)在 300 万规模的数据集上进行了实证研究,结果证明了 NGCF 的有效性。
二、NGCF 框架
NGCF 框架主要有三个部分组成,分别是嵌入层(Embeddings Layer)、嵌入传播层(Embedding Propagation Layers)以及预测层(Prediction Layer)。
2.1 嵌入层
对于一个用户
u
u
u (或物品
i
i
i),首先利用 one-hot 编码进行向量表示,再利用 embedding 技术获取大小为
d
d
d 的嵌入表示
e
u
∈
R
d
(
e
i
∈
R
d
)
\mathbf{e}_{u} \in \mathbb{R}^{d}(\mathbf{e}_{i} \in \mathbb{R}^{d})
eu∈Rd(ei∈Rd),以此构建出一个作为嵌入查找表的参数矩阵:
将上述嵌入表作为用户嵌入和物品嵌入的初始状态,并通过后续的图神经网络以端到端方式进行优化,增强嵌入表示中的协同信号。
2.2 嵌入传播层
嵌入传播过程的介绍主要分为一阶传播和高阶传播两个部分。
(1)一阶传播
从直观上看,与用户发生过交互的物品一定程度上反映了用户的偏好,依据协同过滤的思想,与某一物品发生过交互行为的用户可以作为该物品的特征,进一步地,基于此特征衡量两个物品的协同相似度。而这一过程主要通过一阶传播实现,该过程包含两个主要操作:消息构建和消息聚合。
- 消息构建
对于存在交互行为的用户-物品对 ( u , i ) (u,i) (u,i),将从物品 i i i 流向用户 u u u 的消息定义为:
m
u
←
i
=
f
(
e
i
,
e
u
,
p
u
i
)
\mathbf{m}_{u \leftarrow i}=f\left(\mathbf{e}_i, \mathbf{e}_u, p_{u i}\right)
mu←i=f(ei,eu,pui)
其中,
m
u
←
i
\mathbf{m}_{u \leftarrow i}
mu←i 为传播消息的嵌入表示,
f
(
⋅
)
f(\cdot)
f(⋅) 是消息编码函数,它以嵌入
e
i
\mathbf{e}_{i}
ei 和
e
u
\mathbf{e}_{u}
eu 作为输入,利用系数
p
u
i
p_{ui}
pui控制边
(
u
,
i
)
(u,i)
(u,i) 上每次传播的衰减因子。在本文中上述消息定义的具体实现为:
m
u
←
i
=
1
∣
N
u
∥
N
i
∣
(
W
1
e
i
+
W
2
(
e
i
⊙
e
u
)
)
\mathbf{m}_{u \leftarrow i}=\frac{1}{\sqrt{\left|\mathcal{N}_u \| \mathcal{N}_i\right|}}\left(\mathbf{W}_1 \mathbf{e}_i+\mathbf{W}_2\left(\mathbf{e}_i \odot \mathbf{e}_u\right)\right)
mu←i=∣Nu∥Ni∣1(W1ei+W2(ei⊙eu))
其中,
W
1
,
W
1
∈
R
d
′
×
d
\mathbf{W}_{1},\mathbf{W}_{1} \in \mathbb{R}_{d' \times d}
W1,W1∈Rd′×d 是可训练的权重矩阵,用于提取传播中的有用信息,
d
′
d'
d′ 表示变换大小,
⊙
\odot
⊙ 表示逐位乘积,
e
i
⊙
e
u
\mathbf{e}_i \odot \mathbf{e}_u
ei⊙eu 表示物品与用户交互信息的编码。这里用图拉普拉斯范数
1
∣
N
u
∥
N
i
∣
\frac{1}{\sqrt{\left|\mathcal{N}_u \| \mathcal{N}_i\right|}}
∣Nu∥Ni∣1 作为
p
u
i
p_{ui}
pui 的取值,
N
u
\mathcal{N}_{u}
Nu 和
N
i
\mathcal{N}_{i}
Ni 分别表示用户
u
u
u 和物品
i
i
i 的一跳邻居,其反映了历史物品对用户偏好的贡献程度,且传播的消息随路径长度衰减。
- 消息聚合
在获取了消息的表示后,对于用户
u
u
u 需要对邻域传播来的消息进行聚合,以此更新
u
u
u 的嵌入表示。具体地,将聚合函数定义为:
e
u
(
1
)
=
L
e
a
k
y
R
e
L
U
(
m
u
←
u
+
∑
i
∈
N
i
m
u
←
i
)
\mathbf{e}^{(1)}_{u} = LeakyReLU(\mathbf{m}_{u \leftarrow u} + \sum_{i \in \mathcal{N}_{i}}{\mathbf{m}_{u \leftarrow i}})
eu(1)=LeakyReLU(mu←u+i∈Ni∑mu←i)
其中,
e
u
(
1
)
\mathbf{e}^{(1)}_{u}
eu(1) 表示经过第一个嵌入传播层后得到的用户
u
u
u 嵌入表示,
m
u
←
u
\mathbf{m}_{u \leftarrow u}
mu←u 表示用户的自连接,它保留了原始特征的信息。类似地,可以通过从物品
i
i
i 连接的用户传播信息来获得物品
i
i
i 的嵌入表示
e
i
(
1
)
\mathbf{e}^{(1)}_{i}
ei(1)。
(2)高阶传播
在获取了一阶传播表示后,可以通过堆叠更多的图神经网络层,来获取高阶交互信息。通过堆叠
l
l
l 个嵌入传播层,用户和物品能够接收从其
l
l
l 跳邻居传播的消息,在第
l
l
l 步中,用户
u
u
u 的嵌入表示为:
e
u
(
l
)
=
L
e
a
k
y
R
e
L
U
(
m
u
←
u
(
l
)
+
∑
i
∈
N
i
m
u
←
i
(
l
)
)
\mathbf{e}^{(l)}_{u} = LeakyReLU(\mathbf{m}_{u \leftarrow u}^{(l)} + \sum_{i \in \mathcal{N}_{i}}{\mathbf{m}_{u \leftarrow i}^{(l)}})
eu(l)=LeakyReLU(mu←u(l)+i∈Ni∑mu←i(l))
其中,
m
u
←
i
(
l
)
=
p
u
i
(
W
1
(
l
)
e
i
(
l
−
1
)
+
W
2
(
l
)
(
e
i
(
l
−
1
)
⊙
e
u
(
l
−
1
)
)
)
\mathbf{m}_{u \leftarrow i}^{(l)} = p_{ui}(\mathbf{W}_{1}^{(l)}\mathbf{e}_{i}^{(l-1)} + \mathbf{W}_{2}^{(l)}(\mathbf{e}_{i}^{(l-1)} \odot \mathbf{e}_{u}^{(l-1)}))
mu←i(l)=pui(W1(l)ei(l−1)+W2(l)(ei(l−1)⊙eu(l−1))),
m
u
←
u
(
l
)
=
W
1
(
l
)
e
u
(
l
−
1
)
\mathbf{m}_{u \leftarrow u}^{(l)}=\mathbf{W}_{1}^{(l)}\mathbf{e}_{u}^{(l-1)}
mu←u(l)=W1(l)eu(l−1),
W
1
,
W
2
∈
R
d
l
×
d
l
−
1
\mathbf{W}_{1}, \mathbf{W}_{2} \in \mathbb{R}^{d_{l} \times d_{l-1}}
W1,W2∈Rdl×dl−1 表示可训练的变换矩阵。
(3)矩阵表示
基于上述一阶传播和高阶传播的向量化表示,将传播过程以矩阵的形式进行统一表示:
E
(
l
)
=
LeakyReLU
(
(
L
+
I
)
E
(
l
−
1
)
W
1
(
l
)
+
L
E
(
l
−
1
)
⊙
E
(
l
−
1
)
W
2
(
l
)
)
\mathbf{E}^{(l)}=\operatorname{LeakyReLU}\left((\mathcal{L}+\mathbf{I}) \mathbf{E}^{(l-1)} \mathbf{W}_{1}^{(l)}+\mathcal{L} \mathbf{E}^{(l-1)} \odot \mathbf{E}^{(l-1)} \mathbf{W}_{2}^{(l)}\right)
E(l)=LeakyReLU((L+I)E(l−1)W1(l)+LE(l−1)⊙E(l−1)W2(l))
其中,
E
(
l
)
∈
R
(
N
+
M
)
×
d
l
\mathbf{E}^{(l)} \in \mathbb{R}^{(N+M) \times d_{l}}
E(l)∈R(N+M)×dl 是经过
l
l
l 步嵌入传播后得到的用户和物品的表示,
E
(
0
)
\mathbf{E}^{(0)}
E(0) 表示初始嵌入,即
e
u
(
0
)
=
e
u
,
e
i
(
0
)
=
e
i
\mathbf{e}^{(0)}_{u} = \mathbf{e}_{u}, \mathbf{e}^{(0)}_{i} = \mathbf{e}_{i}
eu(0)=eu,ei(0)=ei,
I
\mathbf{I}
I 表示单位矩阵,
L
\mathcal{L}
L 表示用户-物品二分图的拉普拉斯矩阵:
L
=
D
−
1
2
A
D
−
1
2
and
A
=
[
0
R
R
⊤
0
]
\mathcal{L}=\mathrm{D}^{-\frac{1}{2}} \mathrm{AD}^{-\frac{1}{2}} \text { and } \mathrm{A}=\left[\begin{array}{cc} 0 & \mathbf{R} \\ \mathbf{R}^{\top} & 0 \end{array}\right]
L=D−21AD−21 and A=[0R⊤R0]
其中,
R
∈
R
N
×
M
\mathbf{R} \in R^{N \times M}
R∈RN×M 表示用户-物品交互矩阵,
A
\mathbf{A}
A 为邻接矩阵,
D
\mathbf{D}
D 为对角度矩阵(第
t
t
t 个对角元素
D
t
t
=
∣
N
t
∣
D_{tt} = |N_{t}|
Dtt=∣Nt∣,因此,有
L
u
i
=
1
/
∣
N
u
∣
∣
N
i
∣
\mathcal{L}_{u i}=1 / \sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|}
Lui=1/∣Nu∣∣Ni∣。这种通过矩阵表示的传播规则,可以丢弃节点采样过程,以相当高效的方式同时更新所有用户和物品的表示,这意味着该方法可以在大规模图上运行。
2.3 预测层
在经过
L
L
L 层嵌入传播层后,可以得到用户
u
u
u 的多个嵌入表示
{
e
u
(
1
)
,
⋯
,
e
u
(
L
)
}
\left\{\mathbf{e}_{u}^{(1)}, \cdots, \mathbf{e}_{u}^{(L)}\right\}
{eu(1),⋯,eu(L)},由于不同层得到的表示强调的是通过不同连接传递的消息,它们在反映用户偏好方面的贡献不同。因此,这里主要利用拼接操作,将它们拼接成最终的嵌入表示:
e
u
∗
=
e
u
(
0
)
∥
⋯
∥
e
u
(
L
)
,
e
i
∗
=
e
i
(
0
)
∥
⋯
∥
e
i
(
L
)
\mathbf{e}_{u}^{*}=\mathbf{e}_{u}^{(0)}\|\cdots\| \mathbf{e}_{u}^{(L)}, \quad \mathbf{e}_{i}^{*}=\mathbf{e}_{i}^{(0)}\|\cdots\| \mathbf{e}_{i}^{(L)}
eu∗=eu(0)∥⋯∥eu(L),ei∗=ei(0)∥⋯∥ei(L)
在分别获取了用户
u
u
u 和物品
i
i
i 的最终嵌入表示后,可以利用内积来估计用户对目标物品的偏好:
y ^ N G C F ( u , i ) = e u ∗ ⊤ e i ∗ \hat{y}_{\mathrm{NGCF}}(u, i)=\mathbf{e}_{u}^{* \top} \mathbf{e}_{i}^{*} y^NGCF(u,i)=eu∗⊤ei∗
三、模型训练
(1)损失函数定义
为了学习模型参数,论文使用了成对 BPR 损失函数,它考虑了观察到的和未观察到的用户-物品交互之间的相对顺序,即 BPR 假设观察到的交互比未观察到的交互更能反映用户的偏好,应该赋予更高的预测值,目标函数如下:
Loss
=
∑
(
u
,
i
,
j
)
∈
O
−
ln
σ
(
y
^
u
i
−
y
^
u
j
)
+
λ
∥
Θ
∥
2
2
\text { Loss }=\sum_{(u, i, j) \in O}-\ln \sigma\left(\hat{y}_{u i}-\hat{y}_{u j}\right)+\lambda\|\Theta\|_{2}^{2}
Loss =(u,i,j)∈O∑−lnσ(y^ui−y^uj)+λ∥Θ∥22
其中,
O
=
{
(
u
,
i
,
j
)
∣
(
u
,
i
)
∈
R
+
,
(
u
,
j
)
∈
R
−
}
O=\left\{(u, i, j) \mid(u, i) \in \mathcal{R}^{+},(u, j) \in \mathcal{R}^{-}\right\}
O={(u,i,j)∣(u,i)∈R+,(u,j)∈R−},训练集中的数据对,
R
+
\mathcal{R}^{+}
R+ 表示观察到的交互,
R
−
\mathcal{R}^{-}
R− 表示未观察到的交互,
σ
(
⋅
)
\sigma(\cdot)
σ(⋅) 表示 sigmoid 函数,
Θ
=
{
E
,
{
W
1
(
l
)
,
W
2
(
l
)
}
l
=
1
L
}
\Theta = \left\{\mathbf{E},\left\{\mathbf{W}_{1}^{(l)}, \mathbf{W}_{2}^{(l)}\right\}_{l=1}^{L}\right\}
Θ={E,{W1(l),W2(l)}l=1L},
λ
\lambda
λ 用于控制 L2 正则化强度,防止过拟合。这里论文采用 mini-batch Adam 优化预测模型并更新模型参数,对于一批随机采样的三元组
(
u
,
i
,
j
)
∈
O
(u, i, j)\in O
(u,i,j)∈O,在传播
L
L
L 步后建立其表示为
[
e
(
0
)
,
⋯
,
e
(
L
)
]
[e^{(0)}, \cdots, e^{(L)}]
[e(0),⋯,e(L)],然后利用损失函数的梯度更新模型参数。
(2)消息和节点的 Dropout
Dropout 操作主要用于缓解模型的过拟合现象,一般只在训练中使用,在测试时禁用。本文的方法在训练时,以概率 p 1 p1 p1 删除传播过程中的消息,即在第 l l l 个传播层中,只有部分消息贡献于嵌入表示。另外,本文的方法还进行了节点丢弃来随机阻塞特定的节点并丢弃其所有的传出消息,即对于第 l l l 个传播层,随机丢弃拉普拉斯矩阵的 ( M + N ) p 2 (M + N)p2 (M+N)p2 个节点,其中 p 2 p2 p2 为丢弃率。