精读论文《DLFuzz: Differential Fuzzing Testing of Deep Learning Systems》,记录阅读笔记。
模糊测试
模糊测试(Fuzzing)是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。通常使用大量的随机或半随机输入数据。
背景
目前研究中,用于提高DL系统测试效率的方法主要有以下不足:
1. 利用Z3等求解器在DL模型的形式化约束下生成对抗输入,精确,但是工作在沉重的白盒方式下,约束求解消耗资源。
2. 黑盒方法利用启发式算法对输入进行变异,直到获得对抗输入,耗时,严重依赖人工提供的真实标签。
3. DeepXplore为了避免人工检查,采用多个功能相似的DL系统产生测试预言,但是这存在可扩展性和寻找相似DL系统的困难。
4. 通过对输入施加不可感知的扰动(基于梯度的方式),高效,但是神经元覆盖率低。
因此,DLFuzz对DeepXplore进行改进,保留了DeepXplore的基于梯度的生成变异,在此基础上提出新的变异算法,并且不再对DNN交叉验证。
本文提出了差分模糊测试框架,在不需要交叉引用其他DL系统和人工标签的情况下,为DL系统产生更多高神经元覆盖率的对抗输入。首次将模糊化测试的基本思想与DL测试相结合,并对其有效性进行了验证。
DLFuzz框架
解释:给定的测试输入t是要分类的图像,DNN是被测的特定卷积神经网络(CNN),如VGG-16。变异算法对t施加微扰,得到t′,与t明显不可区分,如果变异后的输入t′和原始输入t都被输入到CNN中,但被分类为不同的类别标签,则我们将其视为不正确的行为,而t′是对抗性输入之一。变异前后的分类结果不一致,说明至少有一个是错误的,不需要人工标注。与此相反,如果CNN预测两者属于同一类标签,则t′将继续用变异算法进行变异,以检验CNN的鲁棒性(健壮性)。
变异算法
- 优化目标
【暴露更多异常行为】和【达到更高神经元覆盖率】可认为是一个联合优化问题,该优化问题可使用基于梯度的方法来实现。
优化目标函数:
解释:第一部分,c是输入的原始类别标签,ci(i=0,...,k)是置信度略低于c的前k个类别标签之一。最大化第一部分,引导输入越过原始类别的决策边界,进入前k个其他类别的决策空间。用于提高待测DNN将变异输入x’分类为除c(x的正确分类)外其他类的概率;
第二部分,ni是打算激活的目标神经元。最大化第二部分,增加m个未激活神经元(由神经元选择策略选出来的)的输出。
- 模糊过程
解释:种子队列用于存储有助于提高神经元覆盖的中间变异输入,每个种子迭代进行变异。初始只有一个输入x,经过DNN预测得到x的标签c和之前提到的置信度略低于c的前k个类别标签c_topk;然后,计算联合优化目标函数obj的梯度,根据梯度得到扰动值,对x进行变异,产生x',并得到对应标签c'、覆盖信息、x'到x的距离(L2距离)。判断:如果提高了NC且符合L2距离约束,则添加进种子队列(后续可以作为一个新种子,计算对应的新梯度再进行迭代。这样可以增加DLFuzz产生的对抗输入数量);最后,若c'已经不等于c(即分类改变),则变异过程终止,将x'加入最终生成的对抗性输入集合中。
过程中将L2距离限制在很小的范围内,确保产生的对抗输入与原输入只有细微区别。
- 神经元选择策略
- 在过去的测试中经常覆盖的神经元
- 在过去的测试中很少覆盖的神经元
以上两个是因为传统测试中经常or很少执行的代码片段更有可能引入缺陷。
- 权重最大的神经元
- 激活阈值附近的神经元
实验结论
与DeepXplore相比,在相同的输入量下,DLFuzz的神经元覆盖率平均提高了2.86%,生成的对抗样本增加了338.59%,扰动减少了89.82%。
将DLFuzz产生的对抗输入加入训练集中,提高了DNN的准确率。
参考:(侵删)
以上为师妹提供的阅读笔记,加上了一些自己的理解。同时参考了以下博客:
https://www.cnblogs.com/Jody9123/p/13096674.html
[论文解读] DLFuzz: Differential Fuzzing Testing of Deep Learning Systems_年糕糕糕的博客-CSDN博客