《DeepMutation: Mutation Testing of Deep Learning Systems》笔记

Abstract:

深度学习(DL)定义了一种新的数据驱动编程范式,其中内部系统逻辑很大程度上是由训练数据塑造的。评估DL模型的标准方法是检查它们在测试数据集上的表现。测试数据集的质量对于获得训练模型的置信度非常重要。使用不适当的测试数据集,已经达到高测试精度的DL模型可能仍然缺乏通用性和健壮性。在传统的软件测试中,突变测试是一种成熟的测试套件质量评估技术,它分析测试套件检测到注入的错误的程度。然而,由于传统软件与基于深度学习的软件存在根本区别,传统的变异测试技术不能直接应用到DL系统中。在本文中,我们提出了一个专门用于DL系统的变异测试框架来度量测试数据的质量。为了做到这一点,通过分享传统软件中变异测试的精神,我们首先定义一组源级变异操作符,将错误注入DL(即,训练数据和训练程序)的源。然后设计了一组模型级变异算子,该算子不经过训练直接将错误注入DL模型中。最终,测试数据的质量可以通过对注入故障的检测程度的分析来评估。在两个公共数据集(MNIST和CIFAR-10)和三个DL模型上,验证了所提变异检测技术的有效性。

索引术语深度学习,软件测试,深度神经网络,变异测试

 

I. I NTRODUCTION
 
在过去的几十年里,深度学习(DL)在许多领域取得了巨大的成功,包括安全关键的应用,如自动驾驶[1],机器人[2],游戏[3],视频监控[4]。然而,随着最近与DL相关的灾难性事故(如Tesla/Uber)的发生,DL系统的鲁棒性和安全性成为了一个大问题。目前,DL系统的性能主要通过对准备好的测试数据集的准确性来衡量。如果没有一个系统的方法来评估和理解测试数据的质量,就很难得出这样的结论:测试数据的良好性能表明了DL系统的健壮性和普遍性。许多最近提出的对抗测试生成技术进一步加剧了这个问题,这些技术对输入数据进行微小的干扰(例如,人眼看不见的[5]),从而触发DL系统的不正确行为。由于DL系统的独特特点,DL系统的新的测试质量标准是非常可取的,测试数据的质量评价是特别重要的。
 
对于传统软件来说,突变测试(MT)[6]已经成为系统地评价测试数据质量和找出测试数据缺陷的最重要的技术之一。MT的一个关键步骤是设计和选择将潜在故障引入被测软件(SUT)的突变算子,创建SUT[6]、[7]的修改版本(即突变体)。MT通过检测一个测试集能在多大程度上检测到突变体的行为差异和相应的原始SUT来衡量测试的质量。
 
传统软件系统的决策逻辑通常由软件开发人员以代码的形式实现,但DL系统的行为主要由深度神经网络(DNNs)的结构以及网络中的连接权值决定。具体来说,权重是通过训练程序在训练数据集上执行得到的,其中DNN结构通常是由高级语言(如Python[8]、[9]和Java[10])训练程序的代码片段定义的。1因此,训练数据集和训练方案是DL系统缺陷的两个主要来源。对于DL系统的变异测试,合理的方法是设计变异算子,将潜在的故障注入到训练数据或DNN训练程序中。在错误被注入后,使用突变的训练数据或训练程序重新执行训练过程,以生成相应的突变的DL模型。这样,许多突变的DL模型{M1, M2,…Mn}是通过注入各种断层产生的。然后,每个突变模型的Mi执行和分析对测试集T,在对应原始DL模型M .给定一个测试输入T T, T检测行为差异的M和Mi M和M的输出是否一致在T。类似于突变检测传统软件[6],最初的DL的行为差异模型M和突变模型{M1, M2,…,Mn}可以被T检测出来,表明T的质量较高。
 
