like(user, item)
。例如:点击、点赞、收藏、转发各算一分Jaccard
相似度,没有考虑不同行为的偏好程度item1
和item2
的用户交集.j
为用户历史交互商品集合用索引,离线计算量大,线上计算量小
1. 事先做离线计算,建立两个索引
user
——> item
的索引:记录每个用户最近点击、交互过的物品ID
id
,可以找到他近期感兴趣的物品列表user_id: [(item_id, score兴趣分)
item
——> item
的索引: 给定任意item_id
,可以快速找到它最相似的k
个items
k
个物品item_id
:topK
个最相似的[items_id, 相似度]
2. 线上做召回,用于实时推荐
query
用户id
,通过user--> item
索引,找到用户近期感兴趣的物品列表last-n
。last-n
列表中每个item
,通过item--> item
的索引,找到top-k
相似物品nk
个),用公式预估用户对物品的相似分数itemCF
通道的返回结果。重复的把分数加起来,去重nl
: 用户喜欢物品l的用户数量,反应物品的热门程度, I
为用户u1
和u2
喜欢物品集合的交集user
对候选物品item
的兴趣:1. 事先做离线计算
user--> item
的索引:
ID
ID
,可以找到他近期感兴趣的物品list
user_id
:[(item_id, 兴趣分数),......]
user-->user
的索引:
k
个用户id
,可以快速找到他最相似的k
个用户user_id
: 最相似的k个【(user_id, 相似度),…】2. 线上做召回
ID
,通过user_id--->user_id
索引,找到top-k
相似用户top-k
相似用户,通过user_id-->item
索引,找到用户最近感兴趣的物品列表last-n
nk
个相似物品,用公式预估用户对每个物品的兴趣分数背景:假如重合的用户是一个小圈子,当两件物品的受众完全不一样,圈子里很多人交互,这时就需要降低小圈子的权重,希望两个物品重合的用户广泛且多样。
模型原理:给用户设置权重,解决小圈子问题
物品相似度计算:
overlap越大,用户u1和u2的重合度越高,则他们可能来自一个小圈子,要降低他们的权重
本质上讲是将召回建模成在向量空间内的近邻搜索问题,将用户和物品均由向量表示,离线构建索引,在serving
时模糊近邻查找。
user
和group
侧分别用NN网络来拟合,最上层的神经元可认为是user
和group
的向量表征。CTR
召回可以直接用点积+sigmod
得到loss
,时长模型可以用cos距离+mse计算loss
group_emd
,线上计算user_emd
再近邻查找。One-hot
编码:把序号映射成高维稀疏向量Embedding
:把序号映射成低维稠密向量key-value
表Milvus
、Faiss
、HnswLib
L2
距离cosine相似度
):工业界最常用。key
:每个区域的向量,value
:区域中所有点的列表embedding Layer
映射成embedding
ne-hot
—> embedding Layer
Pointwise
: 把召回看作二元分类任务
cos(a,b)
接近于 +1
cos(a,b)
接近于-1
1:2
或者1:3
Pairwise
:
cos(a,b+)
以及cos(a,b-)
基本想法:鼓励cos(a,b+)
大于cos(a,b-)
cos(a,b+)
大于cos(a,b-) +m
,则没有损失cos(a,b-)+m - cos(a,b+)
Triplet hinge loss:
Triplet logistic loss:
Listwie:
cos
值通过softmax
激活函数,得到n
个预测值s
,和为1
CrossEntropyLoss(y,s)
: y
取1
或0
,所以也是最大化正样本的余弦相似度选择负样本的原理:
召回目标:快速找到用户可能感兴趣的物品
排序目标:区分比较感兴趣和非常感兴趣的物品
正样本
负样本:
简单负样本:
Batch
内负样本
batch
内有n
个正样本,一个用户和n-1
个物品组成负样本,这个batch
内一共有(n-1)
个负样本0.75
次方,导致热门物品成为负样本的概率过大。pi
,则在做训练的时候,调整为cos(a,bi) - logpi
。但线上做召回的时候仍旧使用cos(a,b)
困难负样本:
对于双塔模型做召回,二元分类任务,让模型区分正负样本:
工业界训练数据:混合几种负样本,50%
的负样本是全体物品,50%
的负样本是没通过排序的物品。对于曝光但是没有点击,训练召回模型不能用这类负样本,训练排序模型会用这类负样本。
离线存储
<特征向量,item_id>
保存到向量数据库Milvus
、Faiss
用户塔:用户的兴趣动态变化,而物品特征相对稳定(可以离线储存用户向量,但不利于推荐效果)
a
作为query
调用向量数据库做检索查找k
个物品,作为召回结果增量更新
online learning
更新模型参数,用户的兴趣会随时发生变化TFRecord
文件online learning
, 增量更新ID embedding
参数。(不更新神经网络其他部分的参数)全量更新
random shuffle
,训练1 epoch
,即每天的数据只用一遍随机打乱优于按顺序排列数据,全量训练优于增量训练
GeoHash
: 对经纬度的编码,地图上一个长方形区域GeoHash-->优质物品列表(按照时间倒排)
城市---> 优质内容列表
背景:精排输出几百个物品,送入重排,重排做多样性抽样,选出几十篇,精排结果一大半没有曝光,被浪费。
想法:复用前n次推荐精排的结果,精排前50,但是没有曝光的,缓存起来,作为一条召回通道,缓存大小固定,需要退场机制
新笔记的点击率、交互率:
分别考察高曝光、低曝光新笔记
双塔模型做id embedding
是,让所有新专辑共享一个id,而不是使用自己真正的id。default embedding
改进: 使用相似物品的embeddding
,取topk
个高曝光的相似物品
类目召回、关键词召回:按照刚刚发布的时间顺序召回
基本思想:如果用户喜欢一件物品,那么那会喜欢内容相似的物品
1000cluster
,记录每个cluster
的中心方向。(k-means聚类,用余弦相似度)last-n
交互的专辑列表,把这写专辑作为种子专辑,把每篇种子专辑映射到向量,寻找最相似的cluster
。(知道了用户对哪些cluster
感兴趣)cluster
的专辑列表中,取回最新的m
张专辑cnn
提取图片,bert
提取文本特征流量怎么在新、老物品中分配,目的:
工业界的做法:PID技术
30
天的专辑24h
)的曝光占比为1/30
1/30
流量调控技术的发展:
boost
:在排序阶段加上或乘上一个系数指标:
5%的用户侧实验
限定:保量100
次曝光
假设:新笔记曝光越多,用户使用APP时长越低
新策略:把新专辑排序时的权重增大两倍。
结果(只看用户消费指标):AB
测试的diff
是负数,实验组不如对照组,如果推全,diff
会缩小