一、SASRec [2018]

  1. 序列推荐系统的目标是将用户行为的个性化模型(personalized model)(基于历史活动)与基于用户最近行为的 context 概念相结合。从序列动态 (sequential dynamic)中捕获有用的模式(pattern)具有挑战性,主要是因为输入空间的维度随着作为 context 的历史行为的数量呈指数增长。因此,序列推荐的研究主要关注如何简洁地捕获这些高阶动态(high-order dynamic)。

    马尔科夫链(Markov Chains: MC)是一个典型的例子,它假设 next action仅依赖于前一个(或者前几个)行为,并已成功用于刻画短程(short-range)的 item 转移(transition)从而用于推荐。另一项工作使用循环神经网络(RNN)通过隐状态 summarize 所有先前的行为,从而用于预测 next action 。这两种方法虽然在特定情况下很强大,但是在某种程度上仅限于某些类型的数据。

    • MC-based 方法通过作出强有力的简化假设,在高度稀疏的 setting 中表现良好,但可能无法捕获更复杂场景的复杂动态( intricate dynamic)。

    • 相反,RNN 虽然具有表达能力,但是需要大量数据(特别是稠密数据)才能超越更简单的 baseline

    最近,一种新的序列模型 Transfomer 在机器翻译任务中实现了 SOTA 的性能和效率。与现有的使用卷积模块或循环模块的序列模型不同,Transformer 完全基于一种叫做 self-attention 的注意力机制,该机制非常高效并且能够揭示句子中单词之间的句法模式(syntactic pattern)和语义模式(semantic pattern)。

    受到这种方法的启发,论文 《Self-Attentive Sequential Recommendation》寻求将自self-attention机制应用于序列推荐问题。论文希望这个想法可以解决上述两个问题:一方面能够从过去的所有行为中提取上下文(类似于 RNN),但另一方面能够仅根据少量行为来构建预测(类似于 MC)。具体而言,论文构建了一个 Self-Attention based Sequential Recommendation: SASRec 模型, 该模型在每个 time step 自适应地为先前的 item 分配权重(如下图所示)。

    所提出的模型在几个 benchmark 数据集上显著优于 SOTA 的、MC/CNN/RNN-based 的序列推荐方法。具体而言,论文将模型性能作为数据集稀疏性的函数来进行检查,其中模型性能与前面描述的 pattern 密切相关。由于self-attention机制,SASRec 倾向于在稠密数据集上考虑长期依赖,而在稀疏数据集上关注最近的行为。而这被证明对于自适应地处理不同密度( density)的数据集至关重要。

    此外,SASRec 的核心组件(即 self-attention block)适用于并行加速,从而使得模型比 CNN/RNN-based 的替代方案快一个数量级。此外,论文分析了SASRec 的复杂性和可扩展性,进行了全面的消融研究以展示关键组件的效果,并将注意力权重可视化从而定性地揭示模型的行为。

  2. 相关工作:有一些工作与我们密切相关。在讨论序列推荐之前,我们首先讨论通用推荐(general recommendation),然后是时间推荐(temporal recommendation)。最后我们介绍了注意力机制,尤其是我们模型核心的 self-attention 模块。

    • 通用推荐(General Recommendation):

      • 推荐系统专注于根据历史反馈(如点击、购买、喜欢)来建模用户对 item 的偏好。用户反馈可以是显式的(如评分)或隐式的(如点击、购买、评论)。由于解释 non-observed 数据的模糊性(ambiguity),建模隐式反馈可能具有挑战。

        为了解决这个问题,《Collaborative filtering for implicit feedback datasets》 提出了 point-wise 方法、《BPR: bayesian personalized ranking from implicit feedback》 提出了 pairwise 方法来解决这些挑战。

      • Matrix Factorization: MF 方法试图发现潜在维度来表示用户的偏好和 item 的属性,并通过 user embeddingitem embedding 之间的内积来估计交互。

        此外,另一个方向的工作基于 Item Similarity Models: ISM ,并没有显式地使用潜在因子建模每个用户(如 FISM)。他们学习一个 item-to-item 的相似度矩阵,然后用户对 item 的偏好是通过该 item 与该用户历史交互 item 之间的相似性来衡量。

      • 最近,由于深度学习在相关问题上的成功,深度学习技术已被引入推荐领域。一个方向的工作旨在使用神经网络来抽取 item 特征(如图像特征、文本特征等等)从而进行 content-aware 推荐。

        另一个方向的工作旨在取代传统的 MF。例如 NeuMF 通过多层感知机来估计用户偏好,而 AutoRec 使用自编码器来预测评分。

    • 时间推荐(Temporal Recommendation):追溯到 Netflix Prize 时代,时间推荐通过显式建模用户活动的时间戳,从而在各种任务上显示出强大的性能。

      TimeSVD++ 通过将时间分成若干区间(segment),并在每个区间中分别对用户和 item 进行建模,从而取得了很好的效果。 此类模型对于理解那些表现出显著时间漂移(temporal drift)的数据集(例如,过去 10 年电影偏好如何变化、用户在下午 4 点访问什么样的企业)至关重要。

      序列推荐(或 next-item 推荐)与此不同,因为序列推荐仅考虑操作的顺序,并且建模与时间无关的顺序模式(sequential pattern)。本质上,序列模型试图根据用户最近的活动建模用户行为的 context,而不是考虑 temporal pattern 本身。

    • 序列推荐(Sequential Recommendation):许多序列推荐系统试图建模 item-item 转移矩阵,并将其作为捕获连续 item 之间的序列模式的一种手段。例如,FPMC 融合了一个 MF 项、以及一个 item-item 项从而分别捕获长期偏好和短期转移。本质上,被捕获的短期转移是一阶马尔科夫链(Markov Chain: MC),而高阶马尔科夫链假设 next action 与之前的几个行为有关。由于最近一个访问的 item 通常是影响用户 next action 的最关键因素(本质上是提供 context),因此基于一阶马尔科夫链的方法表现出强大的性能,尤其是在稀疏数据集上。

      还有一些方法采用考虑更多先前 item 的高阶马尔科夫链。具体而言,Convolutional Sequence Embedding: Caser 是一种 CNN-based 方法,将 L 个先前 itemembedding 矩阵视为 image,并运用卷积运算来抽取转移(transition)。

      除了基于马尔科夫链的方法之外,另一个方向的工作采用 RNN 来建模用户序列。利用 GRU4Rec 使用 GRU 建模点击序列从而用于 session-based 推荐,而 《Recurrent neural networks with top-k gains for session-based recommendation》 改进了 GRU4Rec 并进一步提高了 Top-N 推荐的性能。在每个 time stepRNNlast step 的状态和当前行为作为输入。尽管人们已经提出了诸如 session parallelism 之类的技术来提高效率,但是 step 之间的依赖关系使得 RNN 的效率更低。

    • 注意力机制:注意力机制已被证明在各种任务中是有效的。本质上,这种机制背后的思想是:序列输出 sequential output 中的每个输出都依赖于某些输入的 relevant 部分,而这些输入部分是模型应该持续关注的。 基于注意力的方法的额外好处是,方法更容易解释。最近,注意力机制已被引入推荐系统,例如 Attentional Factorization Machine: AFM 学习每个特征交互对于 content-aware 推荐的重要性。

      然而,上面使用的注意力技术本质上是原始模型的附加组件 (additional component),如 attention+RNNattention+FM 等等。最近,一种纯粹基于注意力的 sequence-to-sequence,叫做 Transfomer,在之前 RNN/CNN-based 方法主导的机器翻译任务上实现了 SOTA 的性能和效率。Transformer 模型在很大程度上依赖于所提出的 self-attention 模块来捕获句子中的复杂结构,并检索 relevant word(在 source language)从而生成 next word (在 target language)。

      Transformer 的启发,我们试图建议一个基于 self-attention 方法的、新的序列推荐模型,然而序列推荐问题与机器翻译问题有很大不同因此需要专门设计的模型。