在本文中,我们提出了一个专门的DL系统变异测试框架,以实现测试数据的质量评估。我们首先设计了8个直接操作训练数据的源级突变测试操作符和培训计划。设计意图是在DL编程源中引入可能出现的故障和问题,这些故障和问题是在收集训练数据和实施训练程序的过程中可能出现的。对于源级变异测试,训练DNN模型的计算量可能很大:训练过程可能需要几分钟、几个小时,甚至更长时间。因此,我们进一步设计了8个突变算子来直接对DL模型进行突变以实现包含故障。这些模型级的突变操作符不仅能够更有效地生成大的突变集,而且还可以引入更细粒度的模型级问题,这些问题可能会在改变训练数据或程序时被遗漏。我们在两个广泛使用的数据集,即MNIST和CIFAR-10,以及三种不同结构和复杂性的流行DL模型上,对提出的变异检测技术进行了深入评估。评估结果证明了所提出的技术作为设计和构建高质量测试数据集的有用性,这将最终促进DL系统的鲁棒性增强。值得注意的是,提出的变异算子的目的是在DL模型上进行故障注入,从而可以评估测试数据的质量,而不是直接模拟人为故障。
 
目前,DL软件的测试仍处于早期阶段,一些初步的研究工作集中在准确性和神经元覆盖率上,如DeepXplore[12]、DeepGauge[13]和DeepCover[14]。就我们所知,我们的工作是第一次尝试为DL系统设计专门的变异测试技术。本文的主要贡献总结如下:
 
•我们提出了一个专门用于DL系统的突变测试框架和工作流,它能够对测试数据集进行质量评估和弱点定位。
•我们设计了8个源级(即在训练数据和训练程序上)突变操作符来将错误引入DL编程元素。我们进一步设计了8个突变算子,可以直接将错误注入到DL模型中。
•我们提出了两个dl特定的突变测试指标,以允许对测试质量进行定量测量。
•我们在广泛研究的DL数据集和模型上评估提出的变异测试框架,以证明该技术的有用性,这也可能促进测试集的增强。
 
 
 
II. B ACKGROUND
 
A. Programming Paradigms
 
构建基于深度学习的系统与传统软件系统有着本质的区别。传统软件是由开发人员以源代码的形式制作的逻辑流的实现(参见图1),它可以被分解为单元(例如,类、方法、语句、分支)。每个单元指定了一些逻辑,并允许作为软件质量度量的目标进行测试(例如,语句覆盖率,分支覆盖率)。编写好源代码后,将其编译成可执行的形式,在各自的运行时环境中运行,以满足系统的需求。例如,在面向对象编程中,开发人员分析需求并设计相应的软件体系结构。每一个架构单元(例如,类)都代表了特定的功能,并且通过单元的协作和交互来实现总体目标。
 
另一方面,深度学习遵循数据驱动的编程范式,通过使用大量训练数据的模型训练过程来编程核心逻辑。该逻辑被编码在一个深度神经网络中,由输入到非线性激活函数[15]的权重集来表示。为了获得一个针对特定任务M的DL软件F, DL开发人员(见图1)需要收集训练数据,指定F对M的期望行为,并准备一个训练程序,该程序描述DNN的结构和运行时训练行为。DNN是通过在训练数据上运行训练程序来构建的。DL开发人员的主要工作是准备一组训练数据和设计一个DNN模型结构,并通过训练过程自动确定DL逻辑。与传统软件相比,DL模型通常难以分解或解释,这使得它们不适合大多数现有的软件测试技术。此外,找到高质量的训练和测试数据是具有挑战性的,这些数据代表了问题空间,并且覆盖了模型,以评估它们的普遍性
 
B. Mutation Testing
 
对传统软件进行[6]、[16]突变测试的一般过程如图2所示。给定一个原始程序P,根据预定义的规则(突变操作符)创建一组错误的程序P(突变),每一个规则都会对P进行轻微修改。例如,突变操作符可以在语法上将程序中的+操作符更改为操作符[17][19]。一个预处理步骤,通常在实际的变异测试程序开始之前,用来过滤不相关的测试。具体来说,对P执行完整的测试集T,只有通过的测试T (T的一个子集)用于突变测试。下一步,在T上执行P的每个突变体。如果突变体p p的检测结果与p的检测结果不同,则p被杀死;否则,p是存活的。当所有的突变体在P T测试,突变分数计算死亡突变体比所有生成的突变体(即# mutantskilled / # mutantsall),这表明测试集的质量。从概念上讲,一个测试套件突变分数更高更有可能捕捉真实缺陷程序[20]。在获得突变测试结果后,开发人员可以根据突变测试[21]、[22]的反馈进一步提高测试集的质量(例如,增加/生成更多的测试)。变异测试的一般目的是评价测试集T的质量,并进一步提供反馈和指导测试的增强。
 
 
 
III. S OURCE - LEVEL M UTATION T ESTING OF DL S YSTEMS
 
通常,传统软件大多是由开发人员以源代码的形式编写的(图1),这可能是缺陷引入的主要来源。突变测试通过对程序代码进行轻微修改以引入故障,从而能够通过检测这种故意更改来度量测试数据的质量。
 
与传统软件的变异测试相同,直接在DL系统的编程源中引入潜在的缺陷是创建变异的合理方法。在本节中,我们提出一种DL系统的源水平突变测试技术。设计了一个通用的DL系统变异测试工作流,并提出了一组变异算子作为关键组件。
 
此外,我们还定义了变异检测指标,用于定量测量和评价检测数据的质量。
 
A. Source-level Mutation Testing Workflflow for DL Systems
 
图3显示了我们的源级突变测试技术的关键工作流。在初始化阶段,DL开发人员准备一个训练程序P和一组训练数据D。训练过程运行P和D后,得到一个DL模型M。在开始突变测试时,使用突变算子(定义在表I中)对原始训练数据D和程序P进行轻微修改,生成相应的突变体D和P。在下一步,训练数据突变体或训练计划突变体参与训练过程,以生成突变的DL模型M。当获得变异的DL模型时,它们将被执行并针对过滤的测试集T进行分析,以评估测试数据的质量。2我们强调,本文提出的变异算子并不是为了直接模拟人为故障;它们的目的是为测试数据集的质量提供定量测量的方法。特别是,原始DL模型与T所能检测到的突变模型(由突变算子生成)之间的行为差异越大,表明T的质量越高。详细的质量度量标准在第三- c节中定义。
 
B. Source-level Mutation Operators for DL Systems
 
我们提出了两组突变算子,即数据突变算子和程序突变算子,对源进行相应的修改,引入潜在的故障(见表I)。
 
1)数据突变算子:训练数据在构建DL模型中起着至关重要的作用。训练数据通常较大,手工标注为[23][25]。准备训练数据通常是费力的,有时还容易出错。我们的数据突变操作符是基于对数据采集过程中可能出现的潜在问题的观察而设计的。这些运算符可以全局地应用于所有类型的数据,也可以局部地应用于整个训练数据集中的特定类型的数据。
 
•数据重复(DR): DR操作员重复训练数据的一小部分。训练数据通常是从多个来源收集的,有些来源非常相似,同一数据点可以收集多次。
•标签错误(LE):每个数据点(d, l)训练数据集d, d表示特性数据和l是标签为d d。通常是相当大的(例如,MNIST数据集[23]包含60,000训练数据),并不少见,一些数据点可以贴错了标签。LE操作符通过更改数据的标签来注入这类错误。
•数据缺失(DM): DM操作员删除部分训练数据。它可能会因疏忽或错误地删除某些数据点而发生。
•数据洗牌(DF): DF操作员在训练前将训练数据洗牌。从理论上讲,针对同一组训练数据运行的训练程序应该得到相同的DL模型。然而,训练过程的实施往往对训练数据的顺序很敏感。在准备培训数据时,开发人员往往不太注意数据的顺序,因此在培训过程中很容易忽略这些问题。
•噪声扰动(NP): NP算子随机地给训练数据添加噪声。一个数据点可能携带来自不同来源的噪声。例如,相机捕捉到的图像可能包括由不同天气条件(例如,雨、雪、灰尘等)引起的噪音。NP运算符试图模拟与嘈杂训练数据相关的潜在问题(例如,NP向图像的某些像素添加随机扰动)。
 
2)程序变异操作符:与传统程序类似,训练程序通常使用高级编程语言(如Python、Java)在特定的DL框架下进行编码。对于传统软件[26][30],有很多基于语法的突变测试工具可用,直接将这些工具应用到培训项目中似乎很简单。然而,这种方法通常不起作用,因为DL训练项目对代码更改很敏感。即使是一个微小的变化也会导致训练程序在运行时失败,或者产生明显的训练过程异常(例如,在训练的早期迭代/阶段明显的低预测精度)。考虑到DL训练程序的特点,我们设计了以下操作符来注入潜在的故障。
 
•层移除(LR): LR操作符随机删除一层dnn,条件是被删除层的输入和输出结构相同。虽然可以删除满足这个条件的任何层,但是任意删除一个层可以生成与原始DL模型明显不同的DL模型。因此,LR操作符主要关注层(例如,稠密,BatchNormalization layer[31]),其删除不会对突变模型产生太大影响。LR操作符模拟了这样一种情况,即代表DNN层的一行代码被开发人员删除。
•层加法(LAs):与LR运算符相反,LAs运算符向DNNs结构中添加一层。LAs专注于添加层,比如激活,批处理归一化,增加或复制表示DNN层的代码行可能导致错误。
•激活函数去除(AFRs):激活函数对的非线性起着重要作用代表性较高的DNNs(即VC维[15]量化)。AFRs操作人员随机删除一个层的所有激活函数,以模拟开发人员忘记添加激活层的情况。
 
C. Mutation Testing Metrics for DL Systems
 
通过突变算子对训练数据和训练方案进行突变后,通过训练可以得到一组突变的DL模型M。对原始DL模型M正确处理的每个测试数据点t t在模型M的突变集上进行评估。如果存在一个测试输入T T没有被m正确处理,我们说测试数据T杀死突变体m。传统突变检测的突变评分计算为被杀死突变体与所有突变体的比值。然而,将传统软件的变异评分指标作为DL系统变异测试的指标是不合适的。在DL的突变测试系统中,是相对简单的T杀死变异m T的规模很大时,也相信从我们的实验部分v .因此,如果我们直接使用DL系统的突变分数比杀了突变体的突变体,我们度量将失去精度评估为DL系统测试数据的质量。
 
在本文中,我们主要研究DL系统的分类问题。3假设有一个k分类问题,设C = {c1,…,ck}为输入数据的所有k类。对于一个测试数据点t’∈t,我们说t杀死了突变体m‘∈m的ci∈C,满足以下条件::(1) t‘被原DL模型M正确地分类为c’, (2) t’没有被m‘分类为ci。我们定义DL系统的突变分数如下,KilledClasses(T, m)是T‘中测试数据杀死的m’个类的集合
 
公式1
 
一般来说,很难准确地预测突变操作符所带来的行为差异。为了避免引入过多的行为差异,我们提出了一个DL突变模型质量控制程序。特别地,我们测量每个突变体m对T的错误率。如果m对T的错误率过高,我们不认为m是一个好的突变体候选,因为它引入了很大的行为差异。为了进一步分析,我们从M中排除了这种突变模型。
 
我们在每个突变模型m∈m上定义T’的平均错误率(AER),以度量所有突变算子引入的总体行为差异效应。、
 
公式2
 
图4显示了一个用于二分类的DL模型示例,其中包含原始模型的决策边界和两个突变模型的决策边界。我们可以看到,突变的模型更容易被绿色的数据杀死,它位于原始DL模型的决策边界附近。数据点越接近决策边界,就越有可能杀死更多的突变模型,这反映在变异分数和为DL系统定义的AER的增加上。一般来说,突变测试通过分析测试数据在多大程度上接近DNNs的决策边界,便于评估测试集的有效性,而DNNs的决策边界更容易出现鲁棒性问题。
 
 
 
IV. M ODEL - LEVEL M UTATION T ESTING OF DL S YSTEMS
 
在第三节中,我们定义了源代码级的突变测试过程和工作流,模拟了传统的用于处理源代码的突变测试技术(见图1)。一般来说,为了充分改进突变测试,许多传统的突变测试技术被设计用于在低级软件表示(例如,字节码[18],[30],二进制代码[33],[34])上工作,而不是在源代码上工作,这样可以避免程序编译和转换的工作。在本节中,我们提出了DL系统的modellellel突变测试,以实现更高效的DL突变模型生成。
 
A. Model-Level Mutation Testing Workflflow for DL Systems
 
图5显示了DL模型级突变测试工作流的总体流程。与源代码级变异测试,修改原来的训练数据D和培训程序P模型层级突变测试直接改变了DL模型M通过培训从D,并为每个生成的DL突变模型P . M M由我们定义的模型级变异算子在表二世,输入测试数据集T是运行在M过滤掉所有不正确的数据,并通过数据被发送到运行每个M。所获得的执行结果采用相同的第III-C节中定义的突变度量进行分析和报告。
 
与源级突变测试类似,模型级突变测试也尝试评估测试数据集的有效性并找出弱点,这有助于开发人员进一步增强测试数据,以锻炼被测DL模型的脆弱区域。由于直接修改DL模型避免了训练过程,因此期望模型级变异测试能够更有效地生成DL突变模型,这与传统软件的低级(如Java字节码等中间代码表示)变异测试技术类似。
 
B. Model-level Mutation Operators for DL Systems
 
改变训练数据和训练程序将最终改变DL模型。然而,训练过程可能是复杂的,受到各种参数的影响(例如,训练epoch的数量)。为了有效地引入可能的故障,我们进一步提出了模型级变异算子,直接变异DL模型的结构和参数。表二总结了所提出的模型级变异算子,其适用范围从权重级到层级。
 
•高斯模糊(GF):权值是的基本元素描述神经元之间连接的重要性。权重对DNNs的决策逻辑有很大的贡献。改变体重的一种自然方式是模糊其值以改变其所代表的连接重要性。GF算子遵循高斯分布N (w, gf2),突变给定的权值w,其中是用户可配置的标准偏差参数。GF算子主要是将权重模糊到其附近的取值范围(即模糊值位于[w−3个面,w + 3个面]的概率为99.7%),但也允许权重以较小的概率变化到较大的距离。
•权重变换(WS):神经元的输出通常由前一层的神经元决定,每个神经元都与权重有联系。WS操作符随机选择一个神经元,并将其连接的权重转移到上一层。
•神经元效应阻塞(NEB):当一个测试数据点被读入一个DNN时,通过不同权重的连接和神经元层对其进行处理和传播,直到产生最终结果。每个神经元根据其连接强度在一定程度上对DNN的最终决定作出贡献。NEB操作符将神经元效应阻塞到下一层所有连接的神经元,这可以通过将其下一层的连接权值重置为零来实现。NEB消除了神经元对DNN最终决定的影响。
•神经元激活逆(NAI):激活功能在神经元非线性行为的形成中起关键作用。许多广泛使用的激活函数(如ReLU [35], Leaky ReLU[36])根据它们的激活状态显示出完全不同的行为。NAI操作符试图逆转神经元的激活状态,这可以通过在应用激活函数之前改变神经元输出值的符号来实现。这有助于创建更多的突变神经元激活模式,每一个都能显示出DNNs[37]新的数学特性(例如,线性特性)。
•神经元开关(NS):一个DNN层的神经元通常对下一层连接的神经元有不同的影响。NS操作符切换一个层中的两个神经元,以交换它们对下一层的角色和影响。
•层失活(LD): DNN的每一层转换前一层的输出,并将其结果传播到下一层。LD操作符是一个层级突变操作符,它删除了整个层的转换效果,就像从DNNs中删除了一样。然而,简单地从训练好的DL模型中移除一个层会破坏模型结构。我们将LD操作符限制为输入和输出形状一致的层。
•层添加(LAm): LAm操作符试图实现LD操作符的相反效果,方法是向款。与LD运算符类似,LAm运算符在相同的条件下工作,以避免破坏原有的dnn;此外,LAm运算符还包括复制层在原始层之后进行复制和插入,这也要求层的输入和输出形状一致。
•激活函数移除(AFRm): AFRm操作符移除整个层激活函数的效果。AFRm操作符与NAI操作符有两个角度的不同之处:(1) AFRm在层上工作,(2)AFRm消除了激活函数的影响,而NAI算子保留了激活函数并试图反转神经元的激活状态。
 
 
 
