谷歌大脑提出TensorFuzz,用机器学习debug神经网络

机器学习尤其是深度学习很难调试与修正,而最近谷歌大脑 Ian Goodfellow 等研究者发布了一个名为 TensorFuzz 的神经网络 Debug 开源库。他们将传统软件工程中由覆盖性引导的模糊方法引入到神经网络,并借助机器学习方法实现 Debug 过程。

神经网络正逐渐影响人类生活环境,包括医学诊断、自动驾驶、企业和司法决策过程、空中交通管制、以及电网控制。这些人类可以做到的事,神经网络也有可能做到。它可以拯救生命、为更多的人提供帮助。然而,在实现这些应用之前,我们首先需要确定神经网络到底是不是可靠的,因此它的修正和调试方法恰恰是我们现在所缺失的。

众所周知,由于各种原因,机器学习模型难以调试或解释,一是从概念上难以说明用户想要了解的模型信息,而且通过统计和计算也难以获得指定问题的答案。这个特性导致最近的机器学习出现「复现危机」,因为我们很难对不好调试的技术做出可靠的实验结论。

即使是与神经网络直接相关的简单问题也可能会有巨大的计算量,而且使用深度学习框架实现的神经网络也可能和理论模型相去甚远,所以神经网络非常难以调试。例如,ReluPlex 可以形式上地验证神经网络的一些特性,但由于计算成本太高,无法扩展到实际模型中。此外,ReluPlex 通过将 ReLU 网络描述为一个分段线性函数来进行分析,它使用一个矩阵乘法都为线性的理论模型。但实际上,由于浮点算法的存在,计算机上的矩阵乘法并非线性的,机器学习算法可以学习利用这种特性进行非线性运算。这并不是要批评 ReluPlex,而是想说明应该需要更多与软件直接交互地测试算法,以便更客观地测试因为深度学习框架而偏离理论的模型。

在 Ian Goodfellow 等人的这项研究中,他们使用传统软件工程已有的技术,即由覆盖性引导的模糊方法(coverage-guided fuzzing,CGF),并修正这种技术以用来测试神经网络。根据 Goodfellow 等研究者在原论文中所述,该项工作的主要贡献有以下几点:

  • 神经网络引入 CGF 概念,并描述了快速近似最近邻算法如何以通用的方式检查覆盖性。

  • 为 CGF 技术构建了一个名为 TensorFuzz 的开源库。

  • 使用 TensorFuzz 可在已训练神经网络搜索数值问题、在神经网络和对应经量化处理的网络间生成不一致性度量、在字符级语言模型中表现的不良行为。

下图描述了整体的 Fuzzer 过程,它与普通计算机程序的 CGF 结构非常相似,只不过它不与经检测的计算机程序交互,而是与 TensorFlow 的静态计算图进行交互。


如上左图所示,Fuzzer 由 Seed 语料库开始,它为计算图提供至少一组输入。研究者将这些输入限制为有效的网络输入,例如对于图像输入,研究者可以限制输入数据有正确的图像尺寸和 RGB 通道数。在给定 Seed 语料库后,输入选择器将从输入语料库中选择不同的元素,例如输入选择器可以是以随机的方法选择输入。

给定有效的输入,Mutator 会对输入做一些修改,这种修改可能只是简单地翻转图像像素,同样也可以是在修改总量的某些约束下对图像进行修改。Mutator 输出的修改数据随后可以输入到神经网络中,TensorFuzz 需要从神经网络抽取出两种信息,即抽取一组元数据数组以计算目标函数,抽取一组覆盖性数组以计算实际覆盖性。计算覆盖性后,如果 Mutator 修改的数据需要执行覆盖,则将它添加到输入语料库中,如果计算的目标函数满足条件,则可以添加到测试案例列表中。

如上右图为 Fuzzer 主体过程的伪代码,在满足迭代数的情况下,从输入语料库中抽取样本为 parent,并使用 Mutate() 函数对该样本做修改以产生新的样本 data。样本 data 随后输入到神经网络,并通过 Fetch() 函数从该神经网络抽取覆盖性 cov 和元数据 meta 两个向量。接下来只需要通过 IsNewCoverage() 和 Objective() 两个函数判断 cov 和 meta 两个向量是不是满足条件,满足的话就能分别将 data 样本加入到输入语料库和测试案例列表。