1.1 模型

  1. 令用户集合为 Uitem 集合为 I ,用户 u 的行为序列为 Su=(S1u,S2u,,S|Su|u) 。在序列推荐的 setting 下,给定用户 u 的行为序列 Su ,我们寻求预测 next item 。在训练过程中,在 time step t ,模型根据前面的 titem 来预测 next item (即,第 t+1item )。

    如下图所示,可以方便地将模型的输入视为 (S1u,S2u,,S|Su|1u),并将预期的输出视为相同序列的 shifted 版本:(S2u,,S|Su|u) 。这里我们将描述如何通过一个 embedding layer、若干个 self-attention block、以及一个 prediction layer 来构建序列推荐模型。我们还分析了它的复杂性,并进一步讨论了 SASRec 与相关模型的不同之处。

1.1.1 Embedding Layer

  1. 我们将训练序列 (S1u,S2u,,S|Su|1u) 转换为固定长度的序列 s=(s1,s2,,sn) ,其中 n 为模型能够处理的最大长度。

    • 如果训练序列长度超过 n ,那么我们选择最近的 n 个行为 。

    • 如果训练序列长度小于 n ,那么我们在序列左侧填充 padding item 直到序列长度为 n

      注意,训练序列按照发生时间从远到近的顺序排列,因此 padding item 填充在左侧(代表最远时刻)。

    对于每个 item i 我们学习一个 embedding 向量 viRd ,其中 dembedding 维度。所有 itemembedding 向量构成了 embedding 矩阵 VR|I|×d ,其中第 i 行表示 item iembedding 向量。

    对于序列 sitem stembedding 向量 vst 记做 et 表示序列中第 tpostionitemembedding 。序列 sinput embedding matrix 记做 ERn×d ,第 t 行表示 position titemembedding ,并且对于 padding item 采用常数 0 向量来表示。

  2. Positional Embedding:我们将在后面章节看到,由于 self-attention 模型不包含任何循环模块或卷积模块,因此它对于先前 itemposition 是无感知的。因此,我们将一个可学习的 position embedding 矩阵 PRn×d 注入到 input embedding 中:

    E^=[vs1+p1vs2+p2vsn+pn]Rn×d

    其中:ptRd 为序列中第 tpositionposition embedding,它是 P 的第 t 行。

    我们还尝试了 《Attention is all you need》 中使用的固定的 position embedding ,单发现这在我们的 case 中导致性能更差。我们在实验中定量和定性地分析了 position embedding 的影响。

