DeepXplore: Automated Whitebox Testing of Deep Learning Systems 论文笔记

[2017] DeepXplore: Automated Whitebox Testing of Deep Learning Systems

深度学习系统的自动化白盒测试

论文地址:https://doi.org/10.1145/3132747.3132785

摘要

论文设计、实现并评估了DeepXplore,这是第一个系统测试真实DL系统的白盒框架。首先,我们引入神经元覆盖来系统地测量由测试输入执行的DL系统的部分。接下来,我们利用具有类似功能的多个DL系统作为交叉引用预言来避免手动检查。最后,我们演示了如何为DL系统找到既能触发许多差分行为又能实现高神经元覆盖率的输入,这可以表示为一个联合优化问题,并使用基于梯度的搜索技术有效地解决。

介绍

尽管DL系统具有令人印象深刻的能力,但由于一些原因,例如训练数据有偏差、模型过度拟合和拟合不足,它们经常在角落情况下表现出意想不到或不正确的行为。
因此,安全和安全关键的DL系统,就像传统软件一样,必须针对不同的情况进行系统测试,以检测和修复任何潜在的缺陷或不希望的行为。

论文贡献

1)我们引入神经元覆盖作为DL系统的第一个白盒测试度量,它可以估计由一组测试输入探索的DL逻辑的数量。
2)我们证明了在最大化神经元覆盖率的同时发现相似DL系统之间的大量行为差异的问题可以表述为联合优化问题。我们提出了一个基于梯度的算法来有效地解决这个问题。
3)我们将所有这些技术作为DeepXplore的一部分来实现,DeepXplore是第一个白盒DL测试框架,它暴露了数千个不正确的角落案例行为。
4)我们表明,DeepXplore生成的测试也可以用于重新训练相应的DL系统,从而将分类精度提高高达3%。

现有DNN测试的局限性

1、昂贵的标签工作

现有的DNN测试技术需要极其昂贵的人力来为目标任务提供正确的标签/动作(例如,自动驾驶汽车、图像分类和恶意软件检测)。对于复杂和高维的真实世界输入,人类,甚至领域专家,经常难以有效地正确执行大型数据集的任务。例如,考虑一个旨在识别潜在恶意可执行文件的DNN。即使是安全专家在不执行可执行文件的情况下,也很难判断它是恶意的还是良性的。

2、测试覆盖率低。

现有的DNN测试计划甚至没有一个试图覆盖DNN的不同规则。因此,测试输入经常不能揭示DNN的不同错误行为。
例如,dnn通常通过简单地将整个数据集分成两个随机部分来测试——一个用于训练,另一个用于测试。在这种情况下,测试集可能只运行DNN学会的所有规则的一小部分。最近的结果涉及对dnn的对抗性规避攻击证明了一些角点情况的存在,其中基于DNN的图像分类器(在随机挑选的测试集上具有最先进的性能)仍然错误地对通过向测试图像添加人类不可察觉的扰动而生成的合成图像进行分类。
然而,与随机测试输入类似,对抗性输入也只覆盖了DNN学会的规则的一小部分,因为它们不是为了最大化覆盖而设计的。此外,它们还固有地局限于测试输入周围的小的不可察觉的扰动,因为较大的扰动将在视觉上改变输入,因此需要人工检查以确保DNN决策的正确性。

3、低覆盖率DNN测试的问题。

为了更好地理解DNN学习的规则的测试覆盖率低的问题,我们提供了一个类似于测试传统软件的问题。如图4(a) 所示,在传统软件程序中,每个语句执行一定的操作,将前一个语句的输出转换为后一个语句的输入,而在DNN,每个神经元将前一个神经元的输出转换为后一个神经元的输入。当然,与传统软件不同的是,dnn没有明确的分支,但是当神经元的输出值变低时,神经元对下游神经元的影响会降低。较低的输出值表示影响较小,反之亦然。当一个神经元的输出值变为零时,该神经元对下游神经元没有任何影响。
在这里插入图片描述

算法

1、神经元覆盖率 Neuron coverage.

首先,我们引入了神经元覆盖的概念,用于基于激活的神经元数量(即输出值高于阈值)。在高层次上,DL系统的神经元覆盖类似于传统系统的代码覆盖,这是一种标准的经验度量,用于测量传统软件中输入所执行的代码量。然而,代码覆盖率本身并不是评估DL系统覆盖率的好指标,因为与传统软件不同,DL系统中的大多数规则不是由程序员手动编写的,而是从训练数据中学习的。

