对于序列建模,实践了机器学习算法与在线服务协同设计的CTR预测系统,理论上可以处理无限长的用户序列。
从服务系统的角度来看,通过设计一个单独的模块用户兴趣中心UIC(User Interest Center),将用户兴趣模型中最消耗资源的部分与整个模型解耦。UIC维护最新的兴趣状态,对于每个用户,其更新取决于实时的用户行为触发事件,而不是流量请求,因此UIC是无延迟的实时CTR预测。
来自机器学习算法角度看,提出了一种新的基于内存的架构,命名为多通道用户兴趣记忆网络MIMN((Multi-channel user Interest Memory Network),捕捉来源于长序列行为的用户兴趣数据。
用户序列建模大致分为两类
(i) 基于pooling的结构,像Wide&Deep、YouTubeDNN、DIN将用户的历史行为视为独立的发出信号并应用sum/max/attention等池化操作来表示用户兴趣表示。
(ii) 顺序建模结构,像DIEN,将用户行为视为顺序信号并应用LSTM/GRU操作进行用户兴趣汇总,得到用户兴趣表示。
在工业应用中,将这些复杂的模型实时地部署到在线服务系统中需要付出很大的努力。每天数以亿计的用户访问系统,事情变得更加困难,因为模型都需要存储整个用户行为序列。这里“长”表示连续用户行为的长度达到1000条或者更多,系统延迟和存储成本增加与用户行为序列的长度近似成线性关系。正如DIEN所报告的那样,它需要做很多工程工作来部署顺序模型,它只处理最大长度为50的用户行为。
上图左边显示了用户行为的平均序列长度和用户活跃天数的关系图,右边是序列长度和AUC的关系图。可以明显看到,序列越长,取得的收益越大。
本文通过对机器学习算法和服务系统的协同设计来解决长序列建模的问题
(i) 服务系统视角:我们设计了一个单独的UIC(用户兴趣中心)模块。UIC关注用户行为的在线服务问题行为建模,为用户提供最新的兴趣表示每个用户。UIC的一个关键点是它的更新机制。更新只依赖于实时的用户行为触发事件,而不是流量请求。也就是说,UIC是无延迟的实时点击率预测。
(ii) 机器学习算法视角:仅解耦UIC模块无法解决存储问题,因为它仍然很难存储和进行推理
用户行为序列的长度扩展到1000到数百数以百万计的用户。这里我们借用记忆网络的概念
从NTM中提出了一种新的架构,称为MIMN(多通道用户兴趣记忆网络)。MIMN采用增量方式,可通过UIC模块实现很容易。这有助于解决存储挑战。此外,MIMN通过两种内存利用率设计改进了传统的NTM正则化和记忆归纳单元,使其更高效用于在有限存储空间下对用户行为序列进行建模。
总结:
• 提出了CTR预测的学习算法和服务系统协同设计实践。
• 设计了一种新颖的UIC模块,可以解耦沉重的负载从整个点击率预测中计算用户兴趣的过程。UIC对于流量请求是无延迟的,并且允许在离线中工作的任意复杂模型计算。
• 提出了一种新的MIMN模型,改进了原有的NTM体系结构,使其具有记忆利用正则化和记忆归纳单元,更加适合用户兴趣学习。
深度点击率模型
随着深度学习的快速发展,我们在许多领域都取得了进步,比如计算机视觉,自然语言处理。在这些成功的启发下,一大批基于深度学习的CTR预测方法已经提出。
方法上,这些方法利用神经网络来捕获特征交互,而不是传统的特征工程。虽然这个想法看起来很简单,但这些工作使CTR预测任务的发展向前迈出了一大步。之后,业界更加关注模型架构设计,而不是通过耗尽特征工程。除了学习特征交互之外,越来越多的方法被提出用于捕获从丰富的历史行为数据中获取用户洞察力。同时用户的兴趣是多种多样的,并且随着目标物料的不同而变化。DIN中引入了注意力机制来捕捉用户的兴趣。DIEN提出了一种辅助损失来获取潜在利益,具体的行为和改进GRU来模拟兴趣的进化。
长期用户利益
一些文章提出对用户的长期兴趣进行分类建模。增量模型的长期和短期用户兴趣得分,表达用户的兴趣。所有这些方法通过特征工程来建模长期利益,而不是自适应端到端学习。TDSSM提出联合建模,长期和短期用户利益提升推荐质量。不幸的是,这些基于深度学习的方法例如TDSSM, DIN, DIEN几乎不能实时部署,预测服务器面对极长的用户行为序列的
存储压力、计算延迟将随用户行为序列的长度增长而线性增长。
在工业应用中,行为序列的长度通常很小,例如50,虽然淘宝上的活跃用户可能会留下一些行为,比如点击,转换等,长度仅在两周内超过1000。
记忆网络
记忆网络NTM已被提出用于通过外部记忆组件提取知识。该思想已被广泛应用于NLP中,如问答系统。一些文章利用了记忆网络用于用户兴趣建模。然而,这些方法忽略了长期兴趣建模和实际部署问题。
在工业应用中,如电子商务中的推荐系统行业中,在特性集中用户行为特征贡献量最大
。例如,在我们的系统中,近90%的特征是用户行为特征,剩下的10%是用户人口统计特征
特性和广告特性。这些行为数据包含丰富的信息,对用户兴趣建模很有价值。
上图显示了没有任何其他的努力,基本模型长度为1000的序列的AUC与100的长度相比提高了0.6%。一般0.3%AUC的改善对业务来说已经足够重要了,这表明利用这些长序列用户行为数据非常有价值。
但利用长序列行为数据带来了巨大的挑战。在推荐系统中,行为特征通常存储在一个
额外的分布式内存存储系统,这些特征被提取到预测服务器参与接收流量请求时的实时推理计算。根据实际经验,在我们的系统中实施DIEN,RTP系统的用户行为序列长度为150,延迟和吞吐量已经达到性能边缘,更别说长度为1000的情况。
长序列用户行为数据,因为它面临着几个挑战,其中最关键的两个包括:
• 存储约束 推荐系统有6亿用户,每个用户的行为序列的最大长度为150,存储约为1TB,不仅存储product_id,还存储其他相关功能id,如shop_id, brand_id等。当行为序列的长度达到1000需要6TB的存储空间。在我们的系统中使用高性能存储来保持低功耗延迟和高吞吐量,如此巨大的存储空间太昂贵了。因此,一个相当长的行为序列意味着不可接受的存储消耗。
• 耗时限制 深度网络非常具有挑战性,特别是在我们有大量请求的情况下。QPS为500耗时为14ms,当用户行为的长度可达1000,DIEN的耗时达到200毫秒,30ms就已经不可接受了。
为解决长序列用户行为的挑战,我们提出了机器学习算法和服务系统协同设计的解决方案。由于用户行为是点击率预测系统中最具挑战性的部分,我们设计了一个UIC(用户兴趣中心)模块来处理它,如下图
UIC服务器维护每个用户的最新兴趣表示。UIC的一个关键点是它的更新机制,用户状态的更新,只取决于实时用户行为触发事件,而不是重新请求。也就是说,UIC对实时点击率预测没有延迟。UIC可以将DIEN模型在1000用户行为长度的条件下耗时从200毫秒降低到19毫秒(QPS为500)。
从长序列数据中学习是很困难的。简单RNN (RNN、GRU、LSTM)在面对相当长的序列时会失效并不奇怪。注意机制在DIN被引入将序列数据的必要信息压缩成定长张量,增强模型的表达能力。在DIN中,对于实时推理,它需要存储所有的原始数据行为序列,这给存储带来了很大的压力。此外,注意力的计算成本也在增加,与行为序列的长度成线性关系,这在长序列用户行为建模是不可接受的。
最近,NTM (Neural Turing Machine,神经图灵机)被提出从源序列中捕获信息并将其存储在一个固定的外部存储器的大小,相比于RNN类的模型在许多长序列数据的建模任务中实现了显著的改进。
借鉴NTM的思想,提出了一种基于记忆模型的网络模型,为我们提供了一种新的解决方案
处理长顺序用户行为建模。命名为MIMN(多通道用户兴趣记忆网络),如下图
UIC通过序列从用户的行为中逐渐捕获用户的兴趣。在论文中,我们提出了提高内存利用率的正则化方法,通过提高内存利用率来提高UIC中记忆张量的表达能力。另一方面,随着用户兴趣的变化随着时间的推移,我们提出记忆感应单元帮助捕获高阶信息。
标准的图灵机从序列中捕获和存储信息。时刻 t t t,记忆矩阵表示为 M t \mathbf M_t Mt,包含 m m m个记忆槽位 { M t ( i ) } ∣ i = 1 m \mathbf \{M_t(i)\} |_{i=1}^m {Mt(i)}∣i=1m,NTM有两个基本操作,记忆读取(memory read)和记忆写入(memory write),这2个操作通过一个控制器(controller)来交互,控制器是个RNN或者LSTM网络。
记忆读取操作
输入序列第 t t t个行为向量,控制器产生一个寻址向量 k t k_t kt,去槽位中的记忆矩阵的每个向量进行计算,得到相关性权重向量 w t r w^r_t wtr。
记忆读取实际上是根据输入向量和记忆矩阵各个向量的相关性来读取,相关性高的读出来的权重就大,相关性低的读出来的权重就小,最后的输出是根据相关性加权得到的。一般的内存读取要么读取要么不读取,是1和0的区别,这里借用了内存读取的概率,但是根据相关性来判定读取多少内容。
w t r ( i ) = exp ( K ( k t , M t ( i ) ) ) ∑ j = 1 m exp ( K ( k t , M t ( j ) ) ) i = 1 , 2 , . . . , m w_t^r(i) = \frac { \exp(K(k_t, M_t(i))) } { \sum_{j=1}^m \exp(K(k_t, M_t(j))) } \ \ \ \ i=1,2,...,m wtr(i)=∑j=1mexp(K(kt,Mt(j)))exp(K(kt,Mt(i))) i=1,2,...,m
这里度量寻址向量和槽位中的记忆向量的相关性用的是cos距离
K ( k t , M t ( i ) ) = k t T M t ( i ) ∣ ∣ k T ∣ ∣ ∣ ∣ M t ( i ) ∣ ∣ K(k_t, M_t(i)) = \frac { k_t^T M_t(i) } { || k_T|| \ || M_t(i)||} K(kt,Mt(i))=∣∣kT∣∣ ∣∣Mt(i)∣∣ktTMt(i)
根据权重得到输出向量
r t = ∑ i = 1 m w t r ( i ) M t ( i ) r_t = \sum_{i=1}^m w_t^r(i) M_t(i) rt=i=1∑mwtr(i)Mt(i)
记忆写入操作
基于写入也有个写入的权重向量 w t w w_t^w wtw,计算方式和读向量权重一样,也是控制器产生一个寻址向量,根据寻址向量和记忆矩阵计算相关性。写入时控制器还会产生一个增加(add)向量 a t a_t at和一个擦除(erase)向量 e t e_t et,记忆矩阵更新如下,也就是先根据擦除向量,擦除记忆矩阵,然后根据增加向量加上去。
M t = ( 1 − E t ) ⨀ M t − 1 + A t \mathbf M_t = (1-\mathbf E_t) \bigodot \mathbf M_{t-1} + \mathbf A_t Mt=(1−Et)⨀Mt−1+At
E t \mathbf E_t Et是擦除矩阵, A t \mathbf A_t At是增加矩阵, E t = w t w ⨂ e t \mathbf E_t = w_t^w \bigotimes e_t Et=wtw⨂et, A t = w t w ⨂ a t \mathbf A_t = w_t^w \bigotimes a_t At=wtw⨂at
传统的NTM存在内存利用率不平衡问题,特别是在用户兴趣建模的场景中。也就是说,热门项目往往容易出现在用户序列中行为数据和主导内存更新,使得内存的使用效率低下。有文章研究使用LRU策略来平衡利用率每个记忆。因为LRU非常注重平衡过程中每个短时间序列的内存利用率。在处理过程中,LRU几乎从不将信息写入相同的内容相邻时间步长的槽。然而,在我们的场景中,用户可以与属于相同兴趣的几个行为交互,因此应该写入相同的插槽。LRU将组织内容寻址和不适合我们的任务。在本文中,我们提出了一种新的记忆利用正则化策略。
Memory Utilization Regularization
通过不同的记忆槽位对写入权重向量的方差进行正则化,平衡利用率。让 g t = ∑ c = 1 t w c w ~ g_t=\sum_{c=1}^tw_c^{\tilde w} gt=∑c=1twcw~表示截止到时刻 t t t累积的更新权重, w c w ~ w_c^{\tilde w} wcw~表示重新平衡后的权重,计算方式如下,
P t = s o f t m a x ( W g g t ) P_t=softmax(W_gg_t) Pt=softmax(Wggt)
w t w ~ = w t w P t w_t^{\tilde w} = w_t^w P_t wtw~=wtwPt
这里 w t w w_t^w wtw是原始的写入权重向量, w c w ~ w_c^{\tilde w} wcw~是平衡后的写权重向量,参数 W g W_g Wg通过方差正则化约束来学习,如下
w w ~ = ∑ t = 1 T w t w ~ w^{\tilde w} = \sum_{t=1}^Tw_t^{\tilde w} ww~=t=1∑Twtw~
L r e g = λ ∑ i = 1 m ( w w ~ ( i ) − ∑ i = 1 m w w ~ ( i ) ) 2 L_{reg} = \lambda \sum_{i=1}^m( w^{\tilde w}(i) - \sum_{i=1}^m w^{\tilde w}(i) )^2 Lreg=λi=1∑m(ww~(i)−i=1∑mww~(i))2
这个约束使得写入权重的方差变小,从而有效缓解热门物料主导记忆矩阵的更新。
前面解决了长序列的记忆问题,但是对记忆中兴趣的提取没有涉及,这部分就是提取长序列记忆中蕴藏的用户兴趣。
NTM中的内存被设计用来存储来自尽可能多地使用源数据。美中不足的是它可能
错过捕捉一些高阶信息,为进一步提升在用户兴趣提取的能力,设计了一个记忆归纳单元MIU。MIU也包含一个内存矩阵S,带有m个槽位,与NTM相同。在这里,每个槽位通道视作用户的一个兴趣。
在 t t t时刻,根据NTM中的读取权重向量大小选择top k k k个兴趣通道, i : w t r ( i ) ∈ t o p k ( w t t ) ∣ i = 1 k i:w_t^r(i) \in topk(w_t^t)|_{i=1}^k i:wtr(i)∈topk(wtt)∣i=1k,根据选择的第 i i i个通道,使用GRU网络更新记忆矩阵S如下
S t ( i ) = G R U ( S t − 1 , M t , e i ) S_t(i) = GRU(S_{t-1}, M_t, e_i) St(i)=GRU(St−1,Mt,ei)
这里 e t e_t et表示用户行为向量,这里就从原始的记忆矩阵中提取到了用户的兴趣向量。
数据集和实验结果
Slot Number of Memory
我们对MIMN进行了实验具有不同数量的内存插槽。为了简化,我们只使用基本的NTM架构来评估MIMN,省略了内存利用正则化的设计以及记忆感应装置。
经验表明,槽数会影响模型的性能。我们的分析结果表明两者是相关的,每一个槽内存是随机初始化的。对于具有长行为的数据集序列,例如淘宝数据集,内存有更多的学习机会并实现稳定的代表性。在短行为的情况下,如Amazon数据集,模型性能用较大记忆容量受到学习的影响。尤其是当所有插槽的内存利用率不平衡,部分内存病媒可能没有得到充分利用和更新,这意味着这些内存向量仍然保持在原始初始化的附近。这将损害模型的性能。因此我们提出记忆利用正则化来缓解这个问题。
Memory Utilization Regularization
每个用户的兴趣强度不均匀,内存初始化随机,在基本NTM模型中,存储的利用是不平衡的。这个问题会伤害记忆的学习,使记忆不足用于利用有限的内存存储。我们使用内存利用率正则化技巧来帮助解决这个问题。
图6显示内存利用率,它验证的有效性这种平衡的效果也带来了改善在模型性能上,如表4所示
Memory Induction Unit
UIC服务器和RTP服务器同步 MIMN是用UIC和RTP实现的服务器在一起。因此,UIC之间存在非同步问题和RTP服务器。两个服务器的异步参数更新在具有周期的实际系统中,可能导致模型推理错误模型部署,这是有很大风险的。进行实验
模拟不同步的情况。表5显示了结果。
MIMN非同步参数更新对模型的影响不大,在个实验中,不同步更新的差距时间在一天之内,这是工业的传统设置系统。在实际系统中,设计了模型部署每小时执行一次,进一步降低风险。我们相信这是由于MIMN学习到的用户兴趣的稳定表示,使得MIMN具有良好的泛化性能。
大销售数据的影响 如今,大甩卖被采用通过许多电子商务网站来吸引顾客进行网上消费,例如中国著名的阿里巴巴双十一大促销。在这个极端情况下,样本分布以及用户行为都与日常情况有很大的不同。我们比较在收集和不收集训练数据的情况下,MIMN的性能
在我们系统的双十一大促销日。结果显示在Table5。我们发现最好从经验上删除大销售数据。
热启策略 虽然UIC的设计是为了在心理上更新增量,但是从稳定的积累开始需要相当长的时间。实际上,我们使用预热策略用预先计算的用户兴趣表示来初始化UIC。我们收集过去120天的历史行为(平均用户行为序列的长度为1000),每个用户和用训练好的MIMN模型在离线模式下进行推理,则将累积的内存推入UIC以进一步增量更新。
回滚策略 如果出现意想不到的问题,例如被大规模在线作弊污染了训练样本,那么UIC服务器的更新机制可能会受到很大的影响。一个棘手的挑战是寻求到异常点的情况发生了, 为了抵御这种风险,我们设计了一个回滚策略,每天早上存储在00:00学习到的用户兴趣表示的副本,并记录过去7天。
使用NTM的记忆矩阵来存储用户长序列,同时对NTM进行正则化的优化,进一步使用GRU提取用户兴趣,使得长序列建模突破存储和耗时的限制,从而提升线上效果。