论文笔记 | ICDM2018 | Self-Attentive Sequential Recommendation

SASRec-title.png

论文地址:https://arxiv.org/abs/1808.09781

官方代码:https://github.com/kang205/SASRec

一 为什么读这篇

搜索用self-attention做推荐的相关文章,本篇算是比较相关的而且排名较高,作者开放的源码也是基于transformer那个第三方的开源实现,算是一脉相承,看看别人是怎么改transformer,应用到推荐里的。

二 截止阅读时这篇论文的引用次数

2019.6.25 15次。

三 相关背景介绍

中了18年IEEE的ICDM,同年8月挂到arXiv上。算是跟进比较及时的,transformer出来一年后就应用到自己工作的领域并发了paper。两位作者来自加州圣地亚哥大学,一作Wang-Cheng Kang是个华人小哥PHD,16年本科毕业于南大,期间受周志华教授指导,PHD是推荐系统和CV双修,CVPR和RecSys的论文都发过,又是一个强人。。二作Julian McAuley是Kang的老板,还在coursera上开了一门专项课程Python Data Products for Predictive Analytics

四 关键词

Sequential Recommendation

self-attention

五 论文的主要贡献

1 将Transformer应用在序列推荐问题上

2 做了细致的剥离对比实验

六 详细解读

0 摘要

动态序列是许多推荐系统的关键特征,为了利用这一点,主要有马尔科夫链(MCs)和RNN方法。其中MC适用于短序列, 稀疏数据集,模型简单;RNN原则上适用于长序列,密集数据集,不过模型更复杂。本文目标是平衡这两个目标,通过提出基于序列模型的self-attention(SASRec),使之可以捕获长期语义(像RNN那样),但是使用attention机制,使预测基于相关的少数行为(像MC那样)。在每一个时间步,SASRec从用户的历史行为中寻找哪些item是"相关的",并基于它们来预测下一个item。

1 介绍

序列推荐研究主要涉及到如何简便地捕获高阶动态。本文主要就是探索将self-attention机制应用到序列推荐问题上。希望这个想法可以解决MC和RNN的两个问题,一方面能够从过去的所有行为中获取context(像RNN),另一方面能够以少量的行为进行预测(像MC)。本文提出的SASRec(Self-Attention based Sequential Recommendation)如图1所示。

SASRec-fig1.png

2 相关工作

2.1 常规推荐

基于point-wise,pairwise的方法来解决隐式反馈关于"未观察到"这种二义的解释。主要都是基于矩阵分解(MF)的方法来发现用户偏好和item属性。还有近年的深度学习方法用于提取特征或用来替代传统的MF方法。如NeuMF,AutoRec。

2.2 时序推荐

TimeSVD++通过将时间划分为几个段,并分别对user和item建模达到了很好的效果。

2.3 序列推荐

有一阶的MC方法,高阶的MC方法。基于CNN的Caser,基于RNN的GRU4Rec。

2.4 Attention机制

Attention机制背后的本质理念是,顺序输出的每项都依赖于模型应该连续关注的某些输入的"相关"部分。还有个优势是基于attention的方法更容易解释。例如AFM(Attentional Factorization Machines)学习每个特征交互对于内容感知推荐的重要性。

本文工作受transformer启发,提出基于self-attention的序列推荐模型。因为序列推荐的问题与机器翻译有很大差异,所以需要对模型进行特殊设计。

3 方法

定义用户行为序列为,在时间步,模型预测的下一个item取决于之前的个item。模型输入可以视为,其期望输出是同样序列的"偏移"版本:。所用符号如表1所示。

SASRec-table1.png

3.1 Embedding层

将训练序列转为固定长度序列。如果序列长度超过,则用最近的个行为。如果不足,则从左补足直到长度为。

位置Embedding

因为self-attention并不包含RNN或CNN模块,因此它不能感知到之前item的位置。本文给输入Embedding插入可学习的位置Embedding :

