当前位置: 首页 > news >正文

精通推荐算法29:行为序列建模之MIMN— 记忆网络建模长周期行为序列

1 行为序列建模总体架构

2 MIMN背景:为什么要建模长期行为序列

用户行为序列建模主要有两种方式。一种基于池化手段,包括累加池化(Sum Pooling)、平均池化(Mean Pooling)、最大值池化(Max Pooling)等,比如YouTubeDNN、DIN等模型。另一种采用序列模型,包括GRU、Transformer等,比如DIEN、BST等模型。二者在建模用户长周期行为序列时,比如长度超过1000,都会遇到很大的挑战。主要来源于两方面:

  1. 特征存储过大。当行为序列很长时,其体积可能占到所有特征的90%以上。为了保证线上响应速度足够快,一般会将特征存入内存中。而服务器内存一般相对较小,且很昂贵,这就给特征存储带来了很大的挑战。
  2. 线上响应变慢。不论采用池化还是序列模型,建模长周期序列时,计算复杂度都会随序列长度至少线性增长。而推荐系统一般都有高吞吐率、低时延的要求,特别是双11大促等流量洪峰时。一般来说精排模型打分需要在50ms内完成,才能保证系统整体的响应速度。这也是传统方法无法建模长周期序列的核心原因。

但是建模长周期序列可以带来的模型性能提升又是十分诱人的。如图5-13所示,在阿里巴巴在线广告系统中,长度1000的行为序列对比长度50的,其模型离线AUC提升了1.5%,可带来巨大的业务指标提升。这也是很合理的,长周期序列一方面包括了用户更多和更广泛的兴趣,从而让系统可以更懂用户。另一方面还包括了用户季节性、周期性的行为,比如去年同季节买过的衣服、上周周末看过的电影等。因此,建模长周期行为序列十分重要。

MIMN是工业界第一个建模长周期行为序列的模型,它由阿里巴巴广告团队于2019年提出,全称“ Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction[7]。它通过巧妙的工程设计和精细的算法模型,理论上可以建模无限长的行为序列,非常值得学习和借鉴。

MIMN工程设计:UIC模块

通常推荐系统中,每次请求都需要实时计算用户行为序列,所以导致模型整体耗时比较高。如果将长周期行为序列先离线建模好,在线请求时直接调用,则可以大大减少模型耗时。这也是大多数采用离线方案来建模长周期行为序列的核心思想。这儿有两个关键问题:

  1. 离线行为序列表征的更新机制。通常可采用每小时或每分钟定时更新,但容易导致用户最近的几次行为,无法被建模,影响整体推理准确度。一般来说,离当前越近的行为越重要。
  2. 行为序列无法与候选物品充分交叉。DIN指出了这一问题的重要性,对于不同的候选物品,行为序列表征应该是不同的,也就是“千物千面”。但显然提前离线建模行为序列,会导致二者无法交叉,最终仍是“千物一面”。

阿里巴巴设计了UIC( User Interest Center)模块,来实现行为序列离线建模。其线上系统架构,对比传统推荐系统,如图5-14所示。其中左边为传统架构,右边为阿里巴巴的架构。

如图5-14左边部分所示,在传统推荐系统中,当用户发起请求后,实时预估服务会先通过用户ID,查找其行为序列特征和用户侧其他特征。并通过候选物品ID,查找物品侧特征。然后将所有特征拼接后传送给推荐算法模型,得到排序结果后返回给用户。

而在阿里巴巴推荐系统中,如图5-14右边部分所示,当用户发起请求后,实时预估服务通过UIC模块直接获取行为序列建模后的表征,再和用户侧其他特征、物品侧特征合并后,传送给推荐模型,得到排序结果后返回给用户。这儿最大的区别是,可以直接拿到行为序列建模后的表征,而不是原始序列特征。从而将模型从用户行为序列建模中解放出来,大大加速了整体推理速度。

UIC模块的更新机制也十分巧妙。每次用户行为发生后,比如点击、收藏和购买等行为,都会触发UIC重新建模用户行为序列,从而更新其表征。这样相比每日或每小时定时更新,实时性高很多,基本可对齐实时计算,有利于提升模型推理准确度。同时,点击、收藏和购买等行为,发生频率比用户请求低一些,比如很多用户打开页面后并不发生点击等任何行为。所以相比实时计算,UIC还可以减少系统计算量。

最后需要指出的是,UIC模块并不能解决行为序列和候选物品不能充分交叉的问题。对序列建模,以及模型整体性能,存在一定的影响。

MIMN模型结构

