对于自动驾驶系统等事关人身安全的深度学习应用,了解其在极端情况下的表现是非常重要的。近日,来自哥伦比亚大学和理海大学的几位研究者提出了一种深度学习系统的自动白箱测试方法 DeepXplore,据称该方法是首个系统性测试现实深度学习系统的白箱框架。机器之心对这项研究的论文进行了摘要编译介绍。
论文链接:https://arxiv.org/abs/1705.06640
深度学习(DL)系统在自动驾驶汽车、恶意代码检测等安全性非常重要的领域有了越来越多的部署,系统在极端情况下的准确率和预测能力极为重要。然而,对所有极端情况下含有数百万个参数、数千个神经元的大规模深度学习系统进行系统性的测试极为困难。已有的深度学习测试极为依赖手动标记数据,也因此不能揭露模型对罕见输入的不同错误行为。
我们提出了 DeepXplore:首个系统性测试现实深度学习系统的白箱框架(whitebox framework)。该框架解决两个难题:(1)生成输入,促发深度学习系统逻辑的不同部分;(2)在没有手动涉入的情况下,识别深度学习系统的不正确行为。首先,我们引入了神经元覆盖率(neuron coverage)来评估由一系列测试输入练习的深度学习系统部位。然后,利用多个有类似功能的深度学习系统作为交叉引证,因此避免了对错误行为的手动检查。我们表明了可以如何将在实现深度学习算法高神经元覆盖率时找到触发不同行为的输入的过程表示为一个联合优化问题,然后使用基于梯度的优化技术有效地解决。
DeepXplore 在 5 个流行的数据集上训练的当前最佳的深度学习模型中找到了数千个不正确的极端行为。对于所有这些被测试的深度学习模型,平均而言,DeepXplore 可以在一台商品笔记本电脑上在 1 秒之内生成一个代表不正确行为的测试输入。由 DeepXplore 生成的输入比已有的测试方法在神经元覆盖率上平均高 33.2%。我们进一步表明由 DeepXplore 生成的测试输入也可以被用于重新训练对应的深度学习模型,以提升分类准确度或识别被污染的训练数据。
图 1:由 DeepXplore 找到的 Nvidia DAVE-2 自动驾驶汽车平台上一个错误行为的示例。图 a:这个基于 DNN 的自动驾驶汽车正确决定左转;图 b:相反,这辆车决定右转撞向护栏。b 图的场景比 a 的更加灰暗。
1 引言
我们的主要贡献是:
我们引入了神经元覆盖率作为深度学习系统的首个白箱测试标准,以用于估计由测试输入集探索的逻辑的量。
我们给出了寻找相似深度学习系统之间的大量行为差异的问题,同时最大化神经元覆盖率可以被阐释为一个联合优化问题。我们提出了一种基于梯度的算法来有效地解决这种问题。
我们实现了所有这些技术,并将其作为了 DeepXplore 的一部分,这是第一个白箱深度学习测试框架,揭示了 15 种当前最佳的深度学习模型的数千个不同的不正确的极端情况(比如,自动驾驶汽车撞到护栏,如图 1 所示),这些模型总共有 132, 057 个神经元,在包含了 162 GB 数据的 5 个流行数据集上进行了训练。
我们展示了可以如何将 DeepXplore 生成的测试用于重新训练对应的深度学习系统,以提升分类准确度或识别被污染的训练数据。
2 深度学习背景知识
图 2:一个简单的 DNN 和由其每个神经元执行的计算
3 已有 DNN 测试的局限性
成本高昂的标记工作
低程度的测试覆盖率
图 3:传统程序和神经网络程序流程的比较。灰色节点表示在处理输入时参与的对应基本模块或神经元
4 DeepXplore 概述
图 4:DeepXplore 工作流程
图 5:在两个相似的 DNN 中,输入诱导出不同的行为
图 6:从一个种子输入开始的梯度上升,然后逐渐找到差异诱导测试输入
5 方法
在这一节,我们提供了对我们的算法的详细技术描述。首先,我们定义和解释了 DNN 的神经元覆盖率(neuron coverage)和梯度(gradient)的概念。接下来,我们描述了其测试问题可以被如何构建为联合优化问题(joint optimization problem)。最后,我们提供了使用梯度的用于联合优化的算法。
5.1 定义
5.2 DeepXplore 算法
算法 1:通过联合优化测试输入生成
6 实现
7 实验设置
7.1 测试数据集和 DNN
7.2 特定领域的限制
8 结果
表 1:用于评估 DeepXplore 的 DNN 和数据集的细节
图 7:奇数行展示了种子测试输入,偶数行展示了由 DeepXplore 生成的差异诱导测试输入。左边 3 列展示了用于自动驾驶汽车的输入,中间 3 行是用于 MNIST,右边 3 行用于 ImageNet
图 9:当训练数据集使用了同样数量的输入(分别通过随机选择、对抗测试和 DeepXplore 生成)进行增强时,三种 LeNet DNN 的准确度的提升