返回介绍

数学基础

统计学习

深度学习

工具

Scala

二十二、BERT4Rec [2019]

发布于 2023-07-17 23:38:23 字数 109707 浏览 0 评论 0 收藏 0

  1. 准确描述用户的兴趣是有效推荐系统的核心。在许多现实世界的 application 中,用户当前的兴趣本质上是动态dynamic的和演变evolving的,受到用户的历史行为的影响。例如,一名用户可能在购买一个 Nintendo Switch 后不久就购买配件(如,Joy-Con 控制器),然而该用户在正常情况下不会购买 console 配件。

    为了建模用户行为中的这种序列动态 sequential dynamics,人们已经提出了各种方法来根据用户的历史交互historical interactions进行序列推荐sequential recommendations。这些方法的目标是:预测用户在给定该用户历史交互的情况下,该用户接下来可能交互的下一个 item 。最近,大量工作采用序列神经网络sequential neural networks,如 Recurrent Neural Network: RNN ,用于序列推荐并获得有前景的结果。先前工作的基本范式是:使用从左到右的序列模型将用户的历史交互编码为向量(即,用户偏好的 hidden representation),并基于该 hidden representation 进行推荐。

    尽管它们的流行性和有效性,BERT4Rec 的作者认为这种从左到右的单向模型不足以学到用户行为序列的最佳representation

    • 如下图 (c)(d) 所示,主要限制是:对于历史行为序列中 item ,此类单向模型限制了 itemhidden representation 的能力,其中每个 item 只能对来自 previous items 的信息进行编码。

    • 另一个限制是:以前的单向模型最初是针对具有自然顺序natural order 的序列数据 sequential data引入的,如文本序列数据text series data、时间序列数据time series data。它们通常假设数据上的严格排序的序列 ordered sequence ,这对于真实世界的 application 并不总是正确的。

      事实上,由于各种不可观察unobservable的外部因素,用户历史交互中的 item 选择可能不遵循严格的顺序假设 order assumption 。在这种情况下,在用户行为序列建模中同时结合来自两个方向的上下文 context 至关重要。

    为了解决上述限制,BERT4Rec 寻求使用双向模型来学习用户历史行为序列的 representation 。具体而言,受 BERT 在文本理解方面的成功所启发,《BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer》提出将深度双向自注意力模型deep bidirectional self-attention model应用于序列推荐,如上图 (b) 所示。在 representation power 方面,深度双向模型在文本序列建模任务上的优异结果表明:将双向的上下文结合起来对sequence representations learning 是有益的。对于严格的顺序假设,BERT4Rec 比单向模型更适合建模用户行为序列,因为双向模型中的所有 item 都可以利用左右两个方向的上下文。

    然而,为序列推荐训练双向模型并不简单,也不直观。传统的序列推荐模型通常通过预测输入序列中每个位置的 next item 来从左到右进行训练。如上图所示,在深度双向模型中同时联合调节jointly conditioning左侧和右侧的上下文,会导致信息泄露,即允许每个位置间接 see the target item 。这可能会使预测未来变得没有价值,并且网络不会学到任何有用的东西。

    为了解决这个问题,BERT4Rec 引入了完形填空任务Cloze task 来代替单向模型中的目标(即,序列地预测 next item)。具体而言,BERT4Rec 在输入序列中随机地mask 一些 item (即,用特殊 token [mask] 来替换它们),然后根据它们周围的上下文来预测这些 masked itemid。 通过这种方式,BERT4Rec 通过允许输入序列中每个 itemrepresentation 同时融合左侧和右侧上下文,从而避免信息泄露并学习 bidirectional representation mode 。除了训练双向模型之外,完成填空目标的另一个优点是:它可以产生更多的样本来在多个 epoch 中训练更强大的模型。

    例如,完形填空目标可以 mask 掉一个 item,也可以一次 mask 掉多个 item 。而传统的 session-based 推荐一次只能预测一个目标。

    然而,完形填空任务的一个缺点是:它与最终任务(即序列推荐)不一致。为了解决这个问题,在测试过程中,我们在输入序列的末尾附加了特殊的 token [mask] 来指示我们需要预测的 item,然后根据其 final hidden vector 进行推荐。对四个数据集的广泛实验表明,我们的模型始终优于各种 state-of-the-art baselines

    即,测试期间用 [mask] 替代 target item

    论文的贡献如下:

    • 作者提出通过完形填空任务用双向自注意力网络来建模用户行为序列。据作者所知,这是第一个将深度双向序列模型和完形填空目标引入推荐系统领域的研究。
    • 作者将BERT4Recstate-of-the-art 的方法进行比较,并通过对四个 benchmark 数据集的定量分析证明双向架构和完形填空目标的有效性。
    • 作者进行了一项全面的消融研究,从而分析所提出模型中关键组件的贡献。
  2. 相关工作:这里我们简要回顾与我们密切相关的几个工作,包括通用推荐general recommendation、序列推荐、以及注意力机制。

    • 通用推荐:推荐系统的早期工作通常使用协同过滤 Collaborative Filtering: CF 从而根据用户的交互历史来建模用户偏好。

      在各种协同过滤方法中,矩阵分解 Matrix Factorization: MF 是最流行的一种,它将用户和 item 投影到一个共享的向量空间中,并通过 user 向量和 item 向量之间的内积来估计用户对 item 的偏好。

      协同过滤的另一个方向是 item-based 邻域方法。它通过使用预计算precomputeditem-to-item 相似度矩阵,通过测量目标 item 与用户交互历史中的 item 的相似性从而评估用户对目标 item 的偏好。

      最近,深度学习已经极大地改变了推荐系统。早期的先驱工作是用于协同过滤的两层Restricted Boltzmann Machine: RBM,在 Netflix Prize 中由论文 《Restricted Boltzmann Machines for Collaborative Filtering》 提出。

      • 基于深度学习的一个方向旨在通过将从辅助信息(如文本、图像、声音)中学到的 distributed item representation 集成到协同过滤模型中,从而提高推荐性能。
      • 基于深度学习的另一个方向试图取代传统的矩阵分解模型。例如,Neural Collaborative Filtering: NCF 通过多层感知机而不是内积来估计用户偏好,而 AutoRecCDAE 使用自编码器框架来预测用户的评分。
    • 序列推荐:不幸的是,上述方法都不适用于序列推荐,因为它们都忽略了用户行为的顺序 order

      早期的序列推荐工作通常使用马尔科夫链 Markov chain: MC,从而从用户历史交互中捕获序列模式 sequential pattern 。例如:

      • 《An MDP-Based Recommender System》recommendation generation 形式化为序列优化问题 sequential optimization problem ,并采用马尔科夫决策过程 Markov Decision Processe: MDP 来解决它。
      • 后来,《Factorizing Personalized Markov Chains for Next-basket Recommendation》 结合 马尔科夫链和矩阵分解的能力,通过分解个性化马尔科夫链 Factorizing Personalized Markov Chain: FPMC 来建模序列行为和通用兴趣。
      • 除了一阶马尔科夫链之外,《Translation-based Recommendation》《Fusing Similarity Models with Markov Chains for Sparse Sequential Recommendation》 还采用高阶马尔科夫链来考虑更多 previous items

      最近,RNN 及其变体 Gated Recurrent Unit: GRULong Short-Term Memory: LSTM 在建模用户行为序列方面变得越来越流行。这些方法的基本思想是:将用户以前的记录通过各种循环架构和损失函数,编码为一个向量(即,用于执行预测的、用户偏好的 representation),包括具有 ranking losssession-based GRUGRU4Rec)、Dynamic REcurrent bAsket Model: DREAMuser-based GRU《Sequential User-based Recurrent Neural Network Recommendations》)、attention-based GRUNARM)、以及具有新的损失函数(即 BPR-maxTOP1-max )和改进的采样策略的 improved GRU4Rec《Recurrent Neural Networkswith Top-k Gains for Session-based Recommendations)。

      除了循环神经网络recurrent neural network之外,人们还引入了各种深度学习模型来进行序列推荐。例如:

      • 《Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding》 提出了一个卷积序列模型 Caser ,它同时使用水平卷积滤波器和垂直卷积滤波器来学习序列模式。
      • 《Sequential Recommendation with User Memory Networks》《Improving Sequential Recommendation with Knowledge-Enhanced Memory Networks》 使用 Memory Network 来改善序列推荐。
      • STAMP 使用具有注意力的 MLP 网络来同时捕获用户的通用兴趣general interest和当前兴趣 current interest
    • 注意力机制:注意力机制在建模序列数据方面显示出巨大的潜力,例如机器翻译和文本分类。最近,一些工作尝试使用注意力机制来提高推荐性能和可解释性。例如,NARM 将注意力机制融合到 GRU 中,从而在 session-based 推荐中同时捕获用户的序列行为和主要意图 main purpose

      上述工作基本上将注意力机制视为原始模型的附加组件 additional component 。相比之下,TransformerBERT 仅建立在 multi-head self-attention 之上,并且在文本序列建模上取得了 state-of-the-art 结果。最近,人们越来越热衷于应用单纯的 attention-based 神经网络来建模序列数据,从而提高模型的效果和效率 effectiveness and efficiency。对于序列推荐,《Self-Attentive Sequential Recommendation》 引入了一个名为 SASRec 的、两层的 Transformer 解码器(即,Transformer 语言模型)来捕获用户的序列行为,并在几个公共数据集上实现了 state-of-the-art 的结果。SASRec 与我们的工作密切相关。然而,它仍然是一个使用因果注意力掩码 casual attention mask 的单向模型。而我们使用双向模型在完形填空任务的帮助下,编码用户的行为序列。

