type
status
date
slug
summary
tags
category
icon
password
用户长期兴趣建模
1.早期方式
sum pooling、avg pooling、max pooling
sum pooling:sum([0.3,0.4,0.5])
avg pooling:avg([0.3,0.4,0.5])
max pooling:max([0.3,0.4,0.5])
缺点:易丢失信息。sum和avg对序列中的所有item一视同仁。
2.DIN

DIN的注意力机制是一种用于对用户历史行为进行加权池化的方法,其主要思想是:
- 根据候选广告和用户历史行为之间的相关性,计算一个注意力权重,反映了用户历史行为对候选广告的重要程度。
- 将用户历史行为的Embedding向量乘以注意力权重,然后求和得到一个动态的用户兴趣向量。
- 将动态的用户兴趣向量与其他特征一起输入到多层感知器网络中,预测点击率。
这种方法可以实现对用户兴趣的动态表示,提高推荐效果。以下是一个简单的例子:
假设有一个候选广告是一本《深度学习》的书籍,有一个用户的历史行为序列是:
: 点击了《机器学习》 : 点击了《人工智能》 : 点击了《数学分析》 : 点击了《小王子》
那么DIN模型会计算出每个历史行为与候选广告之间的注意力权重,例如:: 0.8 : 0.7 : 0.6 : 0.1
这些权重反映了每个历史行为对于推荐《深度学习》这本书籍的影响程度。可以看出,《机器学习》和《人工智能》等与深度学习相关的内容会有较高的权重,而《小王子》等与深度学习无关或者负相关的内容会有较低的权重。
然后DIN模型会将每个历史行为的Embedding向量乘以相应的注意力权重,然后求和得到一个动态的用户兴趣向量。例如:
: [0.8 * 0.2, 0.8 * 0.3, 0.8 * 0.4] + [0.7 * 0.1, 0.7 * 0.2, 0.7 * 0.3] + [0.6 * -0.1, 0.6 * -0.2, 0.6 * -0.3] + [0.1 * -1, 0.1 * -2, 0.1 * -3] = [1,-1,-2]
这个向量就是DIN模型根据用户历史行为和候选广告生成的动态用户兴趣向量。可以看出,这个向量比较接近于《机器学习》和《人工智能》等相关内容的Embedding向量,而远离于《小王子》等无关或者负相关内容的Embedding向量。
最后DIN模型会将这个动态用户兴趣向量与其他特征(如候选广告特征、上下文特征等)一起输入到多层感知器网络中,预测点击率。例如:
: MLP([1,-1,-2], [x,y,z], …) -> CTR
其中[x,y,z]表示候选广告特征等其他特征。
总的来说,DIN的思路是,当给用户呈现不同的target item时,会唤醒用户历史中的不同部分,因此history item embedding在聚合成user interest embedding时应该有不同的权重。
- DIN用target item和每个historical item做attention来确定这个权重
- 和target item相似的historical item,权重高一些,在组成user interest embedding时发挥更大使用;
- 反之,和target item不相似的historical item embedding,权重低,组成user interest时影响小;
- 整个过程的时间复杂度是O(L*B*d),L=user sequence length, B=batch_size, d=embedding dimension
3.SIM

当用户的行为序列特别长时,直接套用DIN会有一个无法回避的难题,就是计算量太大。因此,SIM采取了两步走的策略:
- 第一步是所谓的GSU(General Search Unit),借助离线建立的索引,拿target item直接从索引中提取与它相似的historical items组成的Sub Behavior Sequence (SBS)。这个过程就对应SIM中的S代表的Search。这个Search过程的时间复杂度是O(log(M))<<O(L),M是一个建立索引时的超参,用来平衡搜索的精度与速度。
- 第二是所谓的ESU(Exact Search Unit),拿target item与GSU返回的SBS做target attention,将SBS压缩成一个向量表示用户的长期兴趣。
GSU中的离线索引构建:
- 可以是SIM hard模式,将同一个用户的user behavior sequence中包含相同category的items集合起来,形成
map<category, itemset>的索引
- 可以是SIM soft模式,拿每个item pre-trained embedding(比如来自粗排)聚类成簇,建立类似FASIS那样的索引
SIM缺点是存在目标不一致的问题:
- 目标不一致。GSU建立索引所使用的item embedding是另一个模型pre-trained(比如来自召回或粗排),它所表达的语义未必符合正在训练的精排模型的要求
- 更新频率不一致。大厂的推荐模型都必须能够online learning。但是建立离线索引耗时费力,无法频繁更新。这样一类,精排模型的其他部分都在用最新的数据实时更新,只有GSU部分还在使用过时的索引,成为性能短板。
解决方案是取消离线索引,让target item在线直接从user behaivor sequence中找到与自己相似的historical items:
- target item embedding与每个historical item embedding都是最新的,也就没有了更新频率上的gap
- target item embedding与每个historical item embedding都要为精排模型的业务目标负责,也就没有了优化目标上的gap
4.ETA

