问题

算法工程师经常会遇到一个问题——线下模型指标提高很多,但上线后的表现却无提升甚至下降。那么出现这种问题也一定是有原因的,根据过往的踩坑经验和调研,简单总结下可能的原因。

我将可能的原因分为两个大类,第一个大类是人为可以避免的问题,第二个大类是线上线下存在的不可避免的差异。

一、人为可以避免的问题

出现这种情况,首先要排查可能的bug,而且根据经验,大部分原因来自这里。

1、特征错位

之前在推荐排序层做一个xgboost排序模型的时候,特征工程做了一大堆,线下AUC一直在往上走,但是线上表现却几乎是一条水平线。在一次偶然的机会中发现对于同一条样本,线上线下的预测分竟然有差别!之后把线上线下的特征拉出来按列对齐进行仔细对比,发现特征有错位现象,造成的原因是线上线下解析某配置文件时有区别。解决该BUG后,线上指标立马跃升。

2、特征覆盖度

在选取特征时,不能选线下线上覆盖率差别很大的特征。对于某些特征比如ItemId,这个信息在线下的时候是全都有的,但真正到了线上的时候,如果在你的业务场景下每天有大量的新Item进来,在新闻资讯流推荐业务中,每天还有大量的旧Item会过期。在这种情况下,你的模型线下表现好,线上表现差就是必然的了,因为这些特征在线上都是空值,线下的AUC虽然高,但对线上是没作用的。

3、样本采样与正负样本设计

训练样本的设计与采样一直是算法中最低调但却非常关键的一环,训练样本的差异,会直接影响一个模型的表现。
以youtube-dnn召回模型为例,“G厂一篇文,我们测断腿”不是白讲的。别人玩剩下的,我们才刚开始玩,还玩不好。回到正题,以商品类推荐为例,在正负样本设计的时候,是应该拿曝光未点击的商品作为lable=0的负样本(方法1),还是随机从全量商品中抽取用户未点击过的商品作为lable=0的负样本(方法2)。在网上看到有大佬讨论这个问题,选方法2让模型表现有了质的提升。主要原因有两个:a.用户在本页面未点击的商品,很有可能在别的列表页有过点击行为,方法1实际上将用户感兴趣的商品误标记为了负样本。B.曝光商品极有可能为热门商品,虽然该商品该用户未点击,但是我们不能通过lable=0造成热门商品的权重降低。关于这部分,可以搜索这篇文章:"关于'Deep Neural Networks for YouTube Recommendations'的一些思考和实现"。
那么关于样本采样问题,youtube的做法是每个用户都选取相同数量的样本,但这一点对于很多业务场景是做不到的,因为重度用户的行为很多,新用户的行为很少,这种情况如何折中,youtube没提,我也不知道(踩坑中)。还有,如果线下训练时所有的数据都是线上模型筛选过的比较好的样本,但实际上到了线上之后对于特别差的样本其实是没有经验的。如果一个模型只适用于对比较好的样本进行排序,就会在线上对从来没有见过那些特别差的样本就会做误判。

4、ctr分布的变化

DNN模型相比传统模型,一般预测分的分布会更平滑,和传统模型相比打分布不一致。可以用一天的数据,绘制ctr的概率分布图,分析模型预估值的分布变化情况。如果某个模型的ctr分布图和其他模型差距很大的话,要做出相应的调整。

二、线上线下不可避免的差异

1、样本偏差

其实上面提到过,只不过角度不同,上面是从特征角度来讲的(最起码这个特征不好用可以不用)。但这里主要指的是样本偏差很多影响是无法避免的,线下评测基于历史出现样本,而线上测试存在新样本。因此线下AUC提升可能只是在历史出现样本上有提升,但是对于线上新样本可能并没有效果。
例如A1,A2,A3,B1,B2,B3是六个样本,真实的点击率高低排序应该是A1>A2>A3>B1>B2>B3,历史上只有A1,A2,A3展现过。算法1的排序:A1>A3>A2>B1>B2>B3,算法2的排序:B1>B3>B2>A1>A2>A3。如果基于历史上展现过的样本做评估,算法2(A1>A2>A3)优于算法1(A1>A3>A2),但是如果线上有较多的B1,B2,B3展现,那么算法2很可能表现还不如算法1。
另外,历史数据本身由老模型产生,本身也是存在偏置的。

2、评估不对等

线下AUC计算的时候,不仅会涉及同一个用户的不同item,也会涉及不同用户的不同item,而线上排序系统每次排序只针对同一个用户的不同item进行打分。
线上效果只跟相关性有关,是和position等偏置因素无关的。而线下一般是不同position的样本混合训练。因此,如果我们对position_bias过度建模,比如LR模型里面加入了更多的位置相关的组合特征,会出现auc上升的情况,但是线上ctr反而会下降。

Comment

This is just a placeholder img.