训练-服务偏差(Training-Serving Skew)指模型在离线训练和评估时表现良好,一上线服务效果就明显变差,而原因是训练和服务两个阶段的数据处理、特征计算或代码实现不一致——不是模型本身没学好。
两套管线,两种“现实”
模型不认识业务,它只认识喂进去的那串数字。如果训练时喂的数字,和上线后喂的数字用的不是同一套算法,模型就等于在答一份没复习过的卷子。
打个比方:你照着菜谱在家练了一百遍红烧肉,锅、火、盐勺都摸熟了。到了餐厅后厨,菜谱没变,但换成猛火灶、食材提前腌过、盐勺大一号,同样的动作做出来味道就是不对。菜谱(模型)没问题,是备菜流程(特征管线)换了。
常见的“备菜不一致”:
- 批处理对实时:离线用全量历史算统计量(比如过去 30 天均值),线上只能按当前请求实时算,窗口和时区处理往往不同。
- 口径不同:离线按自然日切分,线上按滑动窗口;离线能用昨天之前的全部汇总,线上只有此刻已结算的数据。
- 重写实现:训练侧用 Python/pandas,服务侧为了性能用 Java、Go 重写一遍,取整、空值、默认值处理对不齐。
- 训练时看了不该看的:用到了线上根本拿不到的字段或未来信息,离线分数自然虚高。
| 维度 | 离线训练 | 线上服务 |
|---|---|---|
| 特征来源 | 仓库里的全量历史 | 实时日志、缓存、接口 |
| 时间语义 | 可以回看过去 | 只有此刻之前 |
| 缺失值 | 统计后填充 | 拿不到就填默认值 |
和漂移、过拟合的区别
数据漂移(Data Drift)和概念漂移(Concept Drift)说的是数据本身随时间变了、输入与结果的关系变了;训练-服务偏差说的是同一时刻、同一批数据,两边管线算出来的特征对不上。判断方法很直接:把线上那条特征链路套在历史数据上重算,和训练特征对不上就是偏斜;对得上但效果随时间下滑,才更可能是漂移。
和过拟合的区别也简单:过拟合是训练好、验证差;训练-服务偏差是训练和验证都好,一上线就差。
对从业者的意义
对算法工程师,这几乎是“离线指标漂亮、上线一塌糊涂”的头号嫌疑。常见做法是让训练和线上共用一套特征定义,把线上实际用到的特征回流记录,定期和训练侧重算结果做一致性比对并报警,再用线上日志做离线回放,在训练环境里跑真实流量。
对其他岗位的人来说,这也是个通用教训:同一个指标,从 Excel 里算和从系统里跑对不上,多半是口径不一致。口径不统一,模型再准也白搭。