MIMN模型架构如图5-15所示。整体上仍然是基于“Embedding + MLP”,如图中右边灰色部分所示。其核心点在于长周期用户行为序列的建模,主要包括两个模块:NTM Neural Turing Machine)记忆网络,如图中黄色部分所示,和MIU Memory Induction Unit)记忆归纳单元,如图中白色部分所示。

4.1. NTM记忆网络

先来看NTM记忆网络,它负责行为序列基础信息抽取。对于GRU等循环神经网络,由于梯度弥散问题,当序列长度增大时,其历史信息容易被遗忘,模型更关注当前状态,导致长周期行为序列建模效果不好。因此,MIMN采用NTM记忆网络代替它,来存储用户长周期行为信息。

NTM记忆网络存在slot负载不均衡的问题,这在行为序列建模中也十分常见。当用户点击物品时,其记忆网络中对应的slot需要更新。由于大多数推荐场景中热门和长尾物品流量十分不均匀,这就导致热门物品对应的slot需要频繁更新,而长尾的则更新较少。为了解决这个问题,MIMN对不同slot的写权重加入正则,从而使得每个slot的利用率尽量均衡。正则化的具体计算过程,就不展开了。

最后需要指出的是,行为序列的表征,是以增量更新的方式进行的。当有新的行为触发时,只需要利用当前序列表征和该行为,增量更新得到新的序列表征即可,而不需要将所有历史行为重新一起建模。这有利于降低服务器计算量,同时由于不需要储存所有历史行为特征,可以大大降低存储空间。

4.2. MIU记忆归纳单元

用户的长周期历史行为,可以被归纳到多类兴趣上,如图5-16所示。为了提升高阶信息捕获能力,比如每类兴趣的演化过程,MIMN还设计了一个记忆归纳单元MIU


 

MIMN总结和思考

MIMN是工业界第一个解决长周期行为序列建模问题的模型,它巧妙结合了工程和算法,在DIEN的基础上,进一步显著提升了业务效果。其核心点主要有:

  1. 通过UIC将行为序列建模从主模型中解耦出来,从而大大提升了主模型的推理速度,并使得长周期序列建模成为了可能。这是所有离线建模方案的核心。
  2. 序列表征的更新机制十分巧妙。用户发生行为时,触发序列表征重新计算和更新。既避免了每次请求就更新带来的冗余计算量,也避免了每小时或每分钟定时更新带来的延迟。
  3. NTM记忆网络有效解决了GRU长程序列梯度弥散问题,从而增强了长序列捕获能力。同时NTM增量更新的机制,也大大减少了计算和存储需求。
  4. MIU记忆归纳单元的设计有效提升了高阶信息捕获能力,有利于表征每类兴趣的演化过程。

不足之处是,和绝大多数离线建模方案一样,MIMN也没办法实现用户行为序列和候选物品的交叉,同样也是“千物一面”。这对模型性能的影响还挺大的,好在阿里后续推出了SIM、ETA等优化模型,有效解决了这一问题。

6 作者新书推荐

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

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

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线
  • ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作
  • 第143天:内网安全-权限维持自启动映像劫持粘滞键辅助屏保后门WinLogon
  • 探寻 IP 代理地址繁多之因
  • 【WPF】WPF学习之【二】布局学习
  • Spring Boot 部署(jar包)
  • 手机TF卡格式化后数据恢复:方法、挑战与预防措施
  • KRTS网络模块:UDP通信
  • MQ-7一氧化碳传感器详解(STM32)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • PostgreSQL的repmgr工具介绍
  • java基础-线程实现
  • 自己实现一个分布式锁
  • 【自然语言处理】调用NLTK数据失败‘wordnet‘和‘punkt‘不存在[Errno 11004]问题解决
  • BIO、NIO、AIO 有什么区别?
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS字符串转数字方法总结
  • Median of Two Sorted Arrays
  • node入门
  • Odoo domain写法及运用
  • 读懂package.json -- 依赖管理
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​如何防止网络攻击?
  • ​香农与信息论三大定律
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #pragma once与条件编译
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (八)Flask之app.route装饰器函数的参数
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)【Hibernate总结系列】使用举例
  • (转)甲方乙方——赵民谈找工作
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bat文件调用java类的main方法
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Core与存储过程(一)
  • .Net mvc总结
  • .netcore如何运行环境安装到Linux服务器
  • .NET分布式缓存Memcached从入门到实战
  • .net分布式压力测试工具(Beetle.DT)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net项目IIS、VS 附加进程调试
  • @Autowired和@Resource的区别
  • @TableLogic注解说明,以及对增删改查的影响
  • [ C++ ] STL---string类的模拟实现
  • []sim300 GPRS数据收发程序
  • [52PJ] Java面向对象笔记(转自52 1510988116)