精通推荐算法29:行为序列建模之MIMN— 记忆网络建模长周期行为序列
1 行为序列建模总体架构
2 MIMN背景:为什么要建模长期行为序列
用户行为序列建模主要有两种方式。一种基于池化手段,包括累加池化(Sum Pooling)、平均池化(Mean Pooling)、最大值池化(Max Pooling)等,比如YouTubeDNN、DIN等模型。另一种采用序列模型,包括GRU、Transformer等,比如DIEN、BST等模型。二者在建模用户长周期行为序列时,比如长度超过1000,都会遇到很大的挑战。主要来源于两方面:
- 特征存储过大。当行为序列很长时,其体积可能占到所有特征的90%以上。为了保证线上响应速度足够快,一般会将特征存入内存中。而服务器内存一般相对较小,且很昂贵,这就给特征存储带来了很大的挑战。
- 线上响应变慢。不论采用池化还是序列模型,建模长周期序列时,计算复杂度都会随序列长度至少线性增长。而推荐系统一般都有高吞吐率、低时延的要求,特别是双11大促等流量洪峰时。一般来说精排模型打分需要在50ms内完成,才能保证系统整体的响应速度。这也是传统方法无法建模长周期序列的核心原因。
但是建模长周期序列可以带来的模型性能提升又是十分诱人的。如图5-13所示,在阿里巴巴在线广告系统中,长度1000的行为序列对比长度50的,其模型离线AUC提升了1.5%,可带来巨大的业务指标提升。这也是很合理的,长周期序列一方面包括了用户更多和更广泛的兴趣,从而让系统可以更懂用户。另一方面还包括了用户季节性、周期性的行为,比如去年同季节买过的衣服、上周周末看过的电影等。因此,建模长周期行为序列十分重要。
MIMN是工业界第一个建模长周期行为序列的模型,它由阿里巴巴广告团队于2019年提出,全称“ Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction”[7]。它通过巧妙的工程设计和精细的算法模型,理论上可以建模无限长的行为序列,非常值得学习和借鉴。
3 MIMN工程设计:UIC模块
通常推荐系统中,每次请求都需要实时计算用户行为序列,所以导致模型整体耗时比较高。如果将长周期行为序列先离线建模好,在线请求时直接调用,则可以大大减少模型耗时。这也是大多数采用离线方案来建模长周期行为序列的核心思想。这儿有两个关键问题:
- 离线行为序列表征的更新机制。通常可采用每小时或每分钟定时更新,但容易导致用户最近的几次行为,无法被建模,影响整体推理准确度。一般来说,离当前越近的行为越重要。
- 行为序列无法与候选物品充分交叉。DIN指出了这一问题的重要性,对于不同的候选物品,行为序列表征应该是不同的,也就是“千物千面”。但显然提前离线建模行为序列,会导致二者无法交叉,最终仍是“千物一面”。
阿里巴巴设计了UIC( User Interest Center)模块,来实现行为序列离线建模。其线上系统架构,对比传统推荐系统,如图5-14所示。其中左边为传统架构,右边为阿里巴巴的架构。
如图5-14左边部分所示,在传统推荐系统中,当用户发起请求后,实时预估服务会先通过用户ID,查找其行为序列特征和用户侧其他特征。并通过候选物品ID,查找物品侧特征。然后将所有特征拼接后传送给推荐算法模型,得到排序结果后返回给用户。
而在阿里巴巴推荐系统中,如图5-14右边部分所示,当用户发起请求后,实时预估服务通过UIC模块直接获取行为序列建模后的表征,再和用户侧其他特征、物品侧特征合并后,传送给推荐模型,得到排序结果后返回给用户。这儿最大的区别是,可以直接拿到行为序列建模后的表征,而不是原始序列特征。从而将模型从用户行为序列建模中解放出来,大大加速了整体推理速度。
UIC模块的更新机制也十分巧妙。每次用户行为发生后,比如点击、收藏和购买等行为,都会触发UIC重新建模用户行为序列,从而更新其表征。这样相比每日或每小时定时更新,实时性高很多,基本可对齐实时计算,有利于提升模型推理准确度。同时,点击、收藏和购买等行为,发生频率比用户请求低一些,比如很多用户打开页面后并不发生点击等任何行为。所以相比实时计算,UIC还可以减少系统计算量。
最后需要指出的是,UIC模块并不能解决行为序列和候选物品不能充分交叉的问题。对序列建模,以及模型整体性能,存在一定的影响。
4 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。
5 MIMN总结和思考
MIMN是工业界第一个解决长周期行为序列建模问题的模型,它巧妙结合了工程和算法,在DIEN的基础上,进一步显著提升了业务效果。其核心点主要有:
- 通过UIC将行为序列建模从主模型中解耦出来,从而大大提升了主模型的推理速度,并使得长周期序列建模成为了可能。这是所有离线建模方案的核心。
- 序列表征的更新机制十分巧妙。用户发生行为时,触发序列表征重新计算和更新。既避免了每次请求就更新带来的冗余计算量,也避免了每小时或每分钟定时更新带来的延迟。
- NTM记忆网络有效解决了GRU长程序列梯度弥散问题,从而增强了长序列捕获能力。同时NTM增量更新的机制,也大大减少了计算和存储需求。
- MIU记忆归纳单元的设计有效提升了高阶信息捕获能力,有利于表征每类兴趣的演化过程。
不足之处是,和绝大多数离线建模方案一样,MIMN也没办法实现用户行为序列和候选物品的交叉,同样也是“千物一面”。这对模型性能的影响还挺大的,好在阿里后续推出了SIM、ETA等优化模型,有效解决了这一问题。
6 作者新书推荐
历经两年多,花费不少心血,终于撰写完成了这部新书。本文在5.6节中重点阐述了。
源代码:扫描图书封底二维码,进入读者群,群公告中有代码下载方式
微信群:图书封底有读者微信群,作者也在群里,任何技术、offer选择和职业规划的问题,都可以咨询。
详细介绍和全书目录,详见
《精通推荐算法》,限时半价,半日达https://u.jd.com/mq5gLOH