多兴趣推荐召回模型: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) ,能够提取多个用户兴趣向量,更好地捕捉用户多方面的兴趣。

问题定义

image-20220113210847987

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=(v u1,....,v uK)

e ⃗ i {\vec{e}_i} e i:item的表征向量(为了缓解冷启动,是多种属性的embedding进行 average pooling):

e ⃗ i = f i t e m ( F i ) {\vec{e}_i}=f_{item}(F_i) e i=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,e i)=max1kK e iTu ik

下面,我们将每一层拆分来,分别进行讲解。

Embedding & Pooling Layer

image-20220113220413445

  1. 用户的多个属性,经过Embedding Layer映射为多个embedding,然后进行拼接;
  2. 如上述,item的话,多个属性映射为embeeding之后,是通过进行average pooling,即上图的Pooling Layer。

Multi-Interest Extractor Layer

为了学习用户的多个兴趣向量,这篇论文通过类似聚类的方法,将用户的历史行为(对应下图的item embedding输入)聚合分组为多个cluster(对应interest capsule,即用户兴趣capsule),一个cluster代表用户一个方面的兴趣,这也正是Multi-Interest Extractor Layer所做的事情。

image-20220117220238547

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\} c ilRNl×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\} c jhRNh×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} SijRNh×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 z jh=i=1mwijSijc il

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的输出(目标产物),可作为下一层网络层的输入。

image-20220118221102950

另外还有几个细节:

  1. b i j {b_{ij}} bij一般是初设化为0;
  2. 为了能够收敛,整个动态路由过程一般重复3次,即以上由low-level capsule得到high-level capsule的过程;
  3. 由于high-level capsule是capsule network的输出,我们的输入只有low-level capsule,所以第一次routing无法计算得到 b i j b_{ij} bij,才需要将 b i j b_{ij} bij初设化为0;
  4. 借由第一次routing过程计算得到的high-level capsule,就可以给到后面的routing过程中了。

B2I Dynamic Routing

论文对经典的capsule network作了一些调整,称为Behavior-to-Interest (B2I) dynamic routing,可以从字面意思理解,就是通过用户的行为,通过动态路由的方法得到用户兴趣向量。

在这个场景下,low-level capsule对应用户的行为,更具体点,就是用户发生交互的item向量;

high-level capsule对应用户的多个兴趣capsule。

image-20220117220238547

调整的包括以下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是没有。

image-20220119211216295

Label-aware Attention Layer

在上一步提取K兴趣capsule之后,与用户基础属性embedding进行拼接,然后输入到H层relu全连接层网络,得到K个最终能够表征用户兴趣的向量 V u {V_u} Vu

image-20220124221950938

(在这里特地解释下:文中一会是兴趣capsule,一会是兴趣向量的?其中兴趣capsule是Multi-Interest Extractor Layer提取的,而兴趣向量是兴趣capsule经过上面多层relu全连接层网络后的输出,即我们最终想要的用户兴趣向量)

在提取用户的兴趣向量之后,引入注意力机制。其实很好理解,目的就是根据target item赋予K个用户兴趣向量不同的重要性(权重)。

如下图,K和V均为用户兴趣向量,Q为target item。

image-20220119213553970

image-20220119213907805

其中,p是控制注意力分布的。

当p接近0时,则每个兴趣向量趋于相同的注意力权重;

当p大于1, V u T e ⃗ i {V_u^T \vec{e}_i} VuTe i 越大的兴趣capsule则会接收越大的注意力,当p趋于无限大时,则会变成一种hard attention:只有最大注意力的兴趣向量起作用,而其他兴趣向量几乎被忽略,可以理解是每次只激活一个兴趣向量。

而论文指出,采用hard attention可以更快收敛。

最后,不同的兴趣向量乘上注意力权重之后,需要做一个reduce_sum累加操作,相当于加权平均。

Training & Serving

离线training和在线serving的做法基本与Youtube DNN的一致:

深入浅出地理解Youtube DNN推荐模型

image-20220120213600254

在训练阶段,当求出最终的用户向量 v ⃗ u {\vec{v}_u} v u后,做法就与YouTube DNN一致了。

训练目标就是拉大( v ⃗ u {\vec{v}_u} v u,target item)的内积相关度和( v ⃗ u {\vec{v}_u} v u,负采样的item)的差距,即 v ⃗ u {\vec{v}_u} v u要与target item相似度高,与负样本的item相似度低。

image-20220119220624994

image-20220119220630591

在Serving阶段,算出多个用户兴趣向量 V u {V_u} Vu之后,每个向量都可用于item召回,同样参考Youtube DNN。最终,从所有召回的item中挑选出相似度最高的N个item作为match(召回)阶段的结果。

代码实现

tensorflow1.x版本的代码实现:github

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值