目录
Enhancing the reliability of out-of-distribution image detection in neural networks
前言
这是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
我们用来表示一个分类网络,其中
代表的是输入图像。对于一个
分类问题,卷积网络最后的输出层维度将会是
,对应输出
到
这
个实数值。为了使得输出有着概率分布的形式,我们通常会使用Softmax激活函数进行映射,使得每个实数值介于0到1之间并且和为1,代表输入
属于各个类别的概率。这个映射函数可以写成以下的形式:
在上述表达式中,就是我们说的temperature。如果令
,那就是我们常见的Softmax激活函数。
表达的是输入样本
属于类别
的置信度或者说是概率。在OOD检测中,我们取Softmax输出的最大置信度作为当前样本是ID样本的概率,也就是:
得分将被用于计算OOD检测的评价指标。作者在训练时,使用的是
,也就是传统的Max-Softmax模型,但是在推理的时候,作者发现通过调节温度
会显著提高OOD检测的能力,这是为什么呢?我们需要理解以下两点:
- 第一点:在计算AUROC,AUPR这两个指标时,会对输入的预测值进行排序,逐个选择分界阈值,然后计算平均。也就是说,这两个指标只与排序结果相关,而与绝对分值无关。进一步的,如果在标签不变的前提下,我们把所有样本的得分同时变大或者变小,但是保证排序的顺序不变,那么这两个指标是不会变化的。
- 第二点:作者在实验中发现一个现象,那就是Max-Softmax方法会倾向于将目标标签所在的那一维度的输出值(logit)推向很大,在量级上远远超过其他维度。这里我们说logit指的是未经过Softmax映射的网络输出的实数值。而根据Max-Softmax的发现,对于OOD样本,这一现象不是那么突出,也就是各个维度(各个类别)的logit会有差异,但是很少有量级上的巨大差异。因此,通过调节温度
,可以使得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使用,性能只可能上升,而不可能下降,这是非常巧妙的一点。作者在文中对温度做了一系列消融实验,对比了不同温度的作用效果:
从上图左侧的四幅图中可以看出,在不同的温度设置下,OOD检测的性能均高于Max-Softmax(对英语温度为1的时候)。
Input Preprocessing
除了对Softmax的输出进行处理之外,作者还提出了另外一种针对输入图像的处理方法,文中称作Input Preprocessing。这个方法是基于一个先验的:由于我们的分类网络是在ID数据上训练的,那么我们可以直观的认为,ID数据分布在得分峰值或者是峰值附近,而OOD数据则往往分布在远离得分峰值的区域。下面的示意图直观的展示了这一现象:
在上图中,蓝色字体表示OOD数据,红色字体表示ID数据。竖直方向的坐标轴表示的是经过Softmax后输出的得分,也就是上文中提到的。因为卷积神经网络是在ID数据上训练的,它对于ID数据更加敏感,并且,ID数据在训练过程中会尽量聚集在得分峰值或者是峰值附近。与此不同的是,OOD数据往往分布在距离峰值较远的区域。
借助于示意图我们可以看出,如果冻结神经网络的权重,对Softmax输出得分进行一次梯度上升的话,ID样本的得分将会大幅度提高,而OOD样本则仅仅会小幅度提高,这样一来,也可以拉大ID数据与OOD数据的得分差距,从而有助于进行OOD检测。
用表示输入的图像,用
表示Softmax网络输出的置信度得分,利用FGSM方法(参见专栏一),可以对输入图像进行微调,得到对抗样本:
上式中的便是经过Input Preprocessing后得到的样本,将
作为输入得到的Softmax得分
可以用于检测OOD样本,也就是用来计算AUROC以及AUPR等指标。在ODIN中,这两种处理方法是结合使用的,对Softmax检测OOD能力的提升具有显著效果。
Evaluation Metrics
作者在文中给出了ODIN与Softmax的实验对比,可以看出,ODIN对于提升卷积网络的OOD检测能力是具有十分明显的作用的。
在本文中,作者使用的卷积网络是DenseNet-BC,除此之外,ResNet18与ResNet34也是OOD检测中常用的骨干网络。从目前来说,用于OOD实验的数据集并不是非常复杂,因此通常选用较常见的规模适量的卷积网络作为分类器。