转自:https://blog.youkuaiyun.com/weixin_31866177/article/details/117781645
我们训练精排模型的时候(假设是优化点击目标),一般会用“用户点击”实例作为正例,“曝光未点击”实例作为负例,来训练模型,基本大家都是这么干的。现在,模型召回以及粗排,也需要训练模型,意思是说,也需要定义正例和负例。一般正例,也都是用“用户点击”实例作为正例,但是怎么选择负例,这里面有不少学问。
Sample Selection Bias问题
我们先来看下不同阶段模型面对的输入数据情况,对于召回模型来说,它面临的输入数据,是所有物料库里的物品;对于粗排模型来说,它面对的输入数据,是各路召回的结果;对于精排模型来说,它面临的输入是粗排模型的输出结果。如果我们仍然用“曝光未点击”实例作为召回和粗排的负例训练数据,你会发现这个训练集合,只是全局物料库的一小部分,它的分布和全局物料库以及各路召回结果数据,这两个召回和粗排模型面临的实际输入数据,分布差异比较大,所以根据这种负例训练召回和粗排模型,效果如何就带有疑问,我们一般把这个现象称为“Sample Selection Bias”问题。

可能的负例选择方法
为了解决“Sample Selection Bias”问题,我们在召回或者粗排模型训练的时候,应该调整下负例的选择策略,使得它尽量能够和模型输入的数据分布保持一致。这里我简单归纳下可能的做法。
选择1:曝光未点击数据
这就是上面说的导致Sample Selection Bias问题的原因。我们的经验是,这个数据还是需要的,只是要和其它类型的负例选择方法,按照一定比例进行混合,来缓解Sample Selection Bias问题。当然,有些结论貌似是不用这个数据,所以用还是不用,可能跟应用场景有关。
选择2:全局随机选择负例
就是说在原始的全局物料库里,随机抽取作为召回或者粗排的负例。这也是一种做法,Youtube DNN双塔模型就是这么做的。从道理上讲,这个肯定是完全符合输入数据的分布一致性的,但是,一般这么选择的负例,因为和正例差异太大,导致模型太好区分正例和负例,所以模型能学到多少知识是成问题的。
选择3:Batch内随机选择负例
就是说只包含正例,训练的时候,在Batch内,选择除了正例之外的其它Item,作为负例。这个本质上是:给定用户,在所有其它用户的正例里进行随机选择,构造负例。它在一定程度上,也可以解决Sample Selection Bias问题。比如Google的双塔召回模型,就是用的这种负例方法。
选择4:曝光数据随机选择负例
就是说,在给所有用户曝光的数据里,随机选择作为负例。这个我们测试过,在某些场景下是有效的。
选择5:基于Popularity随机选择负例
这种方法的做法是:全局随机选择,但是越是流行的Item,越大概率会被选择作为负例。目前不少研究证明了,负例采取Popularity-based方法,对于效果有明显的正面影响。它隐含的假设是:如果一个例子越流行,那么它没有被用户点过看过,说明更大概率,对当前的用户来说,它是一个真实的负例。同时,这种方法还会打压流行Item,增加模型个性化程度。
选择6:基于Hard选择负例
它是选择那些比较难的例子,作为负例。因为难区分的例子,很明显给模型带来的loss和信息含量比价多,所以从道理上讲是很合理的。但是怎样算是难的例子,可能有不同的做法,有些还跟应用有关。比如Airbnb,还有不少工作,都是在想办法筛选Hard负例上。
以上是几种常见的在召回和粗排阶段选择负例的做法。我们在模型召回阶段的经验是:比如在19年年中左右,我们尝试过选择1+选择3的混合方法,就是一定比例的“曝光未点击”和一定比例的类似Batch内随机的方法构造负例,当时在FM召回取得了明显的效果提升。但是在后面做双塔模型的时候,貌似这种方法又未能做出明显效果。全局随机,则无论是FM召回还是后来的双塔,都没做出效果,有时甚至负向明显。但是你又能看到一些报道采用的是全局随机作为负例。所以,我目前的感觉,负例这块是个宝藏,值得深入探索下,包括不同方法的混合,但是到底哪种方法是有效的,貌似很难有统一的定论,带有一定艺术性。
本文讨论了在模型召回和粗排阶段如何选择负例以缓解SampleSelectionBias问题,介绍了几种策略,如曝光未点击、全局随机、Batch内随机等,并分享了作者团队在不同阶段的实际应用经验和困惑。
1511

被折叠的 条评论
为什么被折叠?



