推荐算法炼丹笔记:序列化推荐算法Bert4Rec

作者:一元  
公众号:炼丹笔记  

之前和海归博士朋友聊天,他说,这篇文章是他所有的复现算法中,处理序列最好的算法之一。原本以为Bert只常见于NLP中,本文我们一起详细地阅读学习一下如何使用Bert来做推荐系统并取得最好的效果的。

之前我们的序列化模型从左到右的无向模型是次优的,

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

本文是最早使用Bert方法来处理该问题的文章。为了防止信息泄露并且高效地训练双向模型,我们在序列化建模时采用了Cloze目标,通过联合调节左右上下文来预测序列中的随机屏蔽项。通过这种方式,我们学习了一个双向表示模型,通过允许用户历史行为中的每一项融合来自左侧和右侧的信息来融合信息。

Bert4Rec

问题描述

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第1张图片

模型框架

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第2张图片

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

对比图1b、1c和1d,最显著的区别是基于SASRec和RNN的方法都是从左到右的单向结构,而我们的BERT4Rec使用双向的自我注意来建模用户的行为序列。这样,我们提出的模型可以获得更强大的用户行为序列表示,从而提高推荐性能。


1. Transformer层

v2-f5d608a48d8b943d2aa07def2e3a2c27_b.jpg

2. Multi-Head Self-Attention

注意机制已经成为各种任务中序列建模的一个重要组成部分,它允许捕获表示对之间的依赖关系,而不考虑它们在序列中的距离。

以往的工作表明,在不同的位置联合处理来自不同表示子空间的信息是有益的。因此,我们在这里采用多头自我注意,而不是执行单一的注意功能。具体地说,多头注意首先用不同的、可学习的线性投影将H线性投影到h子空间,然后应用h注意函数产出输出的表示。

于是我们有:

v2-dcd3922b6f0081d993291a83e489cd34_b.jpg

此处,我们省略掉网络层的下标L, 于是我们得到Scaled Dot-Product Attention:

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第3张图片

3. Position-wise Feed-Forward Network

self-attention sub-layer主要是基于线性投影,为了赋予模型非线性和不同维度的交互,此处我们对self-attention sub-layer的输出加入Position-wise的FNN。它主要由两块组成

v2-e218ba2198677c07d1399dced92a3a25_b.jpg

v2-5ab633d9f032d70779b23ec91a32b979_b.jpg

v2-2119e373b5baf00a987c698640ea29ff_b.jpg

4. Stacking Transformer Layer

如上所述,我们可以使用自我注意机制轻松地捕捉整个用户行为序列中的商品-商品交互。然而,通过堆叠自我注意层来学习更复杂的商品转换模式通常是有益的。

然而,随着网络的深入,训练变得更加困难。因此,如图1a所示,我们在两个子层的每一层周围使用残差连接,然后进行层标准化。此外,我们还将dropout应用于每个子层的输出,然后将其规范化。即每个子层的输出为LN(x+Dropout(sublayer(x)),其中sublayer是子层本身实现的功能,LN是中定义的层规范化函数。我们使用LN对同一层所有隐藏单元的输入进行规范化,以稳定和加速网络训练。

5. Embedding层

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第4张图片

6. 输出层

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第5张图片

模型学习

1. 训练

为了防止过拟合等问题,我们创建了t-1个样本(子序列的形式为:([v1],v2), ([v1,v2],v3) ,...) 我们将用双向模型对每个历史子序列进行编码以预测目标,为了方便我们模型的快速训练,我们使用了一个新的目标:Cloze task(Masked Language Model). 在每个训练步,我们随机mask掉输入序列中占比的商品。

v2-cbdec678f78b28d15b76199dbe397602_b.jpg

与“[mask]”相对应的最终隐藏向量被输入到商品集上的输出softmax中,就像在传统的顺序推荐中一样。最终,我们定义每个masked掉的输入作为masked的目标的negative log-likelihood:

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第6张图片

Cloze task的另外一个优势在于它可以产出更多的样本用于模型的训练。

2. 测试

如上所述,我们在训练和最终的顺序推荐任务之间造成了不匹配,因为Cloze task的目标是预测当前被屏蔽的商品,而顺序推荐的目标是预测未来。为了解决这个问题,我们在用户行为序列的末尾附加一个特殊的标记“[mask]”,然后根据这个token的最终隐藏表示来预测下一个项目。为了更好地匹配顺序推荐任务(即预测最后一个项目),我们还生成了在训练期间只屏蔽输入序列中最后一个商品的样本。它的工作原理类似于顺序推荐的微调,可以进一步提高推荐性能。

实验

1. 效果比较

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第7张图片

Bert4Rec在所有的数据集上超过了所有的方法;它和所有的强的Baseline相比,HR@10上获得了7.24%的提升; NDCG@10上取得了11.03%的提升, MRR上取得了11.46%的提升。

2. Cloze objective以及Bidirectional的模型为什么好的讨论

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

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第8张图片

可以,而且帮助比较大。

2.2 为什么Bidirectional的模型比unidirectional的模型好?

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第9张图片

不同的head对应的attention不同。

  • 在第1层中,head 1倾向于关注左侧的商品,而head 2倾向于关注右侧的商品。
  • 不同层次的注意力不同。显然,第二层的关注点往往集中在最近的项目上。这是因为第2层直接连接到输出层,最近的项目在预测未来方面扮演着更重要的角色。
  • 与单向模型只能关注左侧的项目不同,BERT4Rec中的项目倾向于关注两侧的项目。这说明双向性对于用户行为序列建模是必要的和有益的。

3. 参数影响比较

3.1 隐藏维度d的影响

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第10张图片

随着维度的变高,模型会收敛更快。维度变高并不能保证模型取得最好的效果。

3.2 Mask的比例p的影响

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第11张图片
  • p的大小不同数据集不一样,一般不能太小也不能太大,太小或者太大都会带来较差的影响。
  • p的大小非常依赖于数据集的序列长度。

3.3 最大序列长度的影响

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第12张图片

不同数据集取得最佳效果的序列长度不一致,并不是越长的序列效果越好;

4. 解耦分析

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第13张图片
  • PE:位置编码对于Bert4Rec的影响是巨大的,删除PE,模型的效果大大的下降了。
  • PFFN: 长的序列可以从PFFN中获得较多的帮助;
  • LN,RC以及Dropout: 每个元素都可以从这些神经网络中获得提升;
  • 层的个数: 在大的数据集上,stacking Transformer layers可以得到较为明显的提升;
  • Head个数:不同数据集对于head的个数要求不一样;

结论

深度bidirectional自我注意结构在语言理解方面取得了巨大的成功。本文介绍了一种用于序列推荐的深度双向序列模型BERT4Rec。在模型训练中,我们引入Cloze task任务,该任务利用左右两个上下文预测被掩蔽的商品。在四个真实世界数据集的大量实验结果表明,我们的模型优于目前最好的方案。

参考文献

  1. BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer:dl.acm.org/doi/pdf/10.1

推荐算法炼丹笔记:序列化推荐算法Bert4Rec_第14张图片

你可能感兴趣的:(炼丹笔记,算法,大数据,编程语言,python,机器学习)