机器学习模型线上线下效果一致性杂谈

作者:杨辉之,新浪微博推荐广告算法工程师,个人知乎专栏(推荐机器学习模型&架构随笔)欢迎交流讨论

前言

在实际工作(炼丹)过程中,总会遇到线下指标相对 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、训练维度

除了特征外另一个重要的排查方向就是离线训练结果是否存在问题,可以从三个方面进行排查。

  1. 训练集与测试集是否存在重叠部分,此时对测试集的评估结果是不置信的;
  2. 训练集中的特征是否存在穿越现象,特别是与 label 强相关的统计类和行为序列特征出现穿越,离线训练 auc 能夸张到 0.99,相当于开了个上帝视角;
  3. 训练集是否出现了过拟合,这在添加强特征或者模型升级带来较大离线指标提升情况下需要格外注意,这个时候 base 模型的学习率、epoch 个数和正则系数等超参已并不适合实验模型的训练,需要在确保没过拟合的情况下,离线试验出一组较优参数。

3、线上结果不置信

上面是从离线训练结果不置信维度进行排查,那线上结果就一定置信吗?是否也需要好好考究一番?下面结合广告业务中线上实验的一些分析经验抛砖引玉。

  1. 线上指标统计时间窗口:不同指标达到可置信水平的统计窗口有较大区别,这跟业务和指标稳定性有很大关系,比如广告主价值指标的置信时间窗口往往要比收入/ecpm 要长不少,因为天级波动比较大。而 ctcvr 指标则跟归因是否有延迟相关,一般要等好几个归因周期才能置信;
  2. 实验平台分桶是否足够随机:AB 实验平台的核心功能在于流量划分,如果划分不均匀正交就天然带来了偏差,实验结果自然不置信,可以通过创建 AABB 实验来看各个关键指标在 AA 和 BB 上是否能平来验证 AB 实验平台是否有流量划分问题;
  3. 实验模型 serving 状态:另一个需要 check 的点时线上实验模型是否 serving 问题,比如超时情况如何、可用性如何、模型更新时效性如何等方面。

4、训练样本数据分布发生变化

训练样本数据分布发生变化是不可避免的一件事,实验模型线下评估时拟合的是 base 模型跑出来的数据分布,到上线后训练样本里既有 base 模型跑出来样本也有实验模型跑出来的样本,且占比在不断变化,相当于数据分布在变,线上效果不好往往跟这个也有关系,这时候可以从两方面对数据分布的变化建模,都是属于比较 trick 的方法,但是确实能 work。

4.1、线性融合

实验模型的预估分 和 base 模型的预估分 直接在线上做线性融合,权重值可以按流量占比进行预设,并在此基础上上下调整多组权重值,在当前流量上离线评估以确定较优的权重值作为线上使用。

4.2、流量 bias 特征

还有一种更简单的方法,即构建 model name bias 特征,让模型自动学习出不同流量的选择偏差,在实验流量扩量时也能平滑切换,值得注意的是一定要当做 bias 特征去添加,可以放在 wide 侧或专门构建的 bias 子网络。我们实际工作中采用的即是该方法,确实比较 work。


本文地址:https://www.6aiq.com/article/1614038606177
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出