序列推荐论文介绍——SASRec

Wings Lv2

介绍一篇论文:Self-Attentive Sequential Recommendation

问题背景

在推荐平台中,一般的用户操作是有先有顺序的,所以平台可以记录用户与物品的交互历史信息,一个很自然的想法,利用这种历史顺序交互信息来预测用户接下来可能想要交互的物品。

问题建模

首先,假设整个推荐平台有个用户和个物品。对于每一个用户来说,Ta在该平台上被记录到有这么一组与物品的交互序列。平台的目标一般是尽可能通过这些信息预测该用户下一个最有可能交互的物品。

在这里,需要构建一个序列模型,该序列模型能够充分利用序列信息进行预测。很自然,该问题可以被描述为

表示利用该用户的交互序列,向推荐Ta最想要交互的物品

再进一步——序列步骤建模

接下来,还需要对序列步骤进行建模。上述的式子,实际上就是最后一步要输出的情况。在这里,我们可以对上述过程再拆解,是因为这里有一个顺序的重复性。简而言之是,除了在顺序的次序上有不同之外,每一个交互状态都在预测下一个状态的内容。

直观理解就是,该用户在第次交互的时候,可以利用前次交互的信息去进行预测,这个可以是。所以,序列预测的式子可以统一写成:

其中,具体某一次预测展开为:

所以,在当前的深度学习下,很容易得到一种基于序列信息的自监督学习范式,即在位置的信息是位置的监督信息。其内核反映的是一种状态不断发生改变的情况,让模型能够学会这种依赖前置顺序生成后续信息的能力,从广义视角来看,可以看做是一种预测模型

深度学习下的序列模型

接着,我们再回到在深度学习中,按照上述的分析,本质上就是希望存在一个深度学习模型,使其能够根据之前的状态信息去预测下一个状态的信息。

众所周知,深度学习主要是以嵌入向量为主,所以在序列推荐系统中,同样需要对用户和物品进行深度学习意义上的建模,即,每一个用户和物品都有一个对应的维的嵌入向量。对于一个用户交互的物品序列来说,有:

给定一个序列模型,该模型的目的就是能够预测在下一个时刻,用户和物品之间的交互可能性,从而筛选出用户最可能交互的物品,即:

具体来说,针对每一个用户,将所有的物品都过一遍得到这个用户对所有物品的交互可能,筛选出其中比较高的分数就作为用户比较想看的内容来推荐出来即可。

相关模型简介

接下来快速讨论两个架构——RNN系列和Attention系列,从某种角度来说,我更倾向将其讨论为并行训练串行推理串行训练串行推理。简单回顾一下一个经典的做法循环神经网络(RNN)

将用户每一次与物品交互的时候都看做是一次状态更新,所以就可以有:

具体来说就是,每次输入之前的历史状态和当前的交互用户,得到的是当前的用户状态,然后当前的用户状态就可以去和物品的嵌入向量做内积,从而得到这一次交互下的用户状态。由于有以前的交互内容在,所以,相当于之前序列的交互信息都传递过来。

SASRec

而在这里,随着Attention的的火热,另一方面,RNN能做的事情,Attention也能够做,所以基于这样的背景,这篇论文提出利用Attention机制来做这个序列推荐。

嵌入层

首先整个背景是一样的,我们有个用户和的物品,每一个有对应的维的嵌入向量。接着,对于一个用户来说,它有其交互序列,也就有对应的序列嵌入向量

接下来,为了能够在Attention中体现物品之间的距离性,比如有的交互物品之间的距离比较远,有的比较近,还需要增加位置编码,注意这个维度也是

所以,整个嵌入层的输入为:

至于这个为什么能够影响物品之间的距离,还需要看后面的计算。不过在具体代码中,这一串位置编码是可学习变量,所以位置的属性相对弱了很多。

基于自注意力的序列信息提取层

当有了这么一个序列以后,我们希望经过某一层网络层后,对于每一个位置都能够参考前面的信息,即,我们希望每一个交互时刻的“状态”都考虑了之前的内容:

这样,之前的输入的信息都被考虑了,使得当前的状态能够更加精准。这一点在RNN中是比较自然地完成的,而在注意力中则没有那么简单,这是因为注意力机制输入以后,对于每一个位置都考虑了所有位置的信息。比如,对于一个用户输入的序列所对应的嵌入向量,做自注意力有,首先有对应的QKV向量:

其中,所以自注意力就有:

其中就是经过自注意力传播后的结果。可以看到,对于某一位置的状态向量来说,此时有:

位置后面的系数 则相当于考虑了后面物品的向量信息;反之,若则不考虑后面物品的信息。

所以,我们只需要构建一个下三角矩阵,即所有 的位置信息才有意义的矩阵,并将其点乘进入到里面,就能够使其满足式(8)的状态,所以就有:


其中是一个对角线和下三角为1,其余为0的矩阵。接着,在这个考虑顺序信息的模块以后,再做一个类似线性变化的FFN,有:

这个得到的就可以被看做是当前的状态。而整个组合起来又变成与之前一样形状的矩阵,所以我们可以把CausalAttentionFFN这两个模块组合起来反复堆叠,使得我们的模型变得更深,从而获得更好的模型性能。随着我们堆叠几次以后,就能够得到最终的状态

PS:在这里省略了一些常见的能够提升泛化性的技巧,比如Dropout,LayerNorm的讨论。

预测层以及模型训练

正如一开始的背景讨论一样,此时的就可以看做是第次交互以后的用户状态,用该状态与物品的嵌入向量进行内积,即利用相似性计算得到交互的可能性有:

对于模型训练来说,采用BPR损失函数进行训练,即对每一刻交互来说,有一个负采样,利用损失函数进行训练:

直观来说,就是让非交互的数值更小,而交互的数值更大,从而训练该模型。

  • 标题: 序列推荐论文介绍——SASRec
  • 作者: Wings
  • 创建于 : 2026-02-14 12:00:00
  • 更新于 : 2026-03-19 10:47:43
  • 链接: https://www.wingslab.top/深度学习/序列推荐论文介绍/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。