BERT4Rec:当NLP王者BERT进军推荐领域

2022-04-15 13:23:18 浏览数 (1)

作者 | 知乎博主@青枫拂岸 整理 | NewBeeNLP

CIKM2019上,阿里发表了《BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer》[1],继BST将Transformer之后,又一次将NLP领域中前沿技术迁移到了推荐领域。这一次则是发表之后,霸榜无数的Bert模型。想了解BST模型的可以参考我之前的解读:BST:Transformer在推荐领域的应用

结合的切入点仍旧是阿里深耕的领域: 利用用户历史行为,提取历史兴趣进行用户关注商品预测

文中提到,之前的算法使用序列神经网络从左向右地编码用户的历史交互信息,提取用户历史兴趣,只利用了单向的信息进行建模。尽管它们是有效的,但是存在两点问题:

  • 单向结构限制了用户行为序列中隐藏表示的能力;
  • 之前的序列神经网络经常采用严格有序的序列,这并不总是可行的;

为了解决这些问题,作者提出了一个称为 BERT4Rec 的序列推荐模型。该模型采用深层的双向Self-Attention来对用户行为序列进行建模。

为了避免信息泄漏并有效地训练双向模型,我们采用Cloze objective方式 进行序列推荐,即:通过联合item左右的上下文来预测序列中随机masked item。用这种方式,我们学习了双向表示模型,允许用户历史行为中的每个item融合左右两侧的信息来作出推荐。

文章在四个基准数据集上进行的大量实验表明,证明了模型始终优于各种最新的序列模型。

1.背景介绍

尽管正常情况下,用户都会根据时间进程来选择购买的物品,如用户购买了switch后一段时间,会购买joycon(switch手柄)和游戏卡带。并且现阶段使用RNN结构的一些模型也取得了不错的成绩。其基本思想是将用户的历史行为序列从左向右编码向量,基于最后一个隐向量进行推荐。这里举了两个例子分别是SASRec模型和RNN结构。

虽然他们被证明是普遍且有效的,但是文章认为这种单向模型并不是最优的,不足以完全学习到用户的兴趣信息。因为:

  • 单向体系结构限制了隐藏表示在用户行为序列中的能力;
  • 假设一个严格有序的序列,这并是实用的;

所以将两个方向的上下文合并到用户行为序列建模中,会产生更好的效果。但是为了防止信息泄露,采用了 Cloze task 方法。即Bert模型预训练中的Masked LM方法。按下不表,下文具体介绍。

本文的主要贡献:

  • 提出了一种基于双向self-attention和Cloze task的用户行为序列建模方法。第一个将深度序列模型和Cloze task引入推荐系统的研究。
  • 将提出的模型与最先进的方法进行了比较,并通过对四个基准数据集的定量分析,证明了本文算法的有效性。
  • 进行了一项消融分析,分析了模型中关键部件的贡献。

2.模型

2.1 问题描述

在序列化问题中,定义 为用户集合, 为物品集合, 为用户历史行为序列。我们的目标是预测下一时刻用户与每个候选物品交互的概率:

2.2 模型结构

如下图所示,Bert4Rec是由L个有向Transformer层堆叠起来的,在每一层,它通过与Transformer层并行地交换前一层所有位置的信息,迭代更新每个位置的表示,与图1d中基于RNN的方法不同, self-attention赋予BERT4Rec直接捕捉任何距离的依赖关系的能力,而不是像图1d中基于RNN的方法那样一步一步地传递相关信息。这种机制导致了一个全局的感受野,而基于CNN的方法(如Caser)通常感受野有限。

此外,与基于RNN的方法相比,self-attention非常易于直接并行化。相比于1c和1d的模型(都是left-to-right的单向模型),本文提出的双向模型可以解决现有模型的问题。

图1 BERT4Rec 模型整体架构

2.3 Transformer层

上图a中的Transformer Layer 主要有两部分构成,分别是Multi-Head Self-Attention和Position-wise Feed-Forward network。

这里,不再具体介绍。

左:原始transformer encoder 右:BERT2Rec中transformer Layer

2.4 Embedding Layer

将相应的item转化为Embedding vector。并且加入Postional Embedding,这里需要注意的是:

对于给定的物品 ,其输入表示 是通过将相应的物品和位置Embedding求和来构造的:

