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

前言

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