我们将一组测试输入的 神经元覆盖率定义为所有测试输入的唯一激活神经元数量与DNN神经元总数的比率。
正式地说,让我们假设DNN的所有神经元由集合N = {n1,n2,…},所有测试输入由集合T = { x1,x2,…}。函数 out(n,x) 是返回给定测试输入 x 的DNN神经元 n 的输出值的函数。t 代表考虑神经元被激活的阈值。在这种情况下,神经元覆盖率可以定义如下。
在这里插入图片描述
例如,图4b中所示的红色汽车输入图像的神经元覆盖范围(阈值为0)为5/8=0.625。灰色的即为激活的神经元,白色的即为未激活的神经元。

2、最大化的差异行为 Maximizing differential behaviors.

与传统软件相比,DNN的测试输入生成过程的主要优点是,测试生成过程一旦被定义为一个优化问题,就可以使用梯度上升来有效地解决。

优化问题的第一个目标是生成测试输入,从而在测试的dnn中产生不同的行为,即不同的dnn将相同的输入分类为不同的类。
假设我们有n个DNNs,其中Fk是由第k个神经网络模型函数。x表示输入,y表示输出类的概率向量。给定一个任意的x作为种子,它被所有的dnn分类为同一个类,我们的目标是修改x,这样修改后的输入x’将被n个dnn中的至少一个进行不同的分类。

算法1展示了通过求解这个联合优化问题来生成测试输入的算法。
在这里插入图片描述
设 Fk(x)[c] 为 Fk 预测 x 为 c 的类概率。我们随机选择一个神经网络 Fj(第6行)和最大化以下目标函数:
在这里插入图片描述
λ1 是一个参数平衡DNNs 模型Fk≠j能够保持相同的类输出和Fj产生不同的类输出之间的目标项。由于所有的F是可微的,公式2可以通过根据计算梯度迭代改变x,可以很容易地利用梯度上升最大化。(第8-14行)

3、最大限度地覆盖神经元 Maximizing neuron coverage

第二个目标是生成能够最大化神经元覆盖范围的输入。 我们通过迭代地选择失活的神经元并修改输入,使该神经元的输出超过神经元激活阈值来达到这一目标。

让我们假设要最大化一个神经元的输出,也就是说,我们想最大化以下目标函数:
在这里插入图片描述
例如 fn(x)>t,t是神经元激活阈值,我们将 fn(x) 作为神经元 n 的函数建模,需要输入 x 和产生输出神经元 n(公式1中定义)。我们可以再次利用梯度上升机制,因为 fn(x) 是一个可微函数。

请注意,我们也可以同时联合最大化多个神经元,
但为了清晰起见,我们选择在这个算法中选择一次激活一个神经元(算法1第8-14行)。

4、联合优化 Joint optimization

我们共同最大化上述的 obj1 和 fn ,并最大化以下函数:
在这里插入图片描述
其中,λ2是联合优化过程的两个目标之间的平衡参数,n是我们在每次迭代中随机选择的失活神经元(算法1第33行)。由于所有的项都是可微的,我们通过修改x,使用梯度上升共同最大化它们(算法1第14行)。

数据集和模型

我们采用了五个具有不同数据类型的流行公共数据集—MNIST、ImageNet、Driving、Contagio/Virustotal和Drebin,然后针对每个数据集在三个DNN上评估DeepXplore(即总共十五个dnn)。
在这里插入图片描述

实验

1、评估神经元覆盖率在衡量DNN测试的全面性方面的有效性。

首先,我们表明神经元覆盖率是一个比代码覆盖率更好的衡量DNN测试输入全面性的指标。更具体地说,我们发现,对于神经元覆盖率实际上低于34%的所有dnn,少量的测试输入可以实现100%的代码覆盖率。其次,我们评估不同类别测试输入的神经元激活。我们的结果表明,来自不同类别的输入往往比来自同一类别的输入激活更多的独特神经元。这两个发现都证实了神经元覆盖能够很好地估计输入所执行的DNN规则的数量和类型。