22.1 模型

  1. 问题定义:令U={u1,u2,,u|U|}$ \mathcal U=\{u_1,u_2,\cdots,u_{|\mathcal U|}\} $ 为用户集合,V={v1,v2,,v|V|}$ \mathcal V=\{v_1,v_2,\cdots,v_{|\mathcal V|}\} $ 为 item 集合。Su=[v1(u),,vt(u),,vnu(u)]$ \mathcal S_u=\left[v_1^{(u)},\cdots,v_t^{(u)},\cdots,v_{n_u}^{(u)}\right] $ 为用户u$ u $ 的历史交互序列 interaction sequence(按时间顺序排列),vt(u)V$ v_t^{(u)}\in \mathcal V $ 为用户u$ u $ 在 time stept$ t $ 交互的 itemnu$ n_u $ 为用户u$ u $ 的历史交互序列的长度。

    给定历史交互序列Su$ \mathcal S_u $ ,序列推荐旨在预测用户u$ u $ 在 time stepnu+1$ n_u+1 $ 即将交互的 item。该问题可以形式化为:建模用户u$ u $ 在 time stepnu+1$ n_u + 1 $ 所有可能交互的 item 的概率:

    p(vnu+1(u)=vSu)
  2. 这里我们介绍了一种新的序列推荐模型,称作 BERT4RecBERT4Rec 采用来自 TransformerBidirectional Encoder Representation 来完成一个新任务,即序列推荐。BERT4Rec 建立在流行的 self-attention layer (即,Transformer layer)的基础之上。

    如下图 (b) 所示,BERT4RecL$ L $ 个双向 Transformer layer 堆叠而成。在每一层,BERT4Rec 通过 Transformer layer 并行地修改每个位置的 representation ,这种修改是通过交换前一层所有位置的信息来实现的。不像图 (d)RNN-based 方法那样 step-by-step 地学习 forward 相关的信息,self-attention 机制赋予 BERT4Rec 直接捕获任何距离的依赖关系的能力。这种机制导致全局感受野,而像 Caser 这样的 CNN-based 方法通常具有有限的感受野。此外,与 RNN-based 方法相比,self-attention 可以直接并行化。

    比较下图 (b), (c), (d) ,最明显的区别是:SASRec-basedRNN-based 方法都是 left-to-right 的单向结构,而我们的 BERT4Rec 使用双向自注意力来建模用户的行为序列。通过这种方式,我们提出的模型可以获得用户行为序列更强大的 representation ,从而提高推荐性能。

