RecipeRec: A Heterogeneous Graph Learning Model for Recipe Recommendation
本次带来一篇IJCAI-22的会议。
原文链接
Motivation
1、在食谱推荐系统中,现存的recipe recommendation systems只应用了Content-based和collaborative filtering的推荐方法(计算食谱相似度、利用用户信息),忽略了高阶协同信号的影响(如用户、食谱与食物成分的关系框架信息)。
2、个体偏好是复杂的,个体选择一份食谱可能是由于它的食物成分、烹饪方式或朋友的推荐。因此一个全面的食谱推荐系统应该考虑到所有的因素,将高阶协同信号编码入食谱推荐中+对"用户-食谱-食物成分"的关系进行建模迫在眉睫。
Contribution
1、设计了一个URI-Graph,是一个新的大范围"用户-食谱-成分"异构图,如下图1所示
URI图有3种节点,分别是User、Recipe和Ingredient,3种节点之间有四种类型的边,分别是成分-成分、食谱-食谱、食谱-成分、用户-食谱。目前看来,这是第一个以图的方式来研究食谱推荐的文章。
2、基于自己设计的URI数据图集,提出了一个RecipeRec,它是一个异构图学习模型,上图2
具体来说,这个RecipeRec是用来捕获URI图中的食谱内容和关系框架信息的
①首先设计了一个层级注意的共享异构GNN(图中紫框和(c))来对节点进行编码:
(1)为了全面地获取URI图的信息,提出了一个自适应节点级注意力模块,它可以区分特定关系下相邻节点之间的细微差异。
(2)此外,作者团队还设计了一个关系级的注意力模块,用来筛选出节点周围最有意义的关系,并且将它们与适当的权重进行融合。
②应用了 [Lee et al., 2019]的transformer(图中黄框和(b))来对食物成分信息进行编码,并对成分之间的成对相互作用和高阶相互作用进行建模。
③接着引入了一种自监督方式的图对比增强策略(图左下方),来提取信息图中的知识。
④最后设计了一个联合目标函数(图中灰框)和图对比学习(图中橙框)去优化整个模型
3、进行了大量实验证明了RecipeRec在食谱推荐中的优越性。
Solution
一、URI-Graph Data.
在开始讲模型之前,先讲一下他的URI图是怎么做的
Definition 1. User-Recipe-Ingredient Graph.
一个user-recipe-ingredient graph被定义为异构图G = (V, E, C):G有3种类型的节点V(用户、食谱和成分)和4种类型的边E
(成分-成分、食谱-食谱、食谱-成分、用户-食谱),此外每一个节点都与contents C有关(食谱说明、营养成分或用户评分)。
如图1所示,首先从Reciptor [Li and Zaki, 2020]收集食谱,然后从www.food.com抓取用户对每一个食谱的评分当做用户-食谱交互数据来用,最后将食谱里的每一种成分与美国农业部营养数据库做match。这样一来URI图的三种节点就bulid完成了,四种边的构建不再赘述。
最后,作者团队构建了具有7958个用户节点、68794个食谱节点和8847个成分节点的图。图中包含四种边,分别是135353对user-recipe边、6474146对recipe-recipe边、463485对recipes -ingredient边和146188个对ngredient-ingredient边。
Problem 1. Recipe Recommendation with Graphs.
给定一个G = (V, E, C),task是设计一个机器学习模型F(Θ)来完成食谱推荐,具体来说就是为用户返回一个有排名的推荐列表。
二、RecipeRec
为了解决Problem 1,作者团队设计了异构图学习模型RecipeRec,如图2所示,它包含一个具有层级注意的共享异构GNN和一个成分集transformer,图对比增强策略和一个联合目标函数。
1、GNN with Hierarchical Attention
目的:获得用户和食谱的embedding。
由于G中有三种类型的节点,那么它们的特征空间必定有出入,为了让三种节点落到同一个特征空间上,使用了一个基于特定类型的输入映射。
Type-specific Input Projection 特定类型的输入映射—— W ϕ i W_ϕi Wϕi
如果节点的类型
ϕ
i
ϕ_i
ϕi是ingredient,那么我们用营养向量(
x
i
n
g
x_{ing}
xing)去表示它
如果节点的类型
ϕ
i
ϕ_i
ϕi是recipe,那么我们用预训练的跳过指令嵌入的平均值(
x
i
n
s
x_{ins}
xins)[Marin et al., 2019]去表示它
如果节点的类型
ϕ
i
ϕ_i
ϕi是user,那么我们用表示用户的随机初始化向量(
x
u
s
e
r
x_{user}
xuser)去表示它
三种类型就有三种输入映射转换矩阵
W
ϕ
i
W_ϕi
Wϕi,三种节点分别左乘
W
ϕ
i
W_ϕi
Wϕi后,映射到共享的embedding空间中了。
Adaptive Node-level Attention 自适应节点级注意力
目的: 获得
h
i
,
r
l
+
1
h^{l+1}_{i,r}
hi,rl+1——GNN的l+1层,特定关系r的节点
v
i
v_i
viembedding
具体步骤:
z
i
l
=
W
i
l
×
h
i
l
(
1
)
z^l_i = W^l_i \times h^l_i\quad(1)
zil=Wil×hil(1)
对投影到同一个特征空间的节点
v
i
v_i
vi的初始向量
h
i
h_i
hi,使用共享的权重矩阵
W
i
l
W^l_i
Wil来获得中间向量
z
i
l
z^l_i
zil
e
i
j
l
=
L
e
a
k
y
R
e
L
U
[
W
i
j
l
×
(
z
i
l
∥
z
j
l
)
]
(
2
)
e^l_{ij} = LeakyReLU [W^l_{ij} \times (z^l_i∥z^l_j)]\quad(2)
eijl=LeakyReLU[Wijl×(zil∥zjl)](2)
计算节点
v
i
v_i
vi与节点
v
j
v_j
vj之间的未归一的注意力分数,用来学习后者对前者的重要性。
notes:
W
i
j
l
W^l_{ij}
Wijl是可学习的权重矩阵。
∥
∥
∥是拼接操作concatenation,将新向量拼接到原向量的后头,对应维数增加。LeakyReLU是一个常用的激活函数。
α
i
j
l
=
e
x
p
(
e
i
j
l
)
∑
k
∈
N
i
,
r
e
x
p
(
e
i
k
l
)
(
3
)
α^l_{ij} = \frac{exp(e^l_{ij})}{\sum_{k∈N_{i,r}}exp(e^l_{ik})}\quad(3)
αijl=∑k∈Ni,rexp(eikl)exp(eijl)(3)
将得到的注意力分数
e
i
j
l
e^l_{ij}
eijl进行0~1上的归一化(softmax),得到节点
v
i
v_i
vi与节点
v
j
v_j
vj之间的注意力权重系数
α
i
j
l
α^l_{ij}
αijl。
N
i
,
r
N_{i,r}
Ni,r指的是特定关系r中与
v
i
v_i
vi有关联的邻居节点的集合索引。
为了使训练过程更加稳定,引入了multi-head attention多头注意力操作,公式如下所示:
h
i
,
r
l
+
1
=
∥
m
=
1
M
R
e
L
U
(
∑
j
∈
N
i
,
r
α
i
j
l
×
z
j
l
+
W
h
l
×
(
h
i
l
⊙
h
j
l
)
)
×
W
a
(
4
)
h^{l+1}_{i,r} =∥ ^M_{m=1}ReLU(\sum_{j∈N_{i,r}}α^l_{ij} \times z^l_j + W^l_h \times (h^l_i ⊙ h^l_j))\times W_a\quad(4)
hi,rl+1=∥m=1MReLU(∑j∈Ni,rαijl×zjl+Whl×(hil⊙hjl))×Wa(4)
多头注意力的思想是重复M次将节点级注意力,最后拼接为一个整体。
公式(4)中的
W
h
l
W^l_h
Whl和
W
a
W_a
Wa是可训练可训练权重矩阵、⊙是同纬度向量的每个元素分别相乘。RELU也是激活函数。
至此,自适应节点级注意的最终目标
h
i
,
r
l
+
1
h^{l+1}_{i,r}
hi,rl+1到手了。
Relation-level Attention 关系级的注意力
目的:学习每一个关系对节点 v i v_i vi的重要性分数 w i , r w_{i,r} wi,r,并将它们融入到特定关系r的节点embedding—— h i , r l + 1 h^{l+1}_{i,r} hi,rl+1中
w i , r = ∑ i ∈ V r ∣ V r ∣ ⋅ q T ⋅ t a n h ( W R ⋅ h i , r l + 1 + b ) ( 5 ) w_{i,r} = \frac{\sum_{i∈V_r}}{|V_r|}·q^T · tanh(W_R · h^{l+1}_{i,r} + b)\quad(5) wi,r=∣Vr∣∑i∈Vr⋅qT⋅tanh(WR⋅hi,rl+1+b)(5)
W R W_R WR是l+1*l+1的共享非线性矩阵,用来转换 h i , r l + 1 h^{l+1}_{i,r} hi,rl+1, q T q^T qT是一个l+1维的向量,b是l+1维的偏差向量。W、q、b是共享的可训练的。 V r V_r Vr是关系r下的节点集合的数量, ∣ V r ∣ |V_r| ∣Vr∣作分母是为了求平均值。tanh是双曲正切函数。
也就是说,给定一种关系r,该关系下有|V_r|个节点,对于每一个节点,首先将其在关系r下的embedding经过一个非线性层,然后乘上一个关系级注意力向量q,最后再将所有节点的转换结果求平均值,得到这个关系r的重要性。
β
i
,
j
=
e
x
p
(
w
i
,
j
)
∑
r
∈
R
i
e
x
p
(
w
i
,
r
)
(
6
)
β_{i,j} = \frac{exp(w_{i,j})}{\sum_{r∈R_i}exp(w_{i,r})}\quad(6)
βi,j=∑r∈Riexp(wi,r)exp(wi,j)(6)
在得到所有关系到重要性之后,利用softmax函数对其进行归一化,得到最终的关系级注意力权重
β
i
,
j
β_{i,j}
βi,j。
R
i
R_i
Ri是与节点
v
i
v_i
vi关联的所有关系,
β
i
,
j
β_{i,j}
βi,j可以看作关系r对节点
v
i
v_i
vi的贡献。
最后,用得到的
β
i
,
j
β_{i,j}
βi,j对所有的特定关系节点embedding——
h
i
,
r
l
+
1
h^{l+1}_{i,r}
hi,rl+1进行加权融合
h
i
l
+
1
=
∑
r
=
1
R
i
β
i
,
r
⋅
h
i
,
r
l
+
1
(
7
)
h^{l+1}_{i}=\sum^{R_i}_{r=1}β_{i,r} · h^{l+1}_{i,r}\quad(7)
hil+1=∑r=1Riβi,r⋅hi,rl+1(7)
将
h
i
G
h^G_i
hiG=
h
i
L
h^{L}_{i}
hiL当作GNN最后一层传播的节点embedding,L是GNN的层数。
2、Ingredient Set Transformer 成分集合的转换器
目的:对于一个食谱,它有多种成分,并不是每个成分都是同等重要的,为了学习每个成分的重要性,本文应用一个成分集Transformer来整合食谱中的成分交互。最终得到基于transformer的食谱embedding—— h i T F h^{TF}_i hiTF,有别于上面GNN得到的食谱embedding—— h i G h^G_i hiG
本文使用的Transformer是2017年Google在Computation and Language上发表的方法,具体讲解请参考这篇文章详解Transformer中Self-Attention以及Multi-Head Attention,不想看文章可以看他发的视频理解更快Transformer中Self-Attention以及Multi-Head Attention详解。
不管是self-Attention的本体公式
A
t
t
(
Q
,
K
,
V
)
=
ω
(
Q
K
⊤
)
V
(
8
)
Att(Q, K, V ) = ω(QK^⊤)V\quad(8)
Att(Q,K,V)=ω(QK⊤)V(8)
或是后面的多头注意力Multi-Head Attention的设置,都可以从上面链接中的讲解得到答案。(ω是范围激活函数,ω=softmax(·/√d))
贴一下本文的多头注意力公式
A
t
t
(
X
1
,
X
2
)
=
ω
[
(
X
1
⋅
W
Q
)
(
X
2
⋅
W
K
)
⊤
]
(
X
2
⋅
W
V
)
(
9
)
Att(X1, X2) = ω[(X1 · W_Q)(X2 · W_K)^⊤](X2 · W_V )\quad(9)
Att(X1,X2)=ω[(X1⋅WQ)(X2⋅WK)⊤](X2⋅WV)(9)
M A B ( X 1 , X 2 ) = F F N [ W m ⋅ X 1 + A t t ( X 1 , X 2 ) ] , S A B ( X ) = M A B ( X , X ) , h i T F = F F N [ S A B ( X ) ] , ( 10 ) MAB(X1, X2) = FFN[W_m · X1 + Att(X1, X2)],\\ SAB(X) = MAB(X, X),\\ h^{TF}_i = FFN[SAB(X)],\quad(10) MAB(X1,X2)=FFN[Wm⋅X1+Att(X1,X2)],SAB(X)=MAB(X,X),hiTF=FFN[SAB(X)],(10)
最后将食谱的两个embedding:
h
i
T
F
h^{TF}_i
hiTF和
h
i
G
h^G_i
hiG进行拼接
h
i
=
W
O
⋅
(
h
i
G
+
h
i
T
F
)
h_i =W_O · (h^G_i + h^{TF}_i)
hi=WO⋅(hiG+hiTF)
对于用户embedding来说,它只需要经过GNN就行了,即 h i = h i G h_i = h^G_i hi=hiG
3、Objective Function for Recommendation 用来训练推荐的目标函数
目的:训练使得有关联的用户-食谱节点之间的分数比无关联的用户-食谱节点之间的分数大
s
i
,
j
=
s
c
o
r
e
_
p
r
e
d
i
c
t
o
r
(
h
i
,
h
j
)
L
r
e
c
=
∑
i
∈
U
,
j
∈
N
i
m
a
x
(
0
,
1
−
s
i
,
j
+
s
i
,
j
′
)
(
11
)
s_{i,j} = score\_predictor(h_i, h_j)\\ L_{rec} =\sum_{i∈U,j∈N_i}max(0, 1 − s_{i,j} + s_{i,j}′)\quad(11)
si,j=score_predictor(hi,hj)Lrec=∑i∈U,j∈Nimax(0,1−si,j+si,j′)(11)
h
i
,
h
j
,
h
j
′
h_i,h_j,h_j′
hi,hj,hj′是用户节点
v
i
v_i
vi、与该用户有关联的食谱
v
j
v_j
vj、与该用户随机相关的食谱节点
v
j
′
v_j′
vj′的embedding。score_predictor是一个向量求内积的函数,
L
r
e
c
L_{rec}
Lrec是recommendation loss。
4、Graph Contrastive Augmentation 图对比增强策略
目的: 由于上述目标函数只考虑URI-Graph中的显式和监督信息,因此本文另外引入了图对比增强策略,以自监督的方式捕获图中的隐式信息。
具体步骤: 输入的URI图
G
G
G以节点缺失和边缘缺失[Wang et, 2019a]的方式,被增广成两种视角的子图
G
′
,
G
′′
G′, G′′
G′,G′′。
L
c
o
n
=
∑
i
∈
Y
T
−
l
o
g
e
x
p
(
h
i
′
,
h
i
′′
/
τ
)
e
x
p
(
h
i
′
,
h
j
′′
/
τ
)
(
12
)
L_{con} =\sum_{i∈Y_T}− log \frac{exp(h_i′,h_i′′/τ)}{exp(h_i′,h_j′′/τ)}\quad(12)
Lcon=∑i∈YT−logexp(hi′,hj′′/τ)exp(hi′,hi′′/τ)(12)
将同一个节点的不同视角视为正样本对,不同节点作为负样本对。力求损失函数中的分子最大化和分母最小化,来达到提高相同节点不同视角图一致性的目的。
最后将推荐损失函数和图对比学习损失函数融合起来。
L
=
L
r
e
c
+
λ
L
c
o
n
(
13
)
L = L_{rec} + λL_{con}\quad(13)
L=Lrec+λLcon(13)
Evaluation
baselines
传统方法BPR [Rendle et al.,2009]和NeuMF [He et al., 2017]
食谱表示学习和推荐方法 Nutrition [Teng et al., 2012],PopIngre [Teng et al., 2012], IngreNet [Teng et al., 2012] and Reciptor [Li and Zaki,2020]
齐次GNNs GraphSAGE [Hamilton et al., 2017] and GAT[V eliˇckovi´c et al., 2018]
异构GNNs RGCN [Schlichtkrull et al., 2018], mp2vec [Dong et al., 2017],HAN [Wang et al., 2019b] and HGT [Hu et al., 2020]
基于图形的推荐方法PinSage [Ying et al.,2018] and NGCF [Wang et al., 2019a].
Performance Comparison
Summarization
在本文中,我们提出并形式化了用图来推荐食谱的问题。为了解决这个问题,我们创建了URI图,这是一个新的大规模的食谱图数据,以促进基于图的食品研究。此外,我们开发了一种新的异构图学习模型RecipeRec,用于食谱推荐。RecipeRec能够通过GNN和transformer捕获食谱内容和关系结构信息。采用推荐损失和图对比学习损失相结合的目标函数对模型进行优化。大量实验证明,RecipeRec优于最先进的基线。
题外话,本文的公式推导均可以在前人的文章中找到范例,相关推导本站一搜便有。