V. E VALUATION
 
我们实现了DeepMutation,一个DL突变测试框架,包括基于Keras (ver.2.1.3)[9]和Tensorflow (ver.1.5.0)后端[8]的源级和模型级突变测试技术。源代码级突变测试技术由Python实现,有两个关键组件:自动化训练数据突变发生器和Python培训计划突变发生器(见图3和表1)。模型级变异测试自动分析运营商定义的年代款结构和使用我们的变异在一份原款。然后将生成的突变模型序列化并存储为.h5文件格式。权重级和神经元级的突变算子(见表II)是通过突变随机选取的DNN的权重矩阵元素的一部分来实现的。层级突变操作符的实现更为复杂。我们首先分析整个DNN的结构,以确定满足分层突变条件的DNN的候选层(见第IV-B节)。然后,在原有DL模型的基础上,通过Keras和Tensforflow[31]的功能界面,构建新的DL突变模型。
 
为了演示我们提出的变异测试技术的有效性,我们在两个实际数据集和三个DL模型架构上评估了实现的变异测试框架,这将在本节的其余部分进行解释。
 
A. Subject Dataset and DL Models
 
我们选择两个流行的公开数据集MNIST[40]和CIFAR-10[41]作为评价对象。
 
MNIST是用于手写数字图像识别,包含60000训练数据和10000测试数据,总数为70,000年数据在10类(数字从0到9)。CIFAR-10数据集是一组通用的图像图像分类,包括50、000训练数据和000测试数据在10个不同的类(如飞机、汽车、鸟、猫)。
 
对于每个数据集,我们研究了在之前的工作中广泛使用的流行DL模型[23]、[38]、[39]。表三总结了所研究的DNNs的结构和复杂性,以及我们对训练过的DNNs的预测精度。被研究的DL模型A、B和C分别包含107786、694402和1147978个可训练参数。DNNs的可训练参数是指在训练过程中为了提高学习性能而可以调整的参数。通常DL模型的可训练参数越多,模型就越复杂,这就需要更多的训练和预测。我们按照论文[23],[38],[39]的训练说明来训练原始的DL模型。总体而言,在MNIST上,模型A的训练准确率达到97.4%,测试准确率达到97.0%;B型达到了99.3%和98.7%,与最先进的水平相当。在CIFAR-10上,模型C实现了97.1%的训练精度和78.3%的测试精度,与[39]给出的精度相似。
 
B. Controlled Dataset and DL Mutant Model Generation
 
1)试验数据:突变试验的第一步是准备用于评估的试验数据。一般来说,测试数据集通常独立于训练数据集,但其概率分布与训练数据集[42]、[43]相似。一个好的测试数据集应该是全面的,涵盖DL软件用例的各个功能方面,以便评估性能(即泛化),并揭示一个经过充分训练的DL模型的弱点。例如,在自动驾驶场景中,从摄像机、激光雷达和红外传感器捕获的道路图像和信号被用作DL软件的输入,以预测转向角度和制动/加速控制[44]。一个好的测试数据集应该包含在实践中可能发生的各种驾驶情况,如海峡路、弯道、不同路面条件和天气条件。如果一个测试数据集只覆盖了有限的测试场景,那么测试数据集的良好性能并不意味着DL软件已经被很好地测试过了。
 
为了证明我们的变异测试在测量测试数据质量方面的有效性,我们在两个数据设置上进行了一个控制实验(见表四)。Setting one
samples 5 , 000 data from original training data while setting two sampled 1 , 000 from the accompanied test data, both of which take up approximately 10% of the corresponding dataset.
 
每个设置有一对数据集(T1, T2),其中T1从所有类中均匀采样,T2不均匀采样。5每种设置的第一组涵盖了每个类的DL软件的更多样化的用例,而第二组数据集主要关注于单个类。预计T1的突变分数会更高,我们检查我们的突变检测是否证实了这一点。我们对每个设置重复5次数据采样,以对抗采样期间的随机效应。这允许为每个设置获取5对数据(即,(T1, T2)1, (T1, T2)2,…(T1, T2) 5)。根据生成的DL突变模型对每对数据进行评估,并对突变检测分析结果进行平均。
 
