Course 2:监控与持续学习
课程简介
数据漂移检测、模型退化监控、自动重训练。
🎬 本课程视频:MLOps Production — 机器学习工程生产实践
一、为什么需要监控
1.1 模型在生产环境中的退化
模型在生产环境中部署后,性能会随着时间推移而下降。原因包括:
- 数据漂移(Data Drift):输入数据的分布发生变化
- 概念漂移(Concept Drift):输入与输出之间的关系发生变化
- 系统故障:上游数据源不可用、特征计算错误
- 用户行为变化:用户适应了模型,行为模式改变
一个经典的例子:2020 年疫情爆发后,许多电商、出行、旅游领域的 ML 模型性能骤降——因为用户行为模式发生了根本性的变化。
1.2 监控金字塔
有效的 ML 监控应该覆盖多个层次:
- 业务指标:收入、留存率、用户满意度
- 模型指标:准确率、AUC、MAE
- 数据指标:特征分布、缺失率、异常值
- 系统指标:延迟、吞吐量、错误率
二、数据漂移(Data Drift)
2.1 什么是数据漂移
数据漂移是指模型输入特征 $X$ 的分布 $P(X)$ 随时间变化。
原因:
- 季节性变化(电商在双十一期间的流量模式)
- 外部环境变化(疫情期间的用户行为)
- 数据收集方式变化(更换了埋点工具)
- 用户群体变化(产品扩展到新市场)
2.2 检测方法
统计检验:
-
KS 检验(Kolmogorov-Smirnov Test):比较两个分布是否相同
$$D = \sup_x |F_1(x) - F_2(x)|$$
适用于连续分布 -
卡方检验:比较类别分布的差异,适用于类别型特征
分布距离度量:
- Wasserstein 距离:衡量两个分布之间的差异
- JS 散度(Jensen-Shannon Divergence):对称化的 KL 散度
- 群体稳定性指数(PSI):PSI = $\sum (p_i - q_i) \ln(p_i / q_i)$
- PSI < 0.1:分布稳定
- 0.1 ≤ PSI < 0.2:需要关注
- PSI ≥ 0.2:显著漂移
import scipy.stats as stats
def detect_data_drift(reference_data, current_data, threshold=0.05):
drifts = {}
for col in reference_data.columns:
stat, p_value = stats.ks_2samp(reference_data[col], current_data[col])
drifts[col] = {
'statistic': stat,
'p_value': p_value,
'drifted': p_value < threshold
}
return drifts
2.3 监控频率
- 实时监控:延迟、吞吐量、错误率
- 分钟级/小时级:特征统计量(均值、方差、缺失率)
- 天级:特征分布漂移、模型指标
- 周级/月级:业务指标、标签分布
三、概念漂移(Concept Drift)
3.1 什么是概念漂移
概念漂移是指输入 $X$ 与输出 $Y$ 之间的关系 $P(Y|X)$ 发生了变化——同样的特征,对应了不同的输出。
类型:
- 突变(Sudden Drift):关系瞬间改变(政策法规变化)
- 渐变(Gradual Drift):关系缓慢变化(用户口味变化)
- 周期性(Recurring Drift):关系周期性变化(季节性)
- 增量(Incremental Drift):关系逐步演变(渐进式变化)
3.2 检测方法
预测误差监控:跟踪模型预测误差随时间的变化
- 监控 MAE、MSE、分类错误率的时间序列
- 当误差显著上升时触发告警
DDM(Drift Detection Method):
- 监控在线错误率 $p_t$
- 如果 $p_t + \sigma_t \geq p_{\min} + 2\sigma_{\min}$:触发警告
- 如果 $p_t + \sigma_t \geq p_{\min} + 3\sigma_{\min}$:触发漂移
ADWIN(Adaptive Windowing):
- 维护一个可变大小的滑动窗口
- 如果窗口内两个子窗口的均值有显著差异,则检测到漂移
class DDM:
def __init__(self, warning_level=2.0, drift_level=3.0):
self.warning_level = warning_level
self.drift_level = drift_level
self.p_min = float('inf')
self.s_min = float('inf')
self.total = 0
self.errors = 0
def add_element(self, prediction, actual):
self.total += 1
if prediction != actual:
self.errors += 1
p = self.errors / self.total
s = (p * (1 - p) / self.total) ** 0.5
if p + s <= self.p_min + self.s_min:
self.p_min = p
self.s_min = s
if p + s > self.p_min + self.drift_level * self.s_min:
return "DRIFT"
if p + s > self.p_min + self.warning_level * self.s_min:
return "WARNING"
return "OK"
3.3 数据漂移 vs 概念漂移
| 特性 | 数据漂移 | 概念漂移 |
|---|---|---|
| 定义 | $P(X)$ 变化 | $P(Y |
| 检测 | 比较特征分布 | 监控预测误差 |
| 修复 | 更新训练数据分布 | 重新训练模型 |
| 频率 | 相对常见 | 视场景而定 |
四、重训练策略
4.1 重训练触发条件
- 固定时间间隔:每周/每月自动重训练
- 性能下降告警:监控指标低于阈值时触发
- 数据积累:积累到一定量的新数据后重训练
- 人工触发:业务变化或发现问题后手动触发
4.2 重训练方法
全量重训练:使用所有历史数据训练新模型
- 优点:利用全部数据
- 缺点:训练成本高,旧数据可能包含过时模式
增量训练:在新数据上继续训练
- 优点:训练成本低
- 缺点:只适用于支持增量学习的模型(SGD、树模型增量)
滑动窗口训练:只使用最近 N 天的数据
- 优点:适应分布变化
- 缺点:丢弃了可能有用的历史信息
4.3 在线学习 vs 离线重训练
离线重训练:
- 定期用新数据重新训练模型
- 新模型通过 A/B 测试验证后部署
- 适合大多数场景
在线学习:
- 每个新样本到达时实时更新模型
- 适合概念漂移频繁的场景
- 控制难度大,需要监控模型行为
五、告警与响应
5.1 告警层次
- P0(紧急):模型完全不可用,需要立即处理
- P1(高):模型关键指标下降,需要当天处理
- P2(中):模型指标轻微下降,需要本周处理
- P3(低):潜在问题,待观察
5.2 告警响应流程
- 告警触发
- 快速评估影响范围
- 确定根因(数据问题?模型问题?系统问题?)
- 执行回滚或修复
- 事后复盘,更新监控规则
六、总结
- 监控是 ML 系统不可缺的组件——模型在生产中必然退化
- 数据漂移检测 $P(X)$ 变化,概念漂移检测 $P(Y|X)$ 变化
- 多种检测方法:统计检验、PSI、DDM、ADWIN
- 重训练策略需要平衡模型新鲜度和训练成本
- 告警体系确保问题能被及时发现和处理
七、监控系统设计
7.1 监控数据收集
监控系统的第一步是数据收集。需要收集的数据包括:
模型输入数据:
- 采样保存部分推理请求的输入特征
- 计算特征的基本统计量(均值、分位数、缺失率)
- 检测异常特征值
模型输出数据:
- 预测值的分布
- 预测置信度分布
- 模型决策阈值(如果适用)
真实标签数据:
- 模型预测后观察到的真实结果
- 可能存在延迟(如用户是否在推荐后点击)
- 需要与预测对齐
7.2 监控仪表盘设计
有效的监控仪表盘应该:
- 展示关键指标的趋势
- 设置合理的阈值并触发告警
- 支持下钻分析(从全局到单个特征)
- 提供时间对比(同比、环比)
7.3 告警策略设计
好的告警策略应该:
- 减少误报(避免告警疲劳)
- 快速发现真问题
- 提供足够的上下文信息
告警阈值设置:基于历史数据的统计分布设置动态阈值
- 固定阈值:PSI > 0.25 触发告警
- 动态阈值:超过均值 ± 3σ 触发告警
- 基于时间序列的异常检测
7.4 模型回滚策略
当监控系统检测到模型性能显著下降时,需要快速回滚到上一个正常版本:
- 自动回滚:关键指标下降超过阈值时自动触发
- 手动回滚:团队确认问题后手动执行
- 渐进式回滚:逐步减少异常模型的流量
回滚后需要立即进行根因分析,避免同一问题再次发生。
监控指标的分类与选择
构建一个有效的 ML 监控系统需要在不同层面设置指标。按照监控对象的不同,可以将指标分为以下几类:
- 数据质量指标:检查输入数据的完整性、有效性、时效性。如缺失值比例、特征值域范围、时间戳新鲜度等。
- 模型性能指标:检查模型的预测质量。对有标签的场景,可以监控 AUC、准确率、F1 等;对无标签的场景,可以监控预测置信度分布、预测类别分布等代理指标。
- 业务指标:监控模型对业务 KPI 的实际影响。如点击率、转化率、用户留存等。
在监控策略上,建议遵循"金字塔原则":底层是对每个特征的详细监控(特征分布、缺失率等),中间层是对模型输出的汇总监控(预测分布、置信度变化),顶层是业务指标的监控。越往底层,告警越频繁但也越容易误报;越往顶层,告警越稀少但越需要立即处理。
漂移检测的统计方法
数据漂移检测有多种统计方法。对于数值特征,常用的方法包括:两样本 Kolmogorov-Smirnov 检验(KS 检验)、Wasserstein 距离、以及 Population Stability Index(PSI)。对于分类特征,常用卡方检验或 Jensen-Shannon 散度。PSI 在金融风控领域是标准做法:PSI < 0.1 表示分布稳定,0.1-0.25 需要关注,> 0.25 表示显著漂移。
延伸阅读
- 📺 B 站播放列表:MLOps Production — 机器学习工程生产实践
- 📚 更多学习资源,请访问 deeplearning.ai 官网