编者按:如何测试和评价一个基于深度神经网络算法的端到端的自动驾驶模型,一直是个很难回答的问题。难在以下几点:
- 如何找到有效的测试输入?
- 如何定义合理的测试观测量?
- 如何评价测试输出的正确性?
下文的作者在这三方面做了有益的尝试,或许能推动进一步的思考。
本文作者为Yuchi Tian、Suman Jana等,原文链接:https://arxiv.org/abs/1708.08559。
摘要:深度神经网络(DNN)的发展促进了由DNN驱动的自动驾驶汽车的发展。尽管这一技术已经取得了惊人的进步,但与传统软件一样,DNN软件也会表现出不正确或意想不到的错误行为(corner-case behaviors),这可能导致致命的事故。
在本文中,作者设计和实现了一种系统的测试工具——DeepTest,并对其进行了评估。DeepTest是用于自动检测可能导致致命事故的、由DNN驱动的系统的错误行为。它利用使现实驾驶条件发生变化的因素,例如雨、雾、光照等来自动生成测试用例。DeepTest通过生成能最大化激活神经元数量的测试输入,系统地探索DNN逻辑的不同部分。DeepTest在各种现实驾驶条件中(例如模糊、雨、雾等)找到了数千种错误行为,其中许多驾驶条件能使在Udacity自动驾驶汽车挑战赛中表现良好的三个DNN模型产生潜在的致命事故。
关键词:深度学习 测试 自动驾驶 深度神经网络 神经元覆盖率
1、引言
在概念层面上,在基于DNN的软件中产生的错误行为(corner-case behaviors)就类似于传统软件中的逻辑错误。与传统软件开发中的bug检测和周期修复类似,一旦检测到DNN的错误行为,可以通过将引起错误的输入添加到训练数据集,进一步改变模型结构/参数,从而使错误失效。然而,这是一个极具挑战性的问题。
我们使用传统软件的经验表明,很难只通过使用手动测试用例构建出鲁棒的“安全至上“的系统。传统软件和基于DNN的软件的内部结构存在着根本性的差异。例如,传统的软件程序逻辑是由软件开发人员手工编写的,而基于DNN的软件是自动从大量的数据中学习并形成自己的逻辑。此外,传统软件程序的逻辑是用控制流语句来表示的,而DNN则以神经元之间的连接的权重以及非线性的激活函数来形成逻辑。这些差异使得针对基于DNN的软件的自动化测试充满挑战。
在本文中,作者讨论了这些问题并设计了一套系统的测试方法,用于自动检测自动驾驶汽车的DNN算法的错误行为。主要内容包括:
1. 作者利用了神经元覆盖率这一概念,系统地探索了DNN逻辑的不同部分。作者用实验证明,神经元覆盖率的变化与自动驾驶汽车执行操作(如转向)的变化有统计学相关性。因此,神经元覆盖率可以作为一种指导机制,系统地探索不同类型的汽车行为,并发现其中的错误行为。
2. 通过模拟不同现实驾驶条件的图像变换,比如改变对比度/亮度,摄像头的旋转等,可以激活自动驾驶汽车DNN中不同神经元。通过这些图像变换方法的组合,神经元覆盖率相比手动测试方法所能达到的覆盖率提高了一倍。
3. 测试DNN时,当输入图像是某些特定类型的变换时,其输出之间具有一定的相对关系,故而作者通过定义变形关系设计了一种输出评价准则(例如,汽车在不同的照明条件下应该表现相似),以此自动检测错误行为。
图1 几组DeepTest发现的错误示例
2、背景
本文中,自动驾驶车辆的关键系统是基于DNN的感知模块。如图2所示,DNN算法的输入来自于不同的环境感知传感器,如摄像头、LiDAR和红外传感器等;DNN算法的输出则是车辆的控制信号,如转向、制动等。本文所探讨的端到端的自动驾驶系统中的DNN算法是以摄像头为输入,转向角为输出的。
图2 一个典型的基于DNN的自动驾驶汽车架构
3、方法
为了开发基于DNN的自动驾驶汽车的自动测试技术,作者提出下列问题:
- 如何系统地探索自动驾驶汽车DNN的输入输出空间?
- 如何结合实际输入实现自动化的探索?
- 如何优化这个探索过程?
- 如何创建一个测试准则,使其不需要详细的手动设置,便可自动检测错误行为?
3.1 使用神经元覆盖率的系统测试
自动驾驶汽车的输入输出空间(即一个系统的输入和输出的所有可能的组合)非常复杂,想要穷举这些组合是不可能的。因此,作者设计了一种系统的方法将空间划分为不同的等价类(equivalence classes),并通过从每个等价类中选取一个样本来尝试覆盖所有等价类。在本文中,作者采用神经元覆盖率来划分输入空间,并假设所有具有相似神经元覆盖率的输入都属于相同的等价类。
神经元覆盖率是由Pei等人提出的,最初用于测试多个相似的DNN的差异。它被定义为在给定输入下,被激活的特定神经元数目与DNN中神经元的总数的比值。
与传统软件的以代码覆盖率为导向的测试工具类似,DeepTest试图生成能最大限度地增加被测DNN的神经元覆盖率的输入。
3.2 增加合成图像的覆盖率
某些输入不太可能出现在现实世界中,即使这些输入可能引发出错误行为,但它们仍是没有意义的。所以,生成任意的输入来最大化神经元覆盖率并不是有效的手段。因此,DeepTest专注于通过在种子图像(seed image)上进行图像变换来生成现实的合成现象,从而模拟不同的现实世界现象,例如摄像头镜头失真,物体移动,不同的天气条件等。为此,本文研究了九种不同的现实的图像变换,包括改变亮度,对比度,平移,缩放,水平剪切,旋转,模糊,雾气效果和雨水效果。这些变换可以分为三组:线性变换,仿射变换,和卷积变换。实验结果表明,对所有被测DNN来说,这些变换都会显著增加神经元覆盖率。其中:
- 线性变换包括改变亮度和对比度
- 仿射变换包括平移,缩放,水平剪切和旋转
- 卷积变换包括模糊和增加雾/雨效应
3.3 通过组合变换增加神经元覆盖率
既然单个图像变换能增加神经元覆盖率,那是否可以组合它们以进一步增加神经元覆盖率?作者的研究结果表明,不同的图像变换会激活不同的神经元,故而它们也可以堆叠在一起以进一步增加神经元覆盖率。然而,不同变换的所有可能组合形成的状态空间太大,因无法彻底搜索。为此,作者提出了以神经元覆盖率为导向的贪婪搜索算法,它可以有效地找到图像变换组合,从而获得更高的覆盖率(算法如图3所示)。
图3 DeepTest所使用的贪婪算法伪代码
该算法将一组种子图像I,变换列表T及其对应参数作为输入。该算法背后的关键思想是跟踪成功增加给定图像的神经元覆盖率的变换,并在根据该给定图像生成更多合成图像时优先考虑这些变换。整个算法的搜索方式遵循深度优先的原则。
3.4 用变形关系创造一种输出评价准则
在测试基于DNN的复杂系统(如自动驾驶汽车)时面临的主要挑战之一是如何定义对测试输出的评价准则,以便对系统的输出做出评价。建立这样的评价准则是具有挑战性的,因为它在本质上涉及了对人类驾驶员的逻辑重建。
为了规避这个问题,作者利用了不同系统输出之间的变形关系(metamorphic relations)。这里的关键是,虽然无法孤立地为每个变换后的图像定义其所对应的自动驾驶汽车的正确执行操作,但可以确定该汽车的输入是某些特定类型的变换时,其输出之间具有一定的相对关系。例如,相比以原始图像作为输入图像,当自动驾驶汽车的输入是经过光照\天气条件改变、模糊等变换后的合成图像时,输出的转向角度不应该发生明显的变化。
即如果DNN模型基于原始输入图像
的输出转向角为
,而通过将上述变换T应用于
而生成的新合成图像
的对应输出是转向角
,则
和
应该是相同的。
但由于汽车可以安全地容许小的执行操作变化(译者注:转向15.0度和转向14.8度对汽车来说差别并不大),因此对于给定的图像通常没有特定的正确转向角度。在严格地确定变形关系(可能导致许多假阳性事件即误报事件)和松弛地确定变形关系(可能导致许多假阴性事件即漏报事件)之间需要适当折衷。 在本文中,作者使用了下面定义的变形关系:
观察DNN模型对原始图像预测的输出集合
,该集合和对这些图像的手动标签集合
之间存在误差。通常使用均方差(MSE)来度量这样的误差,
利用这个值,作者重新定义了一种新的变形关系:
上述公式中,作为输入的合成图像产生的误差应该在由原始图像产生的均方差的λ倍的范围内。在这里,λ是一个参数,可以在假阳性和假阴性之间取得平衡。
4、应用
作者将DeepTest应用于三个基于DNN的端到端自动驾驶算法的测试中,这些DNN模型(如图4所示)在Udacity自动驾驶挑战赛中都获得了很好的成绩:Rambo(第二名),Chauffeur(第三名)和Epoch(第六名)。
图4 实验模型相关信息
如图4所示,在本文实验中,转向角度被定义为车辆的前进方向和转向车轮(通常为前轮)的前进方向之间的夹角。本文中使用的Udacity自动驾驶车挑战赛数据集最大转向角度为+/- 25度。
在实验中,作者利用了七种不同类型的简单图像变换:平移,缩放,水平剪切,旋转,对比度调整,亮度调整和模糊。作者使用OpenCV来实现这些变换。每个变换使用了10个参数。
5、结果
5.1 不同的输入输出会产生不同的神经元覆盖率吗?
对于每个输入图像,作者测量在实验模型上的相应输出和神经元覆盖率。
转向角度:转向角度是一个连续变量,作者检查神经元覆盖率和转向角度之间的Spearman等级相关性。这是计算两个变量之间单调关联性的非参数度量值。结果表明,转向角度与神经元覆盖率之间存在着正相关性。
转向方向:为了测量神经元覆盖率与转向方向之间的关联,作者检查在右转向和左转向之间神经元覆盖率是否发生变化。 作者使用Wilcoxon非参数测试,因为转向方向只能有两个值(左和右)。作者的研究结果表明,对于实验中三种DNN模型神经元覆盖率都随着转向方向的不同而变化,且都有统计显著性。
以上结果表明,对于不同的输入输出,神经元覆盖率有明显的不同。
5.2 不同类型的图像变换是否会激活不同神经元?
作者从测试集中随机挑选1000个输入图像,并使用了七种不同的变换(模糊,亮度,对比度,旋转,缩放,剪切和平移),最终一共生成70,000个新合成图像。通过使用这些合成图像作为输入来运行所有模型,并记录每个输入所激活的神经元,然后比较由同一原始图像生成的不同合成图像激活的神经元。
结果表明,除了Chauffeur LSTM以外,对于其他模型,不同的变换都会激活不同的神经元。LSTM是一种特殊类型的RNN架构,它能保持状态不受之前的输入影响,因此增加LSTM模型的神经元覆盖率要比其他模型难得多。
5.3 通过组合不同的图像变换,神经元覆盖率能否进一步增加?
作者通过测量在两种不同设置中的神经元覆盖率来研究这个问题:
实验结果表明,通过系统地结合不同的图像变换,可以使神经元覆盖率提高一倍。
5.4 用合成图像重新训练DNN能提高准确度吗?
作者用DeepTest生成的一些合成图像重新训练DNN,观察它们是否有助于使DNN更加健壮。实验使用了经典数据集中的图像,并通过添加雨雾效果创建了它们的合成版本。 作者对Epoch模型进行了再训练,重新训练模型的准确度相比原始模型有着显著提高。
6、局限性与结论
完整性:DeepTest通过在种子图像上应用不同的图像变换来生成合成图像,但是文中所运用的这些变换方式尚不能覆盖所有现实驾驶条件中,对摄像头所产生的影响因素。
真实性:尽管作者专门设计了图像变换使得合成图像尽量接近现实,但由于存在大量不可预知的因素,例如太阳的位置,雨滴的角度和大小,在现实中重现合成图像是不可能的。但是,随着图像处理技术的发展,生成的图像将能更接近现实情况。
执行操作局限性:除了转向之外,自动驾驶车辆的完整DNN算法还必须能控制制动和加速。因为作者的测试模型有局限性,因而仅对转向进行了测试。但对支持输出其他控制信号的模型,作者的技术仍具有一定适用性。
在本文中,作者设计并评估了以DNN驱动的自动驾驶汽车的自动测试工具DeepTest。DeepTest通过对一组种子图像应用不同变换来生成合成测试图像,进而最大化DNN的神经元覆盖率。作者使用特定的变形关系来筛选DNN的错误行为。通过定义相应变换和变形关系,DeepTest可以很容易地适用于测试其他基于DNN的系统。
END
联系人:李老师
电话:021-69589225
邮箱:11666104@tongji.edu.cn