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

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

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

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

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

Bert4Rec

问题描述

模型框架

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

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

1. Transformer层

2. Multi-Head Self-Attention

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

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

于是我们有:

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

3. Position-wise Feed-Forward Network

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

4. Stacking Transformer Layer

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

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

5. Embedding层

6. 输出层

模型学习

1. 训练

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

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

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

2. 测试

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

实验

1. 效果比较

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

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

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

可以,而且帮助比较大。

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

不同的head对应的attention不同。

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

3. 参数影响比较

3.1 隐藏维度d的影响

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

3.2 Mask的比例p的影响

  • p的大小不同数据集不一样,一般不能太小也不能太大,太小或者太大都会带来较差的影响。
  • p的大小非常依赖于数据集的序列长度。

3.3 最大序列长度的影响

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

4. 解耦分析

  • 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相关推荐

  1. 推荐算法炼丹笔记:序列化推荐系统

    作者:一元 公众号:炼丹笔记 特约审稿:杰少 背景 序列推荐系统(SRS)不同于传统推荐系统(RSs)包括协同过滤和基于内容的过滤,SRSs试图理解和建模用户的连续行为.用户与物品之间的交互作用以及用 ...

  2. 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题

    本文对于推荐系统中的采样评估指标进行了讨论,内容略多, 还有一些数学推导, 有兴趣的可以去阅读文末给出的原始论文链接, 此处直接列出核心观点: 在评估推荐算法的效果时,能不采样就不采样! 除了AUC, ...

  3. 推荐算法炼丹笔记:如何让你的推荐系统具有可解释性?

    作者:一元, 公众号:炼丹笔记 可解释性和有效性是构建推荐系统的两大关键成份,之前的工作主要关注通过引入辅助信息来获得更好的推荐效果.但这些方法会存在下面的两个问题: 基于神经网络的embedding ...

  4. 推荐算法炼丹笔记:科学调参在模型优化中的意义

    作者:九羽 ,公众号:炼丹笔记 基于Embedding的推荐算法模型一直是近几年研究的热门,在各大国际会议期刊都能看到来自工业界研究与实践的成果.MF(Matrix Factorization)作为传 ...

  5. 推荐算法炼丹笔记:排序模型CTR点击率预估系列

    微信公众号:炼丹笔记 ​CTR点击率预估系列家谱 炼丹之前,先放一张CTR预估系列的家谱,让脉络更加清晰. (一)FiBiNET:结合特征重要性和双线性特征交互进行CTR预估 1.1 背景 本文发表在 ...

  6. 推荐算法炼丹笔记:CTR点击率预估系列入门手册

    ​CTR点击率预估系列家谱 炼丹之前,先放一张CTR预估系列的家谱,让脉络更加清晰. (一)FiBiNET:结合特征重要性和双线性特征交互进行CTR预估 1.1 背景 本文发表在RecSys 2019 ...

  7. 推荐算法炼丹笔记:非采样的负样本

    作者:一元,公众号:炼丹笔记 最近推荐相关的研究主要集中在探索神经网络的结构等,然后采用负采样对模型进行高效的学习.然而,这么做会导致有两方面的问题没有被考虑仔细: 负采样会带来较大的波动:基于采样的 ...

  8. 推荐算法炼丹笔记:阿里序列化推荐算法ComiRec

    作者:十方 公众号:炼丹笔记 Controllable Multi-Interest Framework for Recommendation 1.ComiRec与众不同之处 该论文是阿里在2020年 ...

  9. 推荐算法炼丹笔记:序列化推荐算法SASRec

    作者:一元 ,公众号:炼丹笔记 背景 本文介绍一篇较早使用Self-Attention进行序列化推荐的文章,也是目前大多数序列化推荐算法非常重要的Baseline,最典型的场景可以参见标题,该篇文章的 ...

最新文章

  1. Kubernetes — CNI 规范
  2. 关于python中requests模块导入问题-Python中requests模块的核心使用(1)
  3. Broadcom BCM4322(如:HP 6530b)wifi不能用解决办法
  4. winform datagridview 重新绘制datagridview的边框。
  5. Android进阶:六、在子线程中直接使用 Toast 及其原理
  6. 在Docker启动Cloudera并开始体验
  7. C++ Opengl 透明纹理源码
  8. volatile和synchronized的区别与联系
  9. Sublime Text 由于中文用户名导致无法安装插件
  10. 关于GPS定位反欺诈研究
  11. icecandidate事件
  12. Mysql连接的原理
  13. IT 软件项目管理 期末复习要点(太原理工大学)
  14. P1067 多项式输出 【模拟】
  15. app store android退款,买完 App、游戏内购就后悔了?手把手教你如何申请 App Store 退款...
  16. iPhone删掉的照片能恢复吗?iPhone最近删除的照片怎么恢复?
  17. maven学习系列8----将resources目录下的文件打包到jar包外
  18. php 搜索关键字,PHP获取搜索关键字有关问题_PHP教程
  19. JS判断用户输入是否为素数
  20. 解决 PR 或 AE 启动不了桌面弹出 Crash 文件

热门文章

  1. 使用c#类库绘制柱状图
  2. MVC核心功能组件和简介
  3. Lucene 简单手记
  4. 一文攻破共用体-C语言
  5. 将新建“Typora File”添加到鼠标右键
  6. 超实用资源,SCI写作到投稿全阶段模板
  7. python3 beautifulsoup 表格_[Python3爬虫]Beautiful Soup解析库
  8. 我的Python脚本——生成任意波形并存为txt
  9. Java实现快速排序 Quick Sort
  10. 计算机视觉与深度学习 | Matlab实现旋转矩阵R到四元数的转换(源代码)