摘要
随着越来越多的软件系统使用深度神经网络模型(DNN)解决问题,迫切需要对 DNN 进行有效的操作测试,以保证这些模型在真实操作环境下的真实性能。这里面的一个挑战是,测试中的数据搜集只能用非常有限的成本预算来进行解释方差,同时又要求产出高精确度的结果。将软件测试视为通过统计抽样进行可靠性估计的一种做法,我们将传统结构覆盖范围背后的思想重新解释为通过条件化以实现方差的减小。基于这样一个认识,本文提出了一个基于对被测 DNN 模型学习到的表示形式进行条件化(降低方差)来进行对 DNN 的测试方法,而这种学习到的表示形式是由模型最后一个隐藏层中神经元输出的概率分布定义的。为了从高维稀疏数据分布中采样,本文设计了一种利用交叉熵最小化的算法。本文进行了各种 DNN 模型和数据集的实验,以评估该方法的总体效率。结果表明,与简单的随机采样相比,此方法仅需要大约一半的标记输入即可达到相同的精度水平。
简介
深度学习在人类难以形式化描述的任务(例如图像分类或语音识别)中获得了巨大的成功。DNN 技术在越来越多的软件系统中被使用,这其中甚至包括了如医疗诊断和自动驾驶这样的安全攸关的应用场景。因此,需要有效且高效的 DNN 测试方法来确保其在操作环境中的服务质量。
近期有一些和 DNN 对抗样本生成相关的测试方法,这些方法类似于由开发人员手动编码的传统软件测试中的调试测试(debug testing),旨在找到导致错误的输入。然而,DNN 模型与人工编码程序直接的本质的差异给调试测试这种测试方法带来了一些挑战。例如,统计机器学习的归纳性质和 NFL 定理(没有免费的午餐定理)意味着,独立于 DNN 模型的操作环境上下文的预言是毫无意义的。事实上,使用统计方法来度量 DNN 的质量也一定程度上降低了单个导致错误的输入的重要性。
与调试测试相反,本文关注于 DNN 的操作测试,即使用从特定操作环境中收集的数据测试先前训练过的 DNN 模型,以便确定该模型在此情况下的实际性能。尽管目前已经有了大量关于传统软件的操作测试的研究,DNN 操作测试中的挑战目前还没有能够被完全攻克。这里的中心问题是,标记真实场景收集的所有操作数据的成本可能过高。例如,可能需要进行外科活检以确定放射或病理图像是真正的恶性还是良性。如何花费更少的成本去标记数据,同时又能较为精确地评估 DNN 在操作环境中的实际质量,就变得至关重要。
为了解决这个问题,本文提出了一种精心设计的采样方法来减少在 DNN 操作测试中所需的带标注的测试数据的数量。传统人工编码的程序通常使用结构覆盖来作为评判的标准,相应地,DNN 中以统计中的方差约减调节来实现测试数据采样和对 DNN 准确性的评估。
这种方法的核心在于,DNN 最后一个隐藏层层的神经元学习和编码的信息可以被用来从未标记的操作数据中进行采样。事实表明,这种降低方差的方法进行测试数据采样事非常有效的,即使模型并没有很好地拟合数据时依然有效,这是其他选择方法所不具备的属性。
为了实现这个想法,该方法需要先从操作数据中选择一小部分数据,但这些数据需要足够有代表性互联网项目,可以较好地服从最后一个隐藏层中神经元输出所定义的空间中的分布。考虑到神经网络模型内部隐藏层空间的高维特性,这项工作并不容易。为了解决这一问题,本文引入了基于交叉熵最小化的分布近似技术。
本文的主要贡献如下:
将操作 DNN 测试的问题形式化为以小样本估算,并提出通过减少方差的测试方法,作为结构覆盖在 DNN 中的一种泛化表示;一种有效的 DNN 操作测试方法,该方法利用了被测 DNN 所学习的高维表示形式,结合了一种基于交叉熵最小化的采样算法来实现;一个系统性的经验评估工作。本文在 LeNet, VGG 和 ResNet 上的测试结果表明,相比于简单随机采样,这种方法可以在维持相同精度的判断下,减少约一半的数据标记工作。问题分析
在开始具体的方法介绍之前,首先简单介绍一下 DNN 测试中存在的问题。DNN 模型在实际被部署到现有的软件系统中时,它们的效果可能会远低于预期。这可能是由于欠拟合或者过拟合导致的,也有可能是因为训练数据集和操作环境实际的数据分布上的差异导致的。后者在实际的应用中是一个令人头痛但又无法避免的问题。然而,DNN 实现的是一种归纳推理,从本质上不同于基于逻辑推论的人工编码的传统程序。这也就导致了没有确定的和通用的测试预言用于 DNN 的测试。具体地说,DNN 的测试必须是统计意义上的,整体意义上的和实际操作环境下的。
如果我们有足够的标记数据很好地表示实际操作环境的上下文,并足以进行准确的估计,那么这个测试任务并不困难。然而现实情况却是,从实际操作环境中可以收集未标记的数据,对它们进行打标签确实一项代价极高的工作。
因此,本文所解决的一个核心问题就是如何利用较小规模的标记数据来较准确地对 DNN 的质量进行评估。本文所希望实现的方法思路如图所示,我们希望通过某些测试样本选择方法,只需要标记搜集的一小部分数据就可以实现对模型在真实操作环境中的质量的较为准确的评估。
显然,上述对 DNN 测试的描述类似于统计采样和估计,其效率可以使用方差减少技术来提高。采样是从总体中选择一组个体以便对其研究并估算总体性质的过程。其中最基本的一个采样方法就是简单随机采样(SRS),如果最后需要 n 个样本,那么该方法从总体中重复抽取 n 次。在该方法中,每一个个体被抽取到的概率是相等的。假设 X 是我们观测数据集合, H 是我们的待测模型,
是基于 n 个样本的模式输出计算出来的均值,即:
我们用
来表示一个无偏估计,那么 SRS 的效率就可以用它的方差统计值来表示,即:
尽管该方法很简单,如果我们可以从总体中抽取足够多的独立同分布的样本,那么 SRS 会非常有效,以至于进一步改进 SRS 会是一项困难的工作。这个使用常用的一个策略就是条件化,也就是找一个理想情况下 H(X)强依赖的随机变量或者随机向量 Z,并利用总方差定律:
根据该定律,如果我们用 Z 来分析 H(X),那么 H(X)的方差就可以被分解为 Z 不可以解释的(等式右边第一项)以 Z 可解释的(等式右边第二项),由于
本身是一个和 Z 相关的函数,并且有:
因此,考虑到
的方差比 H(X)更小,我们可以从 Z 的分布来采样并且评估
。如果我们能够对 Z 进行全采样,那么我们的评估的方差将只会是对每一个 Z 中的样本进行 H 的期望评估的时候引入的,这和分层采样的做法是一致的。进一步,如果 H(X)的值完全取决于 Z,那么方差将为 0。
然而,上述的两个条件假设很难被满足,特别是在一些复杂的场景下。然而,这个里面透露出来的信息却很明确:
识别出尽可能多地影响 H(X)准确性的可观察因子 Z,是的在每一个的条件下,H(X)的方差最小;尽可能的抽取能够代表 Z 的样本,以便 Z 所带来的不确定性可以被很好地处理
尽管传统程序中覆盖引导的测试主要用于识别导致错误的输入,但结构覆盖的功效可以归因于:
覆盖统一部分程序结构的输入的同质性,所有的输入要么都能出发错误,要么都不会出发错误,对于这些同质性输入可以通过避免重复测试来提高效率;覆盖率指标反映了输入的多样性,因此可以通过提高覆盖率来找到更多的极端情况下的输入用例,从而提高测试的完整性
可以发现,结构覆盖的这两点优势与先前条件化所想要实现的目标是相似的,也就是,本文所想要尝试的条件化方法可以视作结构覆盖的一种泛化形式。
方法介绍:
先前问题分析部分已经对本工作的所需要解决的问题进行了阐述,本部分主要讨论基于交叉熵的抽样。基于置信度的分层抽样是本文在实验部分作为对照的一种采样方法,只做简单介绍。对于分类模型来说,其在预测输入 x 的标签时所给出的置信度的值作为随机变量 Z 是一个不错的选择。显然,如果分类器是可靠的,则具有较高置信度的预测将更有可能是正确的。由于置信度本身是一个有明确取值范围的标量,我们可以把它分成 k 个块,并将总体 S 分层为 k 个层次,
。最佳分层 k 的数量和样本分配比例取决于以置信度为条件的 H(X)方差的实际分布,这是没有先验知识的,需要根据经验和先导实验确定它们。
基于交叉熵的抽样:
考虑到 DNN 最后一层隐藏层的输出往往被视作从训练数据中所学习到的信息的一种表示,本文使用该层的神经元输出作为条件化下的随机变量 Z。其背后的理由有三个。第一,尽管这一层的输出仍然不是很能被人所理解,但当模型的使用环境发生变化时,这层的表示是相对稳定的。第二,DNN 预测是直接根据该层输出的线性组合得出,因此这一层的输出一定与预测准确性高度相关。第三,通常认为这一层中的神经元之间的相关性比先前的隐藏层中神经元的相关性要更小,这有助于算法中使用它们的联合分布的近似值。
然而,由于 Z 的高维特性,因此如何从整个测试集中挑选一个典型样本 T 是一项具有挑战性的任务。换句话说,目前需要解决的问题是如何从一个有限的在高维空间稀疏分布的整体中选择小规模的样本解释方差,使得这些样本足够具有代表性。
实验评估
一般来说,DNN 操作测试是为了检测在给定操作上下文中 DNN 模型的性能下降。因此,我们假设模型在训练过程是没有问题的,并不去考虑潜在的训练过程中的问题,比如欠拟合或者过拟合的问题。本文主要关注的性能下降问题包括受污染的训练集、不同的系统设置、不同的物理环境所带来的潜在影响。同时,本文还考虑目标、模型的规模和操作测试数据集的规模上的差异。如表所示,本文一共设计了 20 个实验。
实验所涉及到的模型中的神经元数量与层次信息如表所示:
实验中涉及到了三种采样方法的评估,即简单随机采样(SRS),基于置信度的分层抽样(CSS)和基于交叉熵的抽样(CES)分别对应的评估。
MINIST 数据集上的评估:
从实验结果可以看出,当训练数据集与操作数据集没有太大差异时,CSS 的效果最好,而当训练数据被变异之后,CSS 的效果相当差,其效果在训练数据集与操作数据集存在差异时非常不稳定。
另一方面,CES 方法始终优于 SRS,并且在训练数据被变异之后效果最好。在取得相同效果的情况下,CES 对于标注数据的需求量更低。
驾驶数据集上的评估:
结果表明,对于回归任务,CES 方法同样比 SRS 更为有效。并且当训练数据集与操作数据集存在差异时,其效果更为显著。
ImageNet 数据集上的评估:
与之前的结果类似,尽管 ImageNet 有多大 1000 个分类的图像数据,CES 方法在仅使用 180 个标记样本的情况下,就实现了较低的方差。这一定程度上反映了本文所述的 CES 方法在大规模的 DNN 模型上也可以获得较好的性能。
结论
在本文中,我们利用 DNN 模型学习到的对信息的表示来提高 DNN 操作测试的效率。实验部分的结果证实了我们基于交叉熵的采样方法的有效性,这可以大大降低标记数据的成本。本文另一个有趣的发现就是将结构化覆盖引导测试后的同质性和多样性目标泛化为统计分析中的降低方差的目标,并将其应用于 DNN 模型的测试中来。
当然,还有很多可能的优化方法,例如通过自适应重要性抽样进一步减少方差和减少未标记操作数据的数量。但是,对我们而言,最重要的是如何从统计意义上,整体意义上和操作环境下这些角度重新定义 DNN 中的 bug 和 debug 的概念。
致谢
本文由南京大学软件学院 2019 级博士生章许帆转述。