离线auc有提升线上没提升
在推荐系统实践中,我们往往会遇到一个问题:线下AUC提升并不能带来线上效果提升,这个问题在推荐系统迭代的后期往往会更加普遍。
在排除了低级失误bug以后,造成这个问题可能有下面几点原因:
样本
线下评测基于历史出现样本,而线上测试存在新样本。因此线下AUC提升可能只是在历史出现样本上有提升,但是对于线上新样本可能并没有效果。
历史数据本身由老模型产生,本身也是存在偏置的。
线上和线下特征不一致。例如包含时间相关特征,存在特征穿越。或者线上部分特征缺失等等。
2. 评估目标
AUC计算的时候,不仅会涉及同一个用户的不同item,也会涉及不同用户的不同item,而线上排序系统每次排序只针对同一个用户的不同item进行打分。
线上效果只跟相关性有关,是和position等偏置因素无关的。而线下一般是不同position的样本混合训练,因此线上和线下评估不对等。
3. 分布变化:DNN模型相比传统模型,一般得分分布会更平滑,和传统模型相比打分布不一致。而线上有些出价策略依赖了打分分布,例如有一些相关阈值,那么就可能产生影响。这个可以绘制CTR概率分布图来检查。
那么如何解决呢?可以考虑下面的办法:
使用无偏样本作为测试集。随机样本最好,不行的话,最好不要是基于老模型产生的线上样本。
使用gauc等指标,同时从测试集中去除无点击的用户。gauc基于session进行分组。例如对于搜索业务,把一次搜索query对应的一次用户的曝光点击行为作为一个session进行计算。
算法工程师经常会遇到一个问题——线下模型指标提高很多,但上线后的表现却无提升甚至下降。那么出现这种问题也一定是有原因的,根据过往的踩坑经验和调研,简单总结下可能的原因。
我将可能的原因分为两个大类,第一个大类是人为可以避免的问题,第二个大类是线上线下存在的不可避免的差异。
一、人为可以避免的问题
出现这种情况,首先要排查可能的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反而会下降。