【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)

前言

本次分享2018年发表在ICDM上的论文----「Self-Attentive Sequential Recommendation」。主要是应用self-attention机制来做一个序列推荐,与上一次分享的BST模型类似,最后部分简单做了个对比,并给出了该模型的复现代码。
本文约4.6k字,预计阅读15分钟。

概要

「Self-Attentive Sequential Recommendation」主要是针对的是召回的工作,提出SASRec序列推荐模型。作者受到Transformer启发,采用自注意力机制来对用户的历史行为信息建模,提取更为有价值的信息。最后将得到的信息分别与所有的物品embedding内容做内积,根据相关性的大小排序、筛选,得到Top-k个推荐。【当然在论文实验中,首先针对隐式数据集,完成的是一个二分类问题。在测试集中,并不是对所有的物品进行预测,这样耗时太长。针对每一个正样本,伴随了100个负样本,进行排序】

Self-Attention的意义

文中作者与基于马尔科夫链的序列推荐方法和基于深度学习(CNN、RNN)的序列推荐方法进行对比:

  • 基于MC的方法,通过一个简单的假设,进行信息的状态转移。在高稀疏数据下表现好,但在更复杂的场景中很难捕捉到有用的信息,文章实验也证明了这点;

  • 基于RNN的方法有很强的表达能力,但是训练需要大量的数据,在密集型数据集下表现得更好,且因为每一个隐藏状态都必须依赖于前一个,运行效率较低;

而注意机制已被证明在各种任务中是有效的,如机器翻译等。本质上,这种「机制背后的思想是连续的输出都依赖于某个输入的“相关”部分,而模型应该连续地关注这些输入」。且基于注意力的方法通常更容易解释。注意力机制在AFM、DIN模型中得到了很好的应用。

Transformer模型很大程度上依赖于“self-attention”模块来捕捉句子中的复杂结构,以及检索相关单词来生成下一个单词。虽然顺序推荐的问题与机器翻译有很大的不同,但是作者受到了Transformer的启发,试图基于self-attention方法构建一种新的序列推荐模型。

自己的理解

对于一篇论文,最重要的是去理解为什么文章使用了这个方法,有什么意义或作用。以下是我自己的理解:

在本文中,self-attention的意义:对于下一次的物品推荐,依赖于用户行为序列的各个物品的权重是不同的,这与「推荐场景有关」

  • 用户物品交互较少:在一个稀疏数据集下,用户行为较少,行为相隔时间可能相差几天,甚至几个月,那么「此时相近时间的历史物品信息表现得更为重要」

  • 用户物品交互频繁:在一个密集型数据集下,用户行为多,例如在电商场景下,那么相近的物品信息就不是非常重要。例如,对于某个用户,他在电商场景的一个Session中,行为:手机--电脑--衣服---鼠标---裤子,那下一个用户感兴趣的是电子产品、服装都有可能,上述历史行为都很重要,这牵扯到一个「多兴趣」的概念了。

正如文章实验那样,「在不同环境(数据集)下,模型的self-attention机制关注的重点是不同的」

模型结构

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第1张图片

1. 参数定义

对于序列推荐,我们定义一个用户的行为序列: ,目标是预测下一个用户可能发生交互的物品但需要依赖之前用户的交互历史,如上图所示。论文中所需的参数表示见下表:

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第2张图片

2. Embedding层

文章中重点提到了关于用户行为序列的表示:将行为序列 转化为一个适宜长度的序列 。对于用户 ,若其行为序列的长度大于 ,则取离当前最近的 个行为;若小于 ,则采用0在左边进行填充,直至长度为 。然后其经过Embedding操作,得到Embedding矩阵 , 表示物品集合, 是embedding维度。对于每一个用户行为序列,都可以检索得到Embedding向量,最终得到 。「常量零向量0则用作填充项的嵌入」

【注】关于这一部分其实与很多变长序列的任务都相似,需要将输入转化为一个矩阵,以方便GPU的计算。关于Embedding,在实际代码中,个人会「将行为序列的特征,例如item_id、cate_id等从1开始进行表示,0作为填充值」。之后会经过mask,因此0对应的Embedding向量并没有任何意义。

Positional Embedding

在Transformer中,我们知道,self-attention本身是不具备一种位置关系的,即交换序列中元素的位置,并不影响最终的结果。例如对于阿里的DIN模型,采用注意力机制对用户序列进行建模,但交换之前历史的物品,并不影响最终的预测,因为DIN只是提高与目标物品相似历史物品的权重,模型中的历史行为并没有表现一种时间上的先后关系,严格来说并不算一种序列推荐。因此Transformer中引入「Positional Embedding(位置嵌入)」,来表示序列中的一种先后位置关系。假设位置Embedding为 ,与行为序列的Embedding相加:

但作者提到,采用了Transformer中的Positional Embedding,结果却更差了,在实验部分有涉及讨论。

3. Self-Attention层

