Multi-Interest Network with Dynamic Routing for Recommendation at Tmall
多兴趣动态路由,出自一直在学术前沿的阿里:https://arxiv.org/pdf/1904.08030.pdf 。
推荐系统中默认用户的历史行为代表着用户的兴趣,而传统的Embedding方式会用DNN把用户特征固定成一个低维向量,不能很好的捕捉到用户动态的,多方面丰富的兴趣特征。所以DIN方法采用自注意力,使同一个用户与不同的item预测时用户产生的Embedding都不一样,即先会计算当前item和用户历史item之间的相似度,然后加权用户的历史记录得到用户的兴趣Embedding特征,最后通过sigmoid预测CTR,只是这种计算速度比较慢,只能在精排阶段使用较好。
而这篇论文MIND的主要任务则是从另一个角度来看问题:既然使用一个向量表达用户多样兴趣有困难,那么为什么不使用一组向量呢?
而能够表示一组的模型,胶囊网络(Capsule Network)就十分合适了。整个MIND的网络结构如上图,做左边是用户的其他特征如基础画像属性组成(id,age,gender等concat得到特征),中间的是用户的历史行为item(由id,类别,品牌做avg pooling得到特征),这两部分最后一起表示用户的特征,然后最右边的是label,即要预测的目标item。所有的部分都会先经过一个Embedding,然后用户历史行为数据的处理就是MIND的核心:Multi-Intereset Extractor layer。
Multi-Intereset Extractor layer
原先的Capsule Network是为了解决传统的CNN中只能编码全局的图像特征,而无法编码局部特征的orientation(如组件,方向,旋转等等),所以胶囊网络把原先输入NN的标量变成一组向量,然后对这组向量进行仿射变换、求加权和,非线性激活函数等等,博主以前整理过就不再赘述。对应着动态路由算法,MIND的伪代码如下:
首先输入是用户行为向量 e i e_i ei(每个历史item都是用户的行为胶囊),迭代次数r和兴趣胶囊个数K。
最后的输出为 K u ′ K'_u Ku′个兴趣胶囊。
Label-aware Attention
得到兴趣特征之后,兴趣特征会个原用户的画像特征做concat一起组成用户特征,这里还有一个问题是用户特征有了一组,而目前的label只有一个,无法直接内积算相似度。所以提出了Label-aware Attention,这个东西实际上跟DIN是一样的,先用目标的label item对用户的每一组兴趣求权重(所谓label-aware),然后得到用户的加权和了,最后仍然是一个Embedding(这样就算前面计算得到每个用户的兴趣胶囊数目不一样,也不影响后面的计算)。
v u = V u s o f t m a x ( p o w ( V T e i , p ) ) v_u=V_u softmax(pow(V^Te_i,p)) vu=Vusoftmax(pow(VTei,p))
稍稍有一点不同的是,如模型图的右上角,K,V是用户矩阵,Q是目标label向量,K、Q相乘可以得到不同的用户特征对label的响应程度,然后有一个pow求幂次的函数,对这个相应程度做控制,如果p趋近于0,那么所有兴趣胶囊的权重都一样,如果p大于1,p越大的话,那么点积越大,权重就越大。p越大的话,模型迭代收敛速度会更快。最后SoftMax对结果进行归一化,在分配权重分数求加权和。
最后的损失函数就是求topk的质量啦。
A Capsule Network for Recommendation and Explaining What You Like and Dislike
SIGIR2019,胶囊网络来解释推荐结果,paper:https://arxiv.org/pdf/1907.00687.pdf 。
用户评论包含了丰富的语义,特别是有利于理解用户对项目特征的偏好。以往的方法主要是采用注意力机制来识别对评级预测重要的单词或方面。但是仍然很难理解用户在多大程度上是喜欢还是不喜欢这个item,为此,这篇文章提出了一种基于胶囊网络的用户评论评级预测模型,称为CARP。 模型框架图如上,分为三个部分Viewpoint and Aspect Extraction,Sentiment Capsules和Rating Prediction。
Viewpoint and Aspect Extraction
首先分别从用户和项目评论中提取观点。模型会从评论的word embedding e中编码上下文,即使用一个滑动窗口并用带ReLU的卷积进行编码得到c。同时并不是每一个词都与观点有关,所以需要一个self-attention对c重新分配权重: s u , x , j = c j ⋅ σ ( W x , 1 c j + W x , 2 q u , x + b x ) s_{u,x,j}=c_j \cdot \sigma(W_{x,1}c_j+W_{x,2}q_{u,x}+b_x) su,x,j=cj⋅σ(Wx,1cj+Wx,2qu,x+bx)其中w是权重, q u , x q_{u,x} qu,x是所有用户共享的观点,也是自动学习的,如图上的黄色小框。然后经过视点转换得到v: p u , x , j = W p s u , x , j p_{u,x,j}=W_p s_{u,x,j} pu,x,j=Wpsu,x,j v u , x = ∑ j a t t n u , x , j p u , x , j v_{u,x}=\sum_j attn_{u,x,j} p_{u,x,j} vu,x=j∑attnu,x,jpu,x,jW是视点转换矩阵,是共享的参数。
然后我们需要识别用户在对item进行评分时应用的规则,所以将用户视点和项方面打包在一起,形成一个逻辑单元。即导出所有可能的逻辑单元的表示: g x , y = [ ( v u , x − a i , y ) ⊕ ( v u , x ⊙ a i , y ) ) ] g_{x,y}=[(v_{u,x}-a_{i,y}) ⊕ (v_{u,x} ⊙ a_{i,y}))] gx,y=[(vu,x−ai,y)⊕(vu,x⊙ai,y))]
Sentiment Capsules
将所有可能的逻辑单元的表示输入情感胶囊,以判断那些逻辑是合理的,此外,我们的目标是根据什么信息逻辑单元来推断用户是否喜欢和不喜欢一个项目,以及在多大程度上。
所以作者使用了两类胶囊,正胶囊(积极胶囊)和负胶囊(消极胶囊)。 同时设计了一种双协议路由机制来共同识别积极或者消极情绪。并由这两个情感胶囊产生的输出向量编码用户喜欢或不喜欢某item的程度(胶囊的长度直接就可以表明这一点了)。计算伪代码如下:
其实这个算法也没有特别大的改动,可以理解做了两次的胶囊网络,一个胶囊判断积极的情绪,一个胶囊判断消极的情绪。最后使用得到的向量预测评分就可以了。
总结这篇论文的创新点主要有: