第八章 AI模型质量
8.5 AI模型的白盒测试
8.5.1 Fuzz测试基本原理
Fuzz测试,也被称为模糊测试,是一种软件测试技术。其主要目的是发现软件、操作系统或网络设备中的未知错误。在Fuzz测试中,会向系统输入大量随机或伪随机的数据,以尝试引发异常情况,如崩溃或未处理的错误。
举个例子来说,假设你正在测试一个网页表单,这个表单需要用户输入他们的电子邮件地址。在正常的测试中,你可能会输入像 "user@example" 这样的有效电子邮件地址。但在Fuzz测试中,你会输入大量不同的、可能无效的值,比如一个非常长的字符串,或者包含特殊字符的字符串,甚至是二进制数据。你的目标是看看这些异常输入是否会导致网站崩溃或产生其他未预期的行为。
通过这种方式,Fuzz测试可以帮助开发者发现和修复他们可能未曾注意到的问题,从而提高软件的稳定性和安全性。
尽管Fuzz测试在软件测试领域中被广泛应用,但它也存在一些局限性:
- 代码覆盖率:Fuzz测试可能无法覆盖所有的代码路径,特别是那些需要特定输入条件才能触发的路径。这可能导致某些潜在的漏洞和错误被遗漏。
- 有效输入生成:随机生成的输入数据可能无法满足特定的输入格式或约束条件,从而导致测试效果不佳。为了提高测试效果,需要设计更智能的输入生成策略,但这可能会增加测试的复杂性。
- 资源消耗:Fuzz测试通常需要大量的计算资源和时间来生成和处理输入数据。这可能导致测试过程变得低效,特别是在资源有限的环境中。
- 结果分析:Fuzz测试可能会产生大量的崩溃和错误报告,分析这些报告以确定真正的漏洞和错误可能是一项耗时且困难的任务。
- 误报和漏报:Fuzz测试可能会产生误报(将正常行为误认为是错误)和漏报(未能检测到实际存在的错误)。这可能导致开发人员在修复问题时浪费时间和精力。
- 针对性不足:Fuzz测试通常针对的是通用的漏洞和错误,可能无法发现特定于某个应用程序或领域的问题。
尽管存在这些局限性,Fuzz测试仍然是一种有价值的软件测试方法。
我们来看看如何将Fuzz测试应用到以神经元覆盖率为指标的深度神经网络(DNN)的AI模型测试中。以下步骤:
- 确定测试目标:首先,明确要测试的DNN模型的功能和性能指标,例如准确率、鲁棒性等。
- 选择覆盖率指标:神经元覆盖率是衡量DNN模型测试效果的一种指标,可以选择多种覆盖率指标,如上文提到的基于神经元的覆盖率或是基于神经网络层的覆盖率等。
- 生成测试数据:利用Fuzz测试方法,生成大量随机或半随机的输入数据。这些数据可以是图像、文本或其他适用于DNN模型的输入类型。
- 执行测试:将生成的测试数据输入到DNN模型中,观察模型的输出结果。同时,记录神经元的激活情况,以计算覆盖率指标。
- 分析结果:根据测试结果,分析模型的性能表现。如果发现异常或错误,可以进一步调查原因,优化模型结构或参数。同时,根据覆盖率指标,评估测试的充分性和有效性。
- 迭代优化:根据分析结果,不断调整测试数据生成策略和模型参数,以提高模型的性能和覆盖率。
通过以上步骤,可以将Fuzz测试应用到以神经元覆盖率为指标的DNN的AI模型测试中,从而提高模型的鲁棒性和可靠性。
下面我们看看两个典型的基于覆盖率驱动的Fuzz测试案例:DeepTest和TensorFuzz。
8.5.2 DeepTest简介
DeepTest是一种用于自动检测DNN驱动的自动驾驶汽车中潜在错误行为的系统化测试工具。它的设计目标是通过生成测试输入来最大化激活神经元的数量,从而系统地探索DNN逻辑的不同部分。下面将深入介绍DeepTest的关键流程、有效性和局限性。
关键流程:
1. 测试用例生成:DeepTest利用真实世界驾驶条件的变化生成多样性的测试输入。具体来说,它通过应用不同的真实变换技术于一组种子图像上生成合成测试图像。这些变换技术包括模糊、雨、雾、光照变化等。例如,DeepTest使用四种不同的模糊滤镜(平均Averaging、高斯Gaussian、中值Median和双边Bilateral Filter)来模拟真实世界中的模糊效果。此外,DeepTest还使用Adobe Photoshop提供的多个滤镜来模拟雨、雾等效果。通过这些变换技术,DeepTest可以生成多样性的测试输入,模拟不同的驾驶场景,从而更全面地测试DNN的性能和鲁棒性。
2. 神经元覆盖率最大化:DeepTest通过生成的测试输入来最大化激活神经元的数量。具体来说,它使用一种称为“神经元覆盖率”的指标来衡量DNN中每个神经元的激活情况。DeepTest通过最大化神经元覆盖率来探索DNN的逻辑,从而发现潜在的错误行为。为了实现神经元覆盖率最大化,DeepTest使用一种称为“遗传算法”的优化技术。遗传算法是一种基于自然选择和遗传学原理的优化算法,可以在大量的测试输入中搜索最优解。通过遗传算法,DeepTest可以找到最优的测试输入,从而最大化神经元的覆盖率。
3. 错误行为检测:DeepTest使用领域特定的变形关系来发现DNN的错误行为。具体来说,它使用一组称为“变形关系”的规则来检测DNN中的错误行为。这些变形关系是基于DNN的结构和特性设计的,可以检测出一些常见的错误行为。DeepTest使用这些变形关系来检测DNN中的错误行为,并将其报告给用户。如果DeepTest发现了潜在的错误行为,用户可以进一步分析和修复这些错误,以提高DNN的性能和鲁棒性。
我们具体看下有作者使用了哪些变形关系,包括:
1. 相同变换下的输出应该相同:如果对于同一张图片,应用相同的变换,那么DNN的输出应该是相同的。如果输出不同,那么就可能存在错误行为。
2. 不同变换下的输出应该相似:如果对于不同的图片,应用不同的变换,那么DNN的输出应该是相似的。如果输出差异很大,那么就可能存在错误行为。
3. 对称性:如果对于一张图片,将其水平或垂直翻转,那么DNN的输出应该是相同的。如果输出不同,那么就可能存在错误行为。
4. 平移不变性:如果对于一张图片,将其平移一定距离,那么DNN的输出应该是相同的。如果输出不同,那么就可能存在错误行为。
5. 尺度不变性:如果对于一张图片,将其缩放到不同的尺度,那么DNN的输出应该是相似的。如果输出差异很大,那么就可能存在错误行为。
通过这些步骤,DeepTest可以自动化地测试DNN驱动的自动驾驶汽车,并发现潜在的错误行为,从而提高自动驾驶汽车的安全性和可靠性。
图20是DeepTest的核心算法,该算法的输入为一组种子图像 I,一组变换T及其对应的参数。该算法的关键思想是跟踪成功增加神经元覆盖率的变换,并在从给定图像生成更多合成图像时优先考虑这些变换。该过程以深度优先的方式重复应用于所有图像。
图21是DeepTest发现的一些典型驾驶方向的错误。对于原始图像,箭头标记为蓝色,而对于合成图像,箭头标记为红色。我们可以看到红色偏离蓝色很远,即驾驶方向出错了。
图20 DeepTest的fuzz算法
图21 DeepTest检测到的错误行为的示例图像
有效性:
DeepTest在实验中取得了显著的有效性。它在Udacity自动驾驶汽车挑战赛中的三个表现最好的DNN中发现了数千个错误行为。这些错误行为在不同真实驾驶条件下都会导致潜在的致命事故。通过最大化神经元覆盖率和使用变形关系,DeepTest能够帮助发现DNN中的潜在问题,提高自动驾驶汽车的有效性。
DeepTest的有效性主要体现在以下几个方面:
1. 自动化测试:DeepTest是一种自动化测试工具,可以自动生成测试用例并自动探索DNN的逻辑。这大大减少了人工测试的工作量和时间,并提高了测试的覆盖率和准确性。
2. 多样性的测试输入:DeepTest利用真实世界驾驶条件的变化生成多样性的测试输入。这样可以模拟不同的驾驶场景,包括雨天、雾天、光照变化等,从而更全面地测试DNN的性能和鲁棒性。
3. 发现潜在错误行为:DeepTest通过最大化神经元的激活数量来探索DNN的逻辑。这样可以发现潜在的错误行为,包括在不同驾驶条件下可能导致致命事故的错误行为。这有助于提高自动驾驶汽车的安全性和可靠性。
局限性:
尽管DeepTest在自动化测试中取得了显著的成果,但仍存在一些局限性:
1. 依赖于DNN模型:DeepTest是针对DNN驱动的自动驾驶汽车设计的,因此其适用范围受限于这类车辆。对于其他类型的自动驾驶车辆或其他应用领域,DeepTest可能需要进行适当的修改和调整。
2. 测试输入的覆盖率:尽管DeepTest通过最大化神经元的激活数量来探索DNN的逻辑,但仍可能存在测试输入的覆盖率不足的情况。这可能导致一些潜在的错误行为未被发现。
3. 变形关系的限制:DeepTest使用领域特定的变形关系来发现DNN的错误行为。然而,这些变形关系可能无法覆盖所有可能的错误行为。在某些情况下,可能需要手动定义更多的变形关系来增加测试的覆盖率。
4. 可扩展性:DeepTest在实验中展示了其有效性,但在实际应用中可能面临一些可扩展性的挑战。例如,当DNN模型变得更加复杂和庞大时,测试的时间和资源消耗可能会增加。
总结:
DeepTest是一种自动化测试工具,旨在检测DNN驱动的自动驾驶汽车中的潜在错误行为。它通过生成多样性的测试输入和最大化神经元的激活数量来探索DNN的逻辑,并使用领域特定的变形关系来发现错误行为。尽管DeepTest在实验中取得了显著的有效性,但仍存在一些局限性,包括适用范围的限制、测试输入覆盖率的不足以及变形关系的限制。在实际应用中,这些局限性需要被认识和解决,以确保DeepTest的有效性和可靠性。
8.5.3 TensorFuzz简介
TensorFuzz是Google开发的一种用于调试神经网络的自动化软件测试技术。它使用覆盖率引导的模糊测试技术,通过对神经网络输入的随机变异来引导测试,以满足用户指定的约束条件,从而发现仅在罕见输入下发生的错误。
TensorFuzz的关键流程如下,参见图22:
1. 种子语料库:TensorFuzz的模糊测试过程从一个种子语料库开始。这个种子语料库至少包含一个计算图的输入集。与传统的覆盖率引导模糊测试器不同,TensorFuzz限制输入为某种意义上的有效神经网络输入。例如,如果输入是图像,那么输入将被限制为具有正确大小和形状,并且位于考虑的数据集的输入像素相同的区间内。如果输入是字符序列,那么只允许使用训练集中提取的词汇表中的字符。
2. 变异:在模糊测试过程中,TensorFuzz对种子语料库中的输入进行随机变异。这些变异可以包括添加、删除、替换或修改输入的元素。通过这种方式,TensorFuzz生成了一系列新的输入,用于进一步测试神经网络模型。
3. 输入评估:对于每个变异生成的输入,TensorFuzz将其输入到神经网络模型中,并获取模型的输出。然后,TensorFuzz评估这些输出,以确定模型在特定输入情况下的行为。这可以包括计算覆盖率、目标函数或其他指标来衡量模型的性能。
4. 覆盖率引导:TensorFuzz使用覆盖率引导的模糊测试技术来引导测试过程。它通过测量计算图的“激活”来评估覆盖率,而不是传统的基本块或控制流的变化。通过不断变异输入并评估模型的输出,TensorFuzz尝试最大化覆盖率,以发现更多的错误行为。
TensorFuzz定义了一种覆盖率指标Neuron Activation Vector Clusters。对每个输入,将DNN中的所有层的神经元的激活函数的输出组成一个向量组,然后通过最近邻算法进行聚类,得到不同的Neuron Activation Vector Clusters。
5. 迭代:上述步骤是TensorFuzz的一个迭代。在每个迭代中,TensorFuzz使用前一次迭代中发现的错误和覆盖率信息来指导下一次迭代的变异和评估。这样,TensorFuzz可以逐步提高测试的覆盖率和发现更多的错误行为。
6. 错误报告:当TensorFuzz发现错误行为时,它会生成错误报告,以帮助开发人员诊断和修复问题。错误报告通常包括输入样本、模型输出和其他相关信息,以帮助开发人员理解错误的本质和原因。
图22 TensorFuzz的fuzzing流程
TensorFuzz的有效性已经在多个实验中得到了证明。TensorFuzz可以帮助发现神经网络模型中的多种问题,包括但不限于以下几种:
1. 输入格式错误:神经网络模型通常对输入格式有严格的要求,例如输入的大小、形状、数据类型等。如果输入格式不正确,模型可能会出现错误行为。TensorFuzz可以帮助发现这种类型的问题,例如在图像分类模型中,如果输入图像的大小或形状不正确,模型可能会输出错误的结果。
2. 数值错误:神经网络模型中的数值计算通常非常复杂,可能会出现数值错误,例如溢出、下溢、除以零等。这些错误可能会导致模型输出不正确的结果。TensorFuzz可以帮助发现这种类型的问题,例如在语言模型中,如果模型输出的概率分布不正确,可能是由于数值错误导致的。
3. 边界错误:神经网络模型通常在输入空间的边界处表现不稳定,可能会出现错误行为。例如,在图像分类模型中,如果输入图像的像素值超出了预期的范围,模型可能会输出错误的结果。TensorFuzz可以帮助发现这种类型的问题,例如通过在输入空间的边界处进行变异来测试模型的鲁棒性。
4. 逻辑错误:神经网络模型中的逻辑错误可能会导致模型输出不正确的结果。例如,在语言模型中,如果模型在处理特定的字符序列时出现错误,可能是由于逻辑错误导致的。TensorFuzz可以帮助发现这种类型的问题,例如通过在输入空间中随机变异来测试模型的逻辑正确性。
然而,TensorFuzz也存在一些局限性。首先,TensorFuzz需要大量的计算资源,因为它需要在大量的输入上运行神经网络。其次,TensorFuzz只能发现输入空间中的局部错误,而无法发现全局错误。最后,TensorFuzz需要用户手动指定目标函数和约束条件,这可能需要一定的领域知识和经验。
总的来说,总的来说,TensorFuzz作为一种模糊测试工具,虽然可以帮助发现神经网络模型中的多种问题。然而,它也存在一些局限性,需要在实际应用中进行权衡和考虑。
8.6 AI模型质量小结
本章我们主要介绍了AI模型相关的质量保障手段,参见图23,可以分为黑盒测试、灰盒测试以及白盒测试。
黑盒测试,其中一种最简单的测试方法是端到端的黑盒测试,它不需要我们对AI模型有深入的了解,只需要设定AI模型的评估指标,如:准确率、精确率及召回率等常见指标,然后采集相关的测试样本,进行测试和结果分析即可。但通常一个业务能力可能需要多个AI模型串联调用来一起提供相应的能力,为了更高效的找到算法瓶颈点,我们可以建立分层测试体系,通过建立漏斗模型,可以快速的看到哪一层的算法是我们的重点优化对象。另外蜕变测试是一种快速扩充测试样本的有效手段,通过设定蜕变关系,可以帮助我们验证模型的稳定性和鲁棒性。
接着我们介绍了基于灰盒的精准测试。AI模型,特别是基于深度神经网络的模型,其可解释性一直是当前学术及工业界的一个难点和热点。在图像领域,有基于Grad-CAM热力图的方案,通过AI模型的热力图,我们能够了解到AI模型关注点在图像的哪些区域。基于热力图,我们可以精准对图像进行增强,包括如:模糊、色彩变换、添加噪点等蜕变测试,验证算法的健壮性。
最后我们介绍了AI模型的白盒测试,业内用的最多的是基于覆盖率指引的Fuzz测试。基于覆盖率的指标有多少,包括:简单的基于神经元覆盖率指标以及复杂的基于层的覆盖率指标。DeepTest和TensorFuzz是两个代表性的案例。DeepTest是一种用于自动检测DNN驱动的自动驾驶汽车中潜在错误行为的系统化测试工具。它的设计目标是通过生成测试输入来最大化激活神经元的数量,从而系统地探索DNN逻辑的不同部分。TensorFuzz则是Google开发的一种用于调试神经网络的自动化软件测试技术,它也是使用覆盖率引导的模糊测试技术,通过对神经网络输入的随机变异来引导测试,以满足用户指定的约束条件,从而发现仅在罕见输入下发生的错误。
图23 AI模型质量保障体系
8.7 参考文献
[1] Yuchi Tian, Kexin Pei, Suman Jana, and Baishakhi Ray. 2018. DeepTest: Automated
Testing of Deep-neural-network-driven Autonomous Cars.
[2] Lei Ma, Felix Juefei-Xu, Fuyuan Zhang, Jiyuan Sun, Minhui Xue, Bo Li, Chunyang
Chen, Ting Su, Li Li, Yang Liu, Jianjun Zhao, and Yadong Wang. 2018. DeepGauge:
Multi-granularity Testing Criteria for Deep Learning Systems.
[3] Augustus Odena and Ian Goodfellow. 2018. TensorFuzz: Debugging neural networks with coverageguided fuzzing.
[4] Youcheng Sun, Xiaowei Huang, Daniel Kroening, James Sharp, Matthew Hill, and
Rob Ashmore. 2019. Testing Deep Neural Networks. (DeepCover)
[5] Ramprasaath R. Selvaraju, Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh, Dhruv Batra. 2016. Grad-CAM: Visual Explanations From Deep Networks via Gradient-Based Localization.
[6] Grad-CAM:
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-02-09,如有侵权请联系 cloudcommunity@tencent 删除自动驾驶神经网络测试模型算法