22.1.1 Transformer Layer

  1. 如上图 (b) 所示,给定长度为t$ t $ 的输入序列,我们通过应用 《Attention is All you Need》 中的 Transformer layer ,在每一层l$ l $ 同时迭代计算在每个位置i$ i $ 处的 hidden representationhi(l)Rd$ \mathbf{\vec h}_i^{(l)}\in \mathbb R^d $ ,其中d$ d $ 为 representation 维度。这里,我们将hi(l)$ \mathbf{\vec h}_i^{(l)} $ 堆叠起来得到矩阵H(l)Rd×t$ \mathbf H^{(l)}\in \mathbb R^{d\times t} $ ,因为我们在实践中同时计算所有位置的注意力函数(而不是 step-by-step 地计算)。

  2. 如上图 (a) 所示,Transformer layer Trm 包含两个子层:一个 Multi-Head Self-Attention 子层、一个 Position-wise Feed-Forward Network

  3. Multi-Head Self-Attention :注意力机制已经成为各种序列建模任务中不可或缺的一部分,它允许捕获 representation pair 之间的依赖关系,而无需考虑 representation pair 在序列中的距离。 以前的工作表明,联合处理来自不同位置的、不同 representation 子空间的信息是有益的。因此,我们在这里采用 multi-head self-attention 而不是执行单个注意力函数。具体而言:

    • multi-head attention 首先将H(l)$ \mathbf H^{(l)} $ 线性投影到h$ h $ 个子空间中,使用不同的、可学习的线性投影。
    • 然后并行采用h$ h $ 个注意力函数来生成 output representation
    • 最后这h$ h $ 个 output representation 被拼接成单个 representation 并再次进行线性投影。
    headi=Attention(WQ,i(l)H(l),WK,i(l)H(l),WV,i(l)H(l))MH(H(l))=WO(l)[head1;head2;;headh]

    其中:

    • 每个 head 的投影矩阵WQ,i(l)Rd/h×d,WK,i(l)Rd/h×d,WV,i(l)Rd/h×d$ \mathbf W_{Q,i}^{(l)}\in \mathbb R^{d/h\times d},\mathbf W_{K,i}^{(l)}\in \mathbb R^{d/h\times d},\mathbf W_{V,i}^{(l)}\in \mathbb R^{d/h\times d} $ 以及线性投影矩阵WO(l)Rd×d$ \mathbf W_{O}^{(l)}\in \mathbb R^{d\times d} $ 都是可学习的参数。

    • [;]$ [\cdot;\cdot] $ 为向量拼接,这里的 Attention() 函数是 Scaled Dot-Product Attention

      Attention(Q,K,V)=Vsoftmax(QKd/h)Rd×t

      其中:queryQ$ \mathbf Q $ 、keyK$ \mathbf K $ 、valueV$ \mathbf V $ 从相同的矩阵H(l)$ \mathbf H^{(l)} $ 以学到的不同的投影矩阵来投影得到。引入温度d/h$ d/h $ 是为了产生更平缓的注意力分布,从而避免极小的梯度。

      注意:由于这里的VRd×t$ \mathbf V\in \mathbb R^{d\times t} $ ,而QKRt×t$ \mathbf Q^\top\mathbf K\in \mathbb R^{t\times t} $ ,因此V$ \mathbf V $ 在左侧。

  4. Position-wise Feed-Forward Network:如前所述,自注意力子层主要基于线性投影。为了赋予模型非线性 nonlinearity、以及不同维度之间的交互 interaction ,我们将 Position-wise Feed-Forward Network 应用于注意力子层的输出,在每个位置独立separately 地、且等同地 identically 应用。

    Position-wise Feed-Forward Network 由两个仿射变换组成,中间有一个Gaussian Error Linear Unit: GELU 激活函数:

    GELU(x)=xΦ(x)FFN(x)=W2(l)(GELU(W1(l)x+b1(l)))+b2(l)RdPFFN(H(l))=[FFN(h1(l));;FFN(ht(l))]Rd×t

    其中:

    • Φ(x)$ \Phi(x) $ 是标准高斯分布的累积分布函数。
    • W1(l)R4d×d,W2(l)Rd×4d,b1(l)R4d,b2(l)Rd$ \mathbf W^{(l)}_1 \in \mathbb R^{4d\times d},\mathbf W^{(l)}_2\in \mathbb R^{d\times 4d},\mathbf{\vec b}^{(l)}_1\in \mathbb R^{4d},\mathbf{\vec b}^{(l)}_2\in \mathbb R^{d} $ 为可学习的参数,并且跨所有位置共享。

    在这项工作中,遵循 OpenAI GPTBERT 的工作,我们使用更平滑的 GELU 激活函数而不是标准的 ReLu 激活函数。

    注意,这里通过W1(l)$ \mathbf W_1^{(l)} $ 将 representation 先膨胀,然后再通过W2(l)$ \mathbf W_2^{(l)} $ 执行压缩。

  5. 堆叠 Transformer Layer:如前所述,我们可以使用 self-attention 机制轻松地捕获整个用户行为序列中的 item-item 交互。通过堆叠 self-attention layer 来学习更复杂的 item transition pattern 通常是有益的。然而,随着网络的加深,网络变得更加难以训练。因此,我们在两个子层的每个子层周围使用一个残差连接,然后是 layer normalization ,如上图 (a) 所示。

    此外,我们还将 dropout 应用于每个子层的输出,dropout 发生在 layer normalize 之前。即,每个子层的输出为:LN(x+Dropout(sublayer(x)))$ \text{LN}\left(\mathbf{\vec x} + \text{Dropout}\left(\text{sublayer}\left(\mathbf{\vec x}\right)\right)\right) $ ,其中:

    • sublayer()$ \text{sublayer}\left(\cdot\right) $ 是子层自己实现的函数,如多头自注意力函数 MH() 、或逐位置的前向反馈网络 PFFN()
    • LN()$ \text{LN}(\cdot) $ 是 layer normalization 函数。我们使用 LN 对同一层中的所有隐单元的输入进行归一化,从而稳定和加速网络训练。

    总之,BERT4Rec 将每一层的 hidden representation 调整为:

    A(l1)=LN(H(l1)+Dropout(MH(H(l1))))Trm(H(l1))=LN(A(l1)+Dropout(PFFN(A(l1))))H(l)=Trm(H(l1)),i[1,2,,L]

