Towards Improved Testing for Deep Learning [ICSE 2019]——阅读笔记

笔记结构

  • Towards Improved Testing for Deep Learning [ICSE 2019]--阅读笔记
    • 一、为什么需要对神经网络进行测试?
    • 二、目前的测试技术可以直接用于神经网络吗?为什么?
    • 三、相关的DNN测试方法和标准都有哪些?
      • 1. 黑盒测试
      • 2. 白盒测试
    • 四、目前的这些对DNN测试的方法或标准有什么局限性?有什么可以改进的地方?
      • 1. 覆盖标准方面
      • 2. 测试输入生成的方面
      • 3. Oracle选择的方面
    • 五、作者提出的新的方法或者准则是什么?与传统测试技术相比有什么优势?
    • 六、总结

Towards Improved Testing for Deep Learning [ICSE 2019]–阅读笔记

经过一学期高可信软件技术的课程学习,我对软件测试和修复的相关理论知识和技术都有了基础性的了解。一直以为测试和修复只能应用于“传统”的代码,而在阅读这篇论文之后才认识到,如今热门的神经网络也可以进行测试。除了直观的、可以很容易理解的黑盒测试,前沿研究中还有基于逻辑覆盖等方法的白盒测试。这篇论文中提出的一个测试准则就是基于逻辑覆盖的原则。

接下来让我们带着几个问题出发,一起来了解这篇论文的主要内容。
论文链接:Towards Improved Testing for Deep Learning [ICSE 2019]

一、为什么需要对神经网络进行测试?

随着硬件设备的迅速发展和大数据的热门使用,深度神经网络(简称DNN)迅猛发展,越来越多的领域都注意到了其优越的性能并将其引进。例如自动驾驶、医疗诊断、安全等安全关键领域也与DNN的结合越来越紧密。但此类应用程序的安全性至关重要,因此在部署之前必须要充分衡量其安全性。需要从现有技术方面思考如何对这些DNN进行充分的测试。

二、目前的测试技术可以直接用于神经网络吗?为什么?

在传统软件程序中,程序逻辑必须由程序员手动描述。于此不同的是,DNN是通过对大型数据集的训练来学习决策策略。DNN是在输入层和输出层之间具有多个隐层的神经网络,它没有一个清晰的控制流结构,通常使用各种方法逐步调整参数,以达到预期的精度。

如下图所示,传统的软件测试方法无法直接应用于DNN领域,因为DNN的代码不包含其内部决策逻辑的信息。因此,传统的覆盖准则如代码覆盖、分支覆盖、功能覆盖等也不能应用于DNN。
Towards Improved Testing for Deep Learning [ICSE 2019]——阅读笔记_第1张图片

三、相关的DNN测试方法和标准都有哪些?

1. 黑盒测试

之前的DNN测试方法通常采用黑盒测试方法,例如Nina Narodytska和Shiva Prasad Kasiviswanathan提出的规则是:在给定正确输入的附近寻找关键信息,具体而言就是随机搜索哪些修改会导致分类错误。然而,这些黑盒测试方法不仅缺乏覆盖标准,也忽略了DNN的内部逻辑。

2. 白盒测试

直到最近,有人提出了用于DNN的白盒测试方法。例如DeepXplore,DeepCover,DeepMutation和DeepCT等。现有测试方法的输出通常要么是对系统正确性的度量,要么是对比值的度量。例如在DeepXplore中,作者引入了神经元覆盖率的概念作为测试DNN的覆盖率指标。

下图显示了目前大多数现有的DNN白盒测试方法的高级表示。测试过程的输入是DNN、测试输入和覆盖率度量,主要用于确保程序逻辑的所有部分都经过了测试。而oracle(基本事实)决定DNN的行为对于测试的输入是否正确。除了这些以外,还可以使用指导测试输入生成方法来生成具有更大覆盖率的测试输入,同时可以发现更接近边角的实例。
Towards Improved Testing for Deep Learning [ICSE 2019]——阅读笔记_第2张图片

四、目前的这些对DNN测试的方法或标准有什么局限性?有什么可以改进的地方?

作者从三个方面来阐述了目前DNN的测试标准还存在一些问题,并且根据这些问题提出一些可以改进的工作。

1. 覆盖标准方面

类似于传统软件程序的覆盖标准中的代码覆盖率和分支覆盖率,DNN的任何覆盖标准必须要能够保证完整性。也就是说,DNN的覆盖标准必须能够确保DNN的内部决策结构的所有部分已经由至少一个测试输入来执行。

  1. DeepXplore的局限性:
    典型的前馈深度神经网络包含多个非线性处理层,每个隐含层使用前一个隐含层的输出作为其输入。神经元的状态表示为激活或未激活。
    神经元覆盖根据输入激活的神经元数量衡量测试输入所使用的DNN逻辑部分。但是,它无法完全解释DNN可能出现的所有行为。 有实验能够证明神经元覆盖相当容易实现:25个随机测试输入能够实现接近100%的神经元覆盖。同时,作者在实验中还发现:在模型架构的某些情况下,可以通过两个测试输入获得100%的神经元覆盖。因为对于大多数测试输入,神经元总是处于激活状态。因此,神经元覆盖是相当粗糙和不充分的标准。

  2. DeepCover的局限性:
    DeepCover的覆盖标准考虑了DNN相邻层中的条件判定依赖性。该方法除了时在相对较小的网络上测试之外,它的前提条件还要求DNN是前馈全连接的神经网络。而且它不能推广到诸如RNN、LSTM、attention网络等的架构。DeepCover不考虑神经元在其所在层的环境,即同一层中神经元输出的组合

  3. DeepCT的局限性:
    DeepCT的组合测试是启发于覆盖标准:根据每层激活的神经元比值描述测试输入所使用的逻辑比值。它没有考虑DNN中的层级之间的关系,并且也没有被证实可以扩展到具有不同类型层的、能用于真实世界的DNN。