1.1.2 Self-Attention Block

  1. 《Attention is all you need》 中定义的 scaled dot-product attention 为:

    Attention(Q,K,V)=softmax(QKd)V

    其中:QRM×dk Qquery 矩阵,KRM×dkkey 矩阵,VRM×dvvalue 矩阵。Mitem 数量(每一行代表一个 item),dkquery/key embedding 的维度,dvvalue embedding 的维度,并且 dv 可以与 dk 相等也可以不等。

    直观而言,attention layer 计算所有value 的加权和,其中 query ivalue j 之间的权重与 query ikey j 之间的交互(interaction)有关。比例因子 d 是为了避免内积的值过大(尤其是在维度 d 较高的情况下),使得 softmax 的计算出现数值不稳定从而影响效果。

    也可以用超参数 T 来代替 d ,并根据验证集来调优超参数 T ,这样更灵活。

  2. Self-Attention layer:在机器翻译等 NLP 任务中,注意力机制通常采用 K=V 。最近,《Attention is all you need》 提出了一个 self-attention 方法,它使用相同的对象作为 querykey、以及 value 。在我们的 case 中,self-attention 操作将 embedding E^ 作为输入,通过线性投影将它转换为三个矩阵,然后将投影后的矩阵输入到 attention layer

    H=SA(E^)=Attention(E^WQ,E^WK,E^WV)Rn×d

    其中:

    • WQ,WK,VVRd×d 为待学习的投影矩阵。

    • H 为每个时刻的、经过self-attentionrepresentation ,第 t 行表示第 t 个输出的 representation (对应于time step t )。

    引入投影可以使得模型更加灵活。例如,模型可以学习非对称交互(asymmetric interaction),即 <query i, key j><query j, key i> 可以有不同的交互。

  3. 因果关系(Causality):由于序列的性质,模型在预测第 (t+1)item 时,只能考虑开始的前 titem 。然而,self-attention layer 的第 t 个输出包含后续 itemembedding 的输入信息,这不符合真实的情况。因此,我们通过禁止 j>iqikj 之间的所有连接来修改 attention

    即:key 的时刻不能超过 query 的时刻。

  4. Point-Wise Feed-Forward Network:尽管 self-attention 能够使用自适应权重聚合所有先前 itemembedding,但是它仍然是一个线性模型。为了赋予模型非线性并考虑不同潜在维度之间的交互,我们应用一个 point-wise 的、双层的 feed-forward network: FFN 到所有的 ht 上,1tn1 ,并且双层 FFN 是跨 time step 共享权重的:

    ft=FFN(ht)=W(2)ReLU(W(1)ht+b(1))+b(2)

    其中:W(1),W(2)Rd×d 为待学习的参数矩阵,b(1),b(2)Rd 为待学习的参数向量。

    注意,hthjtj)之间没有交互,这意味着我们仍然阻止了信息泄露(未来信息泄露给历史)。

    注意,这里只有一个 ReLU,为什么?个人猜测是为了方便后面直接接入output layer

1.1.3 Stacking Self-Attention Blocks

  1. 在第一层 self-attention block 之后,ft 基本上聚合了所有先前 itemembedding,即 {e^j}jt 。然而,通过另一个基于 F=[f1,,fn]R(n1)×dself-attention block 来学习更复杂的 item transition 可能是有益的。具体而言,我们堆叠 self-attention block (即,一个 self-attention layer 和一个 FFN),并且第 bblockBb>1)定义为:

    H(b)=SA(F(b1))ft(b)=FFN(ht(b)),b>1,1tn1H(1)=H,F(1)=F
  2. 然而,当网络更深时,有几个问题变得更加严重:

    • 增加的模型容量导致模型过拟合。

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

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

    受到 《Attention is all you need》 的启发,我们执行以下操作来缓解这些问题:

    g~(x)=x+Dropout(g(LayerNorm(x)))

    其中:g(x) 表示 self attention layerFFN

    也就是说,对于 block 中的每个 layer g

    • 我们在输入到 g 之前对输入 x 应用 layer normalization

    • 我们对 g 的输出应用 dropout

    • 此外,我们将输入 x 添加到最终输出。

    我们接下来依次介绍这些操作。

  3. 残差连接(Residual Connections):在某些情况下,多层神经网络已经证明了分层(hierarchically)地学习有意义特征的能力。然而,在提出残差网络之前,简单地添加更多层并不容易得到更好的性能。残差网络背后的核心思想是:通过残差连接将 low-layer 特征传播到更高的层。因此,如果 low-layer 特征有用,模型可以轻松地将它们传播到最后一层。

    同样地,我们假设残差连接在我们的 case 中也很有用。例如,现有的序列推荐方法表明,最近一个访问的 item 对预测 next item 起着关键作用。然而,经过几个 self-attention block 之后,最近一个访问的 itemembedding 与之前的所有 item 纠缠在一起。添加残差连接从而将最近一个访问的itemembedding 传播到最后一层将使模型更容易利用 low-level 信息。

    假设在 time step t 来预测 next item,那么 self attention layer 的残差连接为:

    h~t=et+ht

    这里有一个细节:是采用 et (未考虑 position embedding)、还是采用 e^t (考虑 position embedding)?论文并未提及。这可以通过实验来验证。

  4. Layer Normalizationlayer normalization 用于跨特征对输入进行归一化(即,零均值和单位方差),这有利于稳定和加速神经网络的训练。和 batch normalization 不同, layer normalization 中使用的统计数据独立于同一个 batch 中的其它样本。

    具体而言,假设输入是包含了一个样本中所有特征的向量 x ,则 layer normalization 定义为:

    LayerNorm(x)=αxμσ2+ϵ+β

    其中:

    • 为逐元素乘积(也叫做 Hadamard 积)。

    • μRσR 分别为单个样本 x 中所有元素构成的集合的均值和标准差。

    • α,β 分别为待学习的比例因子和偏置项。

  5. Dropout:为了缓解深度神经网络中的过拟合问题,Dropout 正则化技术已被证明在各种神经网络架构中是有效的。Dropout 的思想很简单:在训练期间以概率 p 随机 turn off 神经元,并在测试期间使用所有神经元。

    除了在 self attention layerFFN 上应用 dropout 之外,我们还在 embedding E^ 上应用了一个 dropout layer

