【Pinterest】基于transformer的用户实时行为建模——TransAct(KDD'23)

962 阅读7分钟

论文名称:《TransAct: Transformer-based Realtime User Action Model for Recommendation at Pinterest》

论文地址:arxiv.org/pdf/2306.00…

代码地址:github.com/pinterest/t…

1.前言

本文提出一个基于transformer建模用户实时行为序列的模块,TransAct。TransAct采用端到端的训练方式,并与一个建模非实时行为的模块(PinnerFormer,天级更新),共同构成一个在离线混合推断的精排架构(Pinnability)。该模型被应用在Pinterest的主Feed页(Home Feed)、相关推荐页(Related Pins)、搜索页(Search)以及通知(Notification)中,并获得核心指标的ab收益。该论文已被KDD'23收录。

2.Pinnability: 在离线混合更新架构

话不多说,首先我们来看Pinterest的精排模型完全体——Pinnability。

自下而上得,Pinnability的底座主要由两部分构成:建模非实时行为的PinnerFormer,以及建模实时行为的TransAct。除此之外,也包括一些其他的数值或类别特征。其中,类别特征会通过Embedding Layer投影成dense feature后进入下一层。

底座的特征经过各模块的编码后,通过concat操作进行合并,并分别经过DCN v2和MLP网络,最终输出多任务的预测结果。

3.TransAct: 实时行为建模

用户行为序列在推荐模型中具有至关重要的作用。一般来说,使用的用户行为序列越长,用户的兴趣表示也更加准确。然而长序列建模往往伴随着巨大的工程挑战,比如获取用户行为以及模型推断的耗时也将随之增加,进而可能有损用户体验和系统效率。

在这样的工程限制下,本文认为,在Pinterst场景中最重要的是用户最近发生的100个动作,需要采用更实时更复杂的模块进行特殊的处理。而更久远的行为则可以采用成本更低的方式进行离线的学习。

Pinterest统计的动作包括:点击(click)、repin(收藏)和hide(隐藏,属于负反馈)。所有交互动作都是pin(Pinterest的候选,一张图片)粒度的。对于用户行为不足100的,将会用零向量填充至100。

下面就是本论文的重头戏,用于建模用户实时行为的模块,TransAct。

TransAct的输入包含两部分:实时行为序列(用户最近的100个行为)和需要预测分数的候选。

实时行为序列的每一个元素由两部分concat构成:PinSage embedding和动作类型embedding。PinSage embedding是基于PinSage生成的包含内容信息的embedding。而动作类型embedding则是由动作类别经embedding layer端到端生成。

3.1 Early Fusion

推荐算法中的early fusion指的是在模型的早期阶段,融合用户和候选的特征。比如计算候选和用户行为序列中元素的相关性,又比如FFM等操作就属于early fusion。本文发现不同的early fusion方式对于提升性能非常重要。论文尝试了两种混合的方法:

  1. 追加(Append)。即在用户行为序列的最后添加候选的PinSage embedding。即TransAct的输入的序列长度为100+1。由于候选embedding还没有发生任何动作,所以使用了全零向量作为占位向量。
  2. 拼接(Concat)。在序列的每一个元素中增加一个候选的PinSage embedding。即序列每一个元素的输入由三部分构成:action type embedding + history_i pinsage embedding + candidata pinsage embedding。论文最终采用了concat的方式。

3.2 序列建模的Encoder

为了编码行为序列,本文尝试了多种编码器:CNN、RNN以及transformer。本文最终采用的结构是2层encoder加1个head的标准transformer。TransAct也消融了位置编码(Position Encoding),但是在该场景中没有效果,这点与阿里提出的BST结论不同。BST也是基于transformer从用户行为中提取用户兴趣,但是BST强调了用户行为顺序的重要性。这种差异性可能和场景有关,在电商场景,行为的顺序性更强,比如我买了电脑,可能就会开始看鼠标、键盘等等。而Pinterst的图片推荐场景则没有这么强的关联性。

3.3 Random Time Window Mask

以上改动会出现一个问题,那就是推荐系统推出的内容与用户的历史行为过于相似损害了主Feed页的多样性。为了解决这个问题,本文提出random time window mask。具体操作是,在训练时,生成一个随机数T服从均匀分布[0h, 24h]。h表示hour。所有发生在(tT,t)(t-T,t)的动作会在self-attention计算前过滤掉。tt表示发起该次请求时的时间戳。在serving阶段,则不会进行mask操作。

3.4 Transformer Output Comprehension

由于transformer是一个N进N出的编码器,transformer最终的输出是一个S×d|S|\times d的矩阵,S|S|是序列长度,dd是每个元素的embedding维度。然后,直接使用该输出会导致后续DCN层需要极大的计算量。因此本文尝试了多种方法对transformer的输出进行压缩:随机挑选K个元素、取前K个元素、Max Pooling以及取前K个元素+Max Pooling等多种方法。经过消融,最终选择了取前K个元素,并对剩余元素(SK|S|-K个)Max Pooling后与前K元素拼接,最终输入维度为K+1×d(K+1)\times d。超参数K=10。

4.实验结论

本文并没有采用公开数据集,而是用Pinterst自己的数据集进行了验证。因为公开数据集中没有可以提供用户实时行为的数据集。(所以能超过我的只能是我自己?)

实验分为了离线和在线两部分,并采用HIT@3进行性能得评估(因为Pinterest场景中该指标得在离线一致性较强)。离线阶段使用Pinterest的两周数据集进行训练,第三周的数据集进行测试。

在线ab测试中,TransAct相比基线,在全局用户和Non-core用户中均取得核心指标得收益。Non-core用户的定义是在过去的28天中没有pin过任何图片的用户。

5.工程细节

  1. 基于Label Weight Matrix确定task weight。Pinnability是一个多任务学习模型,损失函数采用加权交叉熵损失函数。每个目标的权重通过Label Weight Matrix来实现。其核心思想是动态调节目标的重要性权重,比如用户hide(隐藏,一种负反馈)一张图片后,则对模型预测该图片可能会click(点击,一种正反馈)给予更高的惩罚权重。
  2. 基于user weight的样本权重方案。user weight = state[活跃度] x location x gender。用于商业化。
  3. 模型重训。Pinnability每周会重训两次,为的是防止模型对实时特征的更新不敏感,使其不能捕捉用户不断变化的用户行为和偏好。
  4. 针对GPU服务时,CUDA核量大计算小的特点,设计了fuse CUDA kernels、combine memory copies、form larger batches、use CUDA graphs。
  5. TransAct的实验收益被低估。全量后,用户因为感知到推荐系统的即时响应,会更倾向于通过行为表达自己的偏好,从而产生更多的实时行为数据,而模型重训可以让更好得捕捉训练数据的变化。
  6. 计算量及Latency。使用GPU能显著降低serving cost和latency。

6.消融实验

  1. Realtime-Batch Hybrid:TransAct作用显著,其次Pinnerformer,other features作用较小。
  2. Encoder:普通Transfoer表现最优,avg pooling表现不俗。
  3. Early Fusion & 序列长度:concat最优,长度越长越好。
  4. Transformer超参[encoder layer, feed forward dim]:【4, 384】效果最优,但latency增加30%。最终组合为[2, 32]。