来自小红书,双塔的总结
目录
模型结构、训练方式
用户侧
用户离散特征:emb,男女这种类别少的直接one-hot就行,不用emb。
用户连续特征:归一化、分桶、log。
物品侧同理
两个向量的余弦相似度就是模型的输出,预估用户对物品的兴趣。余弦相似度[-1,1]。
训练方式
ps. pairwise损失函数triplet hinge loss。(A, b+, b-)。
ps. 最早listwise概念来自于信息检索,目标是直接优化一个list中的结果,其中包含了第一分数要比第二高,第二要比第三高这样的意思。视频中的其实是n对pairwise loss。
其实训练方式和模型结构都取决于场景要求。
三个维度:任务场景(召回/排序)、模型结构(前期融合/后期融合)、训练方式(采样/遍历)。召回场景要求速度快,需要采样(时间复杂度低)、后期融合(用户向量、物品向量离线计算好,线上直接迅速获得结果);排序场景要求精度高,需要遍历(对所有物品计算一次,精度比采样高)、前期融合(前期融合的模型比后期融合的参数量大一些)。
后期融合是计算相似度,逼迫物品向量、用户向量在同一个空间,可以使用最近邻查找优化抽样结果(将细粒度区别区分开)。前期融合是拼接物品向量、用户向量,计算两个向量的高阶交叉特征,但两个类型向量不在同一个空间,无法使用最近邻查找来优化抽样效果。
point-wise训练
(我选择的是这种)
pair-wise训练
基本就是让用户对cos(a,b+)尽量大,对cos(a,b-)尽量小。
list-wise训练
写错了,最后一个是cos(a,b1-), ..., cos(a,bn+)。
pointwise,pair用在搜索多一些,推荐感觉用得少。list召回不用。(召回模型中的负样本构造 - 知乎)
正负样本
正样本
问题:少部分物品占据大部分点击,导致正样本大多是热门物品。过采样冷门物品,或者降采样热门物品。
负样本——全体物品
因为28法则,少部分物品占据了大量的点击。均匀抽样会对冷门物品不公平。(冷门物品已更高的概率被当做负样本)。
热门物品成为负样本的概率大。物品的热门程度可以用它的点击次数来衡量。负样本抽样概率与热门程度正相关。每个物品的抽样概率正比于(点击次数)^0.75。
简单负样本——batch内负样本
存在的问题
一个物品出现在batch内的概率正比于它的点击次数,也就是它的热门程度。——问题:物品成为简单负样本的概率应该是正比于点击次数的0.75次方。
但是在这里做batch内负采样,物品成为负样本的概率正比与它点击次数的一次方。
抽样概率本应该正比于点击次数的0.75次方。导致热门物品成为负样本的概率过大。模型对这个物品打压越狠,会造成偏差。
如何修正偏差?
训练时进行纠偏,训练完成,线上infer还是cos。
关于纠偏的解释:
p越小,-logp越大,softmax结果s更高。如果是正样本,那导数会偏小(s>0.5);如果是负样本,那导数会偏大。就形成了对低频物品更强的负样本的倾向。
相当于了是放大了冷门负样本的梯度。
-logp算是物品的先验 模型实际上非常容易拟合先验的 所以要debias掉。
困难负样本
1. 被粗排淘汰的物品(比较困难)
比如召回5000个物品进入粗排,model按照分数作为截断,只保留前500个,那么被淘汰的4500个物品都可以被视作负样本。
这些物品被召回,说明他们和用户多少有点关系,被粗排淘汰说明用户对物品的兴趣不够强,所以分成了负样本。
2. 精排分数靠后的物品(非常困难)
比如精排给500个物品打分,排名在后的300个物品都是负样本,进入精排的物品说明已经比较符合用户兴趣了,但未必是用户最感兴趣的。
工业界做法是将简单样本和困难样本混合起来。
常见错误!曝光未点击不能作为负样本。
选择负样本的思路
召回模型的任务是区分用户不感兴趣的物品、和可能感兴趣的物品。
而不是区分比较感兴趣的物品、和非常感兴趣的物品。
排序模型的任务是区分 比较感兴趣的和非常感兴趣的。
总结
线上服务
全量更新
增量更新
为什么只做增量更新效果不好呢?
如果只看1个小时的数据,它是有偏的,统计值跟全天的数据差别很大。
为什么有偏呢?
在不同的时间段内,用户的行为是不一样的,比如中午和傍晚的数据,如果你只看5分钟的数据,那么偏差就更大了。
做全量训练时,做random shuffle,是为了消除偏差。数据随机打乱训练效果更好。
全量模型更好,而增量训练可以实时捕捉用户的兴趣。
总结
更新模型
每条数据只用一遍,1 epoch。
来自
召回06:双塔模型——模型结构、训练方法_哔哩哔哩_bilibili
召回08:双塔模型——线上服务、模型更新_哔哩哔哩_bilibili
双塔召回的损失函数?
关于双塔在训练过程中是不是要一起训练?inference时只有user塔
正负样本?
正负样本的比例?1:3
这里需要回顾以下tf.sample_softmax()方法
应该是将召回问题转为ctr预估,sigmoid二分类吗?
工程中损失函数
推荐系统中的DSSM双塔模型比较简单,即user和item各一个塔,而其损失函数是pointwise loss(我用的),即对每个样本进行损失计算,而非上述需要为正样本搭配一系列的负样本然后进行损失计算,而具体采用的是交叉熵损失计算,如下公式:
参考:
推荐粗排(召回)工程实践之双塔DNN模型 - billlee的文章 - 知乎 https://zhuanlan.zhihu.com/p/259660568
工业界推荐系统中有哪些召回策略? - 石塔西的回答 - 知乎 https://www.zhihu.com/question/315120636/answer/1687203383