本文也试了transformer中固定的位置Embedding,不过效果更糟。

3.2 Self-Attention块

Transformer中的缩放点积attention定义如下:

Self-Attention层

本文中,self-attention以embedding 作为输入,通过线性投影将它转为3个矩阵,然后输入attention层:

Causality

为了避免穿越问题,需要禁止和之间所有的连接。

Point-wise前馈网络

尽管self-attention能够用自适应权重聚集之前所有item的embedding,最终它仍然是个线性模型。为了增加非线性同时考虑不同隐式维度之间的交互,用了一个两层的point-wise前馈网络:

3.3 Self-Attention块的堆叠

堆叠公式如下:

然而随着网络的加深也出现几个问题:

  1. 模型容量的增加导致过拟合
  2. 由于梯度消失训练过程变得不稳定
  3. 更多的参数需要更长的训练时间

受Transformer启发,用了LayerNorm,Dropout,残差连接:

其中表示self-attention层或前馈网络。

LayerNorm公式如下:

其中为element-wise积(Hadamard product),为包含所有特征的一个样本。

3.4 预测层

采用MF层来预测相关的item :

其中是给定个items,下一个item 的相关性。是一个item embedding矩阵。

共享Item Embedding

为了减少模型尺寸及避免过拟合,用一个item embedding ,即:

显式用户建模

为了提供个性化推荐,当前主要有两种方法:

  1. 学习显式的用户embedding表示用户偏好(MF,FPMC,Caser)
  2. 考虑用户之前的行为,通过访问过的item的embedding推测隐式的用户embedding

本文采用第二种方式,同时额外在最后一层插入显式用户embedding,例如通过加法实现。但是通过实验发现增加显式用户embedding并没有提升效果。。

3.5 网络训练

