盖坤长序列建模论文解读系列:SIM

123 阅读9分钟

盖坤其人

盖坤在搜广推领域可谓鼎鼎大名,2011年盖坤清华大学博士毕业,以第一批“阿里星”计划的身份入职阿里的广告团队,即阿里妈妈。早年以发表了用于召回的模型TDM闻名,后来长期致力于推荐系统(广告推荐)CTR预估这一领域,并发表多项研究成果,从DIN,DIEN到后来基于用户行为序列的SIM。

盖坤在2020年入职快手,为躲避竞业协议化名于越。但是2022年被阿里巴巴起诉违反竞业协议,最终赔偿200万。

好了,言归正传。

SIM简介

论文在这:《Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction》 标题翻译过来是:使用终身序列行为数据的基于搜索的用户兴趣建模用于点击率(CTR)预测。

是盖坤(团队)在阿里妈妈的时候于2020年发表的论文。提出了用户行为长序列建模的SIM架构(范式),即Search-based User Interest Modeling 的首字母。GSU和ESU的二级单元的首次提出奠定了后续很多长序列建模的基础架构。

SIM架构定位

图中表示的是当时阿里妈妈的CTR预估模块(系统)的架构,预估模块也可以叫排序模块,指的是把召回的item进行预估然后排序截断,取top 返回。首先可以明确的是SIM是在召回之后,实际排序的之前,也可以视作排序的一部分,是其中的特征获取阶段。

图中最终把召回的item用来的做预估的特征有如下四类来源:

  1. SIM的部分(包含GSU和ESU两个阶段)也就是本文介绍的内容。这个指的是用户的长期兴趣。
  2. Candidate Item(候选item)即召回的item自身的Embedding。它也参与SIM和DIEN这两类用户兴趣的建模。
  3. 用户短期兴趣,核心模型是DIEN,是盖坤更早之前论文中的。
  4. Other Fea,其他特征。

这四类特征经过Concat和Flatten之后,会再参与后面的模型,不过后续的模型比较简单了。

前置概念和术语

这里召回的结果是target ad(目标广告),因为盖坤当时是阿里妈妈的,阿里妈妈是阿里的广告团队。所以召回的结果是广告,不过下面我使用target item替代,更具有通用性。用户的历史行为中的item可以理解成用户过去点击过的商品(毕竟阿里主营业务是电商,阿里妈妈主要服务于电商商品的广告)。

SIM指的是把召回出来的target item,和用户过去的行为历史中的item做匹配,从历史item中提取出item子序列。这个item序列整体会作为target item的一个特征,最终参与排序模型的计算。而SIM论文的核心就是解释清楚如何从比较长的用户历史item中提取出这个子序列。

SIM主要通过分成两个阶段来实现这一过程:第一阶段称为GSU(General Search Unit),第二阶段称之为ESU(Exact Search Unit)。

其实SIM的核心思想并不新奇,是计算机领域比较常见的优化思路,通过分阶段(分层)的系统设计实现效果收益与系统开销(资源与耗时)之间的平衡。比如在推荐系统经典架构中,主要会分成召回和排序两个阶段,他们处理的数据的规模不在同一个量级,通过召回先降低item的数量规模再进入排序阶段。而排序阶段目前也会分成粗排和精排两个阶段,利用两阶段漏斗来处理召回的item,粗排是用简单的模型和算法处理大量的数据,精排是用更为复杂的模型和算法处少量的数据(基于粗排的结果)。

也就是GSU用来降低计算规模,ESU用来提升效果。

个人感觉General和Exact,一个是“大致的”,一个是“精确的”,也可以理解成“粗”和“精”的意思。可以看出SIM是受排序拆分成粗排和精排这个架构影响的。当然粗排和精排是偏汉语的说法,英文表达可能有其他单词,比如Twitter中称为Light Ranker和Heavy Ranker,也有地方会有Basic,Fine之类的词来表达。

GSU

SIM的Search-based 的意思,也就基于检索,而GSU就是Search-based 的这部分。也就是架构中我用红框框出来的部分。

可以看到Query和Index(索引)字样,是信息检索里面的术语,也是就是SIM名称说的基于检索的原因。 B=[b1,b2,...;bT]B=[b_1,b_2,...;b_T] 表示用户的历史行为序列(b是behavior即行为这个单词的首字母),共有T个。当然这个T也不是全部的历史,而是截断的最近T个。GSU的过程就是给每个target item从BB中提取出最相似的K个元素作为子序列BB^∗

具体而言GSU有Hard Search和Soft Search两种做法。下面的 rir_i 表示的是某个target item和第i个历史item之间的相关性分数(relevant score,首字母是r)

Hard Search是把物品实现分类,检索的时候把target ad和用户行为历史中的物品同分类的聚合起来。实现上是对每个用户离线建立了一个二级索引,称之为user behavior tree(简称UBT),UBT是Key-Key-Value的数据结构,第一个Key是UserId,第二个Key是分类Id,最后查询出来的Value是这个用户历史行为中在这个分类下的Item列表。

Soft Search是基于Embedding的,用了复杂的模型做相似度的检索,实际比上面的公式要再复杂一些:

在计算了Target Item的Embedding和每个历史行为序列中的item的Embedding的相似度之后,要做一次Sum pooling(这个是出自CNN的常规计算,可以当成一种剪枝),然后再和Target Item的Embedding拼接起来,这一步应该算是残差连接(出自ResNet,用来解决训练过程中的梯度消失问题)。最终喂给MLP,图中应该省略了全连接层,只画了激活函数,激活函数用的PReLu或者Dice,最后是输出层用的Softmax归一化数值(常规操作)。

