正文
通过比较多个相似的 DNN 的输出来检查 DNN 的输出;
自动「轻微推动」运行过程向目标移动,即:(2) 中定义的检查可以找到不一致的地方,同时 (1) 中定义的覆盖实现最大化,同时还考虑到了约束条件;
使用了有效的基于梯度的联合优化而做到了 (3)。
但对于这其中的每一个,我都有问题。这不是坏事:实际上这篇论文带来的很多问题是一个很大的加分——我已经在期待后续的研究了。我的问题主要和 DeepXplore 的「仅有白箱(whitebox-only)」的本质有关(当然,这也是一个优点)。
让我按顺序逐一阐述一下这四个主要思想,讨论一下我喜欢它们的理由以及相关的问题:
1. 使用神经元覆盖
对于一组 DNN 运行,它们的覆盖指标是「在这些运行过程中有多大比例的神经元(DNN 节点)至少激活了一次」。其核心思想是,对于一个给定的 DNN 输入,每个神经元要么是激活的(即超过了阈值),要么就保持为 0。正如原论文说的一样:
最近的研究已经表明 DNN 中的每个神经元往往需要负责提取其输入的一个特定的特征……这个发现直观地解释了为什么神经元覆盖是一个用于 DNN 测试全面性(testing comprehensiveness)的好指标
注意,这些节点对应的特征并不一定能够用我们的语言直观描述(比如:一个有两只眼睛的物体)。但 DNN 训练的优化过程通常确实会使它们对应于一些「可复用的特征」,即让 DNN 在许多不同输入上都有用的东西。
研究者之前也尝试过自动使神经元活跃,比如在论文《Understanding Neural Networks Through Deep Visualization》为了可视化神经元的工作,但使用神经元覆盖(neuron coverage)来进行验证应该是一个新的好想法。
可能的问题:
但是注意,神经元覆盖(类似于 软件验证中的代码覆盖(code coverage))是真正的实现覆盖(implementation coverage)。而实现覆盖就我们所知是不够的,主要是因为其对因疏忽造成的漏洞没有助益:如果你接收/传输 软件的模块遗忘(SW module forgot)来实现传输,或遗忘有关「接收同时传输」的问题,然后你可以实现 100% 的代码覆盖并达到完美,直到有人实际写出了一个传输测试(或用户自己尝试传输)。
参见覆盖的多个讨论(实现,功能等等):https://blog.foretellix.com/2016/12/23/verification-coverage-and-maximization-the-big-picture/
这对于 DNN 也是一样:如果你忘记在「靠右行驶」、谨慎转弯或巴士上涂鸦的人上训练的驾驶 DNN,那么你可能会在一个漏洞很多的系统上实现 100% 的覆盖。
作者回复:
我们完全同意你的观点。完全的神经元覆盖(full neuron coverage)(就像代码覆盖)无法保证能找到所有可能的漏洞。话虽如此,我们也在思考扩展神经元覆盖的定义,使之能够包含不同类型的覆盖(比如在传统软件中就像路径覆盖(path coverage)一样的神经元路径覆盖(neuron path coverage))。
我认为扩展神经元覆盖能或多或少带来一些帮助。假设(这里简化了很多)我们的驾驶 DNN 有一个用于检测「狗在公路上」的神经元和另一个用于检测「猫在公路上」的神经元。那么,除了分别单个覆盖它们,我们还想要覆盖它们的反例(「没有狗」)和组合(「有狗有猫」、「有猫且没狗」)以及序列(「有猫然后有狗」——这就是上面提到的神经路径覆盖)。
但是,这只是实现覆盖,下面可看到更多评论。
通过比较其它实现来检查 DNN
他们检查行为的方式是比较多个、或多或少不同的基于 DNN 的实现,来看它们是否吻合。这是 软件「差分测试(differential testing)」的一种扩展,其(对于你们这些来自硬件验证的人来说)基本上和原来的「通过一个参考模型进行检查」差不多。
潜在问题:
通过参考模型检查通常是假设该参考模型是(几乎)完美的,即是可以被信任的。当然,事实并非如此,所以是有潜在问题的。
比如说,这能找到遗漏的 bug 吗?只能考虑我们在训练过程中考虑过的一些 DNN 案例,而不能考虑其它的。但我很怀疑这是否足够。该论文说道:
如果所有被测试的 DNN 都会犯同样的错,那么 DeepXplore 不能生成对应的测试案例。但是,我们发现这在实际中并不是一个显著问题,因为大多数 DNN 是独立构建和训练的,它们都会犯同样错误的概率比较低。
但这是假设 (a) 你在现实和充满竞争的市场中能够获取许多不同的实现,和 (b) 至少有一位作者(比如 Tsunami)想过这并不一定现实。
作者回复:
这确实是差分测试的一个限制。以一种独立的方式测试一个模型的一种方法是使用对抗 DNN 测试技术,这种方法目前仅允许实现人眼不可见的轻微扰动。你也许可以扩展对抗训练来使用范围广泛的现实约束。比如说,通过改变光的效果。但是,这种方法的主要问题是缺乏数据标签。我们很难确定一个 DNN 模型是否做出了正确的分类。理论上,任何扰动都可以任意改变图像的真实标签。