22.1.2 Embadding Layer

  1. 如前所述,由于没有任何递归模块或卷积模块,因此 Transformer layer Trm 不知道输入序列的顺序 order 。为了利用输入的序列信息,我们将 Positional Embedding 注入到 Transformer layer stack 底部的 input item embedding 中。对于给定的 itemvi$ v_i $ ,它的 input representationhi(0)$ \mathbf{\vec h}_i^{(0)} $ 是通过对相应的 item embeddingpositional embedding 相加得到:

    hi(0)=ei+pi

    其中:eiRd$ \mathbf{\vec e}_i\in \mathbb R^d $ 为 itemvi$ v_i $ 的 embedding 向量,piRd$ \mathbf{\vec p}_i\in \mathbb R^d $ 为位置索引i$ i $ 的 positional embedding

    所有 itemembedding 构成 item embedding 矩阵ER|V|×d$ \mathbf E\in \mathbb R^{|\mathcal V|\times d} $ ,所有位置的 embedding 构成 positional embedding 矩阵PRN×d$ \mathbf P\in \mathbb R^{N\times d} $ ,N$ N $ 为用户行为序列的最大长度。

    在这项工作中,我们使用可学习的 positional embedding 而不是固定的正弦 embedding,从而获得更好的性能。positional embedding 矩阵P$ \mathbf P $ 允许我们的模型识别该模型正在处理的是输入的哪一部分。但是,positional embedding 矩阵P$ \mathbf P $ 也对我们的模型可以处理的最大序列长度施加了限制,即不超过N$ N $ 。因此,当t>N$ t\gt N $ 时,我们需要截断输入序列[v1(u),,vt(u)]$ \left[v_1^{(u)},\cdots,v_t^{(u)}\right] $ 从而获取最近的N$ N $ 个 item

    如果是固定的正弦 embedding 作为 positional embedding ,那么模型没有最大序列长度的限制。

22.1.3 输出层

  1. L$ L $ 层 Transformer Layer 之后,我们得到输入序列的所有 itemfinal outputH(L)$ \mathbf H^{(L)} $ 。假设我们在 time stept$ t $ maskitemvt$ v_t $ ,然后我们根据ht(L)$ \mathbf{\vec h}_t^{(L)} $ 来预测被 maskeditemvt$ v_t $ 。具体而言,我们应用了一个带 GELU 激活的两层前馈网络来生成 target item 的输出分布:

    P(v)=softmax(E(GELU(WPht(L)+bP))+bO)

    其中:WPRd×d$ \mathbf W_P\in \mathbb R^{d\times d} $ 为可学习的投影矩阵,bPRd,bOR|V|$ \mathbf{\vec b}_P\in \mathbb R^d,\mathbf{\vec b}_O\in \mathbb R^{|\mathcal V|} $ 为 bias 项,ER|V|×d$ \mathbf E\in \mathbb R^{|\mathcal V|\times d} $ 为所有 itemembedding 矩阵。

    我们在输入层和输出层使用共享的 item embedding 矩阵来缓解过拟合并减小模型大小。

    一方面,由于vt$ v_t $ 被 mask 了,因此在所有 Transformer Layer 中都不会泄露vt$ v_t $ 的信息。

    另一方面,位置t$ t $ 得到的 final representationht(L)$ \mathbf{\vec h}_t^{(L)} $ 包含了所有剩余的 item 的信息从而用于预测vt$ v_t $ 。

