Out-of-distribution Detection系列专栏(三)

目录

前言

Enhancing the reliability of out-of-distribution image detection in neural networks

Motivation

Temperature Scaling

Input Preprocessing

Evaluation Metrics


前言

这是OOD检测系列专栏的第三篇文章,也是对于OOD检测后续的发展非常重要的一种方法。由于其不需要额外的训练或者finetune,因此可以很容易的与其他各种技术相结合。这种方法在后续的研究中被称为ODIN。

Enhancing the reliability of out-of-distribution image detection in neural networks

可以观察到一个有趣的现象,做OOD研究的相关文章,题目实在是太长了,都得换好几行。本文中提出的方法被称为ODIN,是Out-of-DIstribution detector for Neural networks的简写。我第一次看到这个简写来源的时候是一脸疑惑的,但是这并不影响ODIN成为OOD检测研究领域的一个绝妙思想。

Motivation

在上一篇文章中,也就是Max-Softmax方法中,作者已经指出,传统的卷积神经网络是可以用来做OOD检测的,并且取得了不错的效果,这说明了按照有监督方式训练得到的分类网络会赋予ID样本更高的置信度,而赋予OOD样本相对较低的置信度。基于这个实验观察,ODIN想要达到的目的就是:在Max-Softmax的基础上,用一些技巧使得模型对ID样本的置信度显著提高,而对OOD样本的置信度仅有小幅度提高。如果能实现这样的目的,那就拉大了ID数据与OOD数据之间的置信度差异,从而增强模型的OOD检测能力。ODIN包含了两种技巧,一种是Temperature Scaling,另一种是Input Preprocessing。下面分别介绍这两种技巧。

Temperature Scaling

我们用f(x)=(f_1(x),f_2(x),f_3(x),...,f_N(x))来表示一个分类网络,其中x代表的是输入图像。对于一个N分类问题,卷积网络最后的输出层维度将会是N,对应输出f_1(x)f_N(x)N个实数值。为了使得输出有着概率分布的形式,我们通常会使用Softmax激活函数进行映射,使得每个实数值介于0到1之间并且和为1,代表输入x属于各个类别的概率。这个映射函数可以写成以下的形式:

S_i(x;T)=\frac{\exp(f_i(x)/T)}{\sum_{j=1}^{N}\exp(f_j(x)/T)}

在上述表达式中,T就是我们说的temperature。如果令T=1,那就是我们常见的Softmax激活函数。S_i(x;T)表达的是输入样本x属于类别i的置信度或者说是概率。在OOD检测中,我们取Softmax输出的最大置信度作为当前样本是ID样本的概率,也就是:

S_{\hat{y}}(x;T)=\max_{i}S_i(x;T)

得分S_{\hat{y}}(x;T)将被用于计算OOD检测的评价指标。作者在训练时,使用的是T=1,也就是传统的Max-Softmax模型,但是在推理的时候,作者发现通过调节温度T会显著提高OOD检测的能力,这是为什么呢?我们需要理解以下两点:

  • 第一点:在计算AUROC,AUPR这两个指标时,会对输入的预测值进行排序,逐个选择分界阈值,然后计算平均。也就是说,这两个指标只与排序结果相关,而与绝对分值无关。进一步的,如果在标签不变的前提下,我们把所有样本的得分同时变大或者变小,但是保证排序的顺序不变,那么这两个指标是不会变化的。
  • 第二点:作者在实验中发现一个现象,那就是Max-Softmax方法会倾向于将目标标签所在的那一维度的输出值(logit)推向很大,在量级上远远超过其他维度。这里我们说logit指的是未经过Softmax映射的网络输出的实数值。而根据Max-Softmax的发现,对于OOD样本,这一现象不是那么突出,也就是各个维度(各个类别)的logit会有差异,但是很少有量级上的巨大差异。因此,通过调节温度T,可以使得OOD样本的置信度锐减,而ID样本的置信度减少很小或没有变化。

我们通过一个实例来理解上述的第二点,也就是Temperature Scaling的作用效果:

import torch
import torch.nn as nn

if __name__ == '__main__':
    T = 100
    softmax = nn.Softmax(0)
    logit_a = torch.tensor([10, 11, 12, 13]).float()
    softmax_logit_a = softmax(logit_a)
    T_softmax_logit_a = softmax(logit_a / T)
    print('Original : ', softmax_logit_a)
    print('Temperature Scaling : ', T_softmax_logit_a)

我们可以得到以下输出结果:

 这说明,在logit没有太大量级差异的时候,我们对logit缩小相同的倍率,会使得经过Softmax映射后,结果趋近于均匀分布,各个维度之间的差异不再明显。下面是一个维度之间有着明显量级差异的示例:

import torch
import torch.nn as nn

if __name__ == '__main__':
    softmax = nn.Softmax(0)
    T = 100
    logit_a = torch.tensor([300, 11, 12, 13]).float()
    softmax_logit_a = softmax(logit_a)
    T_softmax_logit_a = softmax(logit_a / T)
    print('Original : ', softmax_logit_a)
    print('Temperature Scaling : ', T_softmax_logit_a)