1.1.4 Prediction Layer

  1. Bself-attention block 之后,给定开始的 titem 我们基于 ft(B) 来预测 next item 。具体而言,我们采用一个 MF layer 来预测与 item i 的相关性(relevance):

    ri,t=ft(B)ni

    其中:

    • ri,t 为给定开始的 titem 的条件下,item i 成为 next itemrelevance ,也称作交互分( interaction score)。

    • NR|I|×d 为另一个 item embedding 矩阵。

    因此,一个更高的 ri,t 意味着 item i 更有可能成为 next item 。我们根据 ri,t 排序并生成推荐。

  2. Shared Item Embedding:为了降低模型大小并缓解过拟合,我们考虑在 MF layer 中使用 item embedding V

    ri,t=ft(B)vi

    注意:ft(B) 可以视为一个依赖于 V 的函数:ft(B)=ψ(vs1,,vst)

    使用同一套 item embedding 的一个潜在问题是:它们的内积不能表示非对称的 item 转移,例如 item i 经常在 item j 之后购买(这意味着 vivj 需要与 vjvi 不相等,但是从数学上看这是矛盾的)。因此,像 FPMC 这样的方法倾向于使用异质(heterogeneous)的 item embedding (即,vinjvjni) 。

    然而,我们的模型没有这个问题,因为它学习了非线性变换。例如,FFN 可以通过同一套 item embedding 轻松实现不对称:FFN(vi)vjFFN(vj)vi 。根据经验,使用共享 embedding 显著提高了我们模型的性能。

  3. Explicit User Modeling:为了提供个性化推荐,现有方法通常采用以下两种方法之一:

    • 学习一个显式的 user embedding 从而表达用户的偏好(如 MFFPMCCaser)。

    • 考虑用户之前的行为,并从之前访问的 itemembedding 中导出一个隐式的 user embedding (如 FSIMFossilGRU4Rec)。

    我们的方法属于后者,因为我们通过考虑用户的所有行为来生成 embedding ft(B)。但是,我们也可以在最后一层插入显式的 user embedding,例如:

    ru,i,t=(uu+ft(B))vi

    其中 UR|U|×d 为一个 user embedding 矩阵。

    然而,我们根据经验发现添加显式的 user embedding 并不能提高性能(可能是因为模型已经考虑了所有用户的行为)。

1.1.5 Network Training

  1. 回忆一下我们通过截断或填充从而将每个用户行为序列(排除最后一个行为) (S1u,S2u,,S|Su|1u) 转换为一个固定长度的序列 s=(s1,s2,,sn) 。我们定义 ot 为在时刻 t 预期的 output

    ot={<pad>,if st is a padding itemst+1,1t<n

    其中 <pad> 表示 padding item

    我们的模型以序列 s 作为输入,对应的序列 o=(o1,,on1) 作为预期输出(注意,在时刻 n 我们没有下预期的 next item )。我们采用二元交叉熵损失作为目标函数:

    L=SuS1t<n[logσ(rot,t)+jSulog(1σ(rj,t))]

    其中:S 为所有用户的所有 session 所组成的集合。

    注意,我们忽略当 ot=<pad> 时的损失项。

    上式本质是 softmax 交叉熵损失的负采样版本,它是 pointwise loss。我们也可以考虑 pairwise loss

  2. 网络通过 Adam 优化器进行优化。在每个 epoch 中,我们为每个序列中的每个 time step 随机生成一个 negative item j 。更多实现细节将在后面描述。

1.1.6 复杂度分析

  1. 空间复杂度:我们模型中待学习的参数来自embedding,以及 self-attention layerFFNlayer normalization 中的参数,参数的总数为 O(|I|d+nd+d2) 。和其它方法相比(如 FPMCO(|U|d+|I|)d),我们方法的参数规模是适中的,因为我们方法的参数规模不会随着用户数量的增加而增长,并且在推荐问题中 d 通常很小。

  2. 时间复杂度:我们模型的计算复杂度主要来自于 self-attention layerFFN ,即 O(n2d+nd2) 。主要的复杂度是来自 self-attention layerO(n2d) 。然而,我们模型中的一个方便的特性是:每个 self-attention layer 中的计算是完全可并行的,这适合 GPU 加速。相反,RNN-based 方法(如 GRU4Rec)依赖于 time step (即,time step t 的计算必须等待 time step t1 的结果),这导致在序列操作 O(n) 倍时间。

    我们经验性地发现我们的方法比采用 GPURNN/CNN-based 方法快十倍以上(结果类似于 《Attention is all you need》 中机器翻译任务的结果),并且最大长度 n 可以轻松地扩展到几百(对现有的 benchmark 数据集,n 达到几百通常是足够的)。

    在测试阶段,对于每个用户,在计算 embedding ft(b) 之后,评估过程和标准的 MF 方法相同。评估每个 item 的计算复杂度为 O(d)

  3. 处理长的序列:尽管我们的实验从经验上验证了我们方法的效率,但最终它无法扩展到非常长的序列。我们有望在未来调查一些方向:

    • 使用 restricted self-attention《A time-restricted self-attention layer for asr》),它仅关注最近的行为而不是所有行为,并且可以在更高的 layer 考虑远距离行为 distant action

    • 《Personalized top-n sequential recommendation via convolutional sequence embedding》 中那样将长序列分段 。

  4. 未来工作:

    • 结合丰富的上下文信息(如停留时长、行为类型 action typelocation、设备等等)来扩展模型。

      通过这些上下文信息,我们不仅知道行为序列中每个行为作用的 item,还知道发生该行为的上下文。

    • 研究处理非常长的序列。