22.1.4 模型学习

  1. 训练阶段:传统的单向序列推荐模型通常通过预测输入序列的每个位置的 next item 来训练模型。具体而言,输入序列[v1,,vt]$ [v_1,\cdots,v_t] $ 的 target[v2,,vt+1]$ [v_2,\cdots,v_{t+1}] $ 是输入序列的右移一位。然而,在双向模型中联合调节 conditioning 左右上下文会导致每个 itemfinal output representation 包含 target item 的信息。这使得预测未来变得没有意义,并且网络不会学到任何有用的东西。

    假如 target item 为序列中最后一个 item,那么在双向模型中,序列中第一个 item 、第二个 item 、... 其它所有位置 item 都能访问到 target item 的信息。

    这个问题的一个简单解决方案是:从原始长度为t$ t $ 的行为序列创建t1$ t-1 $ 个样本(即,带有 next item 作为 label 的子序列,如([v1],v2)$ ([v_1],v_2) $ 和([v1,v2],v3)$ ([v_1,v_2],v_3) $ ),然后使用双向模型对每个子序列进行编码从而预测 target item 。然而,这种方法非常耗时和耗资源,因为我们需要为序列中的每个位置创建一个新样本并分别预测它们。

    为了有效地训练我们提出的模型,我们将一个新目标,即完形填空任务 Cloze task(也被称作 Masked Language Model: MLM ),应用于序列推荐。这是一项由一部分语言组成的测试,其中某些单词被删除,模型需要预测缺失的单词。在我们的例子中,对于每个 training step,我们随机mask输入序列中所有 itemρ$ \rho $ 比例(即,用特殊token "[mask]" 替换),然后仅根据左右上下文预测被 masked item 的原始 ID 。例如:

    Input:[v1,v2,v3,v4,v5]randomly mask[v1,[mask]1,v3,[mask]2,v5]Labels:[mask]1=v2,[mask]2=v4

    "[mask]" 相对应的 final hidden vector 被馈送到一个 output softmax ,就像在传统的序列推荐中一样。最终,我们将每个 masked inputSu$ \mathcal S_u^\prime $ 的损失定义为 masked target 的负对数似然:

    L=1|Sum|vmSumlogP(vm=vmSu)

    其中:

    • Su$ \mathcal S_u^\prime $ 为用户行为历史Su$ \mathcal S_u $ 的 masked 版本,如[v1,[mask]1,v3,[mask]2,v5]$ [v_1,[\text{mask}]_1,v_3,[\text{mask}]_2,v_5] $ 。
    • Sum$ \mathcal S_u^m $ 为Su$ \mathcal S_u $ 中随机 maskeditem 集合,如{[mask]1,[mask]2}$ \{ [\text{mask}]_1, [\text{mask}]_2 \} $ 。
    • vm$ v_m^* $ 为被 masked itemvm$ v_m $ 的 ground truth ,如{[mask]1=v2,[mask]2=v4}$ \{ [\text{mask}]_1 = v_2, [\text{mask}]_2=v_4\} $ 。
    • P()$ P(\cdot) $ 为模型预测输出为 ground truth 的概率。

    完形填空任务的另一个优点是它可以生成更多样本来训练模型。假设一个长度为n$ n $ 的序列,传统的序列预测会产生n$ n $ 个不同的样本用于训练,而 BERT4Rec 可以在多个 epoch 中获得Cnk$ C_n^k $ 个样本(假设我们随机maskk$ k $ 个 item )。这允许我们训练更强大的双向 representation 模型。

  2. 测试阶段:如前所述,我们在训练和最终的序列推荐任务之间造成了不匹配 mismatch ,因为完形填空任务的目标是预测当前的 masked item ,而序列推荐任务的目标是预测未来。为了解决这个问题,我们将特殊 token "[mask]" 附加到用户行为序列的末尾,然后根据该 tokenfinal hidden representation 来预测 next item

    为了更好地匹配序列推荐任务(即,预测 next item ),在训练期间我们还生成 mask输入序列中最后一个 item 的样本。它的作用类似于用于序列推荐的微调,可以进一步提高推荐性能。

    mask 输入序列中最后一个 item 的样本是否可以给予更大的样本权重?这样可以让模型更 focus 这类样本,从而缓解训练阶段和测试阶段不匹配的问题。或者直接使用 domain adaption 方法。

    因为机器学习有一个核心假设:训练样本和测试样本的分布要保持一致。

22.1.5 讨论

  1. 我们讨论我们的模型与之前相关工作的联系。

    • SASRec:显然,SASRec 是我们的 BERT4Rec 的从左到右的单向版本,具有 single head attention 以及 causal attention mask

      不同的架构导致不同的训练方法。SASRec 预测序列中每个位置的 next item,而 BERT4Rec 使用完形填空目标来预测序列中的 masked item

    • CBOW& SG:另一个非常相似的工作是 Continuous Bag-of- Word: CBOWSkip-Gram: SG

      • CBOW 使用 target word 上下文中所有的词向量(同时使用左侧和右侧)的均值来预测 target word 。它可以视为 BERT4Rec 的一个简化案例:如果我们在 BERT4Rec 中使用一个 self-attention layer 、对所有 item 使用均匀的注意力权重、取消共享的 item embedding 、移除 positional embedding 、并且仅mask center item,那么我们的 BERT4Rec 就变成了 CBOW
      • CBOW 类似,SG 也可以看作是 BERT4Rec 在化简之后的、类似的简化案例(除了保留一个 item 之外,mask所有其它 item )。

      从这个角度来看,完形填空可以看作是 CBOWSG 目标的通用形式。

      此外,CBOW 使用简单的聚合操作来建模单词序列,因为它的目标是学习良好的 word representation,而不是 sentence representation 。相反,我们寻求学习一个强大的行为序列 representation 模型(即,本文中的深度自注意力网络)来进行推荐。

    • BERT:虽然我们的 BERT4Rec 受到 NLP 中的 BERT 的启发,但是它仍然与 BERT 有几个不同之处:

      • 最关键的区别是:BERT4Rec 是用于序列推荐的端到端模型,而 BERT 是用于 sentence representation 的预训练模型。BERT 利用大规模的、任务无关的语料库为各种文本序列任务训练 sentence representation 模型,因为这些任务共享相同的、关于语言的背景知识。然而,这个假设在推荐任务中并不成立。因此,我们针对不同的序列推荐数据集,端到端地训练 BERT4Rec
      • BERT 不同,我们移除了 next sentence losssegment embedding,因为在序列推荐任务中, BERT4Rec 仅将用户的历史行为建模为一个序列。
  2. 未来方向:

    • 将丰富的 item 特征(如商品的类别和价格、电影的演员表)引入到 BERT4Rec 中,而不仅仅是建模 item ID
    • 将用户组件引入到模型中,以便在用户有多个 session 时进行显式的用户建模。

    另外,也可以将 SR-GNN 中的 GNN 组件代替这里的 item embedding

