推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法

(26) 2024-05-06 17:01:02

前面说到的几个模型序列的长度都不会太长,也即考虑的是用户的短期兴趣,例如DIN 和 DIEN 保留的历史行为长度都小于 100。但有实验表明,增加序列的长度能取得效果的提升:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第1张
从上图中可以发现,当用户行为序列长度增加到1000时,AUC会有1.5%的提升,这种幅度的提升在CTR预估任务当中是非常显著的提升了。但存在的问题是:随着用户历史行为特征序列长度越来越长,将其应用于线上系统变得越来越困难,因为线上系统(CTR预估)通常对耗时要求比较高(需要在一定时间内返回结果),系统的线上延迟和存储开销会随着用户历史行为序列的长度增加而线性增加。
所以,学习用户长期兴趣的超长序列建模,不仅要考虑模型的学习表达能力,要应考虑模型的效率和部署可行性。下面介绍两个在这方面的工作:

1.MIMN(KDD 2019)

这是一篇工程性很强的文章,重新设计了序列建模的架构,以解决海量用户的长序列存储和线上预测效率问题。文章借鉴神经图灵机利用额外存储模块来解决长序列数据问题。
关于神经图灵机NTM可以参考这篇Neural Turing Machines-NTM系列(一)简述。

1.1离线架构

推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第2张
整个网络的左侧主要负责用户兴趣的建模,该部分的核心及创新点主要包括以下两个方面:一方面是NTM中基本的memory read和memory write操作;另一方面是为提取高阶信息而采用多通道GRU的memory induction unit。网络的右侧则为传统的embedding+MLP的经典结构。

NTM

标准的NTM通过记忆网络对序列数据的信息进行提取和存储,以时间步t为例,存储的记忆矩阵记作Mt,一共有m个槽位(slot),第i个slot的记忆向量记作Mt(i),此时输入用户第t个行为embedding向量。行为向量通过controller以及两个基本的模块memory read和memory write对记忆进行读取和更新。

memory read:当输入第t个用户行为embedding向量,controller会生成一个用于寻址的read key k_t ,与memory中的每个slot进行相似度计算,接着利用相似度算softmax后的权重向量与每个slot相乘,最后得到一个加权求和的结果r_t:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第3张
memory write:在memory write阶段同样会先计算一个权重向量 。除此之外,还会生成两个向量,一个是add vector a_t,另一个是erase vector e_t,他们都是controller生成的并且他们控制着记忆网络的更新过程。记忆网络的更新过程如下所示:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第4张

写操作包括擦除和添加操作,擦除本次不需要的,添加需要的。有点类似于LSTM中的遗忘门与输入门。上图中的E就是擦除,A就是add。

Memory Utilization Regularization

传统的NTM在推荐场景中存在一个问题就是memory slot利用率很低,例如在推荐场景中会有很多热门的item,这种item被用户点击之后,输入到NTM进行处理的时候,由于item一定,可以看到NTM中write的过程,那么更新的权重经常也一定,比如这个item经过计算之后,第二个slot的权重值很大,而这个item又很热门,导致第二个slot一直被更新,而其他的slot几乎不更新,这样就导致slot的利用率更低了,这种情况可以认为如果不要其他的slot,也可以完成这种操作(这就是利用率的含义)。所以这里使用了正则,正则的目的是使得写权重更均匀,这样不至于使得一部分的slot的利用率很低。采用的方式是:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第5张
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第6张
将这个正则项作为损失函数的一部分,Lreg更小,那么使得w(i)各项都很相近。需要说明的是这里的w(i)是累积,所以目标是使得累积的权重更相近。

Memory Induction Unit(MIU)

NTM这里只是起到存储的目的,并没有去捕捉用户兴趣,或者说还没有进行深层次的特征挖掘,这里使用了一个GRU来捕捉用户兴趣,和NTM一样,有m个slot,每个slot就是用户的interest channel。在t时刻MIU选择K个兴趣轨道进行演化,每个轨道采用GRU结构来进行演化计算:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第7张

1.2线上架构

先来看看传统的线上实时CTR预估模块,用户行为序列建模是在predict server中完成。
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第8张
对用户短期行为序列建模时,为保证系统的低时延、高吞吐量,用户行为特征通常被存储在分布式内存系统中,当接收到一个request时,predict server从内存中读取相应的用户行为特征并进行实时的CTR预估。但面对长期用户行为序列建模时,会受到存储限制和延迟限制。

MIMN的设计初衷还是为了解决在使用长用户行为序列时的数据存储和线上预测耗时问题,其架构变为:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第9张
对于整个算法结构来说,在部署到线上的时候,主要的计算量都在网络的左侧部分(即用户行为兴趣建模),而右侧的Embedding+MLP的计算量则小很多。所以在线上部署的时候将左侧的网络部署到UIC server中,将右侧的网络部署到RTP(real-time prediction) server中。

其线上应用如下图所示:
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第10张

如上图,将MIU和NTM模块统一到了UIC server中,对于每个用户来说,TAIR中不再直接存储用户的行为序列,而是存储NTM模块中的记忆矩阵M,以及兴趣演化矩阵S。当用户访问系统时,从TAIR中读取M和S,并计算最终的点击率预估值,而当新的用户行为发生时,UIC server通过MIU和NTM模块快速队S和M进行更新,并重新写入TAIR中。

