【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans

一、背景

之前基于RNN的推荐模型都是按照从左到右单向建模的,单向结构限制了用户行为序列中隐藏表示的能力——它们通常假定一个严格有序的序列,而这并不总是实用的。

本文提出了 bert4rec,应用deep biderectional self-attention 来对用户的行为序列进行建模的。为了避免信息泄露,高效的训练双向模型,我们采用Cloze目标来进行顺序推荐,预测序列中的随机mask项,通过对其上下文的联合条件进行预测序列中随机mask的items。

二、Bert4Rec

1. 问题定义

U = { u 1 , u 2 , . . . , u ∣ U ∣ } U=\{u_1,u_2,...,u_{|U|}\} U={u1,u2,...,uU}为用户集合, V = { v 1 , v 2 , . . . , v ∣ V ∣ } V=\{v_1,v_2,...,v_{|V|}\} V={v1,v2,...,vV}为物品集合, S u = { v 1 ( u ) , . . . , v t ( u ) , . . . , v n u ( u ) } S_u=\{v_1^{(u)},...,v_t^{(u)},...,v_{n_u}^{(u)}\} Su={v1(u),...,vt(u),...,vnu(u)}为用户历史行为序列。我们的目标是预测下一时刻用户与每个候选物品交互的概率:
请添加图片描述

2. 模型结构

如下图(b)所示,含有L层的Transformer,每一层利用前一层所有的信息。相比于图(d)基于RNN的推荐模型,self-attention可以捕获任意位置的信息。相比于基于CNN的推荐模型,可以捕获整个field的信息。相比于图(c)和图(d)的模型(都是left-to-right的单向模型),本文提出的双向模型可以解决现有模型的问题。

【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第1张图片

3. Transformer Layer

如图(a)所示,Transformer由两部分组成Multi-Head Self-Attention和Position-wise Feed-Forward network部分。

3.1 Multi-Head Self-Attention

对于模型框架中的第 l l l 层Transformer,Multi-Head Self-Attention过程为:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第2张图片
其次是Dropout和Add & Norm过程,这里的Add就是Skip Connection操作,目的是反向传播时防止梯度消失的问题;而Norm是Layer Norm操作。

3.2 Position-wise Feed-Forward Network

由于只有线性映射,为了使得模型具有非线性的性质,所以采用了Position-wise Feed-Forward Network。Position-wise的意思是说,每个位置上的向量分别输入到前向神经网络中,计算方式如下:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第3张图片

3.3 Stacking Transformer Layer

堆叠多层transformer可以学到更多item之间的交互信息,但是模型复杂了之后就不能训练深度模型,因此两个sub-layer在normal之后加入了residual connection,并且在每一个sub-layer输出后加入了dropout,LN是normal layer,其中μ和σ分别是均值和标准差,⊙是点乘,γ是scale因子,ϵ是一个很小的因子,为了防止分母为0:
请添加图片描述
总体来说,模型结构为:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第4张图片

4. Embedding层

在没有任何RNN或CNN模块的情况下,Transformer不知道输入序列的顺序。 为了利用输入的顺序信息,我们在Transformer的Embedding层加入了位置嵌入,本文的位置向量是学到的,不是transformer中的正弦。位置向量矩阵可以给定任意位置的向量,但是要明确最大的长度,因此需要对输入序列进行截断。

对于给定的物品 v i v_i vi ,其输入表示 h i 0 h_i^0 hi0 是通过将相应的物品和位置Embedding求和来构造的:
请添加图片描述

5. Output层

经过L层的信息交换之后,我们得到输入序列中所有items的最终输出: H L = { h 1 L , . . . , h t − 1 L , h t L } H^L=\{h_1^L, ...,h_{t-1}^L,h_t^L\} HL={h1L,...,ht1L,htL}

如上图(b)所示,我们在第t步掩盖掉物品 v t v_t vt,然后基于 h t L h_t^L htL 预测被掩盖的物品 v t v_t vt。这里使用两层带有GELU激活函数的前馈网络得到最终的输出:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第5张图片

6. 模型训练和预测

我们的目的是预测用户下一个要交互的物品 v t + 1 v_{t+1} vt+1 ,对于传统的序列推荐模型,如上图(d)中的RNN模型,输入是 [ v 1 , . . . , v t ] [v_1,...,v_t] [v1,...,vt] ,转换为对应的输出为 [ v 2 , . . . , v t + 1 ] [v_2, ..., v_{t+1}] [v2,...,vt+1] ,那么我们自然可以拿最后一个时刻输出的物品进行推荐。

而在BERT4Rec中,由于是双向模型,每一个item的最终输出表示都包含了要预测物品的信息,这样就造成了一定程度的信息泄漏。因此采用Cloze taske,也就是将输入序列中的p%的物品进行masked,然后根据上下文信息预测masked的物品。

在训练阶段,为了提升模型的泛化能力,让模型训练到更多的东西,同时也能够创造更多的样本,借鉴了BERT中的Masked Language Model的训练方式,随机的把输入序列的一部分掩盖(即变为[mask]标记),让模型来预测这部分盖住地方对应的物品:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第6张图片
采用这种训练方式,最终的损失函数为:
【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans_第7张图片

如上所述,我们在训练过程和最终的序列预测推荐任务之间是不匹配的。因为Cloze task的目的是预测当前被masked的物品,而序列预测推荐的目的是预测未来。为了解决这个问题,在预测阶段我们将masked附加到用户行为序列的末尾,然后根据该masked的最终隐藏表示来预测下一项。

为了更好地匹配序列推荐任务(即,预测最后一项),在训练过程中我们还生成了只mask输入序列中最后一项的样本。这个工作就像对序列推荐的微调一样,可以进一步提高推荐性能。

参考资料

  1. Bert4rec : sequential recommendation with bidirectional encoder representations from transformer
  2. BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer
  3. BERT4Rec:使用Bert进行序列推荐

你可能感兴趣的:(推荐算法,推荐算法,transformer,深度学习)