TensorFuzz:一种基于覆盖准则模糊的神经网络调试技术

admin 2025-01-12 6人围观 ,发现220个评论

论文:Odena,Augustus,andIanGoodfellow."TensorFuzz:DebuggingNeuralNetworkswithCoverage-GuidedFuzzing."arXivpreprintarXiv:1807.10875(2018).

论文摘要:众所周知,机器学习模型难以解释和调试。神经网络尤其如此。在这项工作中,我们引入了神经网络的自动化软件测试技术,这些技术非常适合发现仅针对稀有输入发生的错误。具体来说,我们开发了用于神经网络的覆盖引导模糊(CGF)方法。在CGF中,神经网络输入的随机变化由覆盖度量指导,以达到满足用户指定约束的目标。我们描述了近似最近邻算法如何快速提供此覆盖度量。然后,我们讨论了CGF在以下目标中的应用:在训练好的神经网络中发现数值误差,在神经网络和这些网络的量化版本之间产生分歧,并在角色级语言模型中表现出不良行为。最后,我们发布了一个称为TensorFuzz的开源库,它实现了所描述的技术。

技术路线:

众所周知,机器学习模型由于各种原因而难以调试或解释,范围从概念上难以指定用户希望了解模型的正式术语到统计和计算难以获得正式指定问题的答案。这个属性可能有助于最近机器学习中的“再现性危机”-对于难以调试的技术做出可靠的实验性结论是很棘手的。神经网络可能特别难以调试,因为即使是相对简单的关于它们的形式问题,回答的计算成本也很高,并且因为神经网络的软件实现可能与理论模型有很大差异。例如,ReluPlex可以正式验证神经网络的某些属性,但计算成本太高,无法扩展到实际使用的模型大小。此外,ReluPlex通过使用理论模型分析ReLU网络作为分段线性函数的描述,其中所有矩阵乘法运算都是真正线性的。在实践中,由于浮点运算,数字计算机上的矩阵乘法不是线性的,并且机器学习算法可以学习利用该属性来执行显著的非线性计算。这不是批评ReluPlex,而是为了说明需要额外的测试方法,这些方法直接与软件实际存在,以便正确测试甚至偏离理论模型的软件。

CGF在识别传统软件中的缺陷方面已经取得了很大的成功,因此人们很自然地问它是否可以应用于神经网络。传统的覆盖度量跟踪哪些代码行已被执行,哪些分支已被执行。在最基本的形式中,神经网络被实现为一系列矩阵乘以及基本运算。这些操作的底层软件实现可以包含许多分支语句,但是其中许多是基于矩阵的大小以及神经网络的结构,因此分支行为主要独立于神经网络的输入的特定值。因此,在多个不同的输入上运行的神经网络常常执行相同的代码行并采取相同的分支,但是由于输入和输出值的变化,会在行为上产生有趣的变化。因此执行现有的CGF工具,如AFL,可能找不到有趣的神经网络行为。在这项工作中,我们选择使用快速近似最近邻算法来确定两组神经网络“激活”是否彼此间有意义地不同。这为神经网络提供了一种产生有用结果的覆盖度量,即使神经网络的底层软件实现没有使用许多依赖于数据的分支。

测试和计算传统计算机程序的测试覆盖率的方法不能直接应用于神经网络。因此,我们必须考虑如何写下神经网络的有用覆盖度量。从模糊器中汲取灵感,我们实现了一个名为TensorFuzz的工具。它的工作方式类似于那些工具,但这种方式不同,使其更适合神经网络测试。它不是用C或C++编写的任意计算机程序,而是将输入提供给任意TensorFlow图。它不是通过查看基本块或控制流量的变化来测量覆盖率,而是通过(粗略地说)查看计算图的“激活”来测量覆盖率。

TensorFuzz具体的流程如下图1所示:

图1:主要模糊环路的粗略描述。

左图:模糊测试程序图,表示数据流。右:以算法形式描述模糊测试过程的主循环

对图1左侧流程图的解释:

1.输入选择:

(1)使用启发式方法从种子库当中选择样本。

(2)在这种情况下,随机选择可以接受。

(3)本文采用以下启发式方法进行了解决。

2.变异器:

(1)本文实现图像和文本的突变。

(2)对于图像:只需添加一些方差的白噪声;使用可配置的L∞norm添加白噪声。

(3)对于文本,删除/添加/替换字符。

3.目标函数:

(1)在考虑一些目标的情况下运行模糊器.

(2)希望一些变异输入导致DNN达到某种满足我们想要的状态。

4.覆盖分析仪:

(1)通过使用惊人有效的覆盖度量来将突变输入添加到种子库中。

(2)使用ANN(近似最近邻)来确定突变是否是新的覆盖范围。

(3)两个最近样本之间的L大于我们定义的,我们将其视为新的覆盖范围。

对图1右侧的解释:

模糊测试程序的整体结构与普通计算机程序的覆盖引导模糊器的结构非常相似。主要区别在于,我们不是与我们已经检测过的任意计算机程序交互,而是与TensorFlow图交互,我们可以将输入提供给输入并从中获取输出。

模糊器以包含至少一组计算图输入的种子语料库开始。与传统的CGF不同,我们不只是提供大字节数组。相反,我们将输入限制为某些意义上有效的神经网络输入。如果输入是图像,我们将输入限制为具有正确的大小和形状,并且与所考虑的数据集的输入像素位于相同的间隔中。如果输入是字符序列,我们只允许从训练集中提取的词汇表中的字符。

鉴于此种子语料库,模糊测试的过程如下:在指示停止之前,模糊器根据我们将称为输入选择器的某个组件从输入语料库中选择元素。可以将输入选择器想象为随机选择。

给定输入后,Mutator组件将对该输入执行某种修改。修改可以简单到只是翻转图像中输入像素的符号,并且还可以限制对随着时间的推移对语料库元素进行的总修改的某种约束。

最后,可以将突变的输入馈送到神经网络。在TensorFuzz中,从神经网络中提取两件事:一组覆盖数组,从中计算实际覆盖范围,以及一组元数据数组,从中计算目标函数的结果。

计算覆盖范围后,如果突变输入执行新的覆盖,则将其添加到语料库中,如果它导致满足目标函数,则将其添加到测试用例列表中。

总体而言,本研究做出了以下贡献:

(1)我们介绍了神经网络的CGF概念,并描述了如何快速使用近似最近邻算法以一般方式检查覆盖范围。

(2)我们为CGF开源了一个名为TensorFuzz的软件库。

(3)我们使用TensorFuzz来查找训练神经网络中的数值问题,神经网络与其量化版本之间的分歧,以及字符级别语言模型中的不良行为。

猜你喜欢
    不容错过