1.3总结

MIMN引入了NTM来存储和更新用户长期兴趣表达,并通过MIU来刻画用户兴趣的演化过程,一定程度上解决了长用户序列建模的难题,同时减少了特征存储空间。在线上应用时,通过UIC(User Interest Center) Server与线上预测过程解耦,以达到降低预测耗时的目的。但该模型使用的场景也是比较局限的,最主要的就是要有足够长的用户行为序列数据,一般的场景下是不符合模型使用场景的。不过这种模型拆解的思路,给大家在解决线上耗时难题时提供了一定的借鉴。

2.SIM(CIKM 2020)

目前的序列建模方法中,诸如DIN/DIEN/DSIN,其考虑候选广告和用户行为的关系(Attention等),使用与候选item相关的行为建模出用户对于当前候选的兴趣,即可以建模出用户对不同候选item的兴趣,但它的缺陷也很明显:用户行为不能太长,serving的性能和线上存储要求很高。
上面也提到了MIMN架构,从工程上,将用户兴趣建模和ctr预估解耦,在用户兴趣建模方面,借鉴NTM的思路,使用两个矩阵M和S分别存储用户兴趣的信息和用户兴趣演化的信息,线上进行ctr预估时,只需要读取两个固定大小矩阵。因为兴趣矩阵可以提前计算好,所以不会对线上耗时造成较大的影响。但其缺陷是MIMN 的用户兴趣表征模块只与用户行为有关,与 target item 无关,且它将用户历史行为不加过滤地压缩编码成固定维 memory matrix,当用户行为序列长度突破 1k 量级时,兴趣表征模块使用的 memory matrix 可能无法精确捕捉用户当前兴趣,这是提出 SIM 的主要动机。

与 DIN/DIEN/MIMN 类似,基于 SIM 的 CTR 预估模型整体上仍采用 Embedding&MLP 框架,主要创新点是在计算&存储可控的限制下,对超长用户历史行为序列(万级别)做长期兴趣表征建模(包括如何过滤全部历史行为中的噪声数据)。整体而言,针对每个 target item,SIM 采用两级检索方式对用户长期历史行为序列做过滤&激活:先将与当前 target item 相关的历史 items 降维到百级别,再借助 multi-head attention 机制与 target item 做交互得到长期兴趣表征。
推荐系统中的用户兴趣建模(四):用户长期兴趣——超长序列的建模方法 (https://mushiming.com/)  第11张

2.1 step1: GSU(从超长用户序列中过滤出和target item相关的兴趣序列)

把 target item 特征作为 query,从任意长的原始行为序列数据中搜索出与 target 相关的 topK items 作为候选,从而将用户历史行为降维到百数量级。具体的搜索策略又可分为 hard search 和 soft search 两种实现方式。
hard search: hard search 是利用 item category 属性特征,从历史行为中挑选与 target item 同 category 的 items,在工程实现上需维护 k-k-v 索引结构,实现从 user_id 到 category_id 到 items 的快速检索。
soft search 则利用 ALSH 这类 ANN 检索方案得到 topK items。文中提到因为长期用户行为的分布和短期用户行为的分布不一致,直接使用ctr模型中,短期行为学习到的embedding矩阵,会造成一定的误导,所以对于Soft Search中需要用到的embedding矩阵要单独搭建模型,进行训练。训练数据为超长的用户行为序列,作为ctr的一个辅助任务联合训练,如果行为过长,需要随机采样,辅助任务网络结构详见模型结构图左侧 soft search training 部分。

文中实验表明,hard search 虽然方案简单,但其筛序出的 items 与 soft search 重合度很高,故 hard search 特别适合 online serving,这也是阿里线上采用的方案。若采用 soft search 策略,则 GSU 和 ESU 会共享 item embedding layer 参数。此外,若用户历史行为太多以至于不适合全部作为辅助任务的输入特征,则会对用户行为序列做随机采样。

2.2 step2: ESU(对兴趣序列进行序列建模)

GSU做完后,就得到了用户行为序列中相对于候选item的序列子集,然后对于序列子集中的每个item,提取了两种特征,第一种是item的embedding,第二种是item相对于候选item的时间差,即decay,即时间信息。这两种信息拼接起来,得到的embedding去做multi-head Attention。

2.3 总结

总体来说,SIM的框架更加清晰也更加实用,其中的两步,如何去过滤超长用户序列得到兴趣序列以及如何对兴趣序列进行建模都可以根据自己的业务数据特点来制定相应的方法,可做的空间也比较大,我在阿里暑期实习的时候就曾完整的实现过step1和step2,将用户长期兴趣加入到粗排环节中,并采用了针对业务数据更有效果和更高效的方法,在离线和线上AB的时候都取得了较大的效果提升。

参考:
1.https://www.pianshen.com/article/32461580056/
2.https://zhuanlan.zhihu.com/p/94432395
3.https://zhuanlan.zhihu.com/p/336949535
4.https://zhuanlan.zhihu.com/p/416350009

THE END

发表回复