SASRec
Self-Attentive Sequential Recommendation
2018年的经典文章
摘要
时序动态是许多现代推荐系统的一个关键特征,它们试图根据用户最近执行的操作来捕捉用户活动的“背景”。为了捕捉这种模式,出现了两种方法:马尔可夫链(MC)和递归神经网络(RNN)。马尔科夫链假设用户的下一个动作可以根据他们的最后(或最后几个)动作来预测,而RNN原则上允许发现更长期的语义。一般而言,基于MC的方法在模型简约性至关重要的极稀疏数据集中执行得最好,而RNN在较密集的数据集中执行得更好,因为较高的模型复杂性是负担得起的。我们工作的目标是通过提出一个基于自我注意的顺序模型(SASRec)来平衡这两个目标,该模型允许我们捕获长期语义(如RNN),但使用注意力机制,基于相对较少的动作(如MC)进行预测。在每一个时间步,SASRec都会试图从用户的操作历史中找出哪些项目是“相关的”,并用它们来预测下一个项目。大量的实证研究表明,我们的方法在稀疏和密集数据集上的性能都优于各种最先进的序列模型(包括基于MC/CNN/RNN的方法)。此外,该模型的效率比基于CNN/RNN的同类模型高一个数量级。注意力权重的可视化还显示了我们的模型如何自适应地处理不同密度的数据集,并揭示活动序列中的有意义的模式。
相关工作
- 普通推荐系统
- 临时推荐
- 序列推荐
- 注意力机制
方法
1. 符号系统
M
:
\mathbf M:
M: 项目embedding矩阵;
E
:
\mathbf E:
E: 输入矩阵,每个用户不同,是项目embedding的顺序堆叠
2. 位置信息
在输入矩阵的每一行加入对应的位置向量
P
\mathbf P
P, 这里的
P
\mathbf P
P是可学习的。
3. 自注意力层
常规,用了3个投影矩阵,在这里,有个额外的因果关系,由于是序列模型,所以模型在预测第t+1项时,应该只考虑前面的t项。然而,自注意力机制的第t个输出包含了后续项目的embedding, 会使得模型不稳定,于是作者修改了注意力,禁止了
Q
i
\mathbf Q_i
Qi和
K
j
\mathbf K_j
Kj之间的联系。(怎么实现的这里没说)
接下来是常规的FFN环节赋予模型非线性,这里用的是RELU激活函数。
4. 注意力模块堆叠
就是把FFN的输出作为attention的输入,再进行一轮attention+FNN的组合,当然,这里会出现三个问题:
- 过拟合
- 训练过程不稳定,如梯度消失的问题
- 参数太多,训练耗时
所以进行如下操作:
每层添加dropout,然后再把输入加进去。
5. 预测
前面FNN的输出就是
F
\mathbf F
F, 再乘上项目embedding矩阵的转置,就是对应项目
i
i
i的预测得分。
额外操作
为了减少参数,并且防止过拟合,作者采用共享的项目embedding矩阵
6. 训练
o
t
o_t
ot被定义为
t
t
t时刻预期的输出。大S和小s的区别在于:大S是真实序列,不包含填充。
比如定义序列最大长度为5, i i i是项目,那么: S u = { i 1 , i 2 , i 3 } S^u=\{i_1,i_2,i_3\} Su={i1,i2,i3}, s = { i 0 , i 0 , i 1 , i 2 , i 3 } s=\{i_0,i_0,i_1,i_2,i_3\} s={i0,i0,i1,i2,i3}, i 0 i_0 i0就是填充项
o t o_t ot就是说:如果上一个项目是填充项,那么输出就是填充项,当前时刻 t t t不是序列末尾时,就输出原有序列的下一个,到最后 t t t时刻,即序列末尾时,输出的才是预测项目。
7. 损失函数
当 o t o_t ot是填充项时,忽略。损失函数是二元交叉熵。可以看出损失函数的目的是,让序列内的项目的相关性尽可能大。
总结
和AttRec在注意力机制上的使用的区别在,AttRec少用一个投影矩阵,使得V不同而已。
对数据集的使用仅仅是序列信息,尝试在模型中融入项目特征,现在的难点在于除了电影数据集以外,序列模型各baseline最常用的数据集有:Movielens-1M,Amazon数据集的beauty,sports,toys.
但是Amazon的数据集的项目特征只有一个“category”,而且数据集需要预处理,数据集也有点大。