1.1.7 讨论

  1. 我们发现 SASRec 可以视为某些经典协同过滤模型的推广(generalization)。我们还在概念上讨论了我们的方法和现有方法如何处理序列建模。

  2. SASRec 可以简化为一些现有模型:

    • Factorized Markov Chains: FMCFMC 分解一阶的 item 转移矩阵,并且依赖于最近的一个 item i 来预测 next item j

      P(ji)vinj

      如果我们将 self-attention block 设为零、使用非共享的 item embedding、并且移除 position embeddingSASRec 将简化为 FMC

      此外,SASRec 还与 Factorized Personalized Markov Chains: FPMC 密切相关,后者融合 MFFMC 从而分别捕获用户偏好和短期动态:

      P(ju,i)[uu||vi]nj

      其中:|| 表示向量拼接。

      遵从上面类似于 FMC 的简化操作,并添加显式的 user embedding (通过向量拼接),SASRec 等效于 FPMC

    • Factorized Item Similarity Models: FISMFISM 通过考虑 item j 与用户之前访问的 item 之间的相似性来估计对 item j 的偏好分数:

      P(ju)(1|Su|iSuvi)nj

      如果我们使用一个 self-attention layer(不包含 FFN)、在 item 上设置均匀的注意力权重(即 1/|Su|) 、使用非共享的 item embedding、并移除 position embeddnig,则 SASRec 将简化为 FISM 。因此,我们的模型可以被视为用于 next item 推荐的自适应的、分层的、序列的 item similarity model

  3. MC-based 推荐:马尔科夫链(Markov Chains: MC)可以有效地捕获局部序列模式(local sequential pattern),它假设next item 仅依赖于前面的 Litem 。现有的 MC-based 的序列推荐方法要么依赖于一阶马尔科夫链(如 FPMC, HRM, TransRec)、要么依赖于高阶马尔科夫链(如 Fossil, Vista, Caser)。基于一阶马尔科夫链方法往往在稀疏数据集上表现最好。相比之下,基于高阶马尔科夫链的方法有两个限制:

    • 需要在训练之前指定马尔科夫链的阶次 L ,而不是自适应地选择。

    • 效率和效果无法很好地随阶次 Lscale ,因此 L 通常很小(例如 L<5 )。

    我们的方法解决了第一个问题,因为 SASRec 可以自适应地关注相关的前面的 item (如,在稀疏数据集上仅关注最近一个 item ,以及在稠密数据集上关注更多的 item )。

    此外,对于第二个问题,我们的模型建模了前面 nitem,并且 n 根据经验可以扩展到数百,在训练时间适度增加的同时取得了性能的显著提升。

  4. RNN-based 推荐:另一个方向的工作使用 RNN 来建模用户行为序列。RNN 通常用于建模序列,但是最近的研究表明:CNNself-attention 在某些序列的 setting 中表现得比 RNN 更强。

    我们的 self-attention based 模型可以从 item similarity model 中推导出来,这是用于推荐的序列建模的合理替代方案。对于 RNN,除了并行计算效率低下外,它们的最大路径长度(从输入节点到相关的输出节点)为 O(n)。相比之下,我们的模型具有 O(1) 的最大路径长度,这有利于学习长程依赖(long-range dependency)。