以上只是 Fuzzer 主体过程的一般描述,Chooser、Mutator 以及 Fetcher 的具体结构与算法读者可详细查阅原论文。

论文:TensorFuzz: Debugging Neural Networks with Coverage-Guided Fuzzing

论文地址:https://arxiv.org/pdf/1807.10875.pdf

众所周知,机器学习模型的解释和调试非常困难,神经网络更是如此。在本文中,我们为神经网络引入了自动化软件测试技术,该技术非常适合发掘仅在少量输入下出现的错误。具体而言,我们为神经网络开发了由覆盖引导的模糊(coverage-guided fuzzing,CGF)方法。在 CGF 中,神经网络输入的随机变化由覆盖性度量(coverage metric)引导,以满足用户指定的约束。我们描述了快速近似最近邻算法如何为神经网络提供这种覆盖性度量方法,并讨论了 CGF 在以下目标中的应用:在已训练神经网络中搜索数值误差、在神经网络和对应经量化处理的网络间生成不一致性度量、在字符级语言模型中表现不良行为。最后,我们发布了一个名为 TensorFuzz 的开源库,它实现了本论文所描述的技术。

4 实验结果

我们简要展示了 CGF 技术的一些应用以证实它的通用性质。

4.1 CGF 可以高效地找到已训练神经网络的数值错误

由于神经网络使用浮点数运算,它们对于训练期间及评估过程中的数值错误很敏感。众所周知,这些问题是很难调试的,部分原因是它们可能仅由一小部分很少遇到的输入所触发。这正是 CGF 能发挥作用的一个案例。我们专注于寻找导致非数(not-a-number,NaN)值的输入。并总结出如下结论:

找出数值错误很重要。数值错误,尤其是那些导致 NaN 的数值错误,假如在现实应用中首次遇到这些错误,重要系统将做出严重的危险行为。CGF 可以用于在部署系统之前找到大量的错误,并减少错误在危险环境中造成的风险。

CGF 可以快速找到数值错误。通过 CGF,我们可以简单地添加检查数值选项到元数据中,并运行我们的 fuzzer。为了测试这个假设,我们训练了一个全连接神经网络来分类 MNIST[26] 数字。我们故意使用了一个实现效果比较差的交叉熵损失函数,以增加数值错误出现的可能性。我们用 100 的 mini-batch 大小训练了 35000 个迭代步,直到达到 98% 的验证准确率。然后我们检查到,不存在导致数值错误的 MNIST 数据集元素。尽管如此,TensorFuzz 却在多个随机初始化中快速找到了 NaN,如图 2 所示。

基于梯度的搜索技术可能无法帮助寻找数值错误。CGF 的一个潜在缺陷是,基于梯度的搜索技术可能比随机搜索技术更加高效。然而,我们并不清楚如何明确基于梯度搜索的目标。目前不存在度量模型的真值输出和 NaN 值相似性的直接方法。

随机搜索在寻找某些数值错误方面是极度低效的。为了证实随机搜索不够高效且覆盖引导对于提高效率很有必要,我们对比了随机搜索方法。我们实现了一个基线随机搜索算法,并用 10 个不同的随机初始化在语料库的 10 万个样本上运行了该算法。基线算法在所有实验中未找到一个非限定元素。

图 2:我们训练了一个包含某些不稳定数值运算的 MNIST 分类器。然后我们在 MNIST 数据集的随机种子上运行 fuzzer10 次。fuzzer 在每次运行中都找到了一个非限定元素。而随机搜索未能找到一个非限定元素。左图:运行过程中(共运行 10 次)fuzzer 的累积语料库大小。右图:由 fuzzer 找到的满足条件的图像示例。

4.2 CGF 解决模型和量化版本不一致的问题

量化(quantization)[18] 是一种神经网络权重被保存,且在执行神经网络计算的时候使用更少计算内存位数来表示数值的过程。量化常被用来减少神经网络的计算成本或大小。它还被广泛用于在手机的安卓神经网络 API 或 TFLite 上,以及在自定制机器学习硬件(例如谷歌的 Tensor Processing Unit[20])上运行神经网络推理。

