大家好,我是对白。
今天给大家分享一下在推荐中召回和粗排是如何构造负样本的。
推荐系统通常分为召回->粗排->精排->重排这几个漏斗。
深度模型也从精排逐步下沉到了粗排和召回。
拿业界常用的粗排DSSM模型来说,模型训练样本的构造方式一般是复用精排下发的正负样本,但这会造成一个问题:粗排训练样本和实际线上打分样本分布不一致,训练样本仅是线上打分样本一个比较小的子集。面对这个问题大家通常的解法是,从精排未下发的样本里采一部分,添加至粗排模型的训练负样本中,通常会带来一定的提升。其中的原理是什么呢?以及如何更优雅的做负样本采样?
首先,明确一下粗排的目标:拟合精排模型。即粗排尽可能圈出精排模型能排到前面的item。这一点非常关键,如果只用精排下发的真实曝光样本来训练粗排模型,那么粗排模型对精排模型的拟合就会出现比较大的偏差。
举个例子:
粗排模型给1000条样本打分,最终截取score top300,给到精排模型,精排模型对这300条样本打分,进一步选出用户可能感兴趣的item,比如score top10。
一定会存在这样一种情况:对于粗排模型打分比较靠前的样本(比如top5),精排模型却把这部分样本打分很低(比如top250~300),那么,粗排打分很靠前的这几条样本是不会被曝光的,因此当我们复用精排模型的样本来训练粗排模型时,粗排模型是看不到这几条bad case的样本的,新粗排模型上线后,这几条样本很可能还被粗排模型排到靠前的位置。如果我们把这几条样本作为负样本来训练粗排模型,那么新的模型大概率就可以把这几条样本排到靠后的位置了。
以上是粗排模型扩充下沉负样本work的原因,那么怎么才能做更高效的负采样呢?
我们计算:
w=(归一化的粗排模型打分-归一化的精排模型打分)*系数
用w作为下沉负样本的权重,把粗排模型打分与精排模型打分的gap表达在负样本中,更细粒度地表达两个模型的差异。通常会取得更好的效果。