2. 基础概念

在OOD检测与异常场景挖掘工程中,最容易混淆的不是算法,而是一组看似相近、实则边界不同的基础概念。很多项目失败并非模型能力不足,而是团队把“异常”“新颖性”“开放集”“协变量偏移”当成同义词使用,导致数据划分、评测指标和上线策略互相矛盾。本节用一条统一的“数据生成视角”把这些概念拆开:先看样本来自哪个分布,再看标签空间是否变化,最后看变化发生在输入侧还是决策侧。

核心判断链:样本是否来自训练分布 → 标签是否属于已知类别 → 变化发生在 P(x) 还是 P(y|x) → 任务目标是拒识、发现还是自适应。这条链决定了你该用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) 本身发生变化。例如同样一张“正常”设备图像,在旧产线定义为合格,在新产线因工艺标准提高被定义为缺陷;或者用户行为中“点击”的含义随推荐策略改变。此时输入可能相似,但标签映射已变,模型必须重新学习决策边界。

两者的工程含义完全不同:协变量偏移通常可通过重加权、域适应、数据增强缓解;概念偏移则需要重新标注、增量学习或在线更新,否则模型会“自信地犯错”。

数据分布视角下的核心概念关系 以训练分布 P_in(x,y) 为锚点,区分标签空间与变化机制 分布内 ID P_test(x,y) = P_in(x,y) 标签空间已知 常规分类/检测目标 分布外 OOD P_test(x,y) ≠ P_in(x,y) 可能含未知类或新机制 需要检测/拒识/挖掘 开放集识别 OSR 测试标签空间开放 已知类分类 + 未知类拒识 强调决策边界 异常检测 正常占多数,异常稀少 输出异常分数 异常可来自ID或OOD 新颖性检测 训练仅见正常/已知 测试出现新模式 关注“是否新” 概念偏移 P(y|x) 发生变化 标签语义/规则改变 需重标注或增量学习 协变量偏移:P(x) 变化,P(y|x) 不变 例:白天→夜间、晴天→雨天、设备A→设备B;标签规则不变,输入外观变化 应对:重加权、域适应、数据增强、鲁棒训练;不改变类别定义 偏移机制可叠加

四、方法流程:从概念到工程动作

面对一个真实任务,建议按以下流程判断:

  1. 确认训练分布与标签空间:训练时是否只有已知类?测试时是否可能出现未知类?
  2. 判断变化类型:是输入外观变化(协变量偏移),还是标签规则变化(概念偏移),或两者兼有?
  3. 选择任务定义:需要异常分数、新样本发现,还是已知分类加未知拒识?
  4. 设计数据划分:ID/OOD 划分必须与任务一致,避免把协变量偏移样本误当OOD,或把未知类混入ID测试集。
  5. 选择指标:异常检测看AUROC/PR,开放集看已知准确率与未知拒识率,偏移场景看目标域性能与校准误差。

五、案例与场景:工业质检中的四种典型情况

场景 变化机制 任务定义 关键动作
白天训练,夜间上线 协变量偏移 P(x) 变 域适应/鲁棒分类 夜间数据增强、重加权、校准
训练只有划痕,测试出现凹坑 标签空间开放 开放集识别/新颖性检测 未知类拒识、人工复核、主动学习
旧标准合格,新标准不合格 概念偏移 P(y|x) 变 重新标注/增量学习 更新标签规则、在线微调、版本管理
设备偶发异常振动 异常稀少且无标签 异常检测 无监督打分、阈值调优、告警聚合

六、误区与复盘

常见误区一:把OOD等同于异常。OOD强调分布不同,异常强调“偏离正常模式”。ID内的长尾故障也是异常,但不一定是OOD。
常见误区二:把协变量偏移当成概念偏移。前者标签规则不变,后者标签规则改变;用错会导致模型更新方向完全错误。
常见误区三:开放集识别只做拒识。OSR必须同时保证已知类分类性能,否则“全部拒识”也能获得高未知召回,但毫无业务价值。
常见误区四:忽略阈值与校准。异常分数、OOD分数、拒识分数都需要在目标域上校准,否则上线后误报率会急剧上升。
复盘时建议记录四件事:训练分布与测试分布是否一致、标签空间是否开放、变化发生在 P(x) 还是 P(y|x)、当前指标是否覆盖了业务真正关心的错误类型。把这四点写进数据卡片,可以显著减少团队沟通成本。
# 概念判断伪代码
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检测算法、异常挖掘流程和上线策略才有共同的语言基础。