#论文题目:SASRec:Self-Attentive Sequential Recommendation(SASRec-基于自注意力机制的序列推荐)
#论文地址:https://arxiv.org/abs/1808.09781v1
#论文源码开源地址:https://github.com/kang205/SASRec
#论文所属会议:ICDM 2018
transformer最早提出是用在NLP领域做机器翻译的,本文将transformer中的注意力机制用在序列推荐上,对于给定的物品序列来预测下一个最可能出现的物品是什么(采用自注意力机制来对用户的历史行为信息建模,提取更为有价值的信息。最后将得到的信息分别与所有的物品embedding内容做内积,根据相关性的大小排序、筛选,得到Top-k个推荐。)。该方法在稀疏和密集数据集上都优于各种先进的序列模型。
这个结构是不是非常熟悉呢?没错,其实它就是Transformer中的Encoder部分,每个block包括Self-Attention和FFN等。
首先得到商品序列后,Embedding Layer得到物品的向量表示,之后加以聚合,通过Self Attention得到每个物品之间的注意力数值大小,为了避免线性问题导致模型过拟合,Feed Forward NetWork考虑到不同维度隐藏特征的非线性交互,采用两层前馈网络(ReLU),最后通过Predication Layer进行计算商品的数值大小并进行排序,最终取其Top-K的物品作为推荐。
通俗来说:已知用户历史行为,通过SASRec模型得到一个对历史行为的建模,然后我们将其与每一个候选物品(也可以说是目标物品)的表示(Embedding向量)进行交互(文章采用的是内积方式),得到一个 r r ri,t,表示一种相关性。然后将所有的分数进行排序、筛选,完成推荐。
对于序列推荐,我们定义一个用户的行为序列:Su = (S1u, S2u, …, S{|Su|}u),目标是预测下一个用户可能发生交互的物品但需要依赖之前用户的交互历史,如下图所示。论文中所需的参数表示见下表:
文章中重点提到了关于用户行为序列的表示:将行为序列 S S Su = ( S S S1u, S S S2u, …, S S S{|Su|}u)转化为一个适宜长度的序列 s s s = ( s s s1, s s s2, …, s s sn)。对于用户 u u u,若其行为序列的长度大于 n n n,则取离当前最近的 n n n个行为;若小于 n n n,则采用0在左边进行填充,直至长度为 n n n。经过Embedding操作得到物品的向量矩阵 M M M∈ R R R|I|×d, I I I表示物品集合, d d d是embedding的维度。
对于每一个用户行为序列,都可以检索得到Embedding向量,最终得到 E E E∈ R R Rn×d, E E Ei = M M MSi。
在Transformer中,我们知道,self-attention本身是不具备一种位置关系的,即交换序列中元素的位置,并不影响最终的结果。(但是如果对于一句话“hello, my friend. ”,就拿my这个单词举例,attention的数值只是和“my”前面的词有关,因此不能考虑句子中“my”后面的单词。)同理,用户在预览某些商品的时候,下一件商品可能和上一件商品有关联,(如我们买电脑,下一件商品极有可能买鼠标等),因此Transformer中引入Positional Embedding(位置嵌入),来表示序列中的一种先后位置关系。假设位置Embedding为P∈Rn×d,与行为序列的Embedding相加:
此时的E^就是模型训练时候的输入矩阵。
与Transformer不同的就是,这里的P矩阵是跟随模型一起训练得到的,并不是手动设计的了。(作者说尝试了那种方式,效果不太好)。那这显然就引入了SASRec的一个弊端,这种跟随模型学到的矩阵P,并不能处理长列,可扩展性不强,在实际系统中基本无法确定n的长度。
该部分与Transformer的「编码层」大体上是一致的,是由「多个(或单个)【自注意力机制+(残差连接、LayerNormalization、Dropout)+前馈网络】」 组成。但其中也有一些作者自己的一些想法创新,重点记录下该内容,Self-Attention部分比较简略。
对于普通的单个自注意力层模块:
Due to the nature of sequences, the model should consider only the first t items when predicting the (t + 1 ) - st item. However, the t-th output of the self-attention layer (St) contains embeddings of subsequent items, which makes the model ill-posed.
即在QiKjT中,当i < j时候,存在一种超前查询的现象,因此作者禁止该情况的交互。(Q是查询向量,不能与之后的历史物品的信息进行交互)
这里与Transformer的思想类似,认为叠加多个自注意力机制层能够学习更复杂的特征转换。第[b]个自注意力block定义为:
然而网络层数越深,会存在一些问题:
模型更容易过拟合;
在经过b个self-attention block之后,用户行为中的信息得到有效的提取,即Ft(b),模型最终的目标是预测下一个用户感兴趣的物品,因此,作者通过一个MF层来预测物品i的相关性:
【注】:物品的Embedding矩阵表示是不同的,模型之前训练得到的是M,而这是N,结合下文内容,这里N应该指的是一个已经训练好的物品Embedding矩阵。
为了减小模型大小以及过拟合,作者使用了SASRec模型训练的单个商品的Embedding矩阵进行交互:
Ft(b)作为一个依赖于M的函数:
这里,作者称之为Shared Item Embedding。作者提到如果采用相同的Embedding表示,会产生一个问题:无法通过内积表示一种不对称的转换。文中举例:如果在物品j之后会频繁的买物品i,但是反过来却不可能。但是用相同的Embedding表示,进行内积操作后,却没有区分:
使用同质(homogeneous)商品embedding的一个潜在问题是,它们的内部产品不能代表不对称的商品转换。然而,我们的模型没有这个问题,因为它学习了一个非线性变换。例如,前馈网络可以很容易地实现同项嵌入的不对称性,经验上使用共享的商品embedding也可以大大提升模型的效果;
像FPMC模型通过不同的Embedding解决这个问题。不过,作者指出,SASRec模型不会有这个问题:
将每一个用户行为序列转化成s = {s1, s2, …, st},并且定义输出ot:
如果输入为填充值,输出也是填充值。定义最终的交叉损失函数为:
文章采用Adam优化器,并且针对每一时刻的正样本,都会随机生成一个物品[公式]来作为负样本,平衡训练过程中正负样本的比例。
文章在选取数据集也很严谨。选择了两个稀疏数据集(Amazon-Beauty、Amazon-Games)、物品平均交互多,用户平均交互少的Steam和密集型数据集(Movielens-1m),内容如下所示:
也在知乎上搜了搜该方法的创新点,但是通过自己和transformer进行比较,感觉也没什么创新点。
链接:https://www.zhihu.com/question/482682947