22.2 实验

  1. 数据集:我们在四个真实世界的代表性数据集上评估所提出的模型,这些数据集在领域和稀疏性方面差异很大。

    • Amazon Beauty:这是从 Amazon.com 爬取的一系列商品评论数据集。人们根据 Amazon 上的 top level 商品类别将数据拆分为单独的数据集。在这项工作中,我们采用 Beauty 类别。
    • Steam:这是从大型的在线视频游戏分发平台 Steam 收集的数据集。
    • MovieLens:这是一个用于评估推荐算法的、流行的 benchmark 数据集。在这项工作中,我们采用了两个版本,即 MovieLens 1m: ML-1mMovieLens 20m: ML-20m

    对于数据集预处理,我们遵循 SASRecFPMCCaser 中的常见做法。对于所有数据集,我们将所有数字评分、或者存在评论转换为数值为 1 的隐式反馈(即,用户与 item 存在交互)。此后,我们将交互记录按用户分组,并根据时间戳对这些交互记录进行排序,从而为每个用户构建交互序列。为了确保数据集的质量,按照惯例,我们仅保留至少存在五个反馈的用户。

    处理后的数据集的统计数据如下表所示。

  2. 任务设置:为了评估序列推荐模型,我们采用了 leave-one-out 评估(即,next item 推荐)任务,该任务在SASRecFPMCCaser 中已被广泛使用。对于每个用户,我们将行为序列的最后一个 item 作为测试数据,将倒数第二个 item 作为验证集,并利用剩余的 item 进行训练。

    为了简单的、公平的评估,我们遵循SASRecFPMCCaser 中的通用策略,将测试集中的每个 ground truth item100 个随机采样的、用户未与之交互的 negative item 进行配对。为了使采样可靠和具有代表性,这 100negative item 根据流行度进行采样。因此,任务变成将这些 negative item 与每个用户的 ground truth item 进行排名。

    每个 ground truth item 独立地采样 100negative item ,而不是所有 ground truth item 共享相同的 negative item

  3. 评估指标:为了评估所有模型的排名,我们采用了多种评估指标,包括 Hit Ratio: HRNormalized Discounted Cumulative Gain: NDCGMean Reciprocal Rank: MRR。考虑到每个用户仅有一个 ground truth item,因此 HR@k 等价于 Recall@k 且与 Precision@k 成正比,MRR 相当于 Mean Average Precision: MAP

    在这项工作中,我们使用k=1,5,10$ k=1,5,10 $ 来报告 HRNDCG。对于所有这些指标,值越高则代表性能越好。

  4. baseline

    • POP:它是最简单的 baseline,根据item 的热门程度来排序,其中热门程度根据交互次数来判断。
    • BPR-MF:它使用 pairwise ranking loss 来优化带隐式反馈的矩阵分解。
    • NCF:它使用 MLP 而不是矩阵分解中的内积来建模 user-item 交互。
    • FPMC:它通过将矩阵分解与一阶马尔科夫链相结合,从而捕获用户的通用口味general taste以及序列行为。
    • GRU4Rec:它使用带 ranking based lossGRU 来建模用户行为序列从而用于 session-based 推荐。
    • GRU4Rec+:它是 GRU4Rec 的改进版本,具有新的损失函数和新的采样策略。
    • Caser:它同时以水平卷积和垂直卷积两种方式来使用 CNN 来建模高阶马尔科夫链,从而进行序列推荐。
    • SASRec:它使用从左到右的 Transformer 语言模型来捕获用户的序列行为,并在序列推荐上实现了 state-of-the-art 的性能。
  5. 配置:

    • 对于 NCFGRU4RecGRU4Rec+CaserSASRec ,我们使用相应作者提供的代码。对于 BPR-MFFPMC,我们使用 TensorFlow 实现它们。

    • 对于所有模型中的通用超参数,我们考虑隐层维度d{16,32,64,128,256}$ d\in \{16,32,64,128,256\} $ ,l2$ l_2 $ 正则化系数范围{1,0.1,0.01,0.001,0.0001}$ \{1,0.1,0.01,0.001,0.0001\} $ ,dropout rate{0,0.1,0.2,,0.9}$ \text{dropout rate}\in \{0,0.1,0.2,\cdots,0.9\} $ 。

      所有其它超参数(如 Caser 中的马尔科夫阶次)和初始化策略,要么遵循原始论文作者的推荐,要么根据验证集进行调优。我们报告每个 baseline 在其最佳超参数设置下的结果。

    • 我们使用 TensorFlow 实现 BERT4Rec。所有参数都使用 [−0.02, 0.02] 范围内的截断正态分布进行初始化。

      我们使用 Adam 训练模型,学习率为104$ 10^{-4} $ ,β1=0.9$ \beta_1=0.9 $ ,β2=0.999$ \beta_2=0.999 $ ,l2$ l_2 $ 权重衰减为0.01$ 0.01 $ ,学习率线性衰减。

      当梯度的l2$ l_2 $ 范数超过阈值5$ 5 $ 时,梯度会被裁剪。

      为了公平比较,我们设置层数L=2$ L=2 $ 和 head 数量h=2$ h=2 $ ,并使用与 SASRec 中相同的最大序列长度,即:对于 ML-1mML-20m 数据集,N=200$ N=200 $ ;对于 BeautySteam 数据集,N=50$ N=50 $ 。

      对于 head 的设置,我们根据经验将每个 head 的维度设置为 32 (如果d<32$ d\lt 32 $ ,则为 single head)。

      我们使用验证集调优 mask 比例ρ$ \rho $ ,结果各个数据集上的最佳比例为: Beautyρ=0.6$ \rho=0.6 $ 、Steamρ=0.4$ \rho=0.4 $ 、ML-1mML-20mρ=0.2$ \rho=0.2 $ 。

      所有模型都是在单个 NVIDIA GeForce GTX 1080 Ti GPU 上从零开始训练的而没有任何预训练,batch size = 256

