在我们现实中对模型的训练过程中。经常会遇到各种bias,但是什么样的bias需要消除,什么样的不需要,这里我们再回顾一下:https://www.jianshu.com/p/be1383b7b7bc
之前我确实思考过,在下层的模型,由于看到的信息不是那么全局的,由于工程,算力的限制,也无法在其巨大的搜索空间中做非常精细化,全局化的建模(例如下面这个场景,广告ctr,我们要穷举所有偏差下的反馈ctr会极大地提升系统复杂度),所以一些bias是需要专门去消除的。比如当我们要获取广告的ctr时,由于广告位本身有偏,那么当我们只用ctr这个值来描述我们的广告时,我们要对其先验反馈值去偏。
其实在最上层的模型。看到的是比较全局的信息,可能一些bias并不需要消除【但是也不是所有bias都不需要消除,比如ESSM中训练样本与真实样本分布的bias】。例如,我们的模型要评估某个广告某时在某个特定的广告位上的ctr,那么,其实广告位,广告本身,这些东西都是作为特征输入模型的,我们是将这些带来偏差的因子告诉模型,而不是去除这些因子带来的偏差。
这里其实可以再举个例帮助大家理解。比如我们在系统最上层的建模目标是推荐列表的总点击。那么我们下层粗排其实也可以用双塔建模点击(要想和上层建模一样,这里需要建模成:从后选集N中选出M个item,这M个Item被上层选中的概率最高【实际上是要优化召回率,但是我们没法计算并直接优化真实召回率,】)。但是问题来了,上层模型是可以区分每个item具体在哪个位置展现其ctr是多少,但是下层模型是不可以(也不可能穷举位置)的,所以下层在训练的时候需要加入position位置信息,预估时去除,以达到去偏的效果。
PS:我们之所以不直接建模点击率啥的,也是因为直接建模点击率,实际是在“曝光的商品中,预估其点击率”,而推断的时候,其实是在所有召回商品上【精排则是在所有粗排后的后选集上】进行预估。(当然,这里可以加入一些随机副样本进行去偏)
这里回到最初的问题。我们数据天然的倾斜,为啥要去偏(打压高频用户,防止其主导模型)
其实主要收益就是:加速收敛,使得我们在中长尾用户的数据上能更好地收敛。那当我们模型大小有限,训练资源有限的情况下,是否会对高频用户有损?这里大概率是的。
那么问题就来了,如果天然地,高频用户就贡献了大量的收益,则对于模型来说他就是依赖数据分布来学习,数据上来说高频用户预估错误带来的loss的损失本来就更大,那在模型大小,训练资源有限的条件下,其更倾向于高频用户,肯定能保证模型loss更低。那么我们为什么不按照其天然的分布去训练,而要“去偏”打压他们?
原因就在于,在历史数据上模型loss的最优化,并不会带来真实线上系统数据的最优化。换句话来说,就是在一个真实的系统中,生产环境中数据其实并不真正满足机器学习的强假设iid。这也是为什么,经常离线auc很小的提升,能带来线上非常大的指标收益。因为真实的数据是动态的,变化的,而离线预测,是静态的(static)。可以这样试想一下,你的系统中,有个头部用户,无论你给他推荐什么,他都是随机点,然后随机按一定概率购买(比如一个土豪用户),也许你给他推荐一些没那么相关的,他也不会降低多少购买。而中长尾的用户,反而更有提升的空间。
其实这个问题,往往也是学术界跟工业界一个比较大的区别。
在学术界,问题经常是well defined。而工业界,现实中,结果的影响因素各式各样,学术界的各种强假设下的结论,在工业界中,甚至会导致方向性的错误,使你陷入桎梏。