DLFuzz: Differential Fuzzing Testing of Deep Learning Systems
简介
论文标题
- DLFuzz: Differential Fuzzing Testing of Deep Learning Systems
- DLFuzz:深度学习系统的差分模糊测试
- 2018.12
DLFuzz首次将模糊化测试的基本思想与DL测试相结合
提出一种差分模糊测试框架,总体流程为模糊测试中常见流程
目标函数与神经网络分类置信度和定神经元覆盖率两个方向有关,在选择神经元时有四种方法
摘要
深度学习(DL)系统越来越多地应用于自动驾驶汽车等安全关键领域。这对保证DL系统的可靠性和鲁棒性具有重要意义。现有的测试方法总是不能将稀有输入包含在测试数据集中,并且表现出较低的神经元覆盖率。
在本文中,我们提出了第一个差分模糊测试框架DLFuzz来引导DL系统暴露不正确的行为。DLFuzz不断细微地变异输入,以最大化原始输入和变异输入之间的神经元覆盖和预测差异,而无需手动标记或交叉引用来自具有相同功能的其他DL系统的oracle。我们在两个著名的数据集上进行了实证评估,以证明其有效性。与目前最先进的DL白盒测试框架DeepXplore相比,DLFuzz不需要额外的精力来寻找类似功能的DL系统进行交叉引用检查,但可以以89.82%的小扰动生成338.59%的敌意输入,平均获得2.86%的神经元覆盖率,并节省20.11%的时间消耗。
动机
模糊测试和DL测试有着相似的目标,即实现更高的复盖率,以及获得更多的异常行为。一般来说,我们将模糊化关键阶段的知识结合到DL测试中,如下所示:
- 优化目标Optimization Goal。达到更高的神经元覆盖率和暴露更多异常行为的目标可以看作是一个联合优化问题。该优化问题可以以基于梯度的方式来实现。
- 种子维护Seed Maintenance:模糊时,基于在后续模糊中持续提高神经元覆盖率的潜力,导致神经元覆盖率一定增加的突变输入被保留在种子列表中。
- 变异策略的多样性Diversity in Mutation Strategies 我们设计了许多神经元选择策略来选择可能覆盖更多逻辑和触发更多错误输出的神经元。此外,测试输入的多种变异方式已经实现,并且易于集成。
DLFUZZ方法
架构
DLFuzz的总体架构如图2所示。在本文中,我们实现了DLFuzz来进行图像分类,这是DL域中的一项热门任务,以证明其可行性和有效性。语音识别等其他任务中的调整很简单,也遵循图2中的相同工作流程
具体地说,给定的测试输入t是待分类的图像,DNN是特定的被测卷积神经网络(CNN),例如VGG-16[14]。变异算法对t应用微小的扰动,得到t‘,t’与t明显不可区分。如果变异的输入t‘和原始输入t都被馈送到CNN,但被分类为不同的类别标签,我们将其视为不正确的行为,t’被视为对抗性输入之一。不一致的分类结果表明它们中至少有一个是错误的,因此这里不需要人工标注。相反,如果两者被预测为同一类别标签,t‘将继续发生变异,以测试CNN的稳健性。
算法
变异算法是DLFuzz算法的主要组成部分。该算法通过求解最大化神经元复盖率和错误行为个数的联合优化问题来完成。基于覆盖更多神经元可能潜在地触发更多逻辑和更多错误行为的演示[13],DLFuzz还利用了与DeepXplore相同的神经元覆盖定义和计算方法[13]。输出值大于设定阈值的神经元被视为激活(覆盖)。
变异算法的核心过程在算法1中,该算法包含三个关键部分进行详细讨论
优化问题 正如第一节所讨论的,基于梯度的对抗性深度学习在几个方面优于其他方法,特别是在时间效率方面。它通过优化输入以最大化预测误差[16]来建立扰动,这与在训练DNN时优化权重以最小化预测误差是相反的。它很容易通过以定制目标损失函数,通过梯度上升使损失最大化的方式实现
DLFuzz的损失函数定义如下(算法1行7),这也是优化目标:
o
b
j
=
∑
i
=
0
k
c
i
−
c
+
λ
⋅
∑
i
=
0
m
n
i
o b j=\sum_{i=0}^{k} c_{i}-c+\lambda \cdot \sum_{i=0}^{m} n_{i}
obj=i=0∑kci−c+λ⋅i=0∑mni
目标由两部分组成。在第一部分
∑
i
=
0
k
c
i
−
c
\sum_{i=0}^{k} c_{i}-c
∑i=0kci−c中,c是输入的原始类别标签,
c
i
(
i
=
0
,
…
,
k
)
ci(i=0,…,k)
ci(i=0,…,k)是置信度略低于c的前k个类别标签之一,最大化第一部分引导输入越过原始类别的决策边界,进入前k个其他类别的决策空间。这种修改后的输入更有可能被错误分类[12]。在第二部分中,
∑
i
=
0
m
n
i
\sum_{i=0}^{m} n_{i}
∑i=0mni,
n
i
ni
ni是打算激活的目标神经元。这些神经元的选择考虑了许多提高神经元覆盖率的策略(算法1,第6行)。超参数λ用于平衡这两个目标
目标函数同时考虑了错误分类置信度差值和提高特定神经元的覆盖率
fuzz过程。模糊过程揭示了算法1的整体工作流程。当给定测试输入x时,DLFuzz维护一个种子列表,用于保存有助于神经元覆盖的中间突变输入。最初,种子列表只有一个输入,即精确的x。然后,DLFuzz遍历每个种子,得到构成其优化目标的元素。然后,DLFuzz为以后的变异计算梯度方向。在变异过程中,DLFuzz迭代地将处理后的梯度作为扰动应用于 x s x_s xs,并获得中间输入x‘。在每次变异之后,获取中间类标签c‘、覆盖信息、度量L2距离。如果提高x‘的神经元覆盖率并满足L2_Distance,则会将x’添加到种子列表中。最后,如果c‘已经不同于c,则种子 x s x_s xs的变异过程结束 ,并且x’将被包括在对抗输入集合中。因此,DLFuzz能够针对某一原始输入生成多个对抗性输入,并探索出一条进一步提高神经元覆盖率的新途径。
如果又提高覆盖率又不是对抗样本则放入种子池,是对抗样本则放入对抗样本集合中并且结束变异过程
对于迭代变异过程,首先,当得到梯度时,可以采用各种处理方法来产生扰动,包括只保留符号[16]、模仿现实情况[13,17]等,这些输入的变异策略很容易扩展到DLFuzz。其次,DLFuzz采用12距离来度量摄动,计算与[12]相似。至于16号线的保种条件,DLFuzz将我们期望的距离限制在一个相对较小的范围(小于0.02),以确保隐蔽性。随着一个输入的神经元覆盖率的提高随着时间的推移而下降,相应的保存种子的阈值也会随着运行时间的延长而降低
采用变异算法的同时使用l2度量距离变化,保证隐蔽性
上述文字描述了图中算法的整体流程
神经元选择的策略 为了最大化神经元覆盖率,我们提出了四种启发式策略来选择更有可能提高覆盖率的神经元。对于每个种子X,将使用一个或多个策略来选择m个神经元,这些策略可以在算法输入的策略中定制。
- 策略1.选择过去测试中经常被覆盖的神经元。受传统软件测试实践经验的启发,经常或很少执行的代码片段更有可能引入缺陷。经常或很少被覆盖的神经元可能会导致不寻常的逻辑,并激活更多的神经元。
- 策略2.由于上述考虑,选择在过去的测试中很少被覆盖的神经元。
- 策略3.选择权重最高的神经元。它是基于我们假设具有最大权值的神经元可能对其他神经元有更大的影响而提出的。
- 策略4.选择激活阈值附近的神经元。如果激活/停用输出值略低于/大于阈值的神经元,则更容易加速。
结论
经元有更大的影响而提出的。
4. 策略4.选择激活阈值附近的神经元。如果激活/停用输出值略低于/大于阈值的神经元,则更容易加速。
结论
我们设计并实现了DLFuzz作为DL系统的一个有效的模糊测试框架。DLFuzz首次将模糊化测试的基本思想与DL测试相结合,并对其有效性进行了验证。与DeepXplore相比,在相同的输入量下,DLFuzz的神经元覆盖率平均提高了2.86%,生成的对抗性例子增加了338.59%,扰动减少了89.82%。DLFuzz还克服了依赖DeepXplore中具有类似功能的多个DL系统的麻烦。此外,DLFuzz通过结合这些对抗性输入来重新训练DL系统并稳步提高它们的准确性,从而展示了它的实际用途。