精通推荐算法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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.