
多兴趣推荐召回模型:MIND
Multi-Interest Network with Dynamic routing (MIND) ,能够提取多个用户兴趣向量,更好地捕捉用户多方面的兴趣。
在这篇文章深入浅出地理解Youtube DNN推荐模型中,介绍了深度学习召回模型YouTube DNN,以及推荐系统的召回阶段是怎样一个流程:YouTube DNN计算得到用户兴趣向量,然后与所有item向量的进行最邻近搜索,召回最相关的n个。
但一个用户兴趣向量很难捕获用户多方面的兴趣,可能会出现召回item雷同的情况;
更甚至,当模型计算的用户兴趣向量不准的话,那召回的item可能全是与用户的兴趣偏移的。
2019阿里的论文《Multi-Interest Network with Dynamic Routing for Recommendation at Tmall》就提出一个新的模型 Multi-Interest Network with Dynamic routing (MIND) ,能够提取多个用户兴趣向量,更好地捕捉用户多方面的兴趣。
问题定义
I u {I_u} Iu:用户行为,即用户发生交互(例如点击)的item集合,对应上图User Behavior Sequence:item1、item2、…、item N
P u {P_u} Pu:用户的基础属性,如性别、年龄,对应上图的Other Features
F i {F_i} Fi:目标item的属性,例如item id、category id,对应上图的Label
MIND模型的目标就是通过用户行为+用户基础属性,计算用户的K个兴趣向量 V u {V_u} Vu(当K=1时,则与YouTube DNN类似):
V u = f u s e r ( I u , P u ) , w h e n V u = ( v ⃗ u 1 , . . . . , v ⃗ u K ) {V_u=f_{user}(I_u,P_u)},\ when\ V_u=(\vec{v}_u^1,....,\vec{v}_u^K) Vu=fuser(Iu,Pu), when Vu=(vu1,....,vuK)
e ⃗ i {\vec{e}_i} ei:item的表征向量(为了缓解冷启动,是多种属性的embedding进行 average pooling):
e ⃗ i = f i t e m ( F i ) {\vec{e}_i}=f_{item}(F_i) ei=fitem(Fi)
最后,当用户兴趣向量和item表征向量充分学习之后,在召回阶段,K个用户兴趣向量都可以用来召回item:
f s c o r e ( V u , e ⃗ i ) = m a x 1 ≤ k ≤ K e ⃗ i T u ⃗ i k {f_{score}(V_u,\vec{e}_i)=max_{1\le k \le K}\ \vec{e}_i^T \vec{u}_i^k} fscore(Vu,ei)=max1≤k≤K eiTuik
下面,我们将每一层拆分来,分别进行讲解。
Embedding & Pooling Layer
- 用户的多个属性,经过Embedding Layer映射为多个embedding,然后进行拼接;
- 如上述,item的话,多个属性映射为embeeding之后,是通过进行average pooling,即上图的Pooling Layer。
Multi-Interest Extractor Layer
为了学习用户的多个兴趣向量,这篇论文通过类似聚类的方法,将用户的历史行为(对应下图的item embedding输入)聚合分组为多个cluster(对应interest capsule,即用户兴趣capsule),一个cluster代表用户一个方面的兴趣,这也正是Multi-Interest Extractor Layer所做的事情。
capsule network
提取用户兴趣向量主要借鉴的方法是capsule network(胶囊网络),因此在进入Multi-Interest Extractor Layer讲解之前,需要搞清楚capsule network的原理。
capsule network由low-level的capsule和high-level的capsule组成,目的在于通过 Dynamic Routing(动态路由)的方式,根据low-level capsule来计算得到high-level的 capsule。
low-level capsule: c ⃗ i l ∈ R N l × 1 , i ∈ { 1 , . . . . , m } {\vec{c}_i^l} \in R^{N_l \times 1},\ i \in \{1,....,m\} cil∈RNl×1, i∈{1,....,m}
high-level capsule: c ⃗ j h ∈ R N h × 1 , i ∈ { 1 , . . . . , n } {\vec{c}_j^h} \in R^{N_h \times 1},\ i \in \{1,....,n\} cjh∈RNh×1, i∈{1,....,n}
routing logit:${b_{ij}}=(\vec{c}jh)T S{ij} \vec{c}_i^l $
其中 S i j ∈ R N h × N l {S_{ij}} \in R^{N_h \times N_l} Sij∈RNh×Nl为双线性映射矩阵,是需要学习的参数
接着,可以得到high-level capsule的候选向量:
z ⃗ j h = ∑ i = 1 m w i j S i j c ⃗ i l {\vec{z}_j^h}=\sum_{i=1}^m w_{ij}S_{ij}\vec{c}_i^l zjh=∑i=1mwijSijcil
w i j {w_{ij}} wij是连接high-level capsule和low-level capsule的权重:
w i j = e x p b i j ∑ i = 1 m e x p b i j {w_{ij}}=\frac{exp\ b_{ij}}{\sum_{i=1}^m exp\ b_{ij}} wij=∑i=1mexp bijexp bij
最后,通过非线性的squash函数得到high-level capsule的向量,即capsule network的输出(目标产物),可作为下一层网络层的输入。
另外还有几个细节:
- b i j {b_{ij}} bij一般是初设化为0;
- 为了能够收敛,整个动态路由过程一般重复3次,即以上由low-level capsule得到high-level capsule的过程;
- 由于high-level capsule是capsule network的输出,我们的输入只有low-level capsule,所以第一次routing无法计算得到 b i j b_{ij} bij,才需要将 b i j b_{ij} bij初设化为0;
- 借由第一次routing过程计算得到的high-level capsule,就可以给到后面的routing过程中了。
B2I Dynamic Routing
论文对经典的capsule network作了一些调整,称为Behavior-to-Interest (B2I) dynamic routing,可以从字面意思理解,就是通过用户的行为,通过动态路由的方法得到用户兴趣向量。
在这个场景下,low-level capsule对应用户的行为,更具体点,就是用户发生交互的item向量;
high-level capsule对应用户的多个兴趣capsule。
调整的包括以下3个方面:
A. Shared bilinear mapping matrix:不同于经典的capsule network中每一对low-level capsule和high-level capsule的共享双线性映射矩阵S是不同的;
这篇论文调整为共享双线性映射矩阵S,一方面是Tmall用户行为长度都在数百以内,所以认为双线性映射矩阵S是可以泛化的;另一方面是希望用户兴趣capsule能够处于相同的向量空间,但不同的双线性映射矩阵S会导致用户兴趣capsule映射到不同向量空间。
B. Randomly initialized routing logits:前面提到routing logit b i j {b_{ij}} bij初设化为0,但由于共享了双线性映射矩阵S,这就会导致相同的初设兴趣capsule,即第一次动态路由iteration时K个初设兴趣capsule相同。所以将 b i j {b_{ij}} bij初设化修改为高斯分布 N ( 0 , δ 2 ) {N(0,\delta^2)} N(0,δ2)
C. Dynamic interest number:不同的用户设置不同的兴趣capsule数量,这主要是为了节省计算资源:
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, log2(∣Iu∣)))
论文中指出以上3点对于动态路由的调整,但从算法流程中,其实还有一点不同(个人理解,若有错误希望指出):
MIND的routing logit b i j {b_{ij}} bij在迭代的过程中是累加的,见下图第7点,但原始的routing是没有。
Label-aware Attention Layer
在上一步提取K兴趣capsule之后,与用户基础属性embedding进行拼接,然后输入到H层relu全连接层网络,得到K个最终能够表征用户兴趣的向量 V u {V_u} Vu。
(在这里特地解释下:文中一会是兴趣capsule,一会是兴趣向量的?其中兴趣capsule是Multi-Interest Extractor Layer提取的,而兴趣向量是兴趣capsule经过上面多层relu全连接层网络后的输出,即我们最终想要的用户兴趣向量)
在提取用户的兴趣向量之后,引入注意力机制。其实很好理解,目的就是根据target item赋予K个用户兴趣向量不同的重要性(权重)。
如下图,K和V均为用户兴趣向量,Q为target item。
其中,p是控制注意力分布的。
当p接近0时,则每个兴趣向量趋于相同的注意力权重;
当p大于1, V u T e ⃗ i {V_u^T \vec{e}_i} VuTei 越大的兴趣capsule则会接收越大的注意力,当p趋于无限大时,则会变成一种hard attention:只有最大注意力的兴趣向量起作用,而其他兴趣向量几乎被忽略,可以理解是每次只激活一个兴趣向量。
而论文指出,采用hard attention可以更快收敛。
最后,不同的兴趣向量乘上注意力权重之后,需要做一个reduce_sum累加操作,相当于加权平均。
Training & Serving
离线training和在线serving的做法基本与Youtube DNN的一致:
在训练阶段,当求出最终的用户向量 v ⃗ u {\vec{v}_u} vu后,做法就与YouTube DNN一致了。
训练目标就是拉大( v ⃗ u {\vec{v}_u} vu,target item)的内积相关度和( v ⃗ u {\vec{v}_u} vu,负采样的item)的差距,即 v ⃗ u {\vec{v}_u} vu要与target item相似度高,与负样本的item相似度低。
在Serving阶段,算出多个用户兴趣向量 V u {V_u} Vu之后,每个向量都可用于item召回,同样参考Youtube DNN。最终,从所有召回的item中挑选出相似度最高的N个item作为match(召回)阶段的结果。
代码实现
tensorflow1.x版本的代码实现:github
更多推荐
所有评论(0)