如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【2022/图卷积对比/推荐】 Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Lea
【2022/图卷积对比/推荐】 Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Learning
原文:https://arxiv.org/abs/2202.06200
源码:https://github.com/rucaibox/ncl
1 动机
图显示了用户和item之间的交互,但是一般这都是稀疏的。那么如何减少稀疏对推荐效果的影响呢?一般可以采用对比学习的方法来增强学习的表征能力,在对比学习中通常都是随机采样来构建对比对,忽略了users或者items之间的邻居关系,特别是忽略了哪些潜在的邻居关系。作者提出了一种Neighborhood-enriched Contrastive Learning(NCL),它显示地把潜在邻居(一个user或者item邻居是包括来自图结构的邻居和语义空间上的邻居两种,作者从图结构和语义空间引入用户(或项目)的邻居)组成正对比对。
2 方法
作者定义两类邻居结构:
- 结构邻居: 指通过高阶路径在结构上连接的节点;
- 语义邻居: 指语义相似的邻居,在图上可能无法直接到达,但是他们语义存在相关。
如上结构框图可见主要包含三个loss,三个loss分别定义了模型建模的三个方面。
2.1【User-Item Interaction】
典型GCN聚合user和item表征信息的过程,其聚合过程定义如下式:
z
u
(
l
+
1
)
=
∑
i
∈
N
u
1
∣
N
u
∣
∣
N
i
∣
z
i
(
l
)
,
z
i
(
l
+
1
)
=
∑
u
∈
N
i
1
∣
N
i
∣
∣
N
u
∣
z
(
l
)
,
\begin{aligned} z_u^{(l+1)} & =\sum_{i \in N_u} \frac{1}{\sqrt{\left|\mathcal{N}_u\right|\left|\mathcal{N}_i\right|}} z_i^{(l)}, \\ z_i^{(l+1)} & =\sum_{u \in \mathcal{N}_i} \frac{1}{\sqrt{\left|\mathcal{N}_i\right|\left|\mathcal{N}_u\right|}} z^{(l)}, \end{aligned}
zu(l+1)zi(l+1)=i∈Nu∑∣Nu∣∣Ni∣1zi(l),=u∈Ni∑∣Ni∣∣Nu∣1z(l),
最终用户和item表示为
z
u
=
1
L
+
1
∑
l
=
0
L
z
u
(
l
)
,
z
i
=
1
L
+
1
∑
l
=
0
L
z
i
(
l
)
z_u=\frac{1}{L+1} \sum_{l=0}^L z_u^{(l)}, \quad z_i=\frac{1}{L+1} \sum_{l= 0}^L z_i^{(l)}
zu=L+11l=0∑Lzu(l),zi=L+11l=0∑Lzi(l)
最终预测结果为
y
^
u
,
i
=
z
u
⊤
z
i
,
\hat{y}_{u, i}=\mathbf{z}_u^{\top} \mathbf{z}_i,
y^u,i=zu⊤zi,
采用 BPRQ 损失,其中
σ
\sigma
σ 是sigmoid函数。
L
B
P
R
=
∑
(
u
,
i
,
j
)
∈
O
−
log
σ
(
y
^
u
,
i
−
y
^
u
,
j
)
\mathcal{L}_{B P R}=\sum_{(u, i, j) \in O}-\log \sigma\left(\hat{y}_{u, i}-\hat{y}_{u, j}\right)
LBPR=(u,i,j)∈O∑−logσ(y^u,i−y^u,j)
2.2【Structural Neighbors】
假设用户或物品初始embedding表示为
z
0
z^{0}
z0,
z
l
z^{l}
zl 可以看作聚合了
l
l
l 跳以内邻居信息的embedding。将用户物品交互图看作二部图,则我们可以将偶数跳的embedding看作是同质(因为二部图中用户的偶数跳邻居是用户,物品的偶数跳邻居是物品)。将用户自己的嵌入表征和偶数层的表征视为正对,并采用对比损失InfoNCE最小化距离。同类item也是类似操作
L
S
U
=
∑
u
∈
U
−
log
exp
(
(
z
u
(
k
)
⋅
z
u
(
0
)
/
τ
)
)
∑
v
∈
U
exp
(
(
z
u
(
k
)
⋅
z
v
(
0
)
/
τ
)
)
L
S
I
=
∑
i
∈
I
−
log
exp
(
(
z
i
(
k
)
⋅
z
i
(
0
)
/
τ
)
)
∑
j
∈
I
exp
(
(
z
i
(
k
)
⋅
z
j
(
0
)
/
τ
)
)
,
\mathcal{L}_S^U=\sum_{u \in \mathcal{U}}-\log \frac{\exp \left(\left(\mathbf{z}_u^{(k)} \cdot \mathbf{z}_u^{(0)} / \tau\right)\right)}{\sum_{v \in \mathcal{U}} \exp \left(\left(\mathbf{z}_u^{(k)} \cdot \mathbf{z}_v^{(0)} / \tau\right)\right)} \\ \mathcal{L}_S^I=\sum_{i \in I}-\log \frac{\exp \left(\left(\mathbf{z}_i^{(k)} \cdot \mathbf{z}_i^{(0)} / \tau\right)\right)}{\sum_{j \in I} \exp \left(\left(\mathbf{z}_i^{(k)} \cdot \mathbf{z}_j^{(0)} / \tau\right)\right)},
LSU=u∈U∑−log∑v∈Uexp((zu(k)⋅zv(0)/τ))exp((zu(k)⋅zu(0)/τ))LSI=i∈I∑−log∑j∈Iexp((zi(k)⋅zj(0)/τ))exp((zi(k)⋅zi(0)/τ)),
综合上面两个损失函数的整体结构对比学习损失函数为
L
S
=
L
S
U
+
α
L
S
I
.
\mathcal{L}_S=\mathcal{L}_S^U+\alpha \mathcal{L}_S^I .
LS=LSU+αLSI.
其中,
α
\alpha
α 是超参数,用于权衡两部分损失。
2.3【Semantic Neighbors】
由于基于二部图结构的邻居得到所有的正对,这不可避免会存在噪声的影响,因此采用语义邻居对比学习一定程度上来缓解噪声的影响。我们知道相似的用户或者物品在嵌入空间内应该相似/相近的,而且原型是代表一组语义邻居的集群的中心,则可以将聚类算法应用于用户和商品的嵌入,以获得用户或商品的原型。由于这里无法用end-2-end(端到端)进行优化,则采用EM算法学习并提出原型对比目标。
最大化对数似然函数有下式,其中
c
i
\mathbf{c}_i
ci 是用户
u
u
u 的原型(用户
u
u
u 所在集群的中心),
Θ
\Theta
Θ 是模型参数, $ \mathbf{R}
是交互矩阵,
是交互矩阵,
是交互矩阵,\mathbf{e}_u$ 是用户的embedding。这里在不断地迭代过程,实际上是希望得到的用户嵌入表征是越来越趋于平稳,即得到的聚类模型能够较好的区分不同的语义。
∑
u
∈
U
log
p
(
e
u
∣
Θ
,
R
)
=
∑
u
∈
U
log
∑
c
i
∈
C
p
(
e
u
,
c
i
∣
Θ
,
R
)
\sum_{u \in \mathcal{U}} \log p\left(\mathbf{e}_u \mid \Theta, \mathbf{R}\right)=\sum_{u \in \mathcal{U}} \log \sum_{\mathbf{c}_i \in C} p\left(\mathbf{e}_u, \mathbf{c}_i \mid \Theta, \mathbf{R}\right)
u∈U∑logp(eu∣Θ,R)=u∈U∑logci∈C∑p(eu,ci∣Θ,R)
过K-means聚类得到原型对比学习目标是基于 InfoNCE 最小化以下函数
L
P
U
=
∑
u
∈
U
−
log
exp
(
e
u
⋅
c
i
/
τ
)
∑
c
j
∈
C
exp
(
e
u
⋅
c
j
/
τ
)
\mathcal{L}_P^U=\sum_{u \in \mathcal{U}}-\log \frac{\exp \left(\mathbf{e}_u \cdot \mathbf{c}_i / \tau\right)}{\sum_{\mathbf{c}_j \in C} \exp \left(\mathbf{e}_u \cdot \mathbf{c}_j / \tau\right)}
LPU=u∈U∑−log∑cj∈Cexp(eu⋅cj/τ)exp(eu⋅ci/τ)
对于物品来说
L
P
I
=
∑
i
∈
I
−
log
exp
(
e
i
⋅
c
j
/
τ
)
∑
c
t
∈
C
exp
(
e
i
⋅
c
t
/
τ
)
\mathcal{L}_P^I=\sum_{i \in I}-\log \frac{\exp \left(\mathbf{e}_i \cdot \mathbf{c}_j / \tau\right)}{\sum_{\mathbf{c}_t \in C} \exp \left(\mathbf{e}_i \cdot \mathbf{c}_t / \tau\right)}
LPI=i∈I∑−log∑ct∈Cexp(ei⋅ct/τ)exp(ei⋅cj/τ)
综合两部分捑失函数得
L
P
=
L
P
U
+
α
L
P
I
.
\mathcal{L}_P=\mathcal{L}_P^U+\alpha \mathcal{L}_P^I .
LP=LPU+αLPI.
α
\alpha
α 是超参数,用于权衡两部分捑失。
2.4【loss】
整体目标如下
L
=
L
B
P
R
+
λ
1
L
S
+
λ
2
L
P
+
λ
3
∥
Θ
∥
2
,
\mathcal{L}=\mathcal{L}_{B P R}+\lambda_1 \mathcal{L}_S+\lambda_2 \mathcal{L}_P+\lambda_3\|\Theta\|_2,
L=LBPR+λ1LS+λ2LP+λ3∥Θ∥2,
3 总结
作者提出方法是模型无关的对比学习框架,提升了目前GCN在推荐中的效果。