用户长期兴趣建模
00 min
2024-9-28
2025-12-2
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

 
notion image
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

notion image
当用户的行为序列特别长时,直接套用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

notion image
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

notion image
 
美团的SDIM就是沿着以下思路实现的。首先,把每个historical item embedding先SimHash成m-bit的大的hash signature(比如下图中m=4),再把大的hash signature每隔t个位置分隔成小的hash signature(比如下图中每隔2bits组成黄色和绿色的小方块)。
notion image
再把相同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。步骤更少,速度更快。
 
上一篇
向量化召回方案
下一篇
Mac上spark环境配置(离线安装)