作者:一元,炼丹笔记三品炼丹师
SASRec_Self-Attentive Sequential Recommendation(ICDM18)
背景
本文介绍一篇较早使用Self-Attention进行序列化推荐的文章,也是目前大多数序列化推荐算法非常重要的Baseline,最典型的场景可以参见标题,该篇文章的思路也是现在推荐系统岗位经常考的一篇,还不速速学习一波。
PS: 文末参与问题讨论&被本公众号成员一致认可采纳回答的两位朋友将会得到神秘礼品一份!
序列动态是许多当代推荐系统的一个重要特征,它试图根据用户最近执行的操作来捕捉用户活动的“上下文“。本文提出了一个基于self-attention的序列模型(SASRec),它让我们可以捕捉长期语义(如RNN),但是,使用注意机制,它的预测基于相对较少的动作(如MC)。在每一个时间步,SASRec都会从用户的行为历史中找出哪些项目是“相关的”,并使用它们来预测下一个项目。大量的实证研究表明,该方法在稀疏和密集的数据集上都优于各种最新的序列模型(包括基于MC/CNN/RNN的方法)。
此处我们直接介绍模型。
模型
符号
方案描述
在序列化推荐的设置中,我们给定用户的行为序列, , 并且希望去预测下一个商品。在时刻,模型依赖于前面个商品对下一个商品进行预测。所以模型的输入为, 它期望的输出为相同序列的shift版本,, 所有符号的表示可以参考“符号”处。
1. Embedding层
我们将训练序列转化为固定长度的序列, 其中表示模型可处理的最大长度。如果序列的长度小于,那么我们就进行padding。我们从输入的embedding中获取序列矩阵,其中 常数0用来表示padding商品的embedding。
A. Positional Embedding
2. Self-Attention Block
A.Self-Attention Layer
其中, .
B.Causality: 因为序列的关系,模型在预测的时候需要考虑前面个样本。但是模型self-attention层包含接下来商品的embedding,这会令模型是病态的.所以我们需要在构建attention的时候阻断与。
C.Point-Wise Feed-Forward Network: 尽管self-attention能将之前item的emebdding使用自适应的权重进行集成,但仍然是一个先线性模型,为了加入非线性能力, 我们使用两层的DDN,
其中 是 的矩阵, 为维的向量,注意和, , 不存在交互,防止信息泄漏。
3. Stacking Self-Attention Blocks
在第一个self-attention block之后,学习item的迁移可以学习更加复杂的item迁移,所以我们对self-attention block进行stacking,第的block可以用下面的形式进行定义:
第一个block为, .
其中表示self attention layer或者feed forward network。其中,
其中, 和为的均值和方差, 和为学习的缩放因子和偏差项.
4. Prediction Layer
我们基于进行下一个商品的预测, 特定的,我们使用MF层对相关的商品进行相关性的预测,
其中, 是商品和给定的前面个商品的相关性, ,是商品的embedding矩阵。所以更高的意味着一个更高的相关性。
为了防止模型的过拟合, 我们使用单个商品的embedding ,
注意, 表示依赖于商品embedding的函数,
使用同质(homogeneous)商品embedding的一个潜在问题是,它们的内部产品不能代表不对称的商品转换。然而,我们的模型没有这个问题,因为它学习了一个非线性变换。例如,前馈网络可以很容易地实现同项嵌入的不对称性,经验上使用共享的商品embedding也可以大大提升模型的效果;
显示的用户建模:为了提供个性化的推荐,现有的方法常用两种方法,(1).学习显示的用户embedding表示用户的喜好;(2).考虑之前的行为并且引入隐式的用户embedding。此处使用并没有带来提升。
5. 网络训练
前面我们将用户的序列通过truncation或者padding转化为固定的长度,同时定义在时间的期望输出为:
其中pad表示一个padding的商品。最终我们采用bianry交叉熵损失作为目标函数:
方案复杂度分析
1. 空间复杂度
模型中学习的参数来自于self-attention.ffn以及layer normalization的参数,总的参数为:
2. 时间复杂度
我们模型的计算复杂度主要在于self-attention layer和ffn网络, , 里面最耗时间的还是self-attention layer, 不过这个可以进行并行化。
实验
该次实验主要为了验证下面的四个问题:
- 是否SASRec比现有最好的模型(CNN/RNN)要好?
- 在SASRec框架中不同的成份的影响怎么样?
- SASRec的训练效率和可扩展性怎么样?
- attention的权重是否可以学习得到关于位置和商品属性的有意义的模式?
1. 推荐效果比较
- SASRec在稀疏的和dense的数据集合熵比所有的baseline都要好, 获得了6.9%的Hit Rate提升以及9.6%的NDCG提升;
2. SASRec框架中不同成份的影响
- 删除PE: 删除位置embedding ,在稀疏的数据集上,删除PE效果变好,但是在稠密的数据集上,删除PE的效果变差了。
- 不共享IE(Item Embedding): 使用共享的item embedding比不使用要好很多;
- 删除RC(Residual Connection):不实用残差连接,性能会变差非常多;
- 删除Dropout: dropout可以帮助模型,尤其是在稀疏的数据集上,Dropout的作用更加明显;
- blocks的个数:没有block的时候,效果最差,在dense数据集上,相比稀疏数据多一些block的效果好一些;
- Multi-head:在我们数据集上,single-head效果最好.
3. SASRec的训练效率和可扩展性
- SASRec是最快的;
- 序列长度可以扩展至500左右.
小结
在本文中,作者提出了一个新的基于自我注意的序列模型SASRec。SASRec对整个用户序列进行建模(没有任何递归或卷积操作)。在稀疏和密集数据集上的大量实证结果表明,SASRec模型优于现在最优的基线,并且比基于CNN/RNN的方法快一个数量级。
参考文献
- Self-Attentive Sequential Recommendation:http://cseweb.ucsd.edu/~jmcauley/pdfs/icdm18.pdf
- https://github.com/kang205/SASRec