定义为时间步的期望输出:
o_{t}=\left\{\begin{array}{ll}{<\mathrm{pad}>} & {\text { if } s_{t} \text { is a padding item }} \\ {s_{t+1}} & {1 \leq t<n} \\ {\mathcal{S}_{\left|S^{u}\right|}^{u}} & {t=n}\end{array}\right.
用二元交叉熵损失作为目标函数:

3.6 复杂度分析

空间复杂度

总参数量为:

时间复杂度

主要是self-attention层和前馈网络,占。但是因为self-attention层可以完全并行化,所以也不是什么问题。实验发现速度10倍于基于RNN和基于CNN的方法。

处理长序列

虽然通过实验经验性地验证了本文方法的效率,但最终还是无法扩展到很长的序列。未来的工作可能有:

  1. 使用restricted self-attention『A time-restricted self-attention layer for asr』
  2. 将长序列切分为段『Personalized top-n sequential recommendation via convolutional sequence embedding』

3.7 讨论

本文发现SASRec可以视为某种经典CF模型的泛化。

退化为已有模型

经过简化SASRec可以视为FMC,FPMC,FISM。(这里感觉好牵强)

基于MC的推荐

本文解决了MC的问题(长序列)

基于RNN的推荐

本文解决了RNN的问题(并行计算,最大路径长度)

4 实验

实验设计是为了回答下面4个问题:

  1. SASRec是否超过了当前包括基于CNN/RNN模型的方法,达到了SOTA
  2. SASRec架构中各种组件的影响是什么
  3. 训练效率和扩展性如何
  4. Attention权重是否能学到有意义的模式,关于位置或item属性

4.1 数据集

SASRec-table2.png

数据集划分为3个部分。最后一次行为为测试集,倒数第二次行为为验证集,剩下的为训练集。测试时也用了验证集的数据。

4.2 比较方法

将对比方法分为三类。

第一类为只考虑用户反馈不考虑序列行为顺序的常规推荐方法。包括PopRec,BPR

第二类为基于一阶马尔科夫链的序列推荐,考虑了最后访问的一个item。包括FMC,FPMC,TransRec

第三类为深度学习方法,考虑之前几个或全部的item。包括GRU4Rec,GRU4Rec+,Caser

4.3 实现细节

SASRec的默认版本,用了2个self-attention块(b=2),经学习获得的位置embedding,embedding层中的item embedding和预测层中的是共享的。优化器是Adam,学习率为0.001,batch_size=128,MovieLens-1M数据集的dropout比率为0.2,由于稀疏性其他数据集的比率为0.5。MovieLens-1M的最大序列长度n设置为200,其他数据集设置为50。粗略来看大概是每个用户的平均行为数。

4.4 评估指标

采用两种常见的Top-N指标,Hit Rate@10和NDCG@10。为了避免过重的计算量,对每个用户随机采样100个负item,加上ground-truth item,对这101个item排序计算其指标。

4.5 推荐效果

这里回答了问题1。

SASRec-table3.jpg

效果如表3所示,发现非神经网络方法(a-e)在稀疏数据集上表现好点,神经网络方法(f-h)在密集数据集上表现更好。而本文方法在两种数据集上表现都更好。

SASRec-fig2.jpg

图2分析了关键超参隐式维度的影响,发现本文方法越大效果越好,对所有的数据集,当达到满意的效果。

4.6 剥离实验

这里回答了问题2。默认方法和8个变种方法(d都是50)的效果如表4所示。

SASRec-table4.jpg
  1. 移除位置embedding

    除了稀疏数据集Beauty,效果变差。这个变种也许适合稀疏数据集,这种情况下通常用户序列都很短。

  2. 不共享Item Embedding

    性能严重下降,有可能是因为过拟合

  3. 移除残差连接

    性能严重下降

  4. 移除dropout

    dropout在稀疏数据集上更有效,也说明密集数据集上过拟合问题更少点

  5. 块的个数

    块越多更适合于密集数据集

  6. Multi-head

    2个头的效果比1个头的稍微糟点,没有像Transformer原文用那么多头,因为d的维度只有50,不像Transformer有512,所以不适合分解为更小的子空间。

4.7 训练效率和扩展性

从训练速度和闭合时间两方面来回答问题3。

SASRec-fig3.jpg

序列越长,效果越好,如表5所示。

SASRec-table5.jpg

4.8 可视化Attention权重

这里回答问题4。

SASRec-fig4.jpg

通过a和c的对比,发现模型在稀疏数据集上更倾向关注最近的item,而在密集数据集上对最近的item较少关注。这说明本文方法可以自适应的处理稀疏和密集数据集。

通过b和c的对比,说明位置embedding的影响,没有它们attention权重基本上是均匀分布。

通过c和d的对比,说明模型的层次性,更高的层倾向于关注最近的位置。可能是因为第一个self-attention块已经考虑了之前所有的item,所以第二个块无需考虑更远的位置。

总之,通过可视化可以说明self-attention机制是自适应的,有位置感知以及有层次性的。

七 小结

本文整个感觉其实就是将transformer的self-attention应用到推荐上来,没有什么特别创新的地方,属于应用型论文。以现在的观点来看,好像很普通,不过考虑到transformer出来不久后本文工作就跟上了,这点还是很厉害的。感慨一下搞科研也得追热点,而且不能只盯着自己那一块东西,得看大领域的热点。此外,通过查找作者的背景资料,根据作者过往产出成果,感觉本文应该不是坑,是可以借鉴应用的。

素质四连

要解决什么问题

序列推荐问题

用了什么方法解决

transformer的self-attention机制

效果如何

超过了基于马尔科夫链,CNN/RNN的方法,速度也快很多

还存在什么问题

没有特别创新的改造,就是应用了一下self-attention

算法背后的模式和原理

拿来主义,将不同领域的方法工具拿来用,针对要解决的具体问题细致的调参

八 补充

同一天在arXiv上发表的AttRec:Next Item Recommendation with Self-Attention

你可能感兴趣的:(论文笔记 | ICDM2018 | Self-Attentive Sequential Recommendation)