其中 是关于商品 的d维Embedding, 是关于位置index 的d维度位置编码。位置embedding的矩阵 允许我们的模型识别他在正在处理的输入的那一部分。此外我们设定了模型可以处理的句子最大长度 ) 。我们会讲输入序列的长度进行截断, 阶段到最后的N个商品 当 。

值得注意的是,这里的positional embedding不是想transformer中的利用正余弦变化得到的固定不变的,而是一个可训练学习得到的。

2.5 Output Layer

经过上面的层后,最终得到输入序列中所有items的最终输出 。如上图1(b)所示,我们在第 步掩盖掉物品 ,然后基于 预测被掩盖的物品 。这里使用两层带有GELU激活函数的前馈网络得到最终的输出:

这里需要注意,输出层的公式是推荐场景特有的,因此我来详细解释一下。 是前馈网络的权重矩阵; 和 是偏置项; 是item集合的embedding矩阵。BERT4Rec模型在输入层和输出层用了共享的物品embedding矩阵,目的是减轻过拟合和减少模型大小。

3.模型训练和预测

3.1 训练

推荐算法的目标是:预测用户下一个可能选择的物品 ,文章从原始长度为t的序列中构建了t-1个样本,形式为:

但是!但是!但是! 使用Self-Attention后,任何序列中的item都包含序列中所有item的信息,这就造成了数据泄露。为了解决这个问题,借鉴BERT中的Masked LM方法,在处理用户历史行为序列中,将其称作: Cloze task

其核心是:就是将输入序列中的p%的物品进行masked,让模型来预测这部分盖住地方对应的物品:

与“[mask]”相对应的最终隐藏向量被输入到商品集上的输出softmax中,就像在传统的顺序推荐中一样。采用这种训练方式,最终的损失函数为:

其中 是用户行为历史 的masked版本, 是随机masked的商品, 是masked商品, 是真实商品。

Cloze task和Masked LM一样,它可以产出更多的样本用于模型的训练,不受限于label数量。

3.2 测试

BERT经过两种预训练,得到词向量的embedding后。再fine-tune到其他任务上,从而达到更好的效果。

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

4.实验

4.1 数据集

三个公共数据集,

  • Amazon Beauty
  • Steam
  • MovieLens
    • ML-1M
    • ML-20M
4.2 评估指标

将行为序列的最后一项作为test集,之前的作为验证集。为了模拟真实情况,每个正样本随机抽取100个负样本。采样负样本时,根据其受欢迎程度,因此项目变成了对正样本和负样本进行排名。

指标选取

  • Hit Ratio (HR) k=1,5,10
  • Normalized Discounted Cumulative Gain (NDCG) k=1,5,10
  • Mean Reciprocal Rank (MRR)
4.3
4.4 Bert4Rec模型
  • 使用Tensorflow,训练初始向量[-0.02,0.02]
  • Adam优化器β1 = 0.9,β2 = 0.999,ϵ = 10e−4。ℓ2 weight decay 为0.01。
  • Transformer层 L = 2
  • head 数量 h = 2 ,每个head 维度d为 32
  • maximum sequence length N = 200 for ML-1m and ML-20m
  • maximum sequence length N = 50 for Beauty and Steam datasets
  • Cloze task 的 遮挡概率ρ为 (Beauty ρ=0.6),(Steam ρ=0.4),(ML-1m and ML-20m ρ=0.1)
  • GPU型号 NVIDIA GeForce GTX 1080 Ti GPU
  • batch size of 256
4.5 结果

结果分析:

几乎所有的序列化处理方法(GRU4Res、FPMC)都胜过非序列化方法(NCF BPR-MF)在所有数据集上。

Caser 胜过FPMC 在所有数据集上。表明高阶MCs有利于顺序推荐。然而,高阶MCs通常使用非常小的阶数L,因为它们不能很好地按照阶数L进行缩放。

Caser差于 GRU4Rec 和 SASRec,尤其是稀疏的数据集。而且SASRec 更优于 GRU4Rec and GRU4Rec ,证明了Self-Attention是非常强,针对于序列推荐。

Bert4Rec在所有的数据集上都是最优的,称之为”杀疯了“都不为过;它和所有的强的Baseline相比,HR@10上获得了7.24%的提升; NDCG@10上取得了11.03%的提升, MRR上取得了11.46%的提升。再一次证明了,Bert一出,谁与争锋!不仅适用于NLP领域,在推荐领域的效果也是显著的。

4.6 一些问题

Q1:是否Cloze objective的Bidirectional self-attention模型可以带来帮助?