ETA模型主要包括两个部分:目标注意力(Target Attention)和SimHash。目标注意力就是利用一个DNN模型来对每个候选行为序列进行建模,离线计算得到一个embedding,然后将候选广告embedding和历史行为中的embedding算一个内积相似度,并利用SimHash算法来得到与候选广告最相关的top-k个历史行为子序列。SimHash就是一种局部敏感哈希(Locality Sensitive Hashing, LSH)方法,可以将高维空间中距离相近的点映射到低维空间中距离相近的点,并通过汉明距离来衡量相似度。
简要总结:
- ETA用SimHash算法,将原本d-dim的item embedding压缩成一个log(m)-bits的整数,称为embedding的hash fingerprint。
- 然后,embedding之间的相似性可以fingerprint之间hamming distance来衡量,时间复杂度由dot-product的O(d)降为O(1)。
- 某次online learning结束之后,导出item embedding的时候,各item embedding的fingerprint就提前计算好。这样online serving时,top-k retrieval的时间复杂度就降为了O(L∗B∗1)
- 由于top-K retrieval的时间缩短了,就允许我们无须离线建立索引,而是在线上直接将ctr model中最新的item embedding用于top-K retrieval了。
ETA模型相比于传统的序列建模方法有以下优势:
- 可以有效地处理超长用户行为序列,避免了信息丢失或者噪声干扰。
- 可以动态地根据候选广告选择与之最相关的历史行为子序列,实现了对用户兴趣的动态表示。
- 可以利用SimHash算法加速计算过程,提高了效率和可扩展性。
ETA模型也有以下不足:
- 需要离线计算并存储所有历史行为序列的embedding向量,占用了较大的存储空间。
- 需要依赖于SimHash算法来进行快速匹配,可能会引入一定程度的误差或者偏差。
5.SDIM

美团的SDIM就是沿着以下思路实现的。首先,把每个historical item embedding先SimHash成m-bit的大的hash signature(比如下图中m=4),再把大的hash signature每隔t个位置分隔成小的hash signature(比如下图中每隔2bits组成黄色和绿色的小方块)。

再把相同hash signature的historical item embedding聚合成一个向量。如下图中的norm(s0+s1)所示,聚合方法就是先按位相加,再做L2-normalization。这样,就把user behavior sequence存储成若干buckets。
而针对一个target item做target attention时,将target item也先SimHash再拆解成m/t个hash signature,每个hash signature去上一步得到的buckets提取聚合好的向量。把每个hash signature提取出来的向量再简单pooling一下,就得到了针对这个target item的user interest embedding。
SDIM线上预测时的部署要拆分成两部分:
- 提取用户最新的长期行为序列,把每个historical item embedding先SimHash再拆解成个hash signature,再把具有相同hash signature的historical item embedding聚合一起,组成buckets。这部分工作单独部署成Behavior Sequence Encoding (BSE) Server。
- BSE Server将long-term user behavior sequence压缩成若干buckets,传输给CTR Server。
- CTR Server中,将每个candidate item embedding也先SimHash再拆解成m/t个hash signature,再去接收到的buckets提取向量。所有m/t个hash signature提取完毕后,将提取出来的向量pooling一下,就得到了针对当前candidate item的long-term user interest embedding,再和其他特征一起喂入上边的DNN。
先看BSE Server这边的性能:
- 一个d维的向量,SimHash成m-bit的整数向量,时间复杂度为
O(md)。有近似解法,可以在O(mlog(d))内完成。
- 对于一次用户请求,将该用户L长的用户行为序列做SimHash,耗时
O(Lmlog(d))。而且只需要做一次,也candidate items的多少无关。
- 需要注意的是,当某版本的模型在infer server部署完毕后,每个item embedding也就固定了,每个item embedding的m/t个hash signature也就固定了。可以缓存起来,无需重复计算。
- 所以BSE的主要工作,就是从缓存里提取每个historical item的hash signature,再分桶,再聚合。由于计算量大头的SimHash,已经被之前的计算缓存过了,所以BSE的开销是非常小的。
- 而且由于以上工作都与candidate items无关,可以在进入精排之前提前进行(比如与召回、粗排并发进行),更进一步提高了计算效率。
再看CTR Server这边的性能:
- CTR server要把batch size=B个candidate items,逐一先SimHash再拆解成m/t个hash signature。由于同样可以被缓存,这部分的开销也不大。
- 接下来,就是用hash signature从BSE server发来的buckets中提取向量,再pooling。也就是一个embedding lookup,开销也不大。
与ETA的区别:
- ETA中,GSU筛选出来的SBS还要再交给ESU做Attention,还要再耗费
O(BKd)的时间
- 美团SDIM这里是一步到位,CTR server从buckets中提取出来的基本上就是attention结果了,而不是SBS。步骤更少,速度更快。
- Author:liamtech
- URL:https://liamtech.top/article/10f9746b-4e13-8006-a056-dcc10d525f3f
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!



