「MA-GNN」 是华为诺亚实验室发表在 「AAAI 2020」 上的序列推荐工作。主要利用记忆增强的图神经网络来捕获并融合短期和长期兴趣,应用于序列推荐中。下面仍然围绕5「tion」原则,即:Motiva「tion」, Contribu「tion」, Solu「tion」, Evalua「tion」, Summariza「tion」展开介绍。
注:这是GNN序列推荐系列的第二篇文章:MA-GNN|AAAI2020。第一篇文章GCE-GNN|SIGIR2020请参见:SIGIR2020|GCE-GNN基于全局上下文增强的图神经网络序列推荐方法。
传统的序列推荐方法主要建模的是session-level的短期序列,仅能够捕获蕴含在用户近期交互物品中的短期偏好,缺乏对用户长期偏好的挖掘。因此,本文的主要动机就是考虑用户长期的交互序列,希望能够从中挖掘出用户长期稳定的偏好。除此之外,作者还希望能够显式地建模物品与物品之间的共现关系。为此,作者提出了几种方法来分别捕获用户的短期兴趣,长期兴趣以及物品之间的共现关系,并融合这些因素进行打分和推荐。
先从总体上介绍下整个方法。整个方法实际上很像矩阵分解那一套框架。只不过分解的时候考虑了短期兴趣和长期兴趣。这里头最重要的是理解「输入序列数据怎么规整成矩阵分解的形式,即point-wise分解和打分」 (比如:用户嵌入和物品嵌入点积)。
原始的输入数据是user-level的序列。,由于是user-level的序列,每条序列长度很长,如果直接建模的话,总的样本量正比于用户数,相对较少。因此需要对序列进行切割来做「数据增强」和「长短期序列」区分。可以通过在user-level的序列数据上做窗口滑动来增强,窗口「内部的子序列」构成了「短期序列」,从窗口「左侧端点开始向左到起始点」的子序列构成了「长期序列」,从窗口「右侧端点」开始向右的子序列构成了「目标序列」。这里头有好几个超参数。「滑动窗口的大小」(即:决定了短期序列的长度),滑动窗口的左端点起始值 「(即:决定了长期序列长度的最小值),以及」目标序列的长度 。
形式化地,增强后的每个sample有3段子序列,即:,是滑动窗口的左侧端点,则:是长期交互序列,是滑动窗口内部的长度为短期交互序列,是大小为的目标序列。
则,本文的问题是输入长期序列和短期序列,来输出用户接下来会感兴趣的个物品,并在目标序列上进行评估。命中越多目标序列中的物品,说明模型泛化性越好。所谓的长短期,实际上就是从物品交互时间的久远来衡量,最近交互的若干个物品构成了短期交互序列,再之前的交互构成了长期交互序列。
在解决序列推荐方法上,除了物品和序列「表征的过程」有所差异之外,目前主流的方法都是利用物品表征和用户表征,来预测next item,即:预测所有的个物品上的概率分布,推荐个概率最大的,实际上是个多分类问题。但是这篇文章将多分类转成了二分类问题,即:将「目标序列」中的物品和用户作配对,转化成 正样本对,这样就可以使用矩阵分解的方式来拟合分数。此外,此处采样了负样本,即:三元组,是采样的负样本,最后用pair-wise的BPR损失来训练。总之,「输入」的用户「短期序列和长期序列」都只是为了获取某种刻画「用户兴趣维度」的表征,并「基于多样化的用户兴趣表征来多维度地联合预测分数」。
因此,问题的关键是如何捕获输入的短期和长期序列中蕴含的用户偏好。先总体看下该方法的架构示意图。
如上图所示,最左侧是初始的兴趣表征模块,包含了用户通用兴趣表征,短期序列中的物品表征和长期序列中的物品表征。中间是兴趣建模模块,即:如果对初始的表征进行处理和融合;右侧是基于建模得到的兴趣表征进行分数的预测,包括了3个分数来源,通用兴趣贡献分,长短期融合兴趣贡献分以及物品共现分。
其中,是用户的通用兴趣表征,是目标物品的初始表征,是用户的长短期兴趣融合表征,最后一项是目标物品和用户短期交互序列中的物品的共现分数。这三项分别对应着通用兴趣建模、短期和长期兴趣建模以及物品共现建模。下面依次来介绍。
输入的短期序列和长期序列都记录着产生该行为序列的用户,因此作者在做序列建模的时候,将该用户也考虑进去了。作者采用随机初始化的来表征用户静态和通用的的兴趣。最后在预测层预测分数的时候,采用了简单矩阵分解策略,即:,是目标预测物品的embedding(实际上就是目标序列集合中的物品),该分数即:通用兴趣贡献分。
输入是短期序列,输出是蕴含在短期序列中用户的兴趣表征,是short-term的缩小。如图所示,左下角的部分。作者采用了两层的GNN网络来捕获蕴含在序列中的局部结构信息,并形成用户短期兴趣表征。为了能够用GNN来建模,需要将序列转成session graph。策略是,短期序列中的每个物品和其后面的3个物品做连接,并对形成的邻接矩阵按照行做归一化。如下图所示:
「信息传播和聚合」:接着,基于该「邻接矩阵」来进行邻域信息传播和汇聚。即:
是从邻域传播的信息;和自身做一个拼接(),再过一个非线性变换。
上述得到了序列中每个物品的表征后,需要形成用户的短期兴趣表征。先mean pooling得到短期序列表征,再和用户的「通用表征」做一个拼接并过一层非线性变换融合。即:
这个是本文主要的亮点所在,如果对多维度注意力机制和带记忆网络的注意力机制不太熟悉的话,强烈建议先阅读我之前的一篇博客:深度学习中的注意力机制调研(http://xtf615.com/2019/01/06/attention/)。这部分的输入是长期序列,输出是用户的「长期兴趣表征」。为了能够捕获长期兴趣,通常可以采用「外部记忆单元」来存储用户随时间变化的动态偏好,但是如果为每个用户都存储这样的偏好,会耗费很大的存储空间,而且通过这种方式捕获到的兴趣可能和通用兴趣相似。为了解决这些问题,作者采用了一个记忆网络来存储「所有用户共享的隐兴趣表征」,每种隐单元都代表着某种特定的用户隐兴趣,给定用户长期交互序列,我们可以学习到多种「不同兴趣融合」的用户长期兴趣表征。记长期序列中每个物品的表征形成的表征矩阵为:,即:第列为长期序列中第个物品的表征向量。记忆网络中存储着所有用户「共享的隐兴趣表征」,针对每一个「用户」以及其「长期交互序列」,我们需要为该用户生成与其兴趣匹配的query embedding ,然后根据该query embedding去记忆网络中检索有用的隐兴趣表征,从而形成该用户特定的长期兴趣表征。这里面最重要的就是query embedding的产生,作者采用了多维度的注意力机制。具体而言,
其中,是可学习的注意力参数,是外积操作。上述注意力机制考虑了用户的「通用兴趣表征」和「长期行为序列」,因此该注意力是general-interest and long-term sequence 「aware」的。多维度注意力机制和通常的注意力机制其实差不太多。从语义上而言,每一行向量从某个语义角度衡量了长期行为序列中每个物品在该语义上的权重值,softmax应该是按照每行来做的,即:求每个序列中每个物品在该语义下的概率分布;基于该行向量所代表的注意力概率分布对长期序列做加权汇聚,可以得到在该语义上的用户query表征;共行,则会形成个用户query表征向量,即形成表征矩阵。
实际上从语义上来讲,相当于将不同语义汇聚到的query embedding通过mean pooling汇聚在一起形成最终的query embedding。
总之,通过上述步骤,就能够形成「用户通用兴趣和长期行为序列感知」的检索向量。接下来就是根据该检索向量去记忆网络中检索出和该用户兴趣就相关的记忆,从而形成用户的长期兴趣表征。
记忆网络的的Key和Value矩阵分别记为:和,每一列都代表着某个维度下,所有用户共享的「隐兴趣表征向量」。因此,需要计算用户的query embedding和每一种隐兴趣表征的亲和度值,并转成概率分布。基于该概率分布对所有的隐兴趣表征(列向量)做加权汇聚。最后做个skip-connection,使用门控机制来融合短期兴趣和长期兴趣。这里头的做法借鉴了LSTM/GRU,实际上和SR-GNN做结点信息更新的时候的策略是类似的,不作赘述。唯一要提的点就是,这里头实际上可以直接融合长短期序列表征和,但是作者实际用的时候融合的是,用户长期交互序列表征以及。可能是因为中融入了通用兴趣表征,而最后预测分数的时候,通用兴趣表征是单独作为一项贡献分的,再融合进长短期兴趣表征显得冗余。
做法很简单,门控的输出值是近期交互行为、通用兴趣表征、长期兴趣表征感知的,
基于该门控值进行融合,得到的融合后的兴趣表征为:
显式地对用户短期交互过的物品和目标物品做共现建模,采用了双线性函数:
是可学习的物品相关性矩阵。是短期交互序列中的物品的初始表征,是目标物品。
最后用BPR Loss来学习。不做赘述。
实验主要包括几个部分,
对比实验(方法包括:BPRMF,GRU4Rec,GRU4Rec+,GC-SAN,Caser,SASRec,MARank),居然没有选SR-GNN(个人认为虽然GC-SAN论文中战胜了SR-GNN,但是本人在很多实践中发现SR-GNN比GC-SAN好)。
消融实验:主要考察了通用兴趣,通用兴趣+短期兴趣,通用兴趣+短期兴趣+长期兴趣+gating长短期融合,通用兴趣+短期兴趣+长期兴趣+concat长短期融合,通用兴趣+短期兴趣+长期兴趣+GRU长短期融合。
(3)和(6)对比可以看出共现建模的好处;(1)和(2)对比看出短期兴趣建模的好处;(3)和(4)和(5)的结果说明gating机制的有效性,但是这个结果太不可思议了,gating比concat以及GRU好这么多?gating和GRU的差异主要就是有没有用吧?为了公平性,可以直接用到GRU里面来对比的。对此表示疑惑。
记忆单元的可视化: 验证每个记忆单元是否可以表示某种特定的兴趣。作者在MovieLens上做了case study。作者随机选了某个用户以及他观看过的电影,用其观看的电影直接作为query embedding,去计算在memory network上的注意力分数,即。期望观察到的效果是,给定不同的电影query embedding,注意力分数分布不一样,在类似的电影上,某些维度的注意力分数也应该类似。
可以看到有三部Three Colors的电影的注意力分数分布挺近似的。DIe Hard是惊悚片,和其他的分布不一样。
这种可视化应该是目前论文写作的标配。
这篇文章总体上有一些借鉴的地方。全文最大的亮点在于长期兴趣的建模。基于长期行为序列来构造query embedding,然后去memory network中检索有用的兴趣。这种长期兴趣的建模范式可以借鉴到日常工作优化中。但是缺点是长期序列长度可能比较长,多维度注意力机制可能复杂度相对高一些。但是,另一方面,这篇文章创新度一般,主要是一些已有的机制的叠加和尝试,是否真正有效还有待实践和验证。
AAAI 2020:Memory Augmented Graph Neural Networks for Sequential Recommendation
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方"AINLP",进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
推荐阅读
这个NLP工具,玩得根本停不下来
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
从数据到模型,你可能需要1篇详实的pytorch踩坑指南
如何让Bert在finetune小数据集时更“稳”一点
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
Node2Vec 论文+代码笔记
模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结
中文命名实体识别工具(NER)哪家强?
学自然语言处理,其实更应该学好英语
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧?