MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems
1 论文地址和代码
论文地址:https://keg.cs.tsinghua.edu.cn/jietang/publications/KDD21-Huang-et-al-MixGCF.pdf
代码地址:https://github.com/huangtinglin/MixGCF
2 推荐系统的介绍
近年来,图神经网络(GNN)被用于改进协同过滤推荐系统。通过将用户和项目的交互建模为图,GNN能够将图结构信息融合进嵌入中,以提高推荐性能。典型的基于GNN的推荐模型有PinSage、NGCF和LightGCN,它们已在Web规模的应用中取得了显著的成功。
负采样问题。
- 在GNN-based推荐系统中,负采样是一项关键任务。负采样是指从未与用户交互的项目中挑选样本作为负样本,用于训练模型。然而,传统的负采样方法通常使用均匀分布来采样负样本,这可能导致模型的学习过程过于简单,不能有效地提升模型性能。
- 为了提高负样本的质量,研究者们尝试了基于PageRank分数的采样、重新设计正负样本的分布等方法,然而这些方法主要集中在图的离散空间,忽视了GNN在嵌入空间中的邻域聚合过程。
3 贡献
本文提出了一种新的负采样策略,称为MixGCF。与传统方法不同,MixGCF通过生成硬负样本来提高模型的训练难度,而不是直接从数据中采样真实的负样本。它从数据增强和度量学习中汲取灵感,利用基于GNN的推荐模型合成负样本。
MixGCF设计了两种混合策略:正混合和跳跃混合。在正混合中,负样本的嵌入通过与正样本的信息混合来“污染”;在跳跃混合中,通过对多个负样本进行采样,并通过邻居的跳跃聚合生成合成负样本。
本文的贡献如下:
- 提出合成负样本而不是直接从数据中采样负样本以改进基于GNN的推荐系统的想法。
- 提出一个通用的 MixGCF 框架,其中包含 hop 混合和正混合策略,可以直接用于基于 GNN 的推荐模型。
- MixGCF 性能优越,提出的负采样技术性能优越
4 预备知识
4.1 用于推荐的图神经网络
推荐系统的输入包括一组用户 U = { u } \mathcal{U}=\{u\} U={u},项目 V = { v } \mathcal{V}=\{v\} V={v},和用户的隐式反馈 O + = { ( u , v + ) ∣ u ∈ U , v + ∈ V } O^+=\{(u,v^+)|u\in\mathcal{U},v^+\in\mathcal{V}\} O+={(u,v+)∣u∈U,v+∈V},其中每对表示用户 u u u和项目 v + v^+ v+之间 的交互。目标是估计用户对项目的偏好。
GNN-based CF models 完成了这一目标,主要思想是根据用户的多跳邻居来测量用户 u u u对项目 v v v的偏好。其内积用于量化偏好,即 y ^ ( u , v ) = e u ∗ ⊤ e v ∗ . \hat{y}(u,v)=\mathrm{e}_{u}^{*\top}\mathrm{e}_{v}^{*}. y^(u,v)=eu∗⊤ev∗.,接下来,我们简单介绍一下基于GNN的CF的过程,包括聚合、池化及其负采样优化。
聚合(Aggregation)。每个用户和项目的初始嵌入向量分别为
e
u
\mathbf{e}_{u}
eu和
e
v
\mathbf{e}_{v}
ev,以Light-GCN为 例,其聚合过程为:
e
u
(
l
+
1
)
=
∑
i
∈
N
u
1
∣
N
u
∣
∣
N
i
∣
e
i
(
l
)
,
e
v
(
l
+
1
)
=
∑
j
∈
N
v
1
∣
N
v
∣
∣
N
j
∣
e
j
(
l
)
.
(
1
)
\mathbf{e}_{u}^{(l+1)}=\sum_{i\in N_{u}}\frac{1}{\sqrt{|N_{u}||N_{i}|}}\mathbf{e}_{i}^{(l)} , \mathbf{e}_{v}^{(l+1)}=\sum_{j\in N_{v}}\frac{1}{\sqrt{|N_{v}||N_{j}|}}\mathbf{e}_{j}^{(l)}.\quad(1)
eu(l+1)=i∈Nu∑∣Nu∣∣Ni∣1ei(l),ev(l+1)=j∈Nv∑∣Nv∣∣Nj∣1ej(l).(1)
- e u ( l ) , e v ( l ) \mathbf{e}_u^{(l)},\mathbf{e}_v^{(l)} eu(l),ev(l)是用户 u u u和项目 v v v在第 l l l层的GNN嵌入
- N u \mathcal{N}_{u} Nu表示与用户 u u u交互的项目集
- N v \mathcal{N}_{v} Nv表示与项目 v v v交互的用户集
为简单起见,我们在以下部分中使用 e ( l ) \mathrm{e}^{(l)} e(l)作为第 l l l层嵌入。
池化(Pooling)。基于GNN 的CF模型通常采用池化操作来生成用户和项目的最终表示,这可以帮助避免过度平滑并确定节点子图信息在不同范围内的重要性。
在最后一层
l
l
l,使用池化函数生成最终的用户和项目表示
e
u
∗
\mathbf{e}_u^*
eu∗和
e
v
∗
\mathbf{e}_v^*
ev∗,。
例如,LightGCN 使用基于总和的池化:
e
u
∗
=
∑
l
=
0
L
λ
l
e
u
(
l
)
,
e
v
∗
=
∑
l
=
0
L
λ
l
e
v
(
l
)
,
(
2
)
\mathbf{e}_u^*=\sum\limits_{l=0}^L\lambda_l\mathbf{e}_u^{(l)},\mathbf{e}_v^*=\sum\limits_{l=0}^L\lambda_l\mathbf{e}_v^{(l)},\quad(2)
eu∗=l=0∑Lλleu(l),ev∗=l=0∑Lλlev(l),(2)
例如,NGCF使用concat 的池化
e
u
∗
=
e
u
(
0
)
∣
∣
⋯
∣
∣
e
u
(
L
)
,
e
v
∗
=
e
v
(
0
)
∣
∣
⋯
∣
∣
e
v
(
L
)
,
(
3
)
\mathbf{e}_u^*=\mathbf{e}_u^{(0)}||\cdots||\mathbf{e}_u^{(L)},\mathbf{e}_v^*=\mathbf{e}_v^{(0)}||\cdots||\mathbf{e}_v^{(L)},\quad(3)
eu∗=eu(0)∣∣⋯∣∣eu(L),ev∗=ev(0)∣∣⋯∣∣ev(L),(3)
负采样优化(Optimization with Negative Sampling)。学习排序的任务是为用户提供项目的排名列表(假设用户喜欢的项目比其他项目排名更高)。
然而,通常情况下,用户的偏好无法完全从明确的反馈中得到。我们只能得到一些隐式反馈,比如用户点击、浏览、购买等行为(正向观察数据),这些行为只能告诉我们哪些物品是用户感兴趣的(即正样本)。但是,哪些物品用户不感兴趣(即负样本)则是无法直接知道的。
一种直接的解决方法是假设用户会更喜欢已观察到的物品(正样本),而不喜欢那些未观察到的物品(负样本),但是物品的数量非常大,直接考虑所有未观察的物品非常不现实,通常采用“负采样”技术,即随机选择一部分未观察到的物品作为负样本,用来训练模型。
BPR损失(Bayesian Personalized Ranking),BPR损失函数是其中一种常见的优化目标,公式如下:
max
∏
v
+
,
v
−
∼
f
S
(
u
)
P
u
(
v
+
>
v
−
∣
Θ
)
(
4
)
\max\prod_{v^+,v^-\sim f_{\mathrm{S}}(u)}P_u(v^+>v^-|\Theta)\quad(4)
maxv+,v−∼fS(u)∏Pu(v+>v−∣Θ)(4)
- v + v^{+} v+和 v − v^{-} v−分别表示正项目和负项目
- P u ( a > b ) P_{u}(a>b) Pu(a>b)表示用户 u u u相较于 b b b项目更喜欢 a a a项目
- f S ( u ) f_{\mathrm{S}}(u) fS(u)是负采样的分布,通常是一个均匀分布,即从所有未观察过的物品中随机选择
- Θ \Theta Θ是模型参数,表示我们需要通过训练来优化的参数。
这个式子的目标是最大化所有可能的正负样本对的乘积。 P u ( v + > v − ∣ Θ ) P_{u}(v^{+}>v^{-}|\Theta) Pu(v+>v−∣Θ)表示用户 u u u更喜欢 v + v^{+} v+而不是 v − v^{-} v−的概率,我们需要优化 Θ \Theta Θ模型参数,来使得 P u ( v + > v − ∣ Θ ) P_{u}(v^{+}>v^{-}|\Theta) Pu(v+>v−∣Θ)尽可能大,进而使乘积尽可能大。
5 MIXGCF
5.1 简介
MixGCF 是一种适用于基于 GNN 的推荐系统的负采样通用算法。它可以直接集成到现有的基于 GNN 的推荐算法中,例如 LightGCN 和 NGCF。MixGCF 提出了一种基于图结构合成信息丰富(且虚假的)负项目的方法,用于训练基于 GNN 的协同过滤推荐模型。
5.2 模型框架
如上图,MixGCF的框架,
e
(
l
)
\mathrm{e}^{(l)}
e(l)表示节点
e
e
e在第
l
l
l层的嵌入,
e
′
(
l
)
\mathbf{e}^{\prime(l)}
e′(l) 表示通过positive mixing生成的第
l
l
l层的嵌入。
5.3 Positive Mixing
在MixGCF的框架中,通过其嵌入 e v − \mathrm{e}_{v^{-}} ev−伪造负样本 v i − v_{i}^{-} vi−,其步骤如下:
第一步:选择
M
\text{M}
M个负样本项,形成候选集
M
\mathcal{M}
M,其中
M
\text{M}
M会远小于数据集中项目的数量。这些
M
\text{M}
M个负样本项可以形成一个大小为
M
×
(
L
+
1
)
M\times(L+1)
M×(L+1)的候选负嵌入集
E
=
{
e
v
m
(
l
)
}
\mathcal{E}=\{\mathbf{e}_{v_{m}}^{(l)}\}
E={evm(l)}
第二步:将正样本信息
e
v
+
\mathbf{e}_{v^{+}}
ev+注入到负样本嵌入
E
\mathcal{E}
E中。对于每个候选负嵌入
e
v
m
(
l
)
∈
E
\mathrm{e}_{v_{m}}^{(l)}\in\mathcal{E}
evm(l)∈E,positive mixing operation的公式如下:
e
′
v
m
(
l
)
=
α
(
l
)
e
v
+
(
l
)
+
(
1
−
α
(
l
)
)
e
v
m
(
l
)
,
α
(
l
)
∈
(
0
,
1
)
,
(
5
)
\mathbf{e'}_{v_m}^{(l)}=\alpha^{(l)}\mathbf{e}_{v^+}^{(l)}+(1-\alpha^{(l)})\mathbf{e}_{v_m}^{(l)},\alpha^{(l)}\in(0,1),\quad(5)
e′vm(l)=α(l)ev+(l)+(1−α(l))evm(l),α(l)∈(0,1),(5)
- α ( l ) \alpha^{(l)} α(l)是每一跳 l l l的混合系数
- 注意:如果混合系数是从贝塔分布 B e t a ( β , β ) \mathrm{Beta}(\beta,\beta) Beta(β,β)中采样的,这对模型的泛化能力有很大影响
- 我们使用从(0,1)分布采样的混合系数
设 ε ′ \varepsilon^{\prime} ε′是负样本候选集 M \text{M} M的增强嵌入集,正混合的两个作用是:
- 向负样本中注入正信息来增强样本,这有助于使优化算法更好地学习决策边界
- 通过随机混合系数引入随机不确定性,增强了模型的泛化能力
5.4 Hop Mixing
利用正混合增强的候选负项的嵌入 E ′ = { e ′ v m ( l ) } \mathcal{E}^{\prime} = \{\mathrm{e'}_{v_{m}}^{(l)}\} E′={e′vm(l)},提出了跳混合技术来生成合成的负项 v − v^{-} v−和嵌入 e v − \mathbf{e}_{v^{-}} ev−,跳混合的主要思想是利用gnn中的分层聚合过程。
对于每一层
l
(
0
≤
l
≤
L
)
l\left(0\leq l\leq L\right)
l(0≤l≤L),我们从
ε
′
(
l
)
\varepsilon^{\prime(l)}
ε′(l)中采样一个候选负嵌入
e
v
x
′
(
l
)
(
1
≤
x
≤
M
)
\textrm{e}_{v_{x}}^{\prime(l)}(1\leq x\leq M)
evx′(l)(1≤x≤M),其中
ε
′
(
l
)
\varepsilon^{\prime(l)}
ε′(l)包含了候选负样本项所有层的负嵌入。
以
L=2
\textit{L=2}
L=2为例,从
ε
′
(
l
)
\varepsilon^{\prime(l)}
ε′(l)采样
e
′
v
a
(
0
)
,
e
′
v
b
(
1
)
,
e
′
v
c
(
2
)
\mathrm{e'}_{v_a}^{(0)},\mathrm{e'}_{v_b}^{(1)},\mathrm{e'}_{v_c}^{(2)}
e′va(0),e′vb(1),e′vc(2),
a
,
b
,
c
a,b,c
a,b,c可以相同。
跳跃混合的想法是将所有
L
+
1
L+1
L+1嵌入组合起来,生成(伪)负样本
v
−
v^{-}
v−的嵌入
e
v
−
\mathbf{e}_{v^{-}}
ev−,公式如下:
e
v
−
=
f
p
o
o
l
(
e
′
v
x
(
0
)
,
⋯
,
e
′
v
y
(
L
)
)
,
(
6
)
\mathbf{e}_{v^-}=f_{\mathrm{pool}}\bigg(\mathbf{e'}_{v_x}^{(0)},\cdots,\mathbf{e'}_{v_y}^{(L)}\bigg),\quad(6)
ev−=fpool(e′vx(0),⋯,e′vy(L)),(6)
- 这里的池化操作是与当前基于GNN的推荐器中相同的池化操作。
公式6引出的问题
跳跃混合的核心问题是如何在每一层
l
l
l有效地从
ε
′
(
l
)
\varepsilon^{\prime}(l)
ε′(l)采样嵌入
e
′
v
x
(
l
)
(
1
≤
x
≤
M
)
⋅
\mathrm{e'}_{v_{x}}^{(l)}\stackrel{\cdot}{(1\leq x\leq M)}
e′vx(l)(1≤x≤M)⋅。期望损失
J
(
θ
∗
)
J(\theta^{*})
J(θ∗)和经验损失
J
(
θ
T
)
J(\theta_{T})
J(θT)之间的最优参数的
e
u
T
e
v
\mathrm{e}_u^T\mathrm{e}_v
euTev的预期风险满足:
E
[
∣
∣
(
θ
T
−
θ
∗
)
u
∣
∣
2
]
=
1
T
(
1
p
d
(
v
∣
u
)
−
1
+
1
K
p
n
(
v
∣
u
)
−
1
K
)
,
(
7
)
\mathbb{E}\left[||(\theta_T-\theta^*)_u||^2\right]=\frac{1}{T}(\frac{1}{p_d(v|u)}-1+\frac{1}{Kp_n(v|u)}-\frac{1}{K}),\quad(7)
E[∣∣(θT−θ∗)u∣∣2]=T1(pd(v∣u)1−1+Kpn(v∣u)1−K1),(7)
- p d ( v ∣ u ) , p n ( v ∣ u ) p_d(v|u),p_n(v|u) pd(v∣u),pn(v∣u)分别表示估计的目标用户对项目的正分布和负分布。
- θ T \theta_{T} θT是训练后的模型参数。
- θ ∗ \theta^{*} θ∗是最优的理论参数。
- ( θ T − θ ∗ ) u (\theta_T-\theta^*)_u (θT−θ∗)u是模型参数在用户 u u u上的误差。
- E [ ∣ ∣ ( θ T − θ ∗ ) u ∣ ∣ 2 ] \mathbb{E}\left[||(\theta_T-\theta^*)_u||^2\right] E[∣∣(θT−θ∗)u∣∣2]是误差的二范数(欧几里得距离)的平方的期望值,也就是说,它衡量了模型参数在用户 u u u上的偏差。
当 T T T和 K K K选定时,预期风险就只依赖于 p d ( v ∣ u ) p_d(v|u) pd(v∣u)和 p n ( v ∣ u ) p_n(v|u) pn(v∣u),但如果 p d ( v ∣ u ) p_d(v|u) pd(v∣u)和 p n ( v ∣ u ) p_n(v|u) pn(v∣u)成正比(例如, p n ( v ∣ u ) = α p d ( v ∣ u ) p_n(v|u)=\alpha p_d(v|u) pn(v∣u)=αpd(v∣u)),那么可以让预期风险只取决于 p d ( v ∣ u ) p_d(v|u) pd(v∣u)。而有着高内积分数的user-item之间的交互概率可以被准确估计
基于上述理论,负采样的建议方法是:
- 根据估计的正分布选择负样本
- 用内积分数来近似正分布并选择分数最高的候选样本,即负抽样也尽量选择负候选集中内积最大的user-item
- 这也称为hard negative select strategy
我的理解是:
- 理想的负样本应该是那些“难以区分”的负样本,即与正样本非常相似的负样本。这样,模型就能更好地学习如何区分正负样本。
- 用户与物品的内积得分越高,表示用户对物品的兴趣越强。因此,高内积得分的负样本通常是那些与正样本(真实的交互样本)非常相似的负样本
hard negative select strategy在第
l
l
l层的实现为:
e
′
v
x
(
l
)
=
arg
max
e
′
v
m
(
l
)
∈
E
(
l
)
f
Q
(
u
,
l
)
⋅
e
′
v
m
(
l
)
,
(
8
)
\mathbf{e'}_{v_{x}}^{(l)}=\arg\max_{\mathbf{e'}_{v_{m}}^{(l)}\in\mathcal{E}^{(l)}}f_{\mathbb{Q}}(u,l)\cdot\mathbf{e'}_{v_{m}}^{(l)},\quad(8)
e′vx(l)=arge′vm(l)∈E(l)maxfQ(u,l)⋅e′vm(l),(8)
- 上述公式我认为应该是 e v m ′ ( l ) ∈ ε ′ ( l ) e_{v_{m}}^{\prime(l)}\in\varepsilon^{\prime(l)} evm′(l)∈ε′(l)
- ⋅ · ⋅是内积运算
- f Q ( u , l ) f_{\mathrm{Q}}(u,l) fQ(u,l) 是查询映射,返回的是第 l l l跳目标用户 u u u相关的嵌入
该函数依赖于用于推荐的GNN的池化模块,主流的池化模块有基于和的池化操作和基于连接的池化操作(公式2和公式3)。因此,目标用户 e u \mathbf{e}_u eu和合成负嵌入 e v − \mathrm{e}_{v^{-}} ev−有两种选择:
- Sum-based pooling: e u ⋅ e v − = ∑ l = 0 L λ l e u ⋅ e v − ( l ) \mathbf{e}_{u}\cdot\mathbf{e}_{v^{-}}=\sum_{l=0}^{L}\lambda_{l}\mathbf{e}_{u}\cdot\mathbf{e}_{v^{-}}^{(l)} eu⋅ev−=∑l=0Lλleu⋅ev−(l)
- Concat-based pooling: e u ⋅ e v − = ∑ l = 0 L e u ( l ) ⋅ e v − ( l ) \mathbf{e}_{u}\cdot\mathbf{e}_{v^{-}}=\sum_{l=0}^{L}\mathbf{e}_{u}^{(l)}\cdot\mathbf{e}_{v^{-}}^{(l)} eu⋅ev−=∑l=0Leu(l)⋅ev−(l)
为了使得公式8中的选择过程和GNN推荐系统中使用的池化保持一致,我们让 f Q ( u , l ) = e u f_{Q}(u,l)=\mathbf{e}_{u} fQ(u,l)=eu用于sum-based pooling,让 f Q ( u , l ) = e u ( l ) f_{Q}(u,l)=\mathbf{e}_{u}^{(l)} fQ(u,l)=eu(l) 用于concat-based pooling。
- sum-based pooling最终的用户嵌入是通过将各层节点嵌入的加权求和得到的, e u = ∑ l = 0 L λ l e u ( l ) \mathbf{e}_u=\sum\limits_{l=0}^L\lambda_l\mathbf{e}_u^{(l)} eu=l=0∑Lλleu(l),让 e u \mathbf{e}_u eu参与运算即可
- concat-based pooling则是每一层的用户嵌入是拼接起来的 e u = e u ( 0 ) ∣ ∣ ⋯ ∣ ∣ e u ( L ) \mathbf{e}_u=\mathbf{e}_u^{(0)}||\cdots||\mathbf{e}_u^{(L)} eu=eu(0)∣∣⋯∣∣eu(L),为了确保查询映射函数与这种拼接的方式一致,则需要每一层的嵌入都参与运算。
5.5 Optimization with MixGCF
然后使用公式4中的BPR Loss作为损失函数(只不过加了对数
l
n
ln
ln,将乘法改为加法的形式),公式如下:
L
B
P
R
=
∑
(
u
,
v
+
)
∈
O
+
ln
σ
(
e
u
⋅
e
v
−
−
e
u
⋅
e
v
+
)
,
(
9
)
e
v
−
∼
f
M
i
x
G
C
F
(
u
,
v
+
)
\begin{aligned}\mathcal{L}_{\mathrm{BPR}}&=\sum_{(u,v^{+})\in O^{+}}\ln\sigma(\mathbf{e}_{u}\cdot\mathbf{e}_{v^{-}}-\mathbf{e}_{u}\cdot\mathbf{e}_{v^{+}}),\quad(9)\\&\mathbf{e}_{v^{-}}\sim f_{\mathrm{MixGCF}}(u,v^{+})\end{aligned}
LBPR=(u,v+)∈O+∑lnσ(eu⋅ev−−eu⋅ev+),(9)ev−∼fMixGCF(u,v+)
- σ ( ⋅ ) \sigma(\cdot) σ(⋅)是sigmod函数
- O + O^{+} O+是正反馈集合
- e v − ∼ f M i x G C F ( u , v + ) \mathbf{e}_{v^{-}}\sim f_{\mathrm{MixGCF}}(u,v^{+}) ev−∼fMixGCF(u,v+)表示 e v − \mathrm{e}_{v^{-}} ev−由所提出的MixGCF方法合成。
- e u ⋅ e v − − e u ⋅ e v + \mathbf{e}_u\cdot\mathbf{e}_{v^-}-\mathbf{e}_u\cdot\mathbf{e}_{v^+} eu⋅ev−−eu⋅ev+结果为负数,说明模型已经学到用户对正物品的偏好较高,则 l n σ ( ⋅ ) ln\sigma(\cdot) lnσ(⋅)的值更小,从而损失函数更小