注意Soft Search里的MLP操作和最终整个预估系统最后的MLP是一样的。

ESU

毕竟这篇论文发表于2020年,所以不能免俗地借鉴(蹭)了Transformer,比如ESU的公式和Transformer的注意力机制就很像。这个是ESU

  • attscorei=Softmax(WbizbWaiea)\text{att}^i _{score} = \text{Softmax}(W_{bi}z_b ⊙ W_{ai} e_a)
  • headi=attscoreizb\text{head}_i = \text{att}^i_{ score} z_b
  • Ult=concat(head1;...;headq)\text{U}_{lt} = \text{concat}(\text{head}_1; ...;\text{head}_q)

Ult 表示用户(User)长期(longtime)的兴趣分布。

下面是Transformer的注意力机制:

  • Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^{T}}{\sqrt{d_k}} \right) V

  • where headi=Attention(QWiQ,KWiK,VWiV)\text{where head}_{i} = \text{Attention}(QW_{i}^Q, KW_{i}^K, VW_{i}^V)

  • MultiHead(Q,K,V)=Concat(head1,...,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_h)W^O

当然这部分和原始Transformer的注意力细节上并不同。没有QKV三类矩阵,只有 WbizbW_{bi}z_bWaieaW_{ai}e_a 两个。这里的i指的是第i个head,因为ESU也用了Multi Head Attention(多头注意力)的说法,每个head表示学习用户不同的兴趣。不过我们可以先忽略这里的下标i,只关注一个head的计算过程。即 WbzbW_{b}z_bWaeaW_{a}e_a ,这里的 WbW_bWaW_a 是要通过训练学习的权重Embedding。 eae_a 表示的target item的Embedding。 zbz_b 的含义下面展开讲一下。

BB^∗ 表示GSU给每个target item从用户历史中提取中的相似子序列,包含K个元素。

D=[1;2;...;K]D=[∆_1;∆_2;...;∆_K] 表示的是target item和这K个子序列中的每个前序item的时间间隔信息。

E=[e1;e2;...;eK]E^∗=[e_1^∗;e_2^∗;...;e_K^∗]BB^∗ 中每个item的Embedding的序列。 eje_j^∗ 是第j个item的Embedding。

Et=[e1t;e2t;...;eKt]E_t=[e_1^t;e_2^t;...;e_K^t]DD 中每个时间距离对应的Embedding的序列。 ejte_j^t 是第j个item的时间间隔的Embedding。

zj=concat(ej,ejt)z_j=concat(e_j^∗,e_j^t) 是对第j个item的 eje_j^∗ejte_j^t 做拼接,也就是把子序列中每个item自身的Embedding和它与target Item的时间间隔的Embedding做拼接。这一步也十分像Transformer中把句子序列的每个token的Embedding和它的位置编码的Embedding进行拼接的操作!也就是Transformer中这个地方:

Transformer输入

zb 之迷与思考

不过原始论文在讲完了 zjz_j 以后直接在计算Attention的公式 attscorei=Softmax(WbizbWaiea)\text{att}^i _{score} = \text{Softmax}(W_{bi}z_b ⊙ W_{ai} e_a) 里面提到了 zbz_b ,但是没有具体说 zbz_b 是什么。 zbz_bzjz_j 是相同含义吗?答案应该是否定的。因为 zjz_j 仅表示target item的 BB^∗ 序列中第j个item的加工后的Embedding,但是这里应该需要的是整个 BB^∗ 子序列对应的 zjz_j 序列,而不可能仅仅是某一个的历史行为item的。所以这里的 zbz_b 我猜测是:

zb=[z1,...zj,...zk]zb=[z_1,...z_j,...z_k]

zbz_b 换成大写字母可能更合适一些。这个用Transformer的注意力也能得到佐证。已知 eae_a 表示的是某个target item的Embedding,如果类比Transformer的注意力, eae_a 相当于某一个q,而 zj 相当于某一个k,Transformer的自注意力机制会用一个token的q去和所有token的k相乘,所有token的k组合用K矩阵表示。所以这里的 zbz_b 应该也是 zjz_j 的序列,即一个矩阵,相当于K。

这里和Transformer也有不同,Transformer中一个句子的多个token有多个q,也可以组成一个Q矩阵,最终是QK两个矩阵相乘。而SIM中不同target item它对应的 zjz_j 序列是不同的,所以它只能关注单个target item,相当于只能一个q和K相乘,而不能Q矩阵(多个target item的 eae_a )和K矩阵相乘,因为不同q对应的K不同!

总结

理论上来说,直接对用户的历史行为做ESU肯定是效果上是最好的,但是计算量太大,资源和耗时都撑不住。所以借鉴了计算机领域比较常见的分层思想,也通过GSU剪枝降低计算量,再通过ESU寻求最大化收益。

另外在ESU阶段的建模上借鉴了Transformer的注意力机制。

当然分层思想也有弊端,也就是每一层的效果上限是由上一层的结果决定的。而GSU是比较粗放的计算,比较容易把一些在ESU阶段可能比较靠前的item丢弃掉。因而不得不引出后面的升级版TWIN和TWIN V2。下一次我再来解读相关论文,敬请期待。欢迎关注。