22.2.1 整体性能比较

  1. 下表总结了所有模型在四个 benchmark 数据集上的最佳结果。最后一列是 BERT4Rec 相对于最佳 baseline 的提升。我们省略了 NDCG@1 的结果,因为在我们的实验中它等于 HR@1 。可以看到:

    • 非个性化 POP 方法在所有数据集上的性能最差,因为它没有使用历史行为记录来建模用户的个性化偏好。

    • 在所有 baseline 方法中,序列方法(如,FPMCGRU4Rec+)在所有数据集上始终优于非序列方法(如,BPR-MFNCF)。与 BPR-MF 相比,FPMC 的主要改进在于它以序列的方式来建模用户的历史行为记录。

      这一观察结果验证了:考虑序列信息有利于提高推荐系统的性能。

    • 在序列推荐 baseline 中,Caser 在所有数据集上都优于 FPMC,尤其是在稠密数据集 ML-1m 上,这表明高阶马尔科夫链有利于序列推荐。然而,高阶马尔科夫链通常使用非常小的阶次L$ L $ ,因为它们对于阶次L$ L $ 不是很好地 scalable 的。这导致 Caser 的性能比 GRU4Rec+SASRec 更差,尤其是在稀疏数据集上。

      此外,SASRec 的性能明显优于 GRU4RecGRU4Rec+ ,这表明 self-attention 机制是一种更强大的序列推荐工具。

    • 根据结果,很显然 BERT4Rec 在所有方法中,在四个数据集上的所有指标都是最佳的。与最强的 baseline 相比,它平均而言获得了 7.24%HR@10 相对提升、11.03%NDCG@10 相对提升、11.46%MRR 相对提升。

  2. 问题一:收益是来自于双向自注意力模型还是来自于完形填空目标?

    为了回答这个问题,我们尝试通过将完形填空任务限制为一次仅mask一个 item 来隔离这两种因素的影响。通过这种方式,我们的 BERT4Rec (带有一个 mask)和 SASRec 之间的主要区别在于:BERT4Rec 通过联合地调节jointly conditioning 左右上下文来预测 target item

    注意,这里要求被 maskeditem 是随机的,不能固定为最后一个 item。如果固定地 mask 最后一个 item,那么 BERT4Rec 就等价于 SASRec

    由于篇幅有限,我们在下表中报告了 BeautyML-1m 的实验结果,其中d=256$ d=256 $ 。结果表明:带有一个 maskBERT4Rec 在所有指标上都显著优于 SASRec。这证明了 bidirectional representation 对于序列推荐的重要性。

    此外,最后两行表明完形填空目标也提高了性能。完形填空任务以及 mask 比例ρ$ \rho $ 的详细分析参考后面的超参数研究部分。

  3. 问题二:双向模型为何、以及如何优于单向模型?

    为了回答这个问题,我们试图通过在 Beauty 测试期间可视化 the last 10 items 的平均注意力权重来揭示有意义的模式,如下图所示。由于篇幅有限,我们仅报告了不同层和不同 head 的四个具有代表性的注意力热力图。从结果中可以看到:

    • 不同 head 的注意力不同。例如,在 layer 1 中,head 1 倾向于关注左侧的 item,而 head 2 更喜欢关注右侧的 item

    • 不同层的注意力不同。显然, layer 2 的注意力往往集中在更近 more recentitem 上。这是因为 layer 2 直接连接到输出层,而 recent item 在预测未来方面起着更重要的作用。

      另一个有趣的模式是:图 (a)(b) 中的 head 也倾向于关注 [mask] (因为最后一个 item 是被 masked 的)。这可能是 self-attentionsequence-level state 传播到 item level 的一种方式。

    • 最后也是最重要的一点,与单向模型只能关注左侧的 item 不同,BERT4Rec 中的 item 倾向于同时关注两侧的 item 。这表明双向对于用户行为序列建模是必不可少且有益的。