1.2 实验

  1. 我们进行实验并回答以下几个问题:

    • RQ1SASRec 是否超越了 SOTA 方法(包括 CNN/RNN-based 方法)?

    • RQ2SASRec 架构中各种组件的影响是什么?

    • RQ3SASRec 的训练效率和可扩展性(关于 n 的)如何?

    • RQ4:注意力权重是否能够学到与position 相关的、或者与 item 属性相关的有意义的pattern

  2. 数据集:我们在来自现实世界应用程序的四个数据集上评估我们的方法。数据集在领域(domain)、平台(platform)、稀疏性(sparsity)方面差异很大:

    • Amazon:来自于 Amazon.com 的数据集,其中 Amazon 上的 top-level 产品类别被视为单独的数据集。我们考虑两个类别,美妆(Beauty) 、游戏( Games)。该数据集以高度的稀疏性和可变性(variability)而著称。

    • Steam:来自于一个大型在线视频游戏分发平台 Steam 。数据集包含 2567538 名用户、15474 款游戏、7793069 条英文评论,时间跨度从 201010 月到 20181 月。该数据集还包含可能对未来工作有用的丰富信息,如用户游戏时长(小时)、游戏定价信息、媒体评分(对游戏的评分)、游戏类别 (category)、游戏开发者(developer)等等。

    • MovieLens:用于评估协同过滤算法的、广泛使用的 benchmark 数据集。我们使用包含 100 万用户评分的版本MovieLens-1M

    我们遵循与 《Factorizing personalized markov chains for next-basket recommendation 》《Translation-based recommendation》《Fusing similarity models with markov chains for sparse sequential recommendation》 相同的预处理程序:

    • 对于所有数据集,我们将评论或评分的存在视为隐式反馈(即,用户和 item 的交互),并使用时间戳来确定行为的顺序。

      对于评分,如果太低是不是要移除?否则高分和低分没有差异。

    • 我们丢弃频次低于 5 的用户、以及频次低于 5item

    • 我们将每个用户 u 的历史序列 Su 划分为三部分 :最近的行为 S|Su|u 用于测试、次近的行为 S|Su|1u 用于验证、剩余的行为用于训练。注意,在测试期间,输入序列包括训练行为和验证的行为,即前面的 |Su|1 个行为。

      这个和 GRU4Rec 的不同。在 GRU4Rec 中,仅在用户之间完整的 session 划分数据集(即,user-level),而不对 session 内部进行拆分(即,session-level)。区别在于:

      • user-level 的划分:测试用户是全新的,相当于冷启动cold-start

      • session-level 的划分:测试用户不是全新的,已经在训练期间见过用户前面的 |Su|1 个行为,预测最后一个行为。

    数据集的统计特性参考下表。我们看到:两个 Amazon 数据集的 actions per useractions per item 更少,Steamactions per item 更高,而 MovieLens-1m 是最稠密的数据集。

  3. baseline 方法:我们考虑三组 baseline

    • 第一组 baseline 仅考虑用户反馈而不考虑行为顺序的通用推荐方法(general recommendation method):

      • PopRec:这是一个简单的 baseline,根据 item 的热门程度(即数据集中的频次)对 item 进行排名。

      • Bayesian Personalized Ranking: BPR:是一种从隐式反馈中学习个性化排名的经典方法。biased 的矩阵分解模型作为底层的推荐器( recommender)。

    • 第二组 baseline 包含基于一阶马尔科夫链的序列推荐方法,它考虑最近一个访问的 item

      • Factorized Markov Chains: FMC:一阶马尔科夫链方法。FMC 使用两个 item embedding 来分解 item 转移矩阵,并根据最近一个访问的 item 生成推荐。

      • Factorized Personalized Markov Chains: FPMCFPMC 组合了矩阵分解和分解的一阶马尔科夫链,从而捕获了用户的长期偏好以及 item-to-item 的转移。

      • Translation-based Recommendation: TransRec:一种 SOTA 的一阶序列推荐方法,它将每个用户建模为一个翻译向量( translation vector )从而捕获从current itemnext item 的转移。

    • 最后一组 baseline 包含基于深度学习的序列推荐方法,这些方法考虑了最近访问的一些 item 或者所有访问的item

      • GRU4Rec:一种开创性的、使用 RNN 来建模用户行为序列的 session-based 推荐方法。我们将每个用户的反馈序列视为一个 session

        一个用户只有一个 session 。理论上最好进行时间间隔的拆分,将用户行为序列基于时间间隔拆分为多个 session,使得每个 session 集中体现用户的某个意图。

      • GRU4Rec+GRU4Rec 的改进版本(《Recurrent neural networks with top-k gains for session-based recommendations》),它采用不同的损失函数和采样策略,并在 Top-N 推荐上显示出显著的性能提升。

      • Convolutional Sequence Embeddings: Caser:最近提出的一种 CNN-based 方法,它通过对 L 个最近 itemembedding 矩阵应用卷积运算来捕获高阶马尔科夫链,并实现了 SOTA 的序列推荐性能。

    由于其它序列推荐方法(如 PRME, HRM, Fossil)在类似数据集上的性能逊色于上述 baseline ,因此我们不考虑与它们进行比较。我们也不包含 TimeSVD++, RRN 等时间推荐方法(temporal recommendation method),因为它们的 setting 与我们这里考虑的不同。

  4. 配置:

    • 为了公平地比较,我们使用带 Adam 优化器的 TemsorFlow 来实现 BPR, FMC, TransRec 。对于 GRU4Rec, GRU4Rec++, Caser,我们使用相应作者提供的代码。

    • 对于除了 PopRec 之外所有方法,我们从 {10, 20, 30, 40, 50} 中考虑潜在维度 d

    • 对于 BPR, FMC, FPMC, TransRec,我们考虑 L2 正则化并且正则化系数从 {0.0001, 0.001, 0.01, 0.1, 1} 之间选择。

    • 所有其它超参数和初始化策略都是对应方法的作者所建议的。我们使用验证集调优超参数,如果验证集性能在 20epoch 内没有提高,那么终止训练。

  5. SASRec 实现细节:

    • 对于默认版本的 SASRec 中的架构,我们使用两个 self-attention blockB=2 ),并使用待学习的 positional embedding

    • embedding layerprediction layer 中的 item embedding 是共享的。

    • 我们使用 TensorFlow 实现了 SASRec。优化器是 Adam,学习率为 0.001batch size = 128

    • MovieLens-1mdropout rate = 0.2,而其它三个数据集由于稀疏性因此 dropout rate = 0.5

      数据集越稀疏所以 dropout rate 越大?可能需要进行超参数调优来观察实验效果。

    • MovieLens-1m 的最大序列长度 n=200,其它三个数据集的最大序列长度 n=50

    我们在后面检查 SASRec 的不同变体以及不同超参数的性能。SASRec 的代码公布在 https://github.com/kang205/SASRec

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

    • Hit@10 计算了 ground-truthnext item 出现在推荐列表的 top 10item 比例(分母为推荐列表的个数,即推荐结果中有多少是命中的)。

      注意,由于我们对每个用户仅有一个 test item,因此 Hit@10 相当于 Recall@10 ,并且与Precision@10 成正比(Precision@10 还要除以推荐列表长度,这里是 10)。

    • NDCG@10 是一个position-aware 的指标,它在排名靠前的位置分配更大的权重。

    为了避免对所有 user-item pair 进行大量的计算,我们对每个用户随机采样 100negative item ,并将这些 negative itemground-truth item 进行排名。我们根据这 101item 的排名来评估 Hit@10NDCG@10 指标。

