精通推荐算法26:行为序列建模之BST— Transformer建模用户行为序列

2024-08-21 11:04

本文主要是介绍精通推荐算法26:行为序列建模之BST— Transformer建模用户行为序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 行为序列建模算法架构

BST背景

DIEN利用GRU循环神经网络来建模用户行为序列,捕获了用户行为的演变过程,以及行为间的相关关系,取得了非常不错的业务效果。但受制于GRU天然的串行计算方式,存在长程序列梯度弥散、串行计算影响速度等问题。在自然语言处理领域,Transformer自2017年提出以来,就席卷了整个行业,并在2018年BERT上线后大放异彩。2022年底火遍全球的ChatGPT,其模型底座就是Transformer。相比于GRU,Transformer优势巨大,主要有:

  1. 可以并行计算Transformer的多头自注意力(后称Multi-Head Self Attention前馈神经网络(后称Feed-Forward可以并行计算。而GRU和LSTM等循环神经网络则依赖上一状态,必须串行
  2. 减少长程依赖,利用Self Attention将每个Token之间距离缩短为1,大大缓解了循环神经网络因长距离反向传播导致的梯度弥散问题。
  3. 增加网络深度。由于大大缓解了长程序列梯度弥散问题,Transformer网络可以很深,基于Transformer的BERT甚至可以做到24层。而GRU一般只有2层或者4层。网络越深,高阶特征捕获能力越好,模型性能也越高。
  4. 真正的双向网络。Transformer可以同时融合前后位置的信息,而双向GRU只是将两个方向的编码结果简单相加,严格来说仍然是单向的。
  5. 可解释性。Transformer通过Attention强度,可以表达状态之间的相关性,可解释性更强。Attention得分越高,相关性也越大。

BST将Transformer引入到了推荐算法用户行为序列建模中,取得了不错的业务效果。它由阿里巴巴淘宝推荐团队于2019年提出,全称“ Behavior Sequence Transformer for E-commerce Recommendation in Alibaba[4]

3 BST模型结构:Transformer输入层

BST模型结构包括三个部分,分别是Transformer输入层Multi-Head Self Attention模块Feed-Forward模块,下面依次进行介绍。

BST整体上仍然是“Embedding + MLP”的基本范式,主要优化点为用户行为序列建模部分。它利用Transformer[5]中的Multi-Head Self Attention和Feed-Forward,来建模得到原始行为序列的表征向量。再和其他特征的Embedding向量,合并在一起。然后经过多层全连接神经网络,实现特征充分交叉。最终通过Sigmoid激活输出。其模型结构如图5-9所示。

下面重点来看行为序列建模部分。Transformer的输入分为两部分。一部分是行为序列中各物品的特征向量,比如物品ID、类目ID、卖家ID、品牌ID等,如图5-9中的红色向量。这儿可以挑选一些比较重要的物品侧特征,BST受制于计算复杂度,只加入了物品ID和类目ID。行为序列中的这些特征,可以与物品侧的对应特征共享Embedding向量,从而加速模型收敛,并提升鲁棒性。

另一部分是位置特征,用来表征行为发生的先后顺序和时间间隔,如图5-9中的蓝色向量。位置特征的计算如公式5-15所示。

4 BST模型结构:Multi-Head Self Attention模块

5 BST模型结构:Feed-Forward模块

这部分和原版Transformer基本一样,采用两层全连接。为了防止过拟合,全连接之间加入了LeakyReLU非线性激活Dropout函数。Self Attention和Feed-Forward模块中,均应用了残差连接,从而优化梯度弥散问题并增加模型稳定性。并利用LayerNorm进行层归一化。计算过程如公式5-18所示。

  1. 先将输入向量送入Multi-Head Self Attention模块,并经过Dropout函数。然后再和输入向量相加,实现残差连接。再通过LayerNorm归一化。
  2. 再将第一步的输出送入两层全连接网络,并经过ReLU激活和Dropout函数。然后再和第一步的输出向量相加,实现残差连接。再通过LayerNorm归一化。得到最终输出。

LayerNorm可以对不同层的数据进行归一化,让它们保持在一个量级上,从而可以加快收敛速度。与BatchNorm计算方法类似,但作用目标不同,注意区分。另外需要注意的是,两层全连接之间没有使用残差连接

最后,在自然语言处理中,经常会堆叠(Stacking)多层Multi-Head Self Attention和Feed-Forward模块,从而捕获高阶语义。BERT基础模型堆叠了12层,其Large版本更是采用了24层。BST对这方面也做了研究,最终发现堆叠单层,在其业务场景上效果最好。其原因主要为,推荐算法中特征间的相关性比较直接,相对容易捕获。另外堆叠多层,会加大计算复杂度,增加模型训练和预测耗时。具体使用多少层,要根据实际业务场景数据分布来确定,并考虑可能因此带来的时延。

6 BST代码实现

参见文章 精通推荐算法27:行为序列建模之BST— 代码实现

7 作者新书推荐

历经两年多,花费不少心血,终于撰写完成了这部新书。本文在5.4节中重点阐述了。

源代码:扫描图书封底二维码,进入读者群,群公告中有代码下载方式

微信群:图书封底有读者微信群,作者也在群里,任何技术、offer选择和职业规划的问题,都可以咨询。

详细介绍和全书目录,详见

《精通推荐算法》,限时半价,半日达icon-default.png?t=N7T8https://u.jd.com/mq5gLOH

这篇关于精通推荐算法26:行为序列建模之BST— Transformer建模用户行为序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092978

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数