【推荐系统】DSSM双塔召回2

来自小红书,双塔的总结

目录

模型结构、训练方式

point-wise训练

pair-wise训练

list-wise训练 

正负样本

线上服务


模型结构、训练方式

用户侧

用户离散特征: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

召回07:双塔模型——正负样本_哔哩哔哩_bilibili

召回08:双塔模型——线上服务、模型更新_哔哩哔哩_bilibili

双塔召回的损失函数?

关于双塔在训练过程中是不是要一起训练?inference时只有user塔

正负样本?

正负样本的比例?1:3

这里需要回顾以下tf.sample_softmax()方法

应该是将召回问题转为ctr预估,sigmoid二分类吗?

工程中损失函数

推荐系统中的DSSM双塔模型比较简单,即user和item各一个塔,而其损失函数是pointwise loss(我用的),即对每个样本进行损失计算,而非上述需要为正样本搭配一系列的负样本然后进行损失计算,而具体采用的是交叉熵损失计算,如下公式:

参考:

推荐系统(十一)DSSM双塔模型

推荐粗排(召回)工程实践之双塔DNN模型 - billlee的文章 - 知乎 https://zhuanlan.zhihu.com/p/259660568

工业界推荐系统中有哪些召回策略? - 石塔西的回答 - 知乎 https://www.zhihu.com/question/315120636/answer/1687203383

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值