该部分与Transformer的「编码层」大体上是一致的,是由「多个(或单个)【自注意力机制+(残差连接、LayerNormalization、Dropout)+前馈网络】」 组成。但其中也有一些作者自己的一些想法创新,重点记录下该内容,Self-Attention部分比较简略。

3.1 Self-Attention Block

对于普通的单个自注意力层模块:

  1. 简单的注意力机制函数(这里指采用点击方式计算注意力分数)定义如下:

    在NLP中,一般 ;

  2. 「自注意力方法」中, 都来自同一对象。在本文中,对输入 通过「线性投影」转化为三个矩阵,并使用于上述注意力函数:

    其中 是线性投影矩阵,最后得到的  ,具体见下图(图片来自https://jalammar.github.io/illustrated-transformer/?spm=ata.13261165.0.0.34fb48aaFxc8Jt):【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第3张图片

  3. 前馈网络:虽然自注意力通过权重聚合了所有先前的item embedding,「但是它最终依旧是一个线性模型」。因此考虑到不同维度隐藏特征的非线性交互,本文与Transformer一样,在self-attention之后,采取两层的前馈网络:

    其中 为参数矩阵【 「参数共享」】, 为偏置向量;

「本文创新:」

文章该部分的创新点主要在自注意力函数中的 。自注意力函数将 都经过线性投影得到,这增加了模型的灵活性。例如,模型可以学习不同的交互($ , $)。对此,作者提出了观点:

Due to the nature of sequences, the model should consider only the first  items when predicting the   item. However, the  -th output of the self-attention layer (  ) contains embeddings of subsequent items, which makes the model ill-posed.

即,在 中,当 时,存在一种“穿越”现象【「 是查询向量,不能与之后的历史物品的信息进行交互」】,因此作者提出禁止所有该情况的交互。

3.2 Stacking Self-Attention Blocks

这里与Transformer的思想类似,认为「叠加多个自注意力机制层能够学习更复杂的特征转换」。第 个自注意力block定义为:

其中, ;

然而网络层数越深,会存在一些问题:

  1. 模型更容易过拟合;

  2. 训练过程不稳定(梯度消失问题等);

  3. 模型需要学习更多的参数以及需要更长的时间训练;

因此,作者在自注意力机制层和前馈网络「加入残差连接、Layer Normalization、Dropout」来抑制模型的过拟合。(其实依旧与Transformer类似),下图为Transformer结构做参考:

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第4张图片

用公式表示为:

其中 表示自注意力层和前馈网络。

4. 预测层

在经过 个self-attention block之后,用户行为中的信息得到有效的提取,即 ,「模型最终的目标是预测下一个用户感兴趣的物品」。因此,作者通过一个MF层来预测物品 的相关性:

其中 表示给出用户行为序列 后,第 个物品成为用户感兴趣的相关性, 是物品的embedding矩阵。因此 越高,则说明具有更高的相关性。那么我们可以通过对其排序进行推荐。

【注】:

  1. 通俗来说,已知用户历史行为,通过SASRec模型得到一个对历史行为的建模,然后我们将其与每一个候选物品(也可以说是目标物品)的表示(Embedding向量)进行交互(文章采用的是内积方式),得到一个 ,表示一种相关性。然后将所有的分数进行排序、筛选,完成推荐;

  2. 物品的Embedding矩阵表示是不同的,模型之前训练得到的是 ,而这是 ,结合下文内容,这里 应该指的是一个已经训练好的物品Embedding矩阵; 「尝试:」

1、为了减小模型大小以及过拟合,作者「使用了SASRec模型训练的Embedding矩阵」进行交互:

这里,作者称之为「Shared Item Embedding」。作者提到如果采用相同的Embedding表示,会产生一个问题:无法通过内积表示一种不对称的转换。文中举例:如果在物品 之后会频繁的买物品 ,但是反过来却不可能。但是用相同的Embedding表示,进行内积操作后,却没有区分, 。像FPMC模型通过不同的Embedding解决这个问题。不过,作者指出,SASRec模型不会有这个问题:

However, our model doesn’t have this issue since it learns a nonlinear transformation. For example, the feed forward network can easily achieve the asymmetry with the same item embedding: . Empirically, using a shared item embedding significantly improves the performance of our model.

2、SASRec模型通过用户历史行为建模来表示一个用户,当然像MF等,都是「通过user embedding来对用户进行显示的建模」。因此,作者在原有的基础上,加入了user embedding:

其中 表示用户 的Embedding(如果将 去掉,其实就是一个MF模型)。最终实验结果表明,并没有提高模型的性能,因为在 已经充分的表示了用户的信息了。

5.模型训练

将每一个用户行为序列转化成 ,并且定义输出 :【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第5张图片

如果输入为填充值,输出也是填充值。定义最终的交叉损失函数为:

文章采用Adam优化器,并且针对每一时刻的正样本,都会随机生成一个物品 来作为负样本,「平衡训练过程中正负样本的比例」

实验

对比文章模型上的创新度,最让我有收获的是实验部分。实验非常的详细,双排有4页的内容。接下来只是简单的描述下文章实验的架构,有兴趣的可以阅读原文的实验部分。

1. 问题

文章通过设置4个研究问题来对实验进行讨论分析(这与NCF、ONCF的方式类似):

  • RQ1:SASRec的性能是否在实验中达到最优?

  • RQ2:SASRec架构的各个成分对最终结果有什么影响?

  • RQ3:SASRec模型的效率与可扩展性如何?

  • RQ4:注意力权重能够学习到与位置或物品属性相关的有意义的模式吗?

2. 数据集

文章在选取数据集也很严谨。选择了两个稀疏数据集(Amazon-Beauty、Amazon-Games)、物品平均交互多,用户平均交互少的Steam和密集型数据集(Movielens-1m),内容如下所示:

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第6张图片

3. 比较方法

比较的方法主要分为3种:

  1. 不考虑序列的传统推荐:PopRec、BPR;

  2. 基于马尔可夫链的序列推荐:FMC、FPMC、TransRec;

  3. 基于深度学习的序列推荐:GRU4Rec、GRU4Rec+、Caser;

4. 参数设置

对于SASRec,

  • 文中采用两层self-attention block(b=2),且使用positional embedding;

  • 优化器:Adam,学习率:0.001,batch_size:128;

  • 对于MovieLens-1m,dropout:0.2,最大序列长度(n):200;

  • 对于其他三个数据集,dropout:0.5,最大序列长度(n):50;

5. 实验指标

因为本文主要是针对的是召回工作,所以采用Hit Rate@10NDCG@10两个指标。

并且为了减少大量的计算,在测试集中,对于每一个用户 ,都随机采样100个负样本进行排序。通俗来说,对于每一个样本,模型需要在101个物品中使得正样本分数更高,排得更前(不然要在所有的物品中进行召回,计算量太大)。

6.RQ1& A

下表结果说明了SASRec的性能确实超越了所有的方法。且证实了文中说的:「基于MC的方法在高稀疏的数据集上表现较好,而基于RNN、CNN的序列方法在密集型数据集上表现更加」。而基于self-Attention的SASRec在两种数据集上都表现最佳。

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第7张图片

7. RQ2&A

下图说明了去掉或更换SASRec的某个结构对最终的预测结果带来的影响。

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第8张图片

8. RQ3&A

下图说明了各个模型收敛的速度和训练效率。

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第9张图片

9. RQ4&A

下图是在最后15个时间步骤的最后15个位置上平均注意力权重的4个热力图(按行看)。

  • a vs c:(a)(c)两图表明了在稀疏数据集上,模型倾向于关于最近的物品信息,而在密集型数据集上,模型并没有过多的关注最近的物品信息,对于更久远的信息也赋予了较小的权重;

  • b vs c:(b)图没有加入位置信息,对历史的物品信息的权重显得更为均衡,(c)图则是对近期的物品信息更加的敏感;

  • c vs d:(c)(d)显示了注意力是如何在不同的block之间变化的。显然,高层的注意力往往集中在最近的物品信息上。可能是因为第一个block已经考虑了前面所有的东西,而第二个block不需要考虑远处的位置。

为了证明物品之间的注意力权重的统计意义,作者在四个电影类别(科幻,浪漫,动画和恐怖)中分别选取200部电影,第一个集合用于查询(Query),第二个集合作为键(Key)。下图显示了两个集合之间平均注意力权重的热力图。可以看到热图大约是一个块对角矩阵,这意味着注意机制可以识别相似的物品,并倾向于在它们之间分配更大的权重。

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)_第10张图片

SASRec与BST

SASRec与BST似乎都是引入了Transformer,不过:

  • SASRec针对的是召回工作,它的候选物品池是海量的,且它在Self-Attention中并没有加入下一个预测的物品,并没有使用多头自注意力机制;

  • BST针对的是排序工作,即CTR任务,所以它的候选物品池很小,经过召回工作筛选过的,并且在Self-Attention的序列中具有历史用户行为和当前的目标物品;

代码复现

原文给出了复现代码,我自己尝试用TF2.0进行了复现。
地址:https://github.com/ZiyaoGeng/Recommender-System-with-TF2.0,或点击原文链接。

总结

SASRec是基于slef-attention的序列推荐模型,论文的的Discuss、Experiment部分内容值得研究和借鉴。

往期精彩回顾

【论文导读】DLP-KDD2019|BST---使用Transformer进行序列推荐

NIPS2017|行为序列建模的方式---Transformer

【论文导读】KDD2020|阿里团队最新的多元兴趣推荐模型---ComiRec

【论文导读】2019阿里CTR预估模型---DIEN(深度兴趣演化网络)

扫码关注更多精彩

点分享

点点赞

点在看

你可能感兴趣的:(大数据,算法,python,计算机视觉,机器学习)