增加了BERT4Rec(带1个mask)的实验,其与SASRec之间的主要区别在于,BERT4Rec预测目标项时理解上下文中的序列中所有item信息,而SASRec只抽取了左侧当前时刻前浏览过的item。

结果上,BERT4Rec(带1个mask)效果优于SASRec。

Q2:为什么Bidirectional的模型比unidirectional的模型好?

为了回答这个问题,我们试图通过可视化图2中关于Beauty测试集上测试最后10个项目的平均注意力权重来揭示有意义的模式。由于篇幅的限制,我们只展示了四个不同layer和head的有代表性的注意热图。

我们从结果中进行了一些观察。

a)不同head的注意力不同。例如,在第1层中,head1倾向于参加左侧的项目,而head2倾向于参加右侧的项目。

b)注意力在不同的层面上有所不同,第二层的注意力往往集中在最近的项目上。这是因为第二层与输出层直接相连,最近的项目在预测未来方面发挥着更重要的作用。

另一个有趣的模式是,图2a和2b中的头部也倾向于出现在[mask]上。这可能是自我注意将序列级状态传播到item级的一种方式。

c) 最后也是最重要的一点,与单向模型只能关注左侧的项目不同,BERT4Rec中的项目倾向于关注两侧的项目。这表明双向性对于用户行为序列建模是必要和有益的。

5.参数对结果影响研究

5.1 隐藏维度d

随着维数的增加,每个模型的性能趋于收敛。 更大的隐藏维度不一定会导致更好的模型性能 ,尤其是在Beauty和Steam等稀疏数据集上。这可能是由于训练过度造成的。

在细节方面。Caser在四个数据集上的性能不稳定,这可能会限制其实用性。基于Self-Attention的方法(即SASRec和BERT4Rec)在所有数据集上都能获得优异的性能。最后, Bert4Rec 模型在所有数据集上始终优于所有其他模型,即使隐藏维度相对较小。考虑到我们的模型在d=64上取得了令人满意的性能,以下分析确定d=64。

5.2 Mask的比例p

不能太大也不能太小,具体根据数据集来调整。

对于序列长度与p取值成反比,序列越长,p取短好;序列越短,p取越大更好。作者猜测,序列越长,p越大的话,会导致预测item非常大。模型训练很困难。

5.3 最大序列长度N

依旧是不同的数据集,最佳序列长度不一样。但 依赖于数据的平均序列长度。

Beauty更喜欢较小的N=20,而ML-1m在这方面的性能最好N=200。

由于较大的N往往会引入额外的信息和更多的噪声,因此该模型并不总是从较大的N中受益。然而,当长度N变大时,我们的模型表现得非常稳定。这表明我们的模型能够处理嘈杂的历史记录中的信息项。

6.消融实验

  • PE:位置编码对于Bert4Rec的影响是巨大的,删除PE,模型的效果大大的下降了。
  • PFFN: 长的序列可以从PFFN中获得较多的帮助;
  • LN,RC以及Dropout: 每个元素都可以从这些神经网络中获得提升;
  • 层的个数: 在大的数据集上,stacking Transformer layers可以得到较为明显的提升;
  • Head个数:越长序列数据集在更大h时效果更好,越短序列数据集更适合更小的h。

7.结论

将Bert迁移到的推荐任务中来处理用户行为序列,效果非常好。引入Masked LM方法的Cloze task效果显著,且不依赖于label数量。在四个数据集中表现均是目前最优。

整篇论文读下来,尤其是看了实验部分后,只能说Bert是真的强,在推荐上效果也是杠杠的。但是这篇文章只是将Bert迁移进了推荐领域,就连文中提到的Cloze task都是Bert原文中预训练任务中一个的变型。说明这是一篇偏工程导向上的论文。

连看了5篇阿里系出品、针对用户历史行为序列方面的论文后,感慨阿里在对用户行为序列上的用情至深,总是能针对某个点,或提出或迁移一些结构针对这个问题进行解决;并且阿里的论文结构清晰明了,读起来顺畅,可读性强。

本文参考资料

[1]

《BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer》: https://link.zhihu.com/?target=https://dl.acm.org/doi/10.1145/3357384.3357895

[2]

Microstrong:BERT4Rec:使用Bert进行序列推荐: https://zhuanlan.zhihu.com/p/263014307

[3]

https://github.com/FeiSun/BERT4Rec: https://link.zhihu.com/?target=https://github.com/FeiSun/BERT4Rec

0 人点赞