分布外检测是什么?让模型知道“这个我没见过”
分布外检测(Out-of-Distribution Detection,OOD 检测)是让模型识别“这个输入我没见过”的技术。它专注于发现那些在训练阶段没有被覆盖到的数据样本。比如一个只学过识别猫和狗的分类器,突然收到一张汽车的照片,理想的反应是“这不是我认识的东西”,而不是硬说它是猫或者是狗。
为什么这很重要
神经网络有一个令人担忧的特点:它们常常会对完全陌生的输入给出非常自信的预测。一个分类器面对一张随机噪声图片,可能以 99% 的置信度说这是一只狗。在很多场景中,这种“盲目自信”是危险的。医疗诊断模型遇到一种训练时没见过的罕见病影像,如果照样给出确定的诊断,可能误导医生;自动驾驶系统遇到从未见过的障碍物,如果把它当成普通的路面,后果可能很严重。OOD 检测的价值,就是让模型在面对未知时能够“知道自己不知道”,把这些情况交给人类处理,或者采取更保守的应对方式,从而提高系统的鲁棒性和安全性。
核心挑战
OOD 检测的难点在于,未知的东西是无法穷举的:我们不可能在训练时把所有“不属于”训练分布的样本都准备好。模型只能从训练数据出发,去判断一个新样本“像不像”见过的东西。而且分布外的情况有很多种:可能是完全不同类别的东西(语义上的变化),也可能是同类东西但拍摄条件、风格完全不同(协变量的变化)。
常见方法
基于置信度:用模型输出的最大概率作为指标,概率越低越可能是分布外样本,这是最简单的基线方法,后来又有温度缩放、能量分数等改进。基于距离:在模型的特征空间中,看新样本离训练样本有多远,比如马氏距离、最近邻距离。基于生成模型:学习训练数据的分布,评估新样本在这个分布下出现的可能性。基于训练的方法:在训练时引入一些辅助的“异常”样本,让模型学会区分。大模型和预训练的视觉语言模型,比如 CLIP,也为 OOD 检测提供了新的工具。OOD 检测与分布外泛化相辅相成:前者让模型发现未知,后者让模型应对未知。