突变测试准备好候选数据后,对每个对应的原始DL模型执行候选数据,过滤掉失败的案例,只使用传递的数据进行进一步的突变分析。该过程共生成30对候选数据集(=2个设置* 3个模型* 5个重复),其中3个DL模型都有10对数据集(即每个设置5对数据集)可供分析。
 
2) DL突变模型的生成:在准备受控数据集之后,我们开始突变检测程序。其中一个关键步骤是生成DL突变模型。对于表III中所研究的每一个DL模型,我们使用源级和模型级突变生成器来生成DL突变模型。
 
生成源代码级DL突变模型,我们配置数据级变异算子自动变异1%的原始训练数据和应用程序层次的变异操作的培训计划(见表1)。突变体数据集生成(程序)后,他们被训练在最初的训练计划(训练数据)来获得突变DL模型。考虑到密集的训练工作量,我们配置为为每个数据级突变操作生成20个DL突变(即全局级10个,局部级10个)。对于程序级操作符,我们尝试在每个程序级操作符的最大20个突变模型满足条件时执行突变。
 
生成模型级突变体在重量和神经元层面,我们配置示例1%,重量和神经元的研究了款,并使用相应的变异算子随机变异所选目标(见表2)。在层层面上,我们的工具自动分析层满足(参见ivb)和突变条件随机应用相应的变异操作符。在不需要训练的情况下,模型级的突变体生成是相当有效的。因此,对于每个权重级和神经元级突变算子,我们生成50个突变模型。同样,我们的工具尝试在DNN结构条件满足的情况下,对每一层突变算子产生最大50个突变模型来生成层突变模型。
 
C. Mutation Testing Evaluation and Results
 
在控制数据集和突变模型生成之后,突变测试通过在突变模型上运行候选测试数据集开始执行阶段,然后计算每个数据集的突变分数和平均错误率(AER)。注意,用于评估的数据集是那些传递给原始DL模型的数据。此外,我们还介绍了一个生成突变体模型的质量控制程序。当我们得到了对原始模型通过的测试数据T(见图3)后,我们对每个生成的相应的突变模型进行运行,并去除错误率高的模型,6由于这种突变模型与原始模型存在较大的行为差异。
 
表V总结了所有DL突变模型上每个受控数据集的AER值。我们可以看到,得到的DL突变模型确实能够将故障注入到DL模型中,AER范围为0.13% ~ 17.20%,其中大部分AER都相对较小。在所有的实验控制数据设置中,均匀采样数据组在突变模型上的平均错误率更高,说明均匀采样数据具有更高的缺陷检测能力(从测试角度看质量更好)。对于模型C,同时考虑源级和模级,训练样本集的AER较低,从2.99%到9.11%,但测试样本数据的AER较高,从9.00%到17.20%。这表明在杀死突变体方面,模型C的采样测试数据质量比采样训练数据更好,尽管采样训练数据有更大的数据量(即5,000)。
 
根据AER计算表IV中各设置的平均变异评分,如图6和图7所示。同样,在所有的受控数据对设置中,通过均匀抽样的方法得到较高的变异分数,这也确认了我们对测试数据质量的期望。除了度量检测突变模型缺陷的数据比率的AER之外,突变评分还从测试用例多样性的角度度量测试数据覆盖突变模型的程度。突变分数不一定与AER呈正相关,下一节将对此进行说明。
 
直观地说,一个拥有更多数据的测试数据集可能会发现更多的缺陷和测试方面。然而,正如我们的实验所证实的那样,这通常是不正确的。在表V中,对于模型B的sourcelevel突变检验,得到的1000个均匀采样检验数据的AER(即0.66%)高于5000个均匀采样训练数据的AER(即0.49%)。这在模型c上表现得更为明显。当采用相同的采样方法时,从采样的1000个测试数据中得到的AER都高于采样的5000个训练数据。观察突变评分也可以得出同样的结论(见图6(a)和(b))。模型A和模型B的变异得分是数据量越大变异得分越高的情况,而模型C的结果则相反。
 
