
关键词:深度神经网络,测试用例优先级
1介绍深度神经网络(DNN)的巨大进步推动了深度学习应用的出现,这些应用为人类带来了商业利益,并且它们已逐渐部署在更关键的领域,例如医学诊断,自动驾驶汽车和空中交通管制[5、6、17、19]。它们是基于与传统软件应用程序不同的数据驱动编程模型构造的。尽管深度学习在一些特定的问题上已经超越了人类,但它仍然存在许多缺陷,并可能导致意外行为,这在某些安全攸关的场景下是无法容忍的,例如由特斯拉开发的自动驾驶汽车造成的事故[4]和Uber[7]。
但是,几乎所有现有的研究都只专注于追求高性能基准,而只有很少的工作专注于检测DNN的不良行为或提出建议以帮助开发人员提高基于DNN的软件质量。从另一个角度看,在基于DNN的软件上进行的测试与常规软件有很大的不同,因为前者主要基于数据驱动的编程模型,而后者主要基于业务逻辑。因此,需要大量的测试用例来检测基于DNN的系统的不良行为。更糟的是,DNN经常面临这样一个问题,即自动oracle通常不可用。一种解决方案是投入大量的人力来标记测试用例。例如,ImageNet被认为是世界上最大的视觉识别数据集,由20,000多个类别和数百万个带有标签的数据组成,花费了167个国家的4.9万名员工超过9年的时间。此外,通过分析可能导致不正确行为的测试用例,软件开发人员可以从这些分析和诊断中汲取灵感,从而可以更好地提高系统质量[15]。这样的软件开发过程中的场景促使我们提出了一个测试用例优先级排序工具,以提高测试人员在早期发现有价值的测试用例时的效率。此外,考虑到昂贵的人工标记过程,即使没有测试oracle,我们的工具也设计为有效。
许多关于测试优先级的研究已经针对常规软件系统提出了[3,15,20]。代码覆盖率是指导这些研究优先级排序的首选指标[1、2]。不幸的是,由于常规软件和基于DNN的软件之间的固有差异,基于代码覆盖率的方法并不像预期的那样有效。一方面,常规软件通常具有非常清晰的执行逻辑,并且可以毫不含糊地在流程图中表达,而基于DNN的软件的构建在某种程度上就像是构建块。在此过程中没有明确的逻辑流程,也没有明确的数据流程,因此,使基于代码覆盖率的方法不再有效。另一方面,如果我们尝试将代码覆盖率应用于DNN,则会发现很少的测试用例(约占总测试集的1%)可以达到测试集的最大覆盖率。另外,给定一个DNN模型,每个测试输入都可以达到相同的top-k神经元覆盖率[10],这验证了我们前面提到的假设。结果,当面对基于DNN的系统时,基于代码覆盖率的测试优先级排序方法变得毫无意义且不适用。
DeepGini[16]是专门解决上述问题而设计的,通过统计角度将测量错误分类的可能性的问题转换为测量测试集纯度的问题。这种转换实际上遵循了Gini杂质[14]的想法,它主要用于测量在数据集上进行随机抽样时被错误分类的概率。凭直觉,如果DNN输出的softmax为每个类别生成相似的值,则倾向于将测试用例分类错误。根据Gini杂质的定义,当DNN输出每个类别的概率相同时,我们的方法将输出最大值。与代码覆盖方法相比,我们的方法具有以下优点。第一且最重要的一点是,我们的方法基于扎实的理论并且可以很好地解释,而基于代码覆盖率的方法只是DNN测试领域中的机械应用。其次,我们的方法效率更高,因为我们只需要利用最后一层的信息即可。但是,基于代码覆盖率的方法需要记录每个神经元的信息以计算覆盖率,这既浪费时间又浪费资源。第三,考虑到DeepGini仅利用最后一层的输出矢量,我们的方法更像是黑盒测试,并且对网络体系结构的依赖性较小,这对于希望保护DNN中嵌入的敏感信息的研究人员具有强烈的吸引力。我们的工具已经在多个流行的开源数据集上进行了评估,并附带了最新的DNN模型。
总之,DeepGini具有以下功能:
•DeepGini是基于Web的测试优先级划分工具,用于帮助开发人员及早发现DNN错误行为。基于Gini杂质的理论[14],DeepGini提供了一种在大规模测试集中选择容易出错的测试用例的有效方法。
•DeepGini旨在在不了解DNN架构的情况下工作,DNN架构被认为更安全,更高效。
•DeepGini应用程序具有通过单击相应值来可视化测试用例的功能,这在分析和诊断阶段很有用。
2.工具设计2.1架构我们在图1中展示了DeepGini的体系结构。由三个部分组成:前端,由WebUI层和可视化层组成,用于处理人机交互并以更易理解的方式可视化最终结果,基于深度学习框架的后端进行实际计算,包括训练模型用户不提供运行DeepGini算法和其他基于coverage的方法的方法。详细而言,用户可以上传自己的数据集和模型文件,也可以选择我们提供的数据集和模型。然后,我们的后端将运行DeepGini算法,根据模型的输出确定数据集的优先级。算法完成后,最终结果将被馈送到可视化层,以便以人类便读的形式显示它。此时,用户可以看到不同百分比的故障检测以及优先测试用例的前5个样本,这些样本可以用来调试和诊断神经网络缺陷。我们选择将DeepGini实现为基于Web的微服务,以便可以在任何平台上部署此软件。另外,与桌面应用程序相比,用户只需要浏览器就可以访问DeepGini,这可以大大简化环境配置和软件安装过程。
2.2可视化为了帮助我们的最终用户更好地了解DeepGini的计算结果,我们提供了一个精美的可视化层。DeepGini完成处理后,评估结果将显示在网页上,其中包括一个表格,该表格显示了原始数据集和对抗性样本上的Coverage-AdditionalMethod(CAM)的不同度量结果,以及一些图表来说明不同的测试优先级排序方法。此外,用户可以通过单击相应的曲线来可视化通过不同方法确定优先次序的前5个样本,这将有助于调试DNN模型的开发人员或测试人员。我们还提供了说明不同覆盖标准性能的图表。除了图表外,我们还提供了一个表格来详细显示数值结果。用户可以通过检查表中的数字数据来比较执行时间并了解几个指标之间的细微差别。
2.3接口和用法图2显示了Deep-Gini计算的最终结果分析。我们可以看到几条覆盖曲线,它们代表不同的优先方法。用户可以清楚地区分哪种方法在指定的数据集和DNN模型下效果最好。此外,DeepGini选择了一些优先测试用例的样本,并提供给我们的用户,以便他们了解哪些样本可能会导致当前模型的缺陷。此外,我们的工具还提供了一个选项,可以使用FGSM,JSMA和CW等最新的对抗性攻击算法生成一些对抗性示例,以利用测试过程。这些样本也将显示给用户。我们还为用户提供了下载按钮和生成报告按钮,以便他们可以方便地检查整个优先数据集并更好地了解其模型的整体性能。通过选择表格页面,在DeepGini过程中计算的CAM和CTM以及执行时间将汇总到一个表中。
2.4实现我们基于客户端/服务器架构实现了DeepGini。考虑到Tensorflow提供了强大的API支持并且拥有强大的社区。在我们的实现中,DeepGini采用TensorFlow作为计算引擎。此外,对于后端,我们采用框架来处理请求,并使用远程过程调用与计算引擎进行通信。我们的设计和实现使用户能够在分布式计算机上部署计算引擎和后端。请注意,通过采用远程过程调用作为通信策略,我们将后端与计算引擎分离。最终用户可以选择其他深度学习引擎来支持计算。
3评估我们已经结合其他指标进行了全面的实验,以评估DeepGini的性能。我们的实验中使用的主要指标是故障检测的平均百分比(APFD)和用于衡量有效性和效率的时间成本。较高的APFD值表示更快的错误分类检测率。当将检测到的误分类测试的百分比与优先测试的数量作图时,可以将APFD计算为绘制线下方的面积。形式上,对于其中有k个测试将被错误分类的n个测试的排列,令oi为揭示第i个错误分类测试的第一个测试的顺序。可以按以下方式计算此排列的APFD值:
为了衡量实验方法的时间成本,我们记录每种方法的执行时间。
如表1所示,我们选择了3个流行的公开可用数据集,即MNIST[9],CIFAR-10[8],SVHN[12]。在MNIST和CIFAR-10上,我们使用预先训练的LeNet-5和ResNet-20作为我们的实验模型。对于SVHN,由于我们找不到任何可用的预训练DNN模型,因此我们自己训练DNN模型。
我们将DeepGini与以下几种覆盖标准进行了比较:NAC(k),KMNC(k),TKNC(k)。图3中的结果表明,与基于NAC(k)的方法相比,无论k的值如何,我们都可以通过小于0.5%的测试来达到最大覆盖率。从这个图中我们有两个观察结果。首先,我们的优先排序方法比基于神经元覆盖的方法可以更快地找到更多错误分类的测试案例。其次,我们发现基于神经元覆盖的优先级有时甚至比随机优先级还要差。
与基于TKNC(k)的方法相比,我们的方法要好得多,因为我们方法的曲线上升速度要快得多。我们还发现,无论k的值如何,每个测试的覆盖率都为TKNC(k)。因此,如果我们使用TKNC(k)对测试进行优先级排序,则CTM无法正常工作。不幸的是,CAM也无法使用此覆盖率指标。主要原因是只有约1%的测试足以达到最大覆盖率。在确定1%的测试的优先级之后,CAM会退化为CTM,无法按上述说明运行。因此,我们只能随机分配其余测试的优先级。在有效性方面,以MNIST为例,图2绘制了优先级排序结果,其中我们的方法的曲线上升速度远远快于基于TKNC(k)的方法。因此,我们的方法在有效性上要好得多。
如上所述,如果我们使用KMNC(k)对测试进行优先级排序,则CTM将不起作用,因为几乎所有单个测试都具有相同的KMNC(k)覆盖率,而与k的值无关。因此,我们仅将基于KMNC(k)的CAM与我们的优先级方法进行比较。基于KMNC(k)的CAM方法的有效性并不吸引人。以MNIST为例,图2表明,我们的方法的曲线上升速度远远快于基于KMNC(k)的方法。
4相关工作测试优先级排序技术已被广泛使用,尤其是在面对大量测试案例时。测试优先级排序的目标是找到测试用例的最佳顺序,以便开发人员或测试人员可以在有限的时间预算内获得最大的收益。Wong[1]首先提到了这个想法,然后Harold和Rothermel[15]将其推广。我们注意到,这种想法与无监督学习相结合可以大大减少标注测试集的工作量,因为DNN需要大量测试用例来保证其质量。在许多测试优先排序技术中,CAM和CTM是常规软件工程中最常研究的方法之一。由于我们专注于深度学习系统的测试和调试,因此,基于专门针对DNN提出的覆盖标准的测试优先级吸引了我们的注意力,包括NAC,KMNC,NBC和TKNC[10]。但是,我们的实验表明,这些方法并不有效。
测试机器学习模型是一个新的研究领域,已经提出了多种方法来克服各种极端情况,这些情况在使用小型验证数据集时可能会导致错误的行为,其中包括第一个白盒测试框架DeepXplore[13](DNN的突变测试框架旨在评估数据集的质量)[11],DeepTest(该框架用于通过一系列基本转换最大化激活的神经元来生成测试输入)[18]。这些方法都有共同点。它们都依赖于可靠的测试Oracle,而我们的方法主要是解决没有测试Oracle的问题。此外,上面提到的许多方法都依赖于模型的结构,而我们的方法仅分析输出空间,这被认为更有效,更安全。
近年来,关于对抗性示例的工作量很大,我们只能涵盖最相关的示例。特别是,我们采用了三种最先进的攻击来生成对抗性样本,即基于梯度的方法,基于显着性图的方法和基于优化的方法。在防御方面,可以进行多种尝试来在训练阶段获得相对可靠的模型或在运行时检测对抗性样本。例如,对抗训练试图将对抗样本包括在内。另一个相关的方向是鲁棒训练,它通过在训练阶段考虑所有可能的扰动来尝试训练鲁棒的DNN模型。此外,采用变异测试在运行时查找对抗样本。从本质上讲,测试是对这些防御工作的补充。
5结论在本文中,我们介绍了DeepGini,这是一个基于Web的工具,用于测量错误分类的可能性,可用于对测试进行优先级排序,以便降低人工标签的成本,只需要对一些关键的用例进行标签,再去训练神经网络,就可以大幅提高系统的性能。评估结果表明,DeepGini比基于神经元覆盖的方法更为有效,可以更快速的找出可能使系统出错的测试用例。此外,DeepGini提供了生动而简单的人机界面,以帮助最终用户全面了解优先测试用例,这对于快速查找代码缺陷非常有用。
致谢本文由南京大学软件学院2019级硕士张子杰翻译转述。感谢国家自然科学基金(61932012,61802171,61772014)支持!