1.2.1 不同方法结果比较

  1. 下表展示了所有方法在四个数据集上的推荐性能(用于回答问题RQ1)。

    • 考虑排除 SASRec 以外的其它方法在所有数据集上的表现,我们发现一种通用模式,即:non-neural 方法((a) ~ (e))在稀疏数据集上表现更好,而神经网络方法((f) ~ (h))在稠密数据集上表现更好。

      这可能是由于神经网络方法具有更多参数来捕获高阶转移(high order transition)(即,它们具有表达能力但是容易过拟合),而精心设计但更简单的模型在高度稀疏的 setting 中更有效。

    • 我们的方法 SASRec 在稀疏数据集和稠密数据集上都优于所有 baseline ,并且相对于最强的 baselineHit Rate 上平均提升 6.9%、在 NDCG 上平均提升 9.6%

      一个可能的原因是我们的模型可以自适应地关注不同数据集上不同范围内的 item(例如,在稀疏数据集上仅关注前一个 item,在稠密数据集上关注更多的 item )。我们在后面内容进一步分析了这种行为。

    在下图中,我们还通过展示 d1050 的变化时所有方法的 NDCG@10 指标,从而分析关键超参数 d 的影响。我们看到我们的模型通常受益于更大的 d 。对于所有数据集,我们的 SASRecd40 时取得令人满意的性能。

1.2.2 消融研究

  1. 由于我们的架构中有许多组件,我们通过消融研究来分析它们的影响(用于回答问题RQ2)。下表显示了我们的默认方法及其 8 个变体在所有四个数据集上的性能(d=50) 。我们将分别介绍这些变体并分析它们的作用:

    • Remove PE(Positional Embedding):没有 positional embedding P,每个 item 的注意力权重仅取决于 item embedding 。也就是说,该模型根据用户过去的行为进行推荐,但是行为的顺序并不重要。

      该变体可能适用于用户行为序列通常较短的稀疏数据集。该变体在最稀疏的数据集 Beauty 上的表现优于默认的模型,但是在其它更稠密的数据集上的表现更差。

      移除 positional embedding 不一定效果下降,主要还是要看数据集的性质。

    • Unshared IE(Item Embedding):我们发现,使用两种 item embedding (非共享的 item embedding )会一致性地损害性能,可能是由于过拟合。

    • Remove RC(Residual Connections):我们发现,移除残差连接之后模型性能显著更差。这大概是因为 lower layer 中的信息(如,最近一个 itemembedding,第一个 blockoutput )无法轻易地传播到最后一层,而这些 lower layer 中的信息对于推荐非常有用,尤其是在稀疏数据集上。

    • Remove Dropout:我们的结果表明,dropout 可以有效地正则化模型从而实现更好的性能,尤其是在稀疏数据集上。结果还暗示了:过拟合在稠密数据集上不严重。

      过拟合在稠密数据集上也比较严重,只是相对稀疏数据集而言不太严重。

      因为稀疏数据集更容易陷入过拟合,因此更需要正则化。

    • Number of blocks

      • 毫不奇怪, 零个 block 的结果较差,因为模型效果仅取决于最近一个 item

      • 带有一个 block 的变体的表现相当不错。

      • 带有两个 block 的变体(即 default 模型)的表现仍然进一步提升,尤其是在稠密数据集上,这意味着 hierarchical self-attention structure 有助于学习更复杂的 item 转移。

      • 带有三个 block 的变体可以获得与 default 模型(即两个 block)相似的性能。

    • Multi-headTransformer 的作者发现使用 multi-head的注意力很有用,它将注意力应用于 K 个子空间(每个子空间都是 d/K 维的)。然而,在我们的 case 中,two head attention 的性能始终比 single-head attention 稍差。这可能是由于我们的问题中的 d 很小,它不适合分解成更小的子空间(在 Transformer 中,d=512 )。

