机器学习模型线上线下效果一致性杂谈
作者:杨辉之,新浪微博推荐广告算法工程师,个人知乎专栏(推荐机器学习模型&架构随笔)欢迎交流讨论
前言
在实际工作(炼丹)过程中,总会遇到线下指标相对base有提升,但一到线上就发现收益丢了,是换种配方继续“炼丹”还是“改换门庭”拿着相同的配方继续“炼丹”?本文结合笔者曾经也踩过的各种坑做个简单总结,欢迎大家多提意见和相关讨论,不然下面这些方法试完后线上还是没有收益,估计本人也只能“跑路”了。
1、特征维度
特征作为模型的输入,决定了模型的上限,线上线下特征不一致则会是竹篮打水一场空,效果肯定好不了。那特征出问题的原因可能有如下几个:
1.1、上线前一致性校验
针对同样的特征输入,离线和在线的处理方式不同,如input_schema配置没对齐、特征抽取不一致等,这是最容易出现的情况。解决方法一般是离线和在线共用同一套特征抽取框架,同时每次模型上线前先生成一批待校验的一致性样本,对比每条样本在离线打分和在线打分的gap,小于一定阈值(如1e-6)算一致性通过。这个也是我们踩过坑后,现在模型上线前必做的一件事,一致性失败则线上模型不更新并发报警邮件。
1.2、搭建线上特征监控体系
线上特征的获取由于来源和计算方式不同会有多种通路,比如文件、redis、rpc服务、透传等,每种通路一旦某个环节出现问题,特征就取不到或者取错,对线上预估的影响也是很大的。所以对每一个线上服务使用到的特征建立空值率、top取值分布、时效性、ctr/cvr分布等多个维度的监控也是很有必要的,可以及时发现出问题的特征并加以修复。
1.3、特征更新是否延迟
user侧和item侧的特征一般以正排方式储存在key-value载体中,根据特征类型的不同更新时效性也可以分为:
- 长期更新:user的年龄、性别、婚否、是否有孩子等长期比较稳定的用户画像特征
- 天级更新:user最近7天/14天在该appid上的pv个数、click个数、conv个数、ctr、cvr等按天统计的中长期兴趣特征
- 小时级更新:user的精准兴趣、广泛兴趣、app安装列表等按小时统计的近实时特征
- 实时更新:user最近互动过的adid、appid、industry_id,item实时反馈特征,session序列特征
对于天级更新、小时级更新和实时更新这些对时效性比较敏感的特征,如果出现了更新延迟,线上实验效果的衰减也是特别厉害的。我们这边就出现过添加中长期兴趣特征的实验某一天效果相对base反向了,经排查是由于离线统计中长期兴趣特征的服务堆积延迟造成当天没有将数据灌入redis中,造成线上使用的是T-2天统计的中长期兴趣特征。
1.4、强偏置特征建模方式是否正确
对于一些强bias特征,线上线下的使用方式也是特别重要的,如果使用不当往往离线收益很大而线上纹丝不动或者反向。比如pos bias,在推荐领域,一般放到wide&deep模型的wide侧,离线训练时按实际曝光位置来训练,线上serving时置为0,这对于只追求序关系正确(为什么序关系没有影响,可以从原理上推导,欢迎大家一起讨论)的推荐场景是没有问题的。但是放到广告ctr模型中就存在问题,因为广告场景中还需要依赖pctr做出价计算去收取广告主的钱,这就需要保证pctr预估精准度高,而对所有候选adid pos bias特征都置为0会引起较大的预估gap。一个可行的方案是先将pos bias置为0,计算所有候选adid的mid_pctr,按这个排序得到候选adid实际曝光的pos,按这个pos再走一遍模型打分,得到准确的real_pctr,基于这个去做最终的出价,这种方案缺点也很明显,需要预估两次,但一般整个预估链路的耗时大都集中在特征抽取框架,模型前向过程耗时相对较小。
2、训练维度
除了特征外另一个重要的排查方向就是离线训练结果是否存在问题,可以从三个方面进行排查。
- 训练集与测试集是否存在重叠部分,此时对测试集的评估结果是不置信的;
- 训练集中的特征是否存在穿越现象,特别是与label强相关的统计类和行为序列特征出现穿越,离线训练auc能夸张到0.99,相当于开了个上帝视角;
- 训练集是否出现了过拟合,这在添加强特征或者模型升级带来较大离线指标提升情况下需要格外注意,这个时候base模型的学习率、epoch个数和正则系数等超参已并不适合实验模型的训练,需要在确保没过拟合的情况下,离线试验出一组较优参数。
3、线上结果不置信
上面是从离线训练结果不置信维度进行排查,那线上结果就一定置信吗?是否也需要好好考究一番?下面结合广告业务中线上实验的一些分析经验抛砖引玉。
- 线上指标统计时间窗口:不同指标达到可置信水平的统计窗口有较大区别,这跟业务和指标稳定性有很大关系,比如广告主价值指标的置信时间窗口往往要比收入/ecpm要长不少,因为天级波动比较大。而ctcvr指标则跟归因是否有延迟相关,一般要等好几个归因周期才能置信;
- 实验平台分桶是否足够随机:AB实验平台的核心功能在于流量划分,如果划分不均匀正交就天然带来了偏差,实验结果自然不置信,可以通过创建AABB实验来看各个关键指标在AA和BB上是否能平来验证AB实验平台是否有流量划分问题;
- 实验模型serving状态:另一个需要check的点时线上实验模型是否serving问题,比如超时情况如何、可用性如何、模型更新时效性如何等方面。
4、训练样本数据分布发生变化
训练样本数据分布发生变化是不可避免的一件事,实验模型线下评估时拟合的是base模型跑出来的数据分布,到上线后训练样本里既有base模型跑出来样本也有实验模型跑出来的样本,且占比在不断变化,相当于数据分布在变,线上效果不好往往跟这个也有关系,这时候可以从两方面对数据分布的变化建模,都是属于比较trick的方法,但是确实能work。
4.1、线性融合
实验模型的预估分 和base模型的预估分 直接在线上做线性融合,权重值可以按流量占比进行预设,并在此基础上上下调整多组权重值,在当前流量上离线评估以确定较优的权重值作为线上使用。
4.2、流量bias特征
还有一种更简单的方法,即构建model name bias特征,让模型自动学习出不同流量的选择偏差,在实验流量扩量时也能平滑切换,值得注意的是一定要当做bias特征去添加,可以放在wide侧或专门构建的bias子网络。我们实际工作中采用的即是该方法,确实比较work。