MIND:Multi-Interest Network with Dynamic Routing for Recommendation at Tmall
一、论文
关于多兴趣召回的论文,属于U2I召回的一种,传统的召回方法针对一个Iser的行为序列只产生单一向量,但用户的行为序列往往蕴含多种兴趣,生产单一的用户的嵌入向量无法很好的对用户的行为进行建模,所以阿里巴巴提出了对用户的行为序列生产多个向量以表示用户的多个兴趣表征,从而大大的提高了用户的行为表征能力。
1.1核心方法
1.2 问题定义
我们有必要了解一下论文所解决问题的定义,这里我们就是根据User的历史行为序列来预测User下一个会点击的Item,所以我们针对User的行为序列的标签就是User下一个点击的Item。我们将
I
u
I_{u}
Iu计作是User
u
u
u的行为序列,
P
u
P_{u}
Pu计作是User
u
u
u的基本特征(例如年龄,性别等),
F
i
F_{i}
Fi为Item
i
i
i 的基本特征(例如item_id,cate_id等),则我们的目标就是学习一个函数
f
u
s
e
r
f_{user}
fuser使得:
V
u
=
f
u
s
e
r
(
I
u
,
P
u
)
V_{u}=f_{user}(I_{u},P_{u})
Vu=fuser(Iu,Pu)
这里的
V
u
=
(
v
u
1
→
,
.
.
.
,
v
u
K
→
)
∈
R
d
×
K
V_{u}=(\mathop{v_{u}^{1}}\limits ^{\rightarrow},...,\mathop{v_{u}^{K}}\limits ^{\rightarrow}) \in \mathbb{R}^{d \times K}
Vu=(vu1→,...,vuK→)∈Rd×K,其中d表示User的Embedding向量的维度,K代表着所提取出的用户的兴趣个数,当
K
=
1
K=1
K=1的时候,其退化为正常的U2I序列召回,对于Item我们也需要对其学习一个函数
f
i
t
e
m
f_{item}
fitem:
e
i
→
=
f
i
t
e
m
(
F
i
)
\mathop{e_{i}}\limits^{\rightarrow}=f_{item}(F_{i})
ei→=fitem(Fi)
这里的
e
i
→
∈
R
d
×
1
\mathop{e_{i}}\limits^{\rightarrow} \in \mathbb{R}^{d \times 1}
ei→∈Rd×1,表示每个Item的Embedding向量表征。在获取了User和Item的向量表征之后,那我们该如何对User的多兴趣表征与指定的Item进行打分呢,我们对其采用以下公式进行打分:
f
s
c
o
r
e
(
V
u
,
e
i
→
)
=
m
a
x
1
≤
k
≤
K
e
i
→
T
v
u
k
→
f_{score}(V_{u},\mathop{e_{i}}\limits^{\rightarrow})=\mathop{max}\limits_{1\leq k \leq K} {\mathop{e_{i}}\limits^{\rightarrow}}^\mathrm{T} \mathop{v_{u}^{k}}\limits ^{\rightarrow}
fscore(Vu,ei→)=1≤k≤Kmaxei→Tvuk→
实际上可以看出,这里只是对User的所有兴趣向量挨个与Item的向量进行内积(物品的每个向量表征与用户的每一列即一个兴趣对应的所有用户表征挨个进行内积),从所有的内积结果中挑出最大的得分作为最终的得分。
1.3Embedding & Pooling Layer
通过mean pooling将多个embeding合并成一个embeding向量。
1.4 Multi-Interest Extractor Layer
我们针对针对该流程进行逐一的解释,首先流程的第一行,我们需要根据输入的用户User的长度来动态的计算所提取的User的兴趣向量个数,可以简答的认为一个User的行为序列越长,其所包含的潜在兴趣的个数就越多,这里用户兴趣向量的计算公式如下:
K
u
′
=
m
a
x
(
1
,
m
i
n
(
K
,
l
o
g
2
I
u
)
)
K_{u}^{'} = max(1,min(K,{log}_{2}I_{u}))
Ku′=max(1,min(K,log2Iu))
这里的
K
K
K是我们设置的一个超参数,代表着最小兴趣的个数,当然了,我们也可以直接给所有用户都指定提取出固定个数的兴趣向量,这一部分在作者的实验部分会有体现。第2行就是我们需要给User的行为胶囊
i
i
i 和User的兴趣胶囊
j
j
j 之间声明一个系数
b
i
j
b_{ij}
bij ,这里我们对
b
i
j
b_{ij}
bij 使用高斯分布进行初始化。第三行开始是一个for循环,这里是对动态路由的次数进行for循环,在原论文中,这里是循环三次,即做三次动态路由。下面我们来具体分析一下每一次动态路由需要做什么操作
-
1.首先对 b i j b_{ij} bij 进行softmax,这里要注意我们softmax的维度是-1,这也就是让每个User的行为胶囊i的所有兴趣胶囊j的和为1,即:
w i j = e x p ( b i j ) ∑ i = 1 m e x p ( b i k ) w_{ij}=\frac{exp(b_{ij})}{\sum_{i=1}^{m}exp(b_{ik})} wij=∑i=1mexp(bik)exp(bij) -
2.在得到 w i j w_{ij} wij 之后,我们来生成兴趣胶囊 z j z_{j} zj ,其生成方法就是遍历的User行为序列,对每一个User的行为胶囊i执行第五行的公式,这样就可以将user行为序列的信息聚合到每一个兴趣胶囊中了。这里要注意 S ∈ R d × d S \in \mathbb{R}^{d \times d} S∈Rd×d 是一个可学习参数, S S S 相当于是对User的行为胶囊和兴趣胶囊进行信息交互融合的一个权重。
-
3.在得到兴趣胶囊 z j z_j zj 之后,我们对其使用squash激活函数,其公式如下:
s q u a s h ( z j ) = ∣ ∣ z j ∣ ∣ 2 1 + ∣ ∣ z j ∣ ∣ 2 z j ∣ ∣ z j ∣ ∣ squash(z_j)=\frac{{||z_{j}||}^2}{1+{||z_{j}||}^2}\frac{z_{j}}{{||z_{j}||}} squash(zj)=1+∣∣zj∣∣2∣∣zj∣∣2∣∣zj∣∣zj
这里的 ∣ ∣ z j ∣ ∣ ||z_{j}|| ∣∣zj∣∣ 代表向量的模长 -
4.最后一步我们需要来根据第七行中的公式来更新所有的 b i j b_{ij} bij ,然后继续重复这一循环过程,直到达到预设的循环次数。
在完成动态路由之后,我们就针对User的行为序列得到了他的多兴趣表征了,下面我们来看一下怎么根据用户的多兴趣表征来进行模型的训练
1.5 Label-aware Attention Layer
我们在得到了用户的多兴趣表征之后,我们就要对其进行Loss计算,以此来进行模型的反向传播了,那这个时候我们手里有的信息其实只有两个,第一个就是我们上一小节刚刚得到的用户的多兴趣向量 V u ∈ R d × K V_{u} \in \mathbb{R}^{d \times K} Vu∈Rd×K ,另一个就是我们User的“标签”,也就是User下一个点击的Item,我们同样也可以获取到这一个Item的Embedding向量 e i → ∈ R d \mathop{e_{i}}\limits^{\rightarrow} \in \mathbb{R}^{d} ei→∈Rd ,对于传统的序列召回,我们得到的只有单一的User/Item的Embedding向量,这时我们可以通过Sample Softmax,Softmax或者是一些基于Pair-Wise的方法来对其进行Loss的计算,但是我们这里对于User的Embedding表征的向量是有多个,这里就涉及到了怎么把User的多兴趣表征重新整合成单一的向量了,这里作者进行了详细的实验与讨论。
首先作者通过attention计算出各个兴趣向量对目标item的权重,用于将多兴趣向量融合为用户向量,其中p为可调节的参数
v
u
→
=
A
t
t
e
n
t
i
o
n
(
e
i
→
,
V
u
,
V
u
)
=
V
u
s
o
f
t
m
a
x
(
p
o
w
(
V
u
T
e
i
→
,
p
)
)
\mathop{v_{u}}\limits^{\rightarrow} = Attention(\mathop{e_{i}}\limits^{\rightarrow},V_{u},V_{u})=V_{u}softmax(pow(V_{u}^{T}\mathop{e_{i}}\limits^{\rightarrow},p))
vu→=Attention(ei→,Vu,Vu)=Vusoftmax(pow(VuTei→,p))
可以看出,上述式子中只有
p
p
p 为超参数,下面作者对
p
p
p 的不同取值进行了讨论
- 1.当p=0的时候,每个用户兴趣向量有相同的权重,相当于对所有的User兴趣向量做了一个Mean Pooling
- 2.当p>1的时候,p越大,与目标商品向量点积更大的用户兴趣向量会有更大的权重
- 3.当p趋于无穷大的时候,实际上就相当于只使用与目标商品向量点积最大的用户兴趣向量,忽略其他用户向量,可以理解是每次只激活一个兴趣向量
3.当p趋于无穷大的时候,实际上就相当于只使用与目标商品向量点积最大的用户兴趣向量,忽略其他用户向量,可以理解是每次只激活一个兴趣向量
在作者的实际实验中发现,当p趋于无穷大的时候模型的训练效果是最好的,即在进行Loss计算的时候,我们只对和目标Item最相似的那个兴趣向量进行Loss计算,这样我们就将多兴趣模型的Loss计算重新转换为一个一般的序列召回的问题,这里作者采用了Sample-Softmax当作损失函数,这里的Sample-Softmax可以认为是Softmax的简化版,其核心也是一个多分类任务,但是当Item的个数很大的时候,直接当作多分类做会有很大的计算压力,所以这里引出了Sample-Softmax,这里的Sample-Softmax是对负样本进行了随机采样,这样就可以极大的缩小多分类的总类别数,也就可以在大规模的推荐数据上进行训练了。
来着:https://aistudio.baidu.com/aistudio/education/group/info/27783