当对同一组数据执行时,源级突变测试和模型级突变测试会显示一些不同的行为。注意,在源级别上,我们配置为更改1%的训练数据;在模型层次上,我们对重量和神经元层次的突变体使用相同的比率(即1%)。总的来说,生成的突变模型按源级和模型级的变异测试表现不同。例如,相同的数据对设置的比较图6 (a)和7 (a),源代码级变异测试获得分数低突变模型,但获得更高的突变分数模型b .这意味着相同的1%的突变比结果在不同的DL突变模型源代码级别和影响modellevel突变测试过程。为了提高灵活性,在我们的工具中,我们为源代码级和模型级的突变生成提供了可配置选项。
 
在图6和图7中,我们观察到很多情况下突变分数仍然很低。说明相应的评价测试质量较低,在高维空间中可以理解。尽管在测试数据上有很高的性能,但DL很容易被许多现有的敌对技术攻击,这也证实了我们的发现[45]。
 
D. Mutation Testing of Original Test Data by Class
 
给定DL分类任务,开发人员通常非常小心地准备测试数据。一方面,他们试图从涵盖更多用例场景的不同类中收集数据。另一方面,他们也试图获取每一类更敏感的数据,以便于检测DNN的鲁棒性问题。同一个测试数据集在不同的DL模型上可能表现出不同的测试性能;来自相同测试数据的不同类的数据对测试性能的贡献也可能不同。在本节中,我们将从突变测试的角度研究原始测试数据集的每个类是如何行为的。
 
1)试验数据和突变体模型:与V-B节的实验步骤相似,我们先准备各类的试验数据进行突变体试验。对于MNIST (ciremote -10)中伴随的原始测试数据,我们按类(即t1, t2,…,t10)将其分割成10个测试数据集。对于测试数据ti的每一类,我们采用相同的变异测试步骤,分别对模型A、B和C进行数据过滤。最后,我们得到30个测试数据集,其中按类(即t1, t2,…)划分的10个数据集。对于每个研究的DL模型,t 10)。我们重用生成的V-B部分的模型级DL突变模型,并对准备好的数据集进行突变测试。
 
2)分类检验数据的变异检验结果:表VI汇总了每个模型得到的变异评分和AER。我们可以看到,在一般情况下,不同类别的测试数据得到的突变分数和AER是不同的。以A模型的结果为例,第3类测试数据得到最低的突变评分和AER(即6.25%和1.48%)。这表明,与其他类的测试数据相比,类3的测试数据还可以进一步增强。此外,本实验表明,较高的AER并不一定会导致较高的突变评分。对于模型A,第1类得到的AER大于第2类,而第1类的突变分数较小。
 
Remark. 我们的变异测试技术可以定量分析每个类的测试数据质量。它还有助于定位测试数据中的弱点。基于突变测试反馈,DL开发人员可以优先增加和增强弱测试数据,以覆盖更多缺陷敏感的情况。
 
E. Threats To Validity
 
主题数据集和DL模型的选择可能对有效性构成威胁。在本文中,我们尝试使用两个广泛研究的数据集(即MNIST和CIFAR- 10)和具有不同网络结构、复杂性和具有竞争性预测精度的DL模型来解决这个问题。另一个对有效性的威胁可能是源级DL突变体模型训练过程中的随机性。TensorFlow框架在默认情况下使用多个线程进行训练,这可能会导致同一个训练数据集生成不同的DL模型。为了应对这种影响,我们在训练过程中尽量排除不确定性因素。我们首先修复了所有用于训练程序的随机种子,并通过设置Tensorflow参数使用单个线程进行训练。这样设置使得训练进程在CPU上运行时是确定的,而在GPU上运行时仍然是非确定的行为。因此,对于本文所述的受控评价,我们通过CPU对源级DL突变模型进行训练,以减少训练过程中随机性因素带来的威胁。另一个威胁是数据采样的随机性。为了解决这个问题,我们重复了五次抽样过程并对结果进行了平均。
 
 
 
VI. R ELATED W ORK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值