作者:一块小蛋糕
地址:https://zhuanlan.zhihu.com/p/267263561
整理:深度传送门
最近读完了李航、何向南的《Deep learning for matching in search and Recommendation》,文章思路清晰,总结详实到位,值得一再翻阅,就想借这篇文章结合自己最近一年多的推荐召回工作内容,总结一下推荐系统中的深度召回模型,论文因篇幅限制,很多模型并未详细介绍,因此本文补充了一些内容。
匹配(matching)是衡量用户对物品的兴趣的过程,也是推荐召回中的工作内容。机器学习中是以learning to match的方式根据输入表示和标记数据学习一个匹配函数。而深度学习在其发展过程中以强大的表示学习和泛化能力加上算力提升、数据规模暴涨都使得深度模型在推荐召回中大放异彩。
本文的总结思路是将推荐中的深度召回模型根据学习内容分为两大类:表示学习类和匹配函数学习类。
表示学习类召回模型中根据输入数据的形式和数据属性又可以分为无序交互行为类、序列化交互行为类、多模态内容类和连接图类。
匹配函数学习类模型则包括双路匹配函数和多路匹配函数的学习。
本文第一篇目录如下:
推荐中的召回的最大挑战是不同空间的不匹配问题,而隐空间可以很好的解决这个问题,即将用户和物品都映射到同一个可以比较的低维空间内。这里表示学习的匹配模型所使用的就是隐空间模型框架。
表示学习的过程就是学习两个函数: 将用户和物品映射到一个新空间中,则用户u和物品i的匹配模型: ,F是内积或Cosine之类的相似度函数。不同的神经网络可以实现不同的表示函数 和 ,根据模型输入数据的形式和数据属性将表示学习进一步分为4类:无序交互行为类、序列化交互行为类、多模态内容类和连接图类。
首先是无序行为上的表示学习,传统的矩阵分解以用户的交互历史表示用户,即每一维代表一个物品的multi-hot向量,形成打分矩阵,利用one-hot 的ID向量再经过一层线性映射得到用户和物品的表示。而在深度学习中则是依靠深度模型学习到用户和物品的表示,常用的方法有MLP方法、Auto-Encoder方法和Attention方法。
YouTubeDNN
2016年YouTube提出的深度推荐模型,将每个类别特征都映射为一个Embedding向量,像观看过的视频、搜索过的词项这种序列特征使用平均池化得到序列Embedding;将所有Embedding和连续特征拼接后送入三层MLP得到最终打分。认为MLP可以发挥其近似任何连续函数的优势学到特征Embedding间的交叉,但这种模型是把特征交叉信息编码进MLP的隐藏单元,并不能显式的区分出哪个交叉对预测更重要。而且2018年Beutel等人证明MLP实际上很难学习到乘法操作,而乘法操作是捕获特征交叉信息的重要方式。
MV-DNN (Multi-View Deep Learning Model)
2016年微软的MV-DNN是基于DSSM(双塔)的跨领域(多塔)构建用户表示的模型。模型提出假设:在一个领域内相似的用户在另一个领域内也相似,比如app下载领域相似的用户可能也具有相似的文章阅读喜好。MV-DNN可以很好的将user和item的大量特征编码到隐语义空间,通过兴趣匹配模型学习从user到item的映射关系。既解决了新用户的冷启动问题,同时由于以大量用户行为做特征,利用跨多个域的行为来补充用户信息,对用户兴趣表示也更加精准。该方法对新用户推荐提升明显。
由于深度模型需要处理大规模训练数据的大规模特征,文中提出了几种可行的降维方法:
top 特征:选择最频繁的topk个feature,并且用tf-idf过滤掉停用词特征
k-means:将特征聚类,相似特征聚到同一个类簇中,并将类簇信息表示为新的特征Y。原有特征为N个,聚簇个数为K,特征的维度将从所有特征o(N)降维到类簇个数o(K)。特征处理阶段,新特征Y(y1,y2,...,yi,...,yk-1,yk)具有K个维度,每个维度的值为属于该类簇的特征出现次数加和,最后对Y进行归一化处理。合适的类簇个数对特征表达能力十分重要。小的类簇个数会导致非常多的内容聚簇在一起,从而导致特征被稀释。文中的特征数有3.5M,尝试聚簇个数10K个,即平均每个类簇包含350个特征
LSH:通过一个随机矩阵将输入特征映射到一个低纬度向量表示,同时在新的空间中保持pairwise cos距离关系。为了保证准确性,文中设定Y的维度k=10000,和k-means维度相同。由于LSH的k个维度是随机映射,彼此相互独立,很适合进行并行计算。
缩减训练样本规模:压缩训练样例,每个用户的训练样例数只压缩为一个。文中具体做法是将同一用户所有训练样本的各维度特征进行分数平均,最终一个用户得到一个训练样本,从而减小user-item pair。由于训练样本的表示变化,评估方式也会变化。目标函数将改为最大化用户特征和平均特征的相似度
DMF(Deep Matrix Factorization)
2017年的DeepMF从用户对物品的评分矩阵中直接构建交互矩阵,采用DSSM的双塔结构,每个塔都用MLP从交互矩阵的multi-hot向量中学习到对应的表示。即 。模型的损失函数使用了规范化的交叉熵损失: ,用max(R)即评分矩阵中的最大值对评分值做规范化。
Auto-Encoder是个单隐层神经网络,主要利用其隐层学习低维特征表示或者利用重建层填充交互矩阵的空白值。
AutoRec(Autoencoders Meet Collaborative Filtering)
15年的AutoRec是基于Auto-Encoder模式学习CF模型,对比AutoRec原论文发现在这篇survey中P110关于AutoRec的描述其实是基于用户的AutoRec,但本文中说的是item-based AutoRec。
基于用户的AutoRec输入数据是用户u对所有物品的打分向量 ,评分重建过程: ,重建之后的向量 即预测用户u与所有物品的匹配分值的向量,AutoRec的目标函数使用的是RMSE损失: 。这里也可以使用其他的损失函数如交叉熵损失、hinge损失和pairwise损失等。
原论文中是以item-based AutoRec为例讲解的,如下图所示,输入数据是所有用户对物品i的评分向量 ,其他部分与上面一样。文中的结论是item-based AutoRec效果好于user-based AutoRec,因为物品i的评分数一般比用户u的打分数多,而且用户向量方差更大,不容易学习。
其实可以将基于用户的AutoRec看做是用MLP在用户交互历史上学习用户表示,用Embedding层学习物品表示,即: ,其中 表示W的第i行,可以看做是物品i的id对应的Embedding, 是用户u的交互向量经过一层MLP的输出,匹配分值则是用户的表示 和物品id的Embedding 的内积,这和隐空间模型的定义是一致的。如果Auto-Rec中用到多层隐层形成深度Auto-Encoder,可以看做是用多层MLP学习用户表示,因此auto-encode结构也可以看做是DeepMF的简化版。
CDAE(Collaborative Denoising Auto-Encoder)
CDAE是AutoRec的改进版本,使用隐式反馈数据对用户的偏好建模做topN推荐。CDAE以用户u的所有评分作为输入(即user-based autoRec模型)通过一层神经网络编码得到用户的隐藏表示,再通过一层神经网络还原用户的交互行为(隐式反馈)。与简单的item-based auto-Rec不同在于CDAE在编码得到隐藏表示时加入了用户特征,语义上更丰富。同时为了使模型更具鲁棒性,CDAE对输入的用户评分向量引入随机噪声(可通过maskout或dropout或增加高斯噪声实现)防止模型学习到相等函数。模型结构如下图所示,输入层有I+1个节点,I是所有的物品数,还有一个是用户u的side information;中间隐层有K个节点,最后一个是bias,与输入层是全连接,将输入映射到低维空间中得到低维表示;输出层则是将低维表示重新映射到原始输入空间,通过最小化重建损失和参数的L2正则学习模型参数,同时使用负采样提高训练效率。
Mult-VAE(Variational Autoencoders for Collaborative Filtering)
2018年Netflix基于隐式反馈数据,提出Mult-VAE模型使用多项式似然变分自编码器解决变分推断用于推荐时参数过多的问题。推导过程比较复杂,篇幅限制,感兴趣的同学可以参考论文。
FISM => NAIS (Neural Attentive Item Similarity)
首先要了解2013年的FISM模型,即Factored Item Similarity Model,它是针对CF模型中只利用了用户物品交互信息且只使用userid表示用户的场景下,提出利用用户交互过的物品表示用户,提升用户表达的准确性,即 ,用用户喜欢过的所有item的累加和作为用户的表示,而目标物品的隐向量 是另一套表示,最终用向量内积表示相似度。
2018年何向南发现在学习用户表示的过程中历史交互物品对用户表示贡献的权重并不全是相同的,因此提出NAIS模型利用一个attention网络学习每个物品的权重。与FISM同样,每个物品关联两个Embedding 和 分别表示物品作为目标物品和历史交互物品时的向量。NAIS的匹配函数: , 表示估计用户u与物品i的匹配分值时历史交互物品j的权重,计算 时用到的 是取值 的平滑指数。注意力网络g可以用一个MLP实现,再由softmax函数对g的输出做平滑处理。注意力权重提升了表示学习的可解释性,而且能根据待匹配的目标物品的不同产生不同的用户向量。
这里softmax增加这个平滑指数 的原因是作者在使用正常的注意力权重计算方式时,发现互动历史长的用户的权重会偏低,导致模型效果不佳,而增加一个 指数虽然会破坏注意力网络的概率解释,但确实使模型效果更好了。
作者还指出同时训练注意力网络和物品的Embedding层会减慢收敛速度,比较好的方式是先用FISM预训练好item的Embedding,导入NAIS模型后直接训练注意力网络,不仅收敛更快,模型效果也更好。
ACF (Attentive Collaborative Filtering)
传统的CF算法只利用了用户-物品交互矩阵信息,对用户的交互历史中的所有物品都视作相同权重,而且并不能很好的用于推荐多媒体信息上面,因此2017年新加坡国立大学提出基于两层注意力权重的协同过滤模型(Attentive Collaborative Filtering),认为在多媒体推荐领域,存在两层注意力:用户对每个推荐项(item,如音视频、图片等)的注意力;用户对某个推荐项的各个部分(component,如视频的帧、图片的区域)的注意力。两层注意力分别用于学习用户对每个推荐项的的喜好和用户对推荐项的每个部分的喜好,然后用各部分的注意力权重和表示推荐项物品,各推荐项的注意力权重和表示对应的用户,即用户的表示为: 是推荐项的注意力权重。ACF模型优化的是BPR的pairwise目标函数是: ,这里每个推荐项有两个因子向量,一个是隐空间的物品向量 ,另一个是辅助物品向量 ,预测用户和推荐项的匹配分值: ,展开后: ,第一部分是隐空间模型,第二部分是近邻CF模型。
上图是ACF的模型架构,首先从用户i喜欢的物品集合开始,每个物品l都有一个组件特征集合 ,比如图片的第m个空间位置、视频的第m帧。然后是两层全连接的组件级注意力子网络,以用户隐向量 和特征 为输入,计算第m个组件的component级注意力权重 : ,得到物品l内容表示: ;得到物品内容表示后,接入两层全连接的item级注意力子网络,以用户隐向量 、物品隐向量 、物品的辅助隐向量 和内容特征 计算每个物品的item级注意力权重 ,得到用户i最终的近邻向量 ;之后就是计算BPR损失的过程。
ACF中使用DeepCNN的ResNet-152结构提取图片和视频帧的特征。
DIN (Deep Interest Network)
2018年9月阿里巴巴认为直接对用户行为历史做sum-pooling或average-pooling不能体现用户兴趣的多样性,因此提出DIN引入local-activation,以待预测物品与用户历史行为的相关性做权重来动态生成用户表示。
上图左侧是原有的深度推荐网络(Base Model),通过sum-pooling用户行为历史的方式生成用户表示,而右侧DIN模型中将这部分替换成由activation unit层生成权重再求加权和的方式生成用户表示。这个activation unit层的结构和常规Attention的操作不完全一致,这里是将user的embedding和广告商品的embedding及二者外积拼接后接入Dice激活函数,再经过一层线性层得到activation权重,没有softmax操作,即不限制注意力分值加和为1,论文中的观点是这样能保持用户兴趣的强度。
这里作者还有三个创新点:
- Dice激活函数:由PReLU函数改进而来,原本PReLU: ,Dice中将p(s)泛化为 是batch内数据的均值和方差。
- 以离线指标GAUC代替线上指标:
- batch内正则:解决大规模稀疏场景下(比如用户或商品id空间都在千万级以上),使用SGD优化并引入L2正则后需计算全量参数的L2范数导致的复杂度过高的问题,将计算全量参数的L2范数改为只计算batch内用到的参数的l2范数, , B表示batch数, 表示第m个batch。
其次是序列行为上的表示学习,数据样本需要考虑用户历史行为的时间顺序。
GRU4Rec
2016年的GRU4Rec利用GRU对用户历史购买的序列行为建模,以用户在一个会话内点击的物品序列为输入,每个物品都以one-hot表示,输出会话内下一个点击的物品,其中会话中每个位置的状态可以是当前位置上物品的one-hot表示也可以是截止到该位置之前所有物品的加权和。网络结构如下图所示,最终输出一个N维向量,表示下一次点击发生在每个物品上的概率。这里用到的损失函数有两种:对比正负样本的BPR损失, 是采样的负样本数目, 是预测第i/j个物品被点击的概率,第i个物品是正样本,第j个物品是负样本;另一种是top1损失,正确排序的比例, 。
为了解决session长短不一的问题,GRU4Rec使用batch内session并行的方式执行优化,如下图所示。负采样策略使用的基于流行度的采样。
NARM (Neural Attentive Recommendation Machine )
RNN类方法包括上述的GRU4Rec都有一个问题,就是考虑当前会话内的全部交互行为作为用户短期兴趣建模,而用户行为中通常存在比较多的偶然性噪声,无法得到真正准确的用户兴趣。
2017年山东大学在文章(Neural Attentive Session-based Recommendation)中,给RNN增加注意力解决了这个问题。如下图所示,NARM采用了编码-解码结构,给定用户的点击序列,全局编码器用GRU扫描序列后用最后一个隐状态 表示用户的序列行为;局部编码器用另一个GRU扫描序列并以所有隐状态的加权和表示用户长期兴趣: 表示位置j和t之间的注意力分值, 。最终的序列表示: 和候选物品的embedding都被送入decoder中计算相似度: ,最后再通过一个softmax生成每个候选物品被点击的概率,并使用交叉熵损失优化: 。
RRN(Recurrent recommender network)
2017年的RRN模型主要是针对当时流行的推荐系统都认为用户偏好和电影属性都是静态的这一假设提出质疑,认为它们都是随时间变化的。RRN使用两个单独的LSTM对用户/电影状态随时间变化的过程建模,借鉴矩阵分解MF的思想,将某一时刻两者对位状态相乘作为用户对电影的评分。模型结构图如下,用户/电影的状态定义为: ,其中 是将状态映射到Embedding空间的转换矩阵, 是用户在t时刻对M个电影的打分向量或电影在t时刻被M个用户打分的分数向量, 表示用户/电影是新出现的,后面两个是t、t-1时刻的wallclock。状态更新过程: 表示遗忘门、输入门和输出门。作者取最近的观测状态为输入,以最新的状态为基础,执行状态更新并对未来做预测。文中认为用户/电影状态由time-varing和静态的两部分组成,因此最后预测评分时增加额外的 表示状态中不变的部分,与RNN中得到用的用户/电影表示相加:
RRN模型使用的是显式反馈数据,损失函数使用RMSE,训练方式采用的是subspace descent方法,即两个LSTM网络依次训练(固定一个网络,训练另一个网络)。
Latent Cross
2018年youtube针对用户行为的时序数据和情景特征,提出RNN推荐模型。文章首先指出在普通的前馈神经网络中将情景特征直接与其他特征共同进入模型的方式对于捕捉特征交叉效果(文中叫低秩关系)不够高效。文中用到的情景特征主要包括时间特征、视频观看设备、跳转来源页面。在RNN中引入情景特征的方式有两种:在输入门中提前融合(pre-fusion)和在输出门中concat(即post-fusion)。
上图是RNN推荐模型结构, 表示当前步和上一步的情景特征,模型将 作为RNN的输入以pre-fusion的方式来影响RNN的隐状态,将 与RNN的输出拼接以post-fusion的方式预测 。基准版模型中,RNN输出和情景特征concat形式的交叉并不高效,因此文章提出latent cross:单特征, ;多特征, ,多情景特征之间使用加法的原因是加法容易训练,乘积或拼接都会增加模型训练的难度,最终效果也不如加法。
将用户交互过的物品的embedding矩阵看做图片矩阵,应用二维卷积。但存在两个难点:这里矩阵长度t随用户不同而变化;这个矩阵可能并没有空间关联。
Caser (Convolutional Sequence Embedding)
2018年的Caser(Convolutional Sequence Embedding Recommendation Model)模型的作者们发现推荐系统中存在多种动态模式,如下图所示。而之前的基于MCs的方法都只能捕获point-level的动态模式,对union-level、union-level with skip的则无能为力,这些购买行为是作为一个整体影响后面的购买行为,不仅仅是马尔科夫链中一一对应的转移概率。
Caser的思路是对序列数据和label采用双滑动窗口采样,来对购买行为的skip特性建模。再将序列数据看作一张二维图像,引入能覆盖全部列的full-width过滤器和确保所有特征图大小相同的max-pooling操作,利用竖直和水平两个方向的卷积核分别捕获用户的序列行为特征,得到用户兴趣表示,然后和user向量合并进入全连接层,最终输入softmax层得到下一个物品被点击的概率,目标函数使用交叉熵。
由于用户行为序列长度长短不一,卷积操作得到的特征图长度也各不相同,因此对特征图使用max-pooling得到维度确定的卷积结果。
不过实际上Caser是没有利用交互数据的序列特征的,只是将交互数据按时间顺序组成二维图像,并没有使用到序列中的positional Embedding。
NextItNet
Caser之后还有一些CNN类的模型,主要以提升长序列处理能力为目标,比如2019年腾讯提出的使用空洞卷积和以自回归方式处理序列的NextItNet模型。
腾讯的研究人员认为Caser模型有两个短板:1.max-pooling操作并不能分辨出某个重要特征是出现一次还是多次,而且忽视了位置信息,不利于长序列的学习;2.Caser中只有一层卷积的浅层网络结构不利于建模长程依赖及复杂关系。因此提出使用空洞卷积替代普通卷积,在不增加参数量的情况下增加感受域(receptive filed)大小;使用残差连接解决堆叠多层卷积核带来的梯度消失问题,进而移除池化层。
下图是普通卷积与空洞卷积的区别。
下图中的(a)和(b)是NextItNet用到的两种空洞残差模块,都是由normalization层、激活层(ReLU)、卷积层和短路连接组成。(a)类模块中包含3个卷积核:一个1*3的空洞卷积和2个常规卷积。(b)类模块中只有两个空洞卷积核。
为了避免信息泄露,NextItNet对1维空洞卷积使用dropout-mask防止模型看到未来的item信息,即将序列中预测位置之后的物品项padding掉。
NextItNet使用交叉熵损失,负采样策略尝试了sampled softmax和kernel-based采样两种,效果无明显差别。
GRec(Gap-filling based Recommender)
2020年上面NextItNet模型的研究人员认为,虽然用户行为是有序发生的,但其中的顺序依赖关系可能并不是很明确,也不一定要将用户会话建模为严格的序列,因此预测目标后面的未来数据也可以用于学习用户兴趣,而当前序列数据建模的两种常用方式,数据扩充和自回归训练都没有利用未来数据。利用未来数据的一个极大风险就是数据泄露,腾讯的作者们提出基于填空的编码-解码器框架(GRec),解决了数据泄露问题。具体做法是,将用户会话序列中的一部分项通过其他符号(如“_”)隐藏掉,输入编码器学习到各个位置的表示,解码器以额外的Embedding并根据这些表示对隐藏掉的物品项做预测。
如上图所示,GRec包括:Embedding层、编码器、投影层、解码器和最后的softmax层。其中,编码器受NextItNet启发使用一系列堆叠的一维空洞卷积,每两个空洞卷积层增加一个残差连接,和NextItNet不同的是,这里编码器的卷积没有因果关系,并以填空的方式让CNN关注到空白位的上下文信息;解码器中的CNN结构则和NextItNet中保持一致,只是不必预测整个序列,只需要预测被隐藏掉的物品项即可;为了使编码器和解码器之间的表示带宽最大化,作者在二者之间增加了一个投影网络,即一个倒瓶残差结构:上投影、激活函数、下投影,上下投影之间增加一个短路连接。
PeterRec
2020年腾讯看点的研究团队提出了一种通用用户表示学习架构,采用空洞卷积神经网络构建大型的预训练模型,通过设置一定空洞率的多层卷积网络实现可视域(receptive field)指数级增长,从而捕获和建模超长的用户点击行为,从而实现不需要图像和文本特征即可预测用户画像的目的,如下图所示。
其中,预训练模型中的空洞卷积网络设计和NextItNet中保持一致,每层空洞因子以 增加,因果卷积使用单向自回归和非因果卷积使用双向隐藏优化。微调阶段直接移除预训练的softmax层,添加新任务的分类层,而且在预训练的残差块中以串行或并行的方式插入model patch模块(即一个瓶颈结构的残差块),如下图所示,达到共享大部分参数,只需优化极少量参数就可实现相当甚至更好的模型效果的目的。
在交互序列的表示学习中引入注意力机制。
NARM(Neural Attentive Session-based Recommendation)
两个GRU分别学习用户行为序列的全局和局部信息,局部信息使用注意力计算。前面RNN方法中已经介绍过,此处不再赘述。
SASRec(Self-attention based Sequential Recommender)
在此之前,序列数据的建模通常采用的是马尔科夫链、RNN或CNN,2018年的SASRec模型则是受Transformer启发,完全基于自注意力机制对用户行为建模。其模型结构如下图所示。输入Embedding由物品Embedding和位置Embedding相加,喂入一系列自注意力模块,每个都包括一个self-attention层和一个point-wise的FFN,即 ,其中 ,同时为了避免穿越问题,需要使用mask禁止 和 之间的所有连接。
为了解决自注意力模块的堆叠带来的问题:1.模型容量增加导致过拟合;2.由于梯度消失导致训练过程不稳定;3.更多的参数需要更长的训练时间,SASRec模型在自注意力层和FFN层后都增加了LayerNorm&Dropout和残差连接,同时在预测层计算相关度: 时,物品的Embedding矩阵N与输入物品的Embedding矩阵共享参数。
通常序列化推荐中学习用户表示有两种方法:学习显式的用户Embedding表示兴趣,如MF、FPMC、Caser这些;考虑用户的历史行为,以交互过的物品Embedding学习隐式的用户Embedding。
SASRec采用的是第二种方式,同时也尝试了在最后一层加入显式用户Embedding,即 ,但实验发现增加显式用户Embedding并没有提升推荐效果。
作者在文章中也提到SASRec模型虽然在推荐效果和效率上相比MC、RNN、CNN类方法都有较多提升,但因注意力分值计算的复杂度无法扩展到很长的序列上,未来可以尝试通过限制注意力计算范围或将长序列切分为段等手段优化。
AttRec(Next Item Recommendation with attentive metric learning)
2018年的AttRec与上面的SASRec模型几乎同天发出,这个文章中的四个作者也是前一年《Deep Learning based Recommender System: A Survey and New Perspectives》的作者。文章作者使用自注意力计算item之间的依赖关系得到用户的短期意图,同时使用协同度量学习计算用户和item之间的欧氏距离作为用户的长期偏好,融合长短期兴趣预测下一个推荐物品。AttRec中的自注意力结构如下图所示。
我们主要跟SASRec中的自注意力模块对比二者的异同点,首先是不同的地方:
- self-attention层数:SASRec中使用多层自注意力模块堆叠的方式,对比实验中使用的都是2层;AttRec中只有一层自注意力模块。
- 位置Embedding类别:SASRec中的实验表示learnable的位置Embedding比fixed位置Embedding表现好;而AttRec中使用的是和Transformer中一样的fixed位置Embedding: 。
- 位置Embedding作用范围:SASRec中将位置Embedding加到用户历史交互物品的Embedding矩阵上,作用范围包括后面的Q、K、V矩阵;而AttRec中位置Embedding只是加到query和key上。
- Query、Key和Value矩阵的转换:SASRec中为了让模型更灵活,通过三个不同的矩阵 将输入Embedding映射成self-attention的输入Q、K、V矩阵;而AttRec中,初始的query、key、value矩阵都等于交互物品Embedding矩阵,query和key加上位置Embedding后经过相同的非线性转换层形成Q、K: 。
- 缩放因子取值:SASRec中认为缩放因子 的作用是防止内积操作中出现过大值,使用的是d=50;而AttRec中认为缩放因子的作用是降低极小的梯度值影响,使用的是d=100.
- mask内容:SASRec中没有指明mask操作,只是说为了保证模型预测时的因果性避免穿越,会修改得到的注意力矩阵,禁止掉 和 的连接;而AttRec中的mask操作只隐藏了注意力矩阵的对角位置。
- FFN使用:SASRec中每个自注意力模块都有point-wise的FFN层;而AttRec的自注意力模块中没有这一网络。
- dropout使用位置:SASRec中在每个自注意力模块的attention层注意力矩阵计算完成后以及FFN层之后使用layerNorm&dropout;而AttRec是在attention层的非线性层之前使用dropout,即query和key的非线性转换层。
- norm使用:SASRec中是在attention层注意力矩阵计算完成后以及FFN层之后使用layerNorm&dropout, ;AttRec中是对X、U和V的L2范数做norm clip, 。
- 用户表示计算方式:SASRec中将最后一个自注意力模块的输出作为隐式用户表示;AttRec中使用每个交互物品的attention表示的均值作为用户的短期兴趣表示。
- 待预测物品Embedding来源:SASRec中为了防止过拟合,待预测的物品Embedding与attention的输入的物品Embedding相同;AttRec中则是使用另外一组Embedding表示。这一点严格来说不算是自注意力模块的不同之处,但也是这两个模型比较重要的不同点。
然后是相同的地方:
- 注意力矩阵计算:二者注意力计算公式是相同的: 。
上面是从论文内容中对比的结果,目前尚未从源码和实际实验角度分析验证,可能有理解不当之处,之后再补充这部分内容。
AttRec中还有用户长期兴趣的学习,使用U和V表示用户和物品的latent factor矩阵,并计算他们的欧氏距离,距离越小则用户对物品的兴趣越大。度量学习(metric learning)适用于处理稀疏的数据和未观测到的数据,能够避免dot-product违背不等式性质导致次优解的缺点。
最终对每个物品的打分计算为: 是控制因子。
SHAN(Sequential Recommender System based on Hierarchical Attention Networks)
2018年7月IJCAI,浙江大学认为用户的长期兴趣是随时间而变化的,不同的item对下一次购买行为的影响是不一样的,且对于不同用户相同item对下一次购买也有不同的影响,因此提出分层注意力网络在序列推荐领域建模用户的长期兴趣和短期兴趣。模型图如下:
- Embedding Layer:将用户id、物品id映射成低维稠密表示
- Long-term Attention-based Pooling Layer:使用注意力机制根据用户到时间t-1为止的所有交互集合学习用户的长期偏好表示, ,最后长期用户兴趣表示
- Long- and Short-term Attention-based Pooling Layer: 短期兴趣是基于用户在时间t交互的物品集合上学习出来的,
- 混合后的用户表示: ,最后打分计算和隐因子模型保持一致:
为了避免对未观测数据产生歧义性,SHAN模型使用BPR loss优化: 是用户和物品的Embedding矩阵, 是注意力网络的权重矩阵。
STAMP(STAMP: short-term attention/memory priority model for session-based recommendation)
2018年8月KDD上,中国电子科技大学针对session-based推荐问题提出根据session上下文计算权重的注意力机制,以达到同时捕获用户长短期兴趣的目的。作者们先提出一个STMP模型,如下图所示,当前会话中的所有的物品Embedding: 为session中各个物品Embedding的平均值, 为最后一次点击的物品Embedding,分别经过两个相同结构的MLP后, ,与待预测物品Embedding 三者乘积得到分值 ,再用softmax转换成点击概率, 。
为了提升效果,作者在STMP的基础上增加了注意力机制,即STAMP模型,如下图所示, 仍为session中各个物品Embedding的平均值,$m_t=x_t$是最后一次点击的物品Embedding, 是待预测的物品集合,这里的注意力权重计算和常规的注意力计算有所不同: ,最终注意力网络输出的: ,其他操作与STMP保持一致。模型使用交叉熵损失函数优化: 。
DIEN (Deep Interest Evolution Network)
2018年11月的DIEN与同年9月的DIN是同一作者提出,DIEN是在DIN的基础上做的改进,相比DIN中考虑用户兴趣的多样性,使用注意力机制建模待预测物品和用户交互历史的相对关系,DIEN则认为直接将用户行为看做用户兴趣的方式不够高效准确,且用户兴趣是随时间动态变化的,因此需要从用户行为历史中单独抽象出用户兴趣并对兴趣的动态变化建模。
DIEN的模型结构如上图所示,阿里的在线广告系统中用到了四类特征:用户画像、用户行为、目标广告物品特征、上下文环境特征。所有特征均接入Embedding层,其中用户行为特征是是一个one-hot序列,经过Embedding层之后得到一个长度为T的Embedding矩阵,常规操作是将这些Embedding执行Pooling操作后和其他三类特征的Embedding拼接起来送入MLP,再通过交叉熵损失 优化整个模型。而DIEN中是将Pooling操作替换成兴趣提取层和兴趣变化层:
interest Extractor层:使用GRU对用户行为之间的依赖进行建模,输入是用户行为的Embedding矩阵。隐状态 只能学习行为之间的依赖,并不能有效表示用户兴趣。而 中只包含了预测最终兴趣的监督信息,对序列中间的历史状态 的学习是没有监督信息的,实际上每一步的兴趣状态都能直接决定下一个行为,所以作者们引入辅助loss,使用行为 监督兴趣状态 的学习,实际序列中的下一个item作为正样本,负样本从item set中随机抽取。辅助loss为: ,其中 。最终的全局loss是: 。
引入辅助loss的好处有三个:1.使GRU的隐状态更好地表示用户兴趣 2.辅助loss降低了GRU在建模长程序列时梯度反向传播的难度 3.帮助embedding层学习到更多的语义信息。同时,辅助loss会增加训练成本,但不会增加线上inference耗时。
interest Evolving层:用户的多种兴趣会随着外部环境和自身认知的改变而变化,用户对不同商品的偏好受到不同兴趣的影响。兴趣变化层结合了注意力机制中的局部激活能力和GRU的序列学习能力,使用带注意力更新门的GRU即AUGRU,以上一层的隐状态序列为输入, ,输出的最后一个状态 作为最终输出和其他各类特征拼接后一起送入MLP层。attention分值计算: ,其中 是不同field特征拼接后的Embedding。
关于将attention机制和GRU结合起来的三种办法:
AIGRU(GRU with attention input):将attention权重与输入Embedding相乘,
AGRU(Attention based GRU):使用attention权重替换GRU的更新门,直接对隐状态更新,
AUGRU(GRU with attentional update gate):注意力权重( )是个标量,更新门( )原本是个向量,直接替换导致所有维度无区别更新,因此可以将注意力权重乘到更新门上,即attentional update gate, 。
自从注意力机制被提出之后,很多模型通常以RNN不能并行为理由拒绝使用GRU/LSTM,而这篇文章中为了支持线上高并发场景,降低响应延时,提高吞吐,提出了三个重要优化点:1.GRU元素并行和核融合 2. 连续的用户请求被合并到一个batch中以高效利用GPU 3. 使用Rocket Launching进行模型压缩,训练一个更小但表现相当的轻网络,可以将GRU隐状态的维度从108降到32.
DSIN (Deep Session Interest Network)
2019年的DSIN受序列化推荐中的session启发,在ctr任务中将用户行为划分为多个session,虽然是ctr任务,但对召回也有一定的启发意义。作者首先是从用户行为数据中发现按照时间差大于等于30min划分的session中交互的物品种类高度同构,而不同session之间交互的物品种类多是异构的。因此DSIN提出在每个session中提取用户的session兴趣,再学习session兴趣之间的序列依赖关系。
DSIN的模型结构如上图所示,与DIN、DIEN同样都是从base model上优化而来,输入特征包括三类:用户画像类、用户行为、物品画像,高维稀疏转低维Embedding后拼接送入MLP,损失函数使用交叉熵: 。DSIN主要是替换掉base model中用户行为学习的部分:
session Division层:根据30分钟的间隔规则将用户行为sequence划分成多个session
session interests Extractor层:对同一个session中多个行为的关系建模,降低不相关行为的影响,提取session interest。DSIN使用的是Transformer中的multi-head self-attention模块提取用户session兴趣,以每个session中的Embedding序列为输入,改进了position encoding为bias encoding, ,分别为session的bias向量,behavior的bias向量,unit的bias向量。attention分值计算: ,每一个行为的兴趣表示 ,最终session的兴趣表示是每个行为表示的均值:
session interest Interacting层:使用Bi-LSTM捕获不同session之间的兴趣依赖关系,每个时刻的隐状态是前向后向隐状态拼接而成。
session interest activating层:根据session兴趣向量和目标物品的关系分配session interest的权重, ,同样的对Bi-LSTM的隐状态序列:
最后将 和用户画像特征、物品画像特征拼接后送入MLP层。
BST (Behavior Sequence Transformer)
2019年的BST模型使用Transformer中的encoder结构在用户行为序列上学习物品表示,模型结构如下图所示,同前几个阿里的模型一样,BST的base model仍然是高维稀疏特征Embedding后拼接送入MLP,损失函数使用交叉熵。BST优化的是对用户交互行为序列的学习部分,这里用户序列包含了交互物品的item_id、category_id和物品在序列中的位置特征: ,即商品的点击时间与当前待预测物品$v_t$的推荐时间之间的gap,相比于原论文中的sin/cos,作者发现在阿里推荐的场景中前者表现更好。Transformer层即原论文中的encoder层,虽然叠加多层能更好地学习序列间的复杂关系,但作者的实验证明一层encoder的效果优于叠加2、3层的效果。个中细节,与Transformer保持一致,此处不再赘述。
NPA(Neural News Recommendation with Personalized Attention)
2019年清华大学在IJCAI和KDD上提出NPA模型,认为在新闻推荐中,用户对不同文章的关注点不同,不同用户对同一篇文章的关注点也不同,NPA通过一个新闻表示模型和一个用户表示模型,都使用个性化的注意力机制学习不同的文章关注点和用户兴趣。
模型结构如上图所示,NPA模型包含三个部分:
news encoder:文章标题经过embedding层之后得到单词的embedding矩阵,使用CNN获取local contexts学习单词的上下文表示: 表示从位置(i-k)到位置(i+k)的单词embedding拼接,CNN输出的是序列中每个单词的上下文表示 。之后进入一个个性化注意力网络(如下图所示)根据用户的兴趣计算文章标题中各单词的重要度。首先把userID做embedding,经过一个dense层得到 ,以此作为query计算标题中单词的注意力权重: ,最终的新闻文章表示: 。
user encoder:学习到每个文章的表示后,根据用户的点击文章历史学习用户的兴趣表示,同样使用个性化注意力网络(如下图所示),userID的embedding经过另外一个dense层得到 ,以此作为query计算历史序列中每个文章的注意力权重: ,最终的用户表示:
click predictor:随机选取K条负样本,和正样本一起计算点击概率:
BERT4Rec
2019年的BERT4Rec在SASRec的基础上使用双向自注意力机制处理序列,可以同时利用左右两边过去未来的行为。从两个地方改进了SASRec:移除了自注意力中对$Q_i, K_j for j>i$的0限制;受BERT启发,使用完形填空的训练模式,为了避免信息泄露,训练过程中随机隐藏掉序列中的一些物品并基于左右两侧的行为预测被隐藏的物品,预测的时候在序列的最后插入一个“MASK”,然后用 “MASK”增强后的embedding预测用户接下来会观看哪个item。
模型结构如上图所示:
- Transformer层:给定一个长度为t的输入序列,在每一层l的每个position i上同时使用transformer layer来迭代式地计算隐表示 并stack起来形成一个矩阵
- embedding层:位置embedding使用可学习的embedding代替sinusoid
- output层:经过L层Transformer堆叠后,进入两层GELU激活的FFN得到目标物品的点击概率:
(以上内容有理解不当之处还请指正)
下篇预告: