DeepGini: Prioritizing Massive Tests to Enhance the Robustness of Deep Neural Networks
image-20200928211534475论文:https://arxiv.org/abs/1903.00661
细节: https://github.com/deepgini/deepgini.
摘要
给定输入定义正确输出的测试oracle在自动化测试中通常是不可用的。为了获得oracle信息,基于DNN的系统的测试任务通常需要花费大量的人力来标记测试数据,这大大降低了质量保证的过程。
为了缓解这个问题,作者提出了DeepGini,一种基于DNN统计观点设计的测试优先化技术。这样的统计视角允许我们将测量误分类概率的问题简化为测量集合杂质的问题,这允许我们快速识别可能误分类的测试。
介绍
深度学习的能力尽管很高,但可靠和质量方面仍存在重大问题。DNN软件测试与传统软件测试完全不同,因为DNN是基于数据驱动所构建的,因此,有效的测试数据+oracle信息,对于发掘DNN软件的不当表现至关重要。不幸的是,类似于传统软件的测试技术,DNN测试也面临着自动化测试技术oracle通常不可用的问题。
特别的,在测试基于DNN的系统中,测试者通常关注于造成系统表现错误的测试,因为这些错误可以带来对于程序不同问题的洞察。这一事实很自然的促使我们去提出一种技术,来帮助区分测试的优先级,从而可以在测试之前标记和分析导致错误的测试。从而,我们可以从人工的努力中获得最大的效益。
以往的两类覆盖技术:1. 总覆盖率:倾向于喜欢覆盖了更多程序元素的用例 2. 覆盖附加:倾向于喜欢能覆盖更多以前没有的元素的用例
但是这类基于覆盖的技术并没有那么有效:
- 首先,这类标准是为了衡量测试充分性,但实际上,我们尚不清楚如何用它来提高DNN的质量。
- 一些覆盖标准无法区分不同测试的故障检测能力。因而无法使用覆盖-总优先级方法,来为测试用例进行有效的优先级排序。
- 第三,对于现有的大多数神经元覆盖准则,只有一个测试集中的几个测试能够达到该集合的做大覆盖率。例如,top-k神经元覆盖率,我们只需1%的测试就可以达到最大覆盖率。在这种情况下,我们对于测试进行的优先级排序,也只能进行1%就停止。
- 通常覆盖-附加方法的时间复杂度过高,其中m是元素个数(神经元个数),n是测试用例数。这两个值通常都比较庞大,这也就导致了模型过于庞大。
为了克服以上问题,并有效的提高DNN的质量,本文种,我们提出了DeepGini方法,主要针对于图像分类类的DNN。DeepGini主要基于DNN的统计特性,而非卷积覆盖率。这种方法使得我们将误分类问题简化为一个衡量测试集合杂质的问题。
该测量基于的直觉是,如果一个DNN为每类输出相同的概率时,测试会很容易被DNN错误分类。因此,当DNN为每个类输出相同的概率时,该度量产生最大值。
<0.5,0.5>对应的度量值 大于 <0.9,0.1>对应的度量值
这一方法有如下好处:
- 利用该方法进行度量比基于神经元覆盖率的度量要更有区分度,因为测试用例通常都有着不同的输出向量,但却很可能拥有相同的覆盖率
- 该度量不用记录中间信息来计算覆盖率。而只需要对测试进行优先排序,所以更为安全,易用。
- DeepGini的时间复杂度于总覆盖率类似,但远低于覆盖附加方法。同时和总覆盖方法一样可扩展。
- DeepGini在前的测试集,优于该度量在后的测试集,也优于使用覆盖范围度量在前的测试集。
该方法需要运行所有测试来获得输出。但实际上运行DNN的时间要远小于训练DNN。
作者从两个方面来论证的方法的有效性。
首先,计算了故障检测的平均百分比值(APFD),这是评估优先排序技术的标准方法。
其次,为了评估该技术能否有效提高DNN质量,将排序靠前的测试集重训练,并对比准确性。
贡献如下:
- 提出了一种有效且高效的方法,以排序DNN测试集。
- 证明该度量较大的测试集能更有效的提高DNN质量。
- 证明了基于神经元覆盖率的方法,在测试优先级和DNN优化上的不足。
方法
分类纯度
image-20200929113101779大致思想:右侧比左侧更容易被分类,左侧更容易被混淆。
计算方法 前者为0.25+0.25=0.5,后者为0.81+0.01=0.82
这种想法于基尼指数的含义十分接近。因此作者考虑引入基尼系数来进行度量。
DeepGini
定义:给定一个测试t和它在DNN下的输出(),定义来度量t可能被错误分类的概率。
之后作者证明了这一度量的极值也是最值,在各分类概率相等时取到
利用每个测试所对应的度量,我们可以直接用快排来给它进行排序,以较低的时间效率来完成。
同时由于度量计算只需要输出向量,因此该方法基本不会对原有的DNN进行干涉
利用DeepGini增强DNN
DeepGini 的有效性背后的原则实际上是遵循主动机器学习理论,该理论更喜欢决策边界附近的测试。
因此,作者认为DeepGini不仅提供了一种测试优先级的办法,同时还提供了一种在有限时间预算内增强DNN稳健性的技术。
实验设计
数据集和模型选择
数据集:MNIST,CIFAR-10,Fashion,SVHN
模型:不同神经元数量的模型,以展现对于不同层次模型的效果
image-20200929140938095对抗测试生成
除了对于数据集中的原始数据进行优先排序,本文还对对抗性测试进行了一个优先级排序。分别选择了四种SOTA方法生成对抗测试数据,FGSM,BIM,JSMA,CW.
Q: 按照基尼系数的含义,良好分类的数据集,也能够得到很高的分数。如何分辨:全都分错,错的彻底;不太对也错的不彻底;全都分对,对的彻底。
基线方法
通过将本文的度量与基于覆盖的11种方法进行对比。
主要基于四种模式,两个方面来计算:
- 利用CTM或CAM来进行测试优先级排序
- 对原始数据集中的测试进行优先排序,或对原始+对抗测试数据集进行优先级排序
研究问题
RQ1 有效性
DeepGini能否找到比基于神经元覆盖的方法更好的测试排序么?
通过比较不同方法的APFD(平均错误发现率)来论证。
- APFD值不够接近于1,并不意味着优先级排序不够有效。因为理论上,该值通常要比1小得多。
对于一系列测试n个,其中有k个会被误分类,设表示第i个误分类测试的下标。APFD表示为:
更准确的来说,假设APFD理论最大最小值为和,我们将APFD值归一化排序后,值越接近1,就说明排序方法越好。
RQ2 效率
DeepGini是否比基于神经元覆盖的方法更有效?
通过记录时间花销来回答这一问题。排序方法通常都更耗时,因为测试集数量通常很大。基于我们的分析,一些优化排序方法甚至要花费数个小时,这在工业中是难以接受的。
RQ3 指导性
DeepGini是否能够指导DNN的重训练以帮助提升其准确性?
一般的DNN网络通常准确性都足够强,因此本文是通过引入对抗测试来回答该问题。对每个模型,向测试集T中加入相同数量的对抗测试样本,并构造一个验证集V用于以下实验。
在对T进行优先级排序后,将前1%,2%,...,10%的测试数据代回训练集,并训练一个新的DNN。(不加入更多是因为,更多的测试数据,无法再带来模型明显的变化。)然后利用验证集V,度量新DNN的准确性。利用不同的度量,来判断重训练的DNN的准确率。基于实验结果,我们可以回答,DeepGini能够更有效的指导重训练。
结果分析
RQ1&RQ2 效率和有效性
与NAC,NBC,SNAC比较
image-20200929144050922关于DeepGini的结论:速度快,且APFD得分高。
关于覆盖率的结论:0.5%的测试就足以达到这三类方法的覆盖率上限了。
image-20200929144523959以随机分类为基线,有些覆盖方法的效果甚至会比随机还要差。而其中DeepGini能够最快的达到最高的错误检出率。
与TKNC,LSC,DSC,KMNC对比
- 难以良好进行排序:CTM无效,CAM很快达到最大后,也无效。
- 这几种方法的效率普遍比DeepGini要慢20倍以上,再工业中基本都属于无法接受的速度。
RQ3指导性
image-20200929145236351其中KMNC的运算速度过慢无法完成实验。对比其他方法,可以发现DeepGini在生成优先级序列提高DNN准确性方面更为有效。
image-20200929145945051表六:10%的优先数据代回。基线效果大致在0.83-0.85,DeepGini可以达到0.9以上。
讨论
image-20200929150534912额外的提了安全性,和可扩展性。
网友评论