2. 测试输入生成的方面

测试输入可以通过指导方式生成或选择得到,它通常有两个主要目标:最大化未覆盖故障的数量,并最大化覆盖范围。 目前测试输入生成方法存在一些主要缺点:

(1)修改现有测试输入直到找到满足标准的测试输入的迭代过程单次执行耗时长

(2)与总的测试和生成的输入数量相比,那些能够导致覆盖范围和/或发现的角落案例增加的测试输入数量相当低。

3. Oracle选择的方面

测试DNN的正确性需要一些基本事实(oracle),我们可以理解为基线或者正确答案,主要是用于确定输入的行为是否正确。目前用于测试DNN的现有规则受到以下几个限制:

(1)数据驱动的方案中最直接的方法是收集尽可能多的实际数据并手动标记以检查其是否正确。但是,这样的过程需要大量的手动工作

(2)在某些工作中,会使用同一任务的多个实现作为oracle,并将其中的的差异行为标记为角落案例行为。然而,我们观察到这种方法会错误地将某些角落情况分类为正确的行为,此外,此方法仅在具有多个高精度且相似的实现的应用程序中有效

五、作者提出的新的方法或者准则是什么?与传统测试技术相比有什么优势?

在本文中,作者基于对内部决策逻辑的覆盖提出了一个包含两个因子的覆盖标准——每个神经元单独对下一层神经元值的条件影响以及上一层中神经元值的组合对下一层神经元值的影响

基于这些定义,我们的覆盖标准被定义为DNN中由第k-1层的第i、j个神经元n_(i,k-1)、n_(j,k-1)和第k层第q个神经元n_(q,k)三元组的2-路覆盖:(n_(i,k-1),n_(j,k-1),n_(q,k))。

第一个覆盖更多地受到MC/DC和其他传统软件覆盖标准的启发,但第二个覆盖的灵感来自组合测试。这种测试基于以下事实:并非每个参数都会导致每次失败,而经验数据表明几乎所有失败都是由相对较少的参数之间的相互作用引起的

PS:MC/DC MC/DC(修订的条件/判定覆盖)(Modified Condition/Decision
Coverage)准则是一种实用的软件结构覆盖率测试准则,
在每个判定中的每个条件都曾独立的影响判定的结果至少一次。独立影响意思是在其他的条件不变的情况下,改变一个条件,而这个改变会导致最终的结果也改变。总结起来就是在所有的测试用例中,要保证每个条件都能对结果都独立起到作用。

除了提出的这个标准以外,作者还介绍通过实现这个标准,可以不断迭代实现100%覆盖DNN的内部逻辑。下面,举个例子给大家解释一下:

(1)对于一个初始测试输入的结果,我们通过组合优化来实现指导测试输入的生成。任何没有达到100%覆盖率的三元组被随机选择,以确定哪些激活值的组合没有被覆盖。例如考虑DNN某个状态实例未被100%覆盖,这种状态下三元组中n_(i,k-1)被触发(其激活函数值大于假设阈值0)、n_(j,k-1)没有被激活(其激活函数值小于等于0)、决策神经元n_(q,k)被激活。目标变成了:
在这里插入图片描述
其中f是对应神经元的激活函数,为了产生当前状态,激活n_(i,k-1)和n_(q,k)而不激活n_(j,k-1),可以通过最大化n_(i,k-1)和n_(q,k)的激活函数、最小化n_(j,k-1)的激活函数,以使它们分别大于或小于一定阈值从而变为激活或未激活状态。

(2)因为F_(n,t)(见下式)中的个体项是某些层中某些神经元的激活值,而任何n的∅(t,n)(表示对于输入为t时神经元n的激活状态)是复合函数,所以可以使用链式法则逐层计算偏导数直到到达输入t的输入层,从而逐步修改t以生成测试输入。
在这里插入图片描述
(3)通过这种迭代修改输入的方式最大化目标函数,以达到期望的三元组某种激活状态,从而覆盖三元组不同的激活状态。

作者接下来在评估中体现了他们提出的标准相对于前面的工作更细粒度

作者评估了三个DNN——LeNet-1,LeNet-4和LeNet-5——的覆盖度量,这三个DNN对手写数字的MNIST数据集进行了分类。并确定覆盖标准有效性的指标是:

(1)10个随机测试输入获得的覆盖率
(2)边角案例数与总测试输入数的比率

结果显示,前面工作在相同的指标下获得了更高的覆盖率和对比值,而使用作者提出的标准时覆盖率直线下降,体现出作者提出的标准较于先前工作粒度更细。

六、总结

深度神经网络在安全关键应用领域的应用越来越多,从各方面考虑都必要进行充分的测试,以检测和修正其错误行为。但是由于深度神经网络缺乏明确的控制流结构,使得传统的软件测试标准如代码覆盖率等无法应用于深度神经网络。

在这篇论文中,作者研究了目前现有的深度神经网络测试方法、存在的局限和改进的机会,以及对快速、可扩展的端到端测试方法的需求。最后,作者还提出了一个深度神经网络的覆盖准则,该准则试图覆盖深度神经网络内部逻辑。但是覆盖方法对更大尺寸的真实DNN的可扩展性及其对不同网络架构的适应性尚待测试。

此笔记为小组作业,由本人撰写,特别感谢周悦同学的意见和提供的部分内容修改。公式没有调整格式,之后有空再改。

你可能感兴趣的:(笔记)