如表6所示,结果清楚地表明,在测量DNN测试的全面性方面,神经元覆盖率是一个明显优于代码覆盖率的指标。即使是10个随机选择的输入,也会导致DNN实现100%代码覆盖率,而任何DNN的神经元覆盖率都不会超过34%。
在这里插入图片描述

2、对不同类型输入的神经元的激活

在这个实验中,我们分别测量了在相同和不同类别的MNIST输入对上运行的LeNet-5 DNN中常见的活动神经元的数量。表7的结果显示来自同一类别的输入比来自不同类别的输入共享更多的激活神经元。由于来自不同类别的输入往往通过匹配不同的DNN规则来检测,我们的结果也证实了神经元覆盖能够有效地估计在DNN测试期间激活的不同规则的数量。
在这里插入图片描述

3、评估DeepXplore的性能

我们使用两个指标来评估DeepXplore的性能:生成的测试的神经元覆盖率生成引起差异的输入的执行时间

在本实验中,我们比较了由三种不同方法生成的相同数量的测试所获得的神经元覆盖率:(1) DeepXplore (2) adversarial testing (3) random selection from the original test set
我们可以从结果中得出两个关键的观察结果。
首先,如图9所示,DeepXplore平均覆盖的神经元比随机测试和对抗测试多34.4%和33.2%。第二,决定神经元何时被激活的神经元覆盖阈值 t 极大地影响所实现的神经元覆盖。随着阈值t的增加,这 3 种方法覆盖的神经元都减少了。这是直观的,因为更高的 t 值使得使用简单的修改来激活神经元变得越来越困难。
在这里插入图片描述

4、超参数的不同选择。

我们进一步评估了DeepXplore的不同超参数的选择如何影响DeepXplore的性能。

有四个主要的超参数控制DeepXplore的不同方面,如下所述。
(1) **λ1** 平衡了最小化某个标签的一个DNN预测和最大化同一标签的其余DNNs预测之间的目标。
较大的 λ1将较高的优先级放在降低特定DNN的预测值/置信度上,而较小的 λ1将较大的权重放在维持其他DNN的预测上。
(2) **λ2** 在发现差异行为和神经元覆盖之间提供了平衡。较大的 λ2更侧重于覆盖不同的神经元,而较小的 λ2产生更多的差异诱导测试输入。
(3) **s** 控制迭代梯度上升过程中使用的步长。较大的s可能导致围绕局部最优的振荡,而较小的s可能需要更多的迭代来达到目标。
(4) **t** 是确定每个单个神经元是否被激活的阈值。随着t的增加,寻找激活神经元的输入变得越来越困难。

如前所述,改变神经元激活阈值t的效果如图9所示。
表9
表10
表11
表9、10和11分别显示了DeepXplore运行时随s、 λ1和λ2的变化。我们的结果表明,s和 λ1的最优值在不同的DNNs和数据集上是不同的,而 λ2 = 0.5对所有数据集都是最优的。

威胁

DeepXplore采用了软件分析中的差异测试技术,因此继承了差异测试的局限性。

首先,差异测试需要至少两个具有相同功能的不同DNN。此外,如果两个DNN仅略有不同(即仅改变几个神经元),DeepXplore将需要更长的时间来找到差异诱导输入,而不是彼此明显不同的DNN。然而,我们的评估表明,在大多数情况下,对于给定的问题,多个不同的DNN很容易获得,因为开发人员经常定义和训练他们自己的DNN来进行定制和提高准确性。
第二,只有当至少一个DNN产生的结果不同于其他DNNs时,差异测试才能检测到错误的行为。如果所有被测试的DNN都犯同样的错误,DeepXplore就无法生成相应的测试用例。然而,我们发现这在实践中并不是一个重要的问题,因为大多数DNNs是独立构建和训练的,它们犯同样错误的几率很低。

总结

我们设计并实现了DeepXplore,这是第一个白盒系统,用于系统地测试DL系统,并自动识别错误行为,而无需手动标记。我们引入了一个新的度量,神经元覆盖率,用于测量一组输入在DNN中执行了多少规则。DeepXplore执行梯度上升来解决联合优化问题,该问题最大化神经元覆盖率和潜在错误行为的数量。DeepXplore能够在五个真实数据集上训练的十五个最先进的dnn中发现数千个错误行为。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值