SASRec(2017):基于自注意力的transformer序列推荐

0、前言

最近学习了一下推荐算法,这篇经典的推荐算法Self-Attentive Sequential Recommendation,当年transformer一出来就被应用在了推荐算法领域中,论文阅读下来整体不难,感觉也没有太大的创新点,最大的创新点可能就是将transformer从机器翻译领域应用在了推荐领域。

接下来是我的学习笔记,当然在此之前借鉴了很多其他优秀博主的相关分享,具体有哪些我也不太记得了,总之笔记是我自己总结的,也免费分享给大家。

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

论文原版代码:GitHub - kang205/SASRec: SASRec: Self-Attentive Sequential Recommendation

pytorch实现:GitHub - pmixer/SASRec.pytorch: PyTorch(1.6+) implementation of https://github.com/kang205/SASRec 后面我也会专门写一篇自己的复现笔记,在源代码的基础上进行注释解析以及改进。

最近,一种新的序列模型transformer在机器翻译任务中实现了最先进的性能和效率。 与现有的使用卷积或循环模块的顺序模型不同,Transformer完全基于一种被称为“自我注意”的注意机制,这种机制非常高效,能够发现句子中单词之间的句法和语义模式。

受此方法的启发,我们寻求将自注意机制应用于顺序推荐问题。 我们希望这个想法可以解决上面列出的两个问题,一方面能够从过去的所有动作中提取上下文(如rnn),另一方面能够根据少数动作(如mc)构建预测。 具体来说,我们构建了一个基于自注意的顺序推荐模型(SASRec),该模型在每个时间步骤自适应地为以前的项目分配权重(图1)。

在多个基准数据集上,该模型显著优于当前基于MC/CNN/ rnn的顺序推荐方法。 特别是,我们将性能作为数据集稀疏性的函数进行检查,其中模型性能与上述模式密切相关。 由于自关注机制,SASRec倾向于考虑对密集数据集的长期依赖,同时关注稀疏数据集上的最新活动。 这对于自适应处理不同密度的数据集至关重要。

注意力机制已被证明在各种任务中都是有效的,例如图像字幕和机器翻译等。 从本质上讲,这种机制背后的想法是,顺序输出(例如)每个都依赖于模型应连续关注的某些输入的“相关”部分。 另一个好处是基于注意力的方法通常更容易解释。 最近,注意力机制已被纳入推荐系统中。 例如,注意力分解机(AFM)学习每个特征交互对于内容感知推荐的重要性。

然而,上面使用的注意力技术本质上是原始模型的附加组件(例如注意力+RNN、注意力+FM等)。 最近,一种纯粹基于注意力的序列到序列方法 Transfomer  在机器翻译任务上实现了最先进的性能和效率,而这些任务之前是由基于 RNN/CNN 的方法主导的。  Transformer 模型在很大程度上依赖于所提出的“自注意力”模块来捕获句子中的复杂结构,并检索相关单词(源语言)以生成下一个单词(目标语言)。 受 Transformer 的启发,我们寻求基于自注意力方法构建一种新的顺序推荐模型,尽管顺序推荐的问题与机器翻译有很大不同,并且需要专门设计的模型。

在训练过程中,在时间步 t,模型根据前 t 个项目预测下一个项目。可以方便地将模型的输入视为{S1,S2,S3.....Sn-1},并将其预期输出视为同一序列的“移位”版本{S2,S3,S4....Sn}

1、Embedding Layer嵌入层

我们变换训练序列(Su 1, Su 2,… , Su| Su|−1)生成定长序列s = (s1, s2,…) , sn)

其中n表示我们的模型可以处理的最大长度。 如果序列长度大于n,我们只考虑最近的n个动作。

如果序列长度小于n,则采用0在左边进行填充,直至长度为n。

经过Embedding操作得到物品的向量矩阵M∈R|I|×dI是物体集合,d是潜在维数

对于每一个用户行为序列,都可以检索得到Embedding输入向量E∈Rn×d,其中Ei = Msi

Positional Embedding位置嵌入:正如我们将在下一节看到的,由于自注意模型不包括任何循环或卷积模块,它不知道以前项目的位置。 因此我们在输入嵌入中注入一个可学习位置嵌入P∈Rn×d:

此时的E^就是模型训练时候的输入矩阵。

与Transformer不同的就是,这里的P矩阵是跟随模型一起训练得到的,并不是手动设计的了。(作者说尝试了那种方式,效果不太好)。那这显然就引入了SASRec的一个弊端,这种跟随模型学到的矩阵P,并不能处理长列,可扩展性不强,在实际系统中基本无法确定n的长度。

2、Self-Attention Block自注意力块

缩放点积注意力(scaled dot-product attention)定义为:

其中Q代表查询,K代表键,V代表值(每行代表一个项)。 直观上,注意层计算所有值的加权和,其中查询i与值j之间的权重与查询i与键j之间的交互有关。比例因子√d是为了避免内积值过大,特别是在维数较高的情况下。在NLP中,一般K=V

在自注意力方法中,Q,K,V 都来自同一对象。在本文中,对输入矩阵E^通过线性投影转化为三个矩阵,并使用于上述注意力函数:

投影使模型更加灵活。 可以学习不对称交互<query i, key j>和<query j, key i>可以具有不同的交互。其中WQ, WK, WV∈Rd×d是线性投影矩阵,最后得到的Q, K, V∈Rn×d,具体见下图:

由于序列的性质,模型在预测第 (t + 1) 个项目时应仅考虑前 t 个项目。 然而,自注意力层的第 t 个输出包含后续项目的嵌入,这使得模型不适定。 因此对于Qi 和 Kj,当i < j的时候,Q是查询向量,不能与之后的历史物品的信息进行交互,应该禁止该情况的交互 。

Point-Wise Feed-Forward Network(FFN:虽然 selfattention 能够通过自适应权重聚合所有先前项目的嵌入,但最终它仍然是一个线性模型。 为了赋予模型非线性并考虑不同潜在维度之间的相互作用,我们对所有 Si 同样应用点式两层前馈网络(共享参数):


 

3、Stacking Self-Attention Blocks堆叠自注意力块

叠加多个自注意力机制层能够学习更复杂的特征转换,第[b]个自注意力block定义为:

 其中第 1 个块定义为 S(1) = S 和 F(1) = F。

然而,当网络更深时,几个问题变得更加严重:

1)模型容量的增加导致过拟合; 

2)训练过程变得不稳定(由于梯度消失等); 

3)具有更多参数的模型通常需要更多的训练时间。

因此,在自注意力机制层和前馈网络(加入残差连接、Layer Normalization、Dropout)来抑制模型的过拟合。(其实依旧与Transformer类似)

其中g(x)表示自注意力层或前馈网络。 也就是说,对于每个块中的层 g,我们在输入 g 之前对输入 x 应用层归一化,对 g 的输出应用 dropout,并将输入 x 添加到最终输出。

4、Prediction Layer 预测层

在经过b个self-attention block之后,用户行为中的信息得到有效的提取,即Ft(b),模型最终的目标是预测下一个用户感兴趣的物品,因此,作者通过一个MF层来预测物品i的相关性:

其中 ri,t 是给定前 t 个项目(即 s1、s2、...、st)的情况下项目 i 作为下一个项目的相关性,并且 N ∈ R|I|×d 是项目嵌入矩阵,其实就是之前的M矩阵,这里N应该指的是一个已经训练好的物品Embedding矩阵。 因此,高交互分数 ri,t 意味着高相关性,我们可以通过对分数进行排名来生成推荐。

Shared Item Embedding共享项目嵌入:为了减小模型大小并减轻过度拟合,我们考虑另一种仅使用单个项目嵌入 M 的方案: 根据经验,使用共享项目嵌入可以显着提高我们模型的性能。

5、Network Training模型训练

通过截断或填充项将每一个用户行为序列转化成s = {s1, s2, …, st},定义输出Ot为时间步 t 的预期输出,其中 <pad> 表示填充项。 模型以序列 s 作为输入,对应的序列 o 符合预期

文章在选取数据集也很严谨。选择了两个稀疏数据集(Amazon-Beauty、Amazon-Games)、物品平均交互多,用户平均交互少的Steam和密集型数据集(Movielens-1m),内容如下所示:

6、Evaluation Metrics评估指标

我们采用两个常见的 Top-N 指标,Hit Rate@10 和 NDCG@10,来评估推荐性能。 

由于每个用户只有一个测试项,因此 Hit@10 相当于 Recall@10,并且与 Precision@10 成正比。

为了避免对所有用户-项目对进行大量计算,对于每个用户 u,我们随机抽取 100 个负项,并将这些项与真实项进行排名。 根据这101个项目的排名,可以评估Hit@10和NDCG@10。

在推荐系统中,Hit Rate@10 和 NDCG@10 是两个常用的评估指标,它们用于衡量推荐列表在前10个推荐项中的表现。下面是这两个指标的具体含义:

1. Hit Rate@10:

   定义:Hit Rate@10(在前10个推荐中的命中率)是指在推荐列表的前10个推荐项中,至少有一个是用户实际感兴趣的(即用户点击或购买的)的比例。这个指标衡量的是推荐系统能否在前10个推荐中至少命中一个用户感兴趣的项目。

   应用:这个指标简单直观,常用于评估推荐系统的准确性,尤其是在用户可能对多个项目感兴趣的情况下。它是一个二元指标,关注的是推荐列表中是否有用户感兴趣的项目,而不是这些项目的排序。

2. NDCG@10:

   定义:Normalized Discounted Cumulative Gain@10(归一化折扣累积增益@10)是一个更复杂的指标,它不仅考虑了推荐列表中用户感兴趣的项目,还考虑了这些项目的排名。NDCG@10通过为列表中的每个项目分配一个分数(通常是项目的相关性),然后根据项目的排名对这些分数进行折扣,最后对折扣后的分数进行累积,得到一个值。这个值会被归一化,以便与理想情况下的最大值进行比较。

   计算:NDCG的计算涉及到对每个推荐项目的相关性进行评分(例如,1表示完全相关,0表示不相关),然后对每个位置的项目分数进行折扣(通常使用对数折扣函数),最后将折扣后的分数累加并归一化。

   应用:NDCG@10是一个综合指标,它不仅衡量推荐系统能否推荐出用户感兴趣的项目,还考虑了这些项目的排序质量。一个高的NDCG@10值意味着推荐系统不仅能够推荐出用户感兴趣的项目,而且这些项目在推荐列表中的位置也更靠前,即推荐系统能够更好地预测用户的偏好。

7、模型性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值