2. 基础概念
在OOD检测与异常场景挖掘工程中,最容易混淆的不是算法,而是一组看似相近、实则边界不同的基础概念。很多项目失败并非模型能力不足,而是团队把“异常”“新颖性”“开放集”“协变量偏移”当成同义词使用,导致数据划分、评测指标和上线策略互相矛盾。本节用一条统一的“数据生成视角”把这些概念拆开:先看样本来自哪个分布,再看标签空间是否变化,最后看变化发生在输入侧还是决策侧。
一、分布内与分布外:以训练分布为锚点
设训练数据服从分布 P_in(x, y),测试样本若来自同一分布,称为分布内(In-Distribution, ID);若来自不同分布 P_out(x, y),称为分布外(Out-of-Distribution, OOD)。关键点是:ID/OOD 是相对于“训练分布”定义的,不是相对于“人类常识”定义的。同一个样本,在A模型上是OOD,在B模型上可能是ID。
工程上常用“分布偏移”描述 P_in ≠ P_out。但偏移并不等于OOD:如果标签空间相同、只是输入边缘分布变化,仍可能属于协变量偏移;如果标签语义映射变化,则属于概念偏移。因此,ID/OOD 是总称,协变量偏移与概念偏移是两种具体机制。
二、异常、新颖性与开放集识别:目标不同,标签假设不同
异常检测(Anomaly Detection)通常假设正常样本占多数,异常样本稀少且定义模糊,目标是给样本打“异常分”。异常可以是ID内的长尾故障,也可以是OOD样本。它不要求异常有类别标签,常用于工业质检、日志监控、设备预警。
新颖性检测(Novelty Detection)更强调“训练时只有正常/已知数据,测试时出现从未见过的新模式”。它通常把新样本视为需要报警或人工确认的对象,但不一定要求区分新类之间的差异。与异常检测相比,新颖性检测更关注“是否新”,而非“是否坏”。
开放集识别(Open Set Recognition, OSR)则明确要求模型在测试时同时完成两件事:把已知类正确分类,并把未知类拒识为“未知”。它假设标签空间在测试时是开放的,未知类不属于任何训练类别。OSR 的评价通常同时看已知类准确率和未知类拒识率。
三者的关系可以概括为:异常检测偏“异常分数”,新颖性检测偏“新样本发现”,开放集识别偏“已知分类 + 未知拒识”。它们可以共享OOD检测技术,但任务定义和评测协议不同。
三、协变量偏移与概念偏移:变化发生在哪里
协变量偏移(Covariate Shift)指输入边缘分布变化,即 P_train(x) ≠ P_test(x),但条件分布 P(y|x) 保持不变。例如训练集是白天道路图像,测试集是夜间道路图像;标签规则没变,只是输入外观变了。此时模型可能因输入分布变化而性能下降,但类别语义未变。
概念偏移(Concept Shift)指 P(y|x) 本身发生变化。例如同样一张“正常”设备图像,在旧产线定义为合格,在新产线因工艺标准提高被定义为缺陷;或者用户行为中“点击”的含义随推荐策略改变。此时输入可能相似,但标签映射已变,模型必须重新学习决策边界。
两者的工程含义完全不同:协变量偏移通常可通过重加权、域适应、数据增强缓解;概念偏移则需要重新标注、增量学习或在线更新,否则模型会“自信地犯错”。
四、方法流程:从概念到工程动作
面对一个真实任务,建议按以下流程判断:
- 确认训练分布与标签空间:训练时是否只有已知类?测试时是否可能出现未知类?
- 判断变化类型:是输入外观变化(协变量偏移),还是标签规则变化(概念偏移),或两者兼有?
- 选择任务定义:需要异常分数、新样本发现,还是已知分类加未知拒识?
- 设计数据划分:ID/OOD 划分必须与任务一致,避免把协变量偏移样本误当OOD,或把未知类混入ID测试集。
- 选择指标:异常检测看AUROC/PR,开放集看已知准确率与未知拒识率,偏移场景看目标域性能与校准误差。
五、案例与场景:工业质检中的四种典型情况
| 场景 | 变化机制 | 任务定义 | 关键动作 |
|---|---|---|---|
| 白天训练,夜间上线 | 协变量偏移 P(x) 变 | 域适应/鲁棒分类 | 夜间数据增强、重加权、校准 |
| 训练只有划痕,测试出现凹坑 | 标签空间开放 | 开放集识别/新颖性检测 | 未知类拒识、人工复核、主动学习 |
| 旧标准合格,新标准不合格 | 概念偏移 P(y|x) 变 | 重新标注/增量学习 | 更新标签规则、在线微调、版本管理 |
| 设备偶发异常振动 | 异常稀少且无标签 | 异常检测 | 无监督打分、阈值调优、告警聚合 |
六、误区与复盘
常见误区二:把协变量偏移当成概念偏移。前者标签规则不变,后者标签规则改变;用错会导致模型更新方向完全错误。
常见误区三:开放集识别只做拒识。OSR必须同时保证已知类分类性能,否则“全部拒识”也能获得高未知召回,但毫无业务价值。
常见误区四:忽略阈值与校准。异常分数、OOD分数、拒识分数都需要在目标域上校准,否则上线后误报率会急剧上升。
# 概念判断伪代码
def diagnose(train_dist, test_dist, label_space):
if test_dist == train_dist:
return "ID:常规评估"
if label_space.is_open(test_dist):
return "OSR/新颖性:已知分类 + 未知拒识"
if test_dist.p_x != train_dist.p_x and test_dist.p_y_given_x == train_dist.p_y_given_x:
return "协变量偏移:域适应/重加权"
if test_dist.p_y_given_x != train_dist.p_y_given_x:
return "概念偏移:重标注/增量学习"
return "异常检测:无监督打分与告警"
总结来看,ID/OOD 是分布层面的总分类;异常、新颖性、开放集识别是任务层面的不同目标;协变量偏移与概念偏移是偏移机制层面的两种具体形式。只有先把这些概念对齐,后续的OOD检测算法、异常挖掘流程和上线策略才有共同的语言基础。