22.2.2 超参数研究

  1. 接下来我们检查了超参数的影响,包括隐层维度d$ d $ 、mask 比例ρ$ \rho $ 、最大序列长度N$ N $ 。在分析一个超参数时,我们将剩余的超参数固定在最佳设置。限于篇幅,这里仅报告 NDCG@10HR@10

  2. 隐层维度d$ d $ :下图显示了隐层维度d$ d $ 的变化(同时保持其它最佳超参数不变)如何影响模型的 NDCG@10HR@10 指标,可以看到:

    • 最明显的观察是:每个模型的性能随着维度d$ d $ 的增加而趋于收敛。更大的隐层维度并不一定会带来更好的模型性能,尤其是在 BeautySteam 等稀疏数据集上。这可能是由于过拟合造成的。
    • 在细节方面,Caser 在四个数据集上的表现不稳定,这可能会限制其有用性 usefulnessself-attention based 方法(即,SASRecBERT4Rec)在所有数据集上都取得了卓越的性能。
    • 最后,我们的模型在所有数据集上始终优于所有其它 baseline,即使在隐层维度d$ d $ 相对较小的时候。

    考虑到我们的模型在d64$ d\ge 64 $ 时取得了令人满意的性能,我们在下面的分析中仅报告d=64$ d=64 $ 的结果。

  3. mask 比例ρ$ \rho $ :如前所述,mask 比例ρ$ \rho $ 是模型训练中的关键因素,它直接影响损失函数。显然,mask 比例ρ$ \rho $ 不应该太小,否则不足以学习一个强大的模型;同时也不应该太大,否则模型很难训练,因为此时需要根据少量的上下文来猜测太多的 masked item 。为了验证这一点,我们研究了 mask 比例ρ$ \rho $ 如何影响不同数据集的推荐性能。

    下图展示了 mask 比例ρ$ \rho $ 从 0.10.9 之间变化的结果。

    • 考虑ρ>0.6$ \rho\gt0.6 $ 在所有数据集上的结果,此时出现了一个通用模式,即:模型性能随着ρ$ \rho $ 的增加而降低。
    • 从前两列的结果中,很容易看出ρ=0.2$ \rho=0.2 $ 在所有数据集上的表现都优于ρ=0.1$ \rho = 0.1 $ 。

    这些结果验证了我们上面所说的。

    此外,我们观察到最优ρ$ \rho $ 高度依赖于数据集的序列长度:

    • 对于具有短序列长度的数据集(如 BeautySteam),在ρ=0.6$ \rho=0.6 $ (Beauty) 和ρ=0.4$ \rho=0.4 $ (Steam) 时获得最佳性能。
    • 对于具有长序列长度的数据集(如 ML-1mML-20m),在ρ=0.2$ \rho=0.2 $ 时获得最佳性能。

    这是合理的,因为与短序列数据集相比,长序列数据集中的大ρ$ \rho $ 意味着需要预测的 item 更多。以 ML-1mBeauty 为例,ρ=0.6$ \rho=0.6 $ 意味着:

    • 对于 ML-1m 我们需要平均每个序列预测98=163.5×0.6$ 98=\lfloor 163.5\times 0.6\rfloor $ 个 item
    • 对于 Beauty 我们仅需要平均每个序列预测5=8.8×0.6$ 5=\lfloor 8.8\times 0.6\rfloor $ 个 item

    前者对于模型训练而言太难了。

    注:下图的 x 轴文字有误,应该是 Mask proportion 而不是 Dimensionality

  4. 最大序列长度N$ N $ :下表展示了 BeautyML-1m 数据集上不同的最大长度N$ N $ 对模型推荐性能和训练速度的影响。我们观察到:

    • 适当的最大长度N$ N $ 也高度依赖于数据集的平均序列长度:Beauty 更喜欢较小的N=20$ N=20 $ ,而 ML-1mN=200$ N=200 $ 上实现最佳性能。这表明用户的行为受到短序列数据集上 more recent items 的影响、受到长序列数据集上 less recent items 的影响。

      这是因为 Beauty 数据集的平均序列长度很短,而 ML-1m 数据集的平均序列长度很长。因此,二者的最佳N$ N $ 值对应于 20200

    • 通常而言,模型不能一致地从较大的N$ N $ 中受益,因为较大的N$ N $ 往往会引入额外的信息和更多的噪音。然而,随着N$ N $ 的变大,我们的模型表现得非常稳定。这表明我们的模型可以处理包含噪音的历史记录中的 informative items

    • BERT4Rec 的一个可扩展性问题是:每层的计算复杂度为O(n2d)$ O(n^2d) $ ,与序列长度n$ n $ 成二次方(n$ n $ 可以小于最大长度N$ N $ )。幸运的是,下表中的结果表明,使用 GPU 可以有效地并行化 self-attention layer

22.2.3 消融研究

  1. 最后,我们对 BERT4Rec 的一些关键组件进行了消融实验,从而更好地了解它们的影响,包括 positional embedding: PEposition-wise feed-forward network: PFFNlayer normalization: LNresidual connection: RCdropoutself-attention的层数L$ L $ 、multi-head attentionhead 数量h$ h $ 。

    下表显示了我们的默认版本L=2,h=2$ L=2,h=2 $ 及其变体在所有四个数据集上的结果,其中维度d=64$ d=64 $ 并且其它超参数(如ρ$ \rho $ )保持在最佳设置。我们分别介绍每个变体并分析它们的作用:

    • PE:结果表明,移除 positional embedding 会导致 BERT4Rec 在长序列数据集(即 ML-1mML-20m )上的性能急剧下降。

      如果没有 positional embedding,每个 itemvi$ v_i $ 的 hidden representationhi(0)$ \mathbf{\vec h}_i^{(0)} $ 仅取决于 item embedding 。此时,模型无法获得序列的顺序信息,例如模型对于不同位置的 "[mask]",使用相同 hidden representation 来预测不同的 target item (假设unmaskitem 保持不变) 。这使得模型有问题。这个问题在长序列数据集上更为严重,因为它们有更多的 masked item 需要预测。

    • PFFN:结果表明,长序列数据集(如 ML-20m )从 PFFN 中获益更多。这是合理的,因为 PFFN 的目的是整合来自多个 head 的信息。正如关于 head 数量h$ h $ 的分析中所讨论的那样,这些来自多个 head 的信息是长序列数据集所偏好的。

    • LN, RC, Dropout:引入这些组件主要是为了缓解过拟合。显然,它们在 Beauty 等小型数据集上更有效。为了验证它们在大型数据集上的有效性,我们在L=4$ L=4 $ 层的 ML-20m 上进行了实验。结果表明:当没有 RC 时,NDCG@10 降低了约 10% (这个结果不在下表中)。

    • 层数L$ L $ :结果表明,堆叠 Transformer layer 可以提高性能,尤其是在大型数据集(如 ML-20m )上。这验证了通过深度自注意力架构学习更复杂的 item transition pattern 是有益的。在数据集 Beauty 上,L=4$ L=4 $ 的性能下降主要是由于过拟合引起的。

    • head 数量h$ h $ :我们观察到长序列数据集(如 ML-20m)受益于较大的h$ h $ ,而短序列数据集(如 Beauty)更喜欢较小的h$ h $ 。这种现象与 《Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures》 中的实验结果一致,即大h$ h $ 对于使用 multi-head self-attention 捕获长距离依赖关系至关重要。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文