此时,我们得到的结果如下:

可以看出,此时,经过Temperature Scaling之后,各维度之间的概率置信度并没有发生显著的变化,原来占据主导的维度现在仍然占据主导优势。 

另外,值得指出的是,Temperature Scaling不会改变各个维度之间的相对顺序关系,这丛上面的两个示例也可以看出。这保证了Max-Softmax方法结合Temperature Scaling使用,性能只可能上升,而不可能下降,这是非常巧妙的一点。作者在文中对温度T做了一系列消融实验,对比了不同温度的作用效果:

 从上图左侧的四幅图中可以看出,在不同的温度设置下,OOD检测的性能均高于Max-Softmax(对英语温度为1的时候)。

Input Preprocessing

除了对Softmax的输出进行处理之外,作者还提出了另外一种针对输入图像的处理方法,文中称作Input Preprocessing。这个方法是基于一个先验的:由于我们的分类网络是在ID数据上训练的,那么我们可以直观的认为,ID数据分布在得分峰值或者是峰值附近,而OOD数据则往往分布在远离得分峰值的区域。下面的示意图直观的展示了这一现象:

在上图中,蓝色字体表示OOD数据,红色字体表示ID数据。竖直方向的坐标轴表示的是经过Softmax后输出的得分,也就是上文中提到的S_{\hat{y}}(x;T)。因为卷积神经网络是在ID数据上训练的,它对于ID数据更加敏感,并且,ID数据在训练过程中会尽量聚集在得分峰值或者是峰值附近。与此不同的是,OOD数据往往分布在距离峰值较远的区域。

借助于示意图我们可以看出,如果冻结神经网络的权重,对Softmax输出得分进行一次梯度上升的话,ID样本的得分将会大幅度提高,而OOD样本则仅仅会小幅度提高,这样一来,也可以拉大ID数据与OOD数据的得分差距,从而有助于进行OOD检测。

x表示输入的图像,用S_{\hat{y}}(x;T)表示Softmax网络输出的置信度得分,利用FGSM方法(参见专栏一),可以对输入图像进行微调,得到对抗样本:

\tilde{x}=x+\epsilon(\nabla_x\log S_{\hat{y}}(x;T))

上式中的\tilde{x}便是经过Input Preprocessing后得到的样本,将\tilde{x}作为输入得到的Softmax得分S_{\hat{y}}(\tilde{x};T)可以用于检测OOD样本,也就是用来计算AUROC以及AUPR等指标。在ODIN中,这两种处理方法是结合使用的,对Softmax检测OOD能力的提升具有显著效果。

Evaluation Metrics

作者在文中给出了ODIN与Softmax的实验对比,可以看出,ODIN对于提升卷积网络的OOD检测能力是具有十分明显的作用的。

在本文中,作者使用的卷积网络是DenseNet-BC,除此之外,ResNet18与ResNet34也是OOD检测中常用的骨干网络。从目前来说,用于OOD实验的数据集并不是非常复杂,因此通常选用较常见的规模适量的卷积网络作为分类器。 

### 关于Out-of-Distribution (OOD) 检测 #### OOD概念定义 在机器学习领域,尤其是深度学习中,模型通常被训练用于识别来自特定数据分布的样本。然而,在实际应用场景下,输入的数据可能并不遵循训练集中的分布模式。这些不遵循预期分布规律的新颖或者异常样例被称为Out-of-Distribution(OOD)[^1]。 #### 处理方法概述 为了有效应对OOD问题,研究人员提出了多种策略和技术来增强模型对于未知类别或异常情况下的鲁棒性和泛化能力: - **基于置信度的方法**:通过评估模型给出的概率分布特性(如熵),可以判断测试实例是否属于已知分类之外。当预测结果显示出较高的不确定性时,则认为该样本可能是OOD [^3]。 - **证据理论驱动的学习框架**:引入狄利克雷先验作为不确定性的表示形式,并调整网络结构使其能够显式地估计这种不确定性水平。这种方法允许区分高可信度的正常类成员与其他潜在的异常点 。 - **对比学习与自监督机制**:利用未标记的大规模数据集构建辅助任务,从而让特征提取器学会捕捉更广泛而稳定的语义信息,有助于提高对不同域间变化的适应力 [^2]。 #### PyTorch实现案例 针对上述提到的技术路线之一——基于置信度的OOD检测方案,下面提供了一个简单的Python代码片段展示如何计算并筛选出疑似OOD样本的过程: ```python import torch.nn.functional as F def detect_ood(logits, threshold=0.9): probs = F.softmax(logits, dim=-1) max_probs, _ = torch.max(probs, dim=-1) ood_mask = max_probs < threshold return ood_mask.cpu().numpy() ``` 此函数接收神经网络最后一层输出logits以及设定好的阈值参数threshold,默认情况下取值为0.9;返回布尔数组指示哪些位置对应着可能存在的OOD项。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值