1.2.3 训练效率和可扩展性

  1. 我们评估了我们模型的训练效率的两个方面(用于回答问题 RQ3):训练速度(一个训练 epoch 所花费的时间)、收敛时间(达到令人满意的性能所花费的时间)。我们还根据最大长度 n 检查模型的可扩展性。所有实验均使用单个 GTX-1080 Ti GPU 进行。

  2. 训练效率:下图展示了使用 GPU 加速的、基于深度学习的方法的效率。GRU4Rec 由于性能较差而被省略。为公平比较,CaserGRU4Rec+ 有两种训练选项:使用完整的训练数据、或仅使用最近的 200 个行为(SASRec 中就是使用最近的 200 个行为)。

    • 在计算速度上,SASRec 一个 epoch 的模型更新时间仅为 1.7 秒,比 Caser11 倍(19.1 s/epoch) )、比 GRU4Rec+18 倍(30.7s/epoch)。

    • 在收敛速度上,SASRecML-1M 数据集上大约在 350秒内收敛到最佳性能,而其它模型需要更长的时间。

    • 我们还发现,使用完整数据可以提高 CaserGRU4Rec+ 的性能。

  3. 可扩展性:与标准 MF 方法一样,SASRec 与用户总数、item 总数、action 总数呈线性关系。一个潜在的可扩展性问题是最大长度 n ,但是计算可以有效地采用 GPU 并行化。这里我们测量 SASRec 在不同 n 的训练时间和性能,从而研究 SASRec 的可扩展性,并分析它是否可以在大多数情况下处理序列推荐。

    下表显示了具有不同序列长度的 SASRec 的性能和效率。

    • 较大的 n 的性能会更好,在 n=500 左右时性能会达到饱和(可能是因为这个长度已经覆盖了 99.8% 的行为序列)。

    • 然而,即使 n=600,模型也可以在 2000 秒内完成训练,这仍然比 CaserGRU4Rec+ 更快。

    因此,我们的模型可以轻松地扩展到多达数百个行为的用户行为序列,这适用于典型的评论数据集和购买数据集。我们计划在未来研究处理非常长的序列的方法。

1.2.4 可视化

  1. 回想一下,在 time step t ,我们模型中的 self-attention 机制根据前面 titemposition embeddingitem embedding 自适应地为它们分配权重。为了回答 RQ4,我们检查所有训练序列,并通过展示 position 上的平均注意力权重、以及 item 之间的平均注意力权重来揭示有意义的pattern

  2. position 上的注意力:下图展示了最近 15time step 在最近 15position 上的平均注意力权重的四种热力图。注意,我们在计算平均权重时,分母是有效权重的个数,从而避免短序列中 padding item 的影响。

    我们考虑了不同热力图之间的一些比较:

    • (a) vs (c):这种比较表明:

      • 对于稀疏数据集 BeautySASRec 倾向于关注更近(more recent)的 item

      • 对于稠密数据集 ML-1MSASRec 倾向于关注不那么近(less recent)的 item

      这是使我们的模型能够自适应地处理稀疏数据集和稠密数据集的关键因素,而现有方法往往仅侧重于某一头。

      即,表明我们的 self-attention 机制的行为是自适应的。

    • (b) vs (c):这种比较展示了使用 positional embedding: PE 的效果。

      • 没有 positional embedding (即,(b),注意力权重基本上均匀分布在先前的 item 上。

      • positional embedding(即,(c),也是默认的模型),模型对 position 更敏感,因为模型倾向于关注最近的 item

      即,表明我们的 self-attention 机制的行为是position-aware 的。

    • (c) vs (d):由于我们的模型是分层(hierarchical)的,这里展示了不同 block 之间的注意力是如何变化的。显然, high layer 的注意力往往集中在更近(more recent)的position上。这大概是因为第一个 self-attention block 已经考虑了所有之前的 item,而第二个 block 不需要考虑很远的 position

      即,表明我们的 self-attention 机制的行为是hierarchical 的。

      此外,既然第二个 block 不需要考虑很远的 position,那么是否使用简单的 last representation 就可以?毕竟 self-attention block 的计算复杂度比直接引入 last representation 更高。

    总而言之,可视化表明我们的 self-attention 机制的行为是自适应的、position-aware 的、以及 hierarchical 的。

  3. item 之间的注意力:展示几个精心挑选的 item 之间的注意力权重可能没有统计学意义。在 MovieLens-1M 上,每部电影都有多个类别。为了进行更广泛的比较,我们随机选择两个不相交的集合,每个集合包含来自 4 个类别的 200 部电影:科幻( Sci-Fi)、浪漫(Romance)、动画( Animation)、恐怖(Horror) (注,这两个集合共享相同的四个类别)。第一个集合用于 query,第二个集合用于 key

    下图展示了两个集合内不同 item 之间的平均注意力权重的热力图(item 粒度的,而不是类别粒度的),每个集合内的 item 根据类别进行分组。我们可以看到:热力图大概是一个块对角矩阵( block diagonal matrix),这意味着注意力机制可以识别相似的 item (如,同一个类别的 item),并倾向于在相似 item 之间分配更大的权重( SASRec 事先不知道类别,我们也没有将 item 类别作为特征馈入模型)。