寻找由量化导致的错误非常重要:当然,如果量化显著减少了模型准确率,那量化就没有什么意义了。给定一个量化模型,如果能检查出多少量化减少了准确率最好。

仅检查已有的数据只能找到很少的错误:作为基线实验,我们训练了一个使用 32 位浮点数的 MNIST 分类器(这一次没有故意引入数值错误)。然后把所有权重和激活值修剪为 16 位。之后,我们对比了 32 位和 16 位模型在 MNIST 测试集上的预测,没有找到任何不一致性。

CGF 可以快速在数据周围的小区域中找到很多错误:然后运行 fuzzer,变化限制在种子图像周围的半径为 0.4 的无限范数球中,其中仅使用了 32 位模型作为覆盖的激活值。我们将输入限制在种子图像附近,因为这些输入几乎都有明确的类别语义。模型的两个版本在域外的垃圾数据(没有真实类别)上出现不一致性并没有什么意义。通过这些设置,fuzzer 可以生成 70% 样本的不一致性。因此,CGF 允许我们寻找在测试时出现的真实错误,如图 3 所示。

随机搜索在给定和 CGF 相同的变化数量下无法找到新的错误:如 4.1 节所述,我们试验了一个基线随机搜索方法以表明覆盖引导在这种设置下特别有用。随机搜索基线在给定和 fuzzer 相同的变化数量下无法找到新的任何不一致性。

图 3:我们训练了一个 32 位浮点数的 MNIST 分类器,然后将对应的 TensorFlow 图修剪为 16 位浮点数图,原始的和修剪后的图都在 MNIST 测试集的全部 10000 个元素上执行相同的预测,但 fuzzer 可以找到大约 70% 的测试图像中半径为 0.4 的无穷范数球中的不一致性。左图:fuzzer 的累积语料库大小随运行次数(共 10 次)的变化。那些一路朝右的曲线对应失败的模糊化(fuzzing)运行。右图:由 fuzzer 找到的被 32 位和 16 位神经网络分类为不同类别的图像。

入门神经网络Ian Goodfellow谷歌大脑
4
相关数据
神经网络技术
Neural Network

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

交叉熵技术
Cross-entropy

交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小

范数技术
Frobenius Norm

范数(norm),是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,是一个函数,其为向量空间内的所有向量赋予非零的正长度或大小。半范数反而可以为非零的向量赋予零长度。

机器学习技术
Machine Learning

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

语言模型技术
Language models

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

损失函数技术
Loss function

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

伪代码技术
pseudocode

伪代码,又称为虚拟代码,是高层次描述算法的一种方法。它不是一种现实存在的编程语言;它可能综合使用多种编程语言的语法、保留字,甚至会用到自然语言。 它以编程语言的书写形式指明算法的职能。相比于程序语言它更类似自然语言。它是半形式化、不标准的语言。

目标函数技术
Objective function

目标函数f(x)就是用设计变量来表示的所追求的目标形式,所以目标函数就是设计变量的函数,是一个标量。从工程意义讲,目标函数是系统的性能标准,比如,一个结构的最轻重量、最低造价、最合理形式;一件产品的最短生产时间、最小能量消耗;一个实验的最佳配方等等,建立目标函数的过程就是寻找设计变量与目标的关系的过程,目标函数和设计变量的关系可用曲线、曲面或超曲面表示。

自动驾驶技术
self-driving

从 20 世纪 80 年代首次成功演示以来(Dickmanns & Mysliwetz (1992); Dickmanns & Graefe (1988); Thorpe et al. (1988)),自动驾驶汽车领域已经取得了巨大进展。尽管有了这些进展,但在任意复杂环境中实现完全自动驾驶导航仍被认为还需要数十年的发展。原因有两个:首先,在复杂的动态环境中运行的自动驾驶系统需要人工智能归纳不可预测的情境,从而进行实时推论。第二,信息性决策需要准确的感知,目前大部分已有的计算机视觉系统有一定的错误率,这是自动驾驶导航所无法接受的。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

张量技术
Tensor

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

TensorFlow技术
TensorFlow

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

准确率技术
Accuracy

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

机器之心
机器之心

机器之心是国内领先的前沿科技媒体和产业服务平台,关注人工智能、机器人和神经认知科学,坚持为从业者提供高质量内容和多项产业服务。

推荐文章
返回顶部