赞
踩
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程
在传统的软件开发体系中,从业人员编写与数据交互的逻辑来产生预期的行为,而软件测试则是帮助检测是否编写逻辑(written logic)与实际预期的行为一致。
然而,在机器学习系统中,数据经过训练,为人们所期待或需要的行为提供经验性实例,并在模型优化过程中产生系统逻辑。那么问题来了,
我们如何确保这个习得的逻辑(learned logic)能够持续产生期待的行为?
这里,我们看一下,在传统软件系统测试和高质量软件开发的实践过程中,都有哪些内容。
通常,一个典型的软件测试套路包括:
以上过程一般遵循下列惯例:
当我们针对新代码进行测试时,可以看到输出的测试报告,并验证所完成的代码更改不会影响系统的预期行为。
如果一个测试失败,我们将知道哪个特定的行为不再符合预期,还可以通过查看诸如代码覆盖率(code coverage)之类数据指标,来了解该测试的适用程度如何。
此处,可以进行一番对比,我们来看一下一个典型的机器学习模型在训练完成后,相应的模型评估报告所包含的具体内容:
所遵循的一般原则如下:
当面对一个新的机器学习模型时,我们通常会检查在验证集上跑出来的模型性能指标和对应的可视化。一般而言,我们能够比较出多个模型之间的性能并作出相对的判断,但此时还是不能立即描述具体的模型行为。
例如,定位模型失败的原因通常需要额外的调查工作。一个常见的做法是首先查看验证集上那些最严重的模型错误列表,并手动对这些失败模式进行归类。
假设我们为模型编写行为测试(下文会讨论这个内容),此时还有一个问题--我们是否进行了足够的测试?
虽然传统的软件测试有诸如运行测试代码覆盖率等指标,但当将这种应用程序逻辑从代码行数转换为机器学习模型的参数时,已经变得难以量化。
于是便要追问:我们是想要量化与输入数据分布相关的测试覆盖率,还是模型内部各种激活行为的可能性?
Odena等人引入了一种可能的覆盖率指标,旨在跟踪所有测试示例的模型日志,并量化这些激活向量的邻域内所覆盖的面积。
然而,在业界还找不出符合该论文所提及条件的完美实例。实际上,机器学习系统的测试还仅仅处于早期阶段,测试覆盖率的问题并没有被很多人真正提出并深入讨论过。
先看下基本定义:
在模型开发过程中,固然模型的评估指标是保证模型质量的必要手段,但显然还远远不够。如果没有关于具体行为的详细报告,我们仍然无法立即理解:当切换到新的模型,相应行为会产生何等的细微差别。
此外,对于之前遇到的错误,也无法跟踪,并对其进行有效的预防。对于机器学习系统来说,这些都尤其危险,因为失败常常会发生的悄无声息。
虽然可以改进总体评估指标,但是会在某些重要的子集中变得不合时宜,而又难以察觉。再者,尽管模型可以在训练期在新的数据集中看起来运行正常,却已经在不知不觉中向模型添加了一定程度的偏差。
因此,我们需要更细致的模型行为报告进行鉴别,而这正是模型测试可以发力之处。
对于机器学习系统的开发,建议从业者将模型评估和模型测试两者并重,以构建高质量的模型。
在实践中,大多数从业者将这两种方法结合在一起,其中评估指标是自动计算的,而某种程度的模型“测试”则是手动完成错误分析。事实上,开发机器学习系统的模型测试能够为错误分析提供一个系统的方法。
模型测试通常有两种类型:
训练前测试
作为不包含模型参数的测试,相关内容如下:
训练后测试
为了让我们能够理解模型行为,有必要针对训练过的模型进行测试,目的在于检查训练模型的逻辑是否合理。
这里介绍三种不错的理解行为和属性的模型测试方法,我们来一一看下。
不变性测试
不变性测试在于引入一组扰动量,但要做到使这种输入不影响模型的输出。实操上,可以使用这些扰动来产生一对一对的输入值(原始的和扰动的),并以此检查模型预测的一致性。
这种方法与数据增量的概念密切相关,意味着在训练期间对输入应用扰动,并保留原始标签。
比如,在以下两句话上运行一个情感分析模型:
此处的期待在于,仅仅改变行为主体的名字,但不会影响模型的预测。
定向期望测试
对比而言,定向期望测试,则在于对输入定义一组扰动,但这些扰动要应该对模型输出产生可预测的影响。
例如,如果对一个房价预测模型,我们可能会断言:
这里,让我们设想一个模型在这种测试中失败的场景——从验证数据集中随机抽取一行并减少某一特征特性,结果其预期价格高于原始标签。
或许这与直觉不符,于是我们决定进一步研究。最后发现,数据集的选择以非预期的方式影响了模型的逻辑,而这可不是仅仅通过检查验证集的性能指标就可以轻易发现的。
最小功能测试(数据单元测试)
正如软件单元测试旨在隔离与测试代码中基本模块一样,这里的数据单元测试,则面向特定情况中量化模型的性能测试。
这样做可以保证识别出那些导致错误的关键场景,还可以为在错误分析期间发现的故障模式编写更加泛化的数据单元测试,以保证日后可以在模型中自动搜索类似的错误。
还算幸运,目前已经有很多成型的方法存在了,以Snorkel为例,可以通过其切片函数来高效便利的识别满足某些标准的数据集的子集。
比如,可以编写一个切片函数来识别少于5个单词的句子,以评估模型在短文本片段上的执行情况。
在传统的软件测试中,通常会构建可以反映代码组织结构的测试。然而,这种方法不能很好的服务于机器学习模型,原因是由习得的参数而构成的机器学习模型逻辑已经变得非常动态,使得传统测试方法不再适用。
在这篇论文Beyond Accuracy: Behavioral Testing of NLP Models with CheckList中,作者的建议是:要针对期望模型在学习执行给定任务时获得的“技能”来构建测试。
例如,一个情感分析模型需要对下列条目有一定理解:
而一个图像识别模型,则需要认知以下概念:
不得不说,在现实中,机器学习系统的测试还是比较棘手的,因为在开发过程中无法明确的编写系统逻辑。
然而,这也并不意味着需要涉及大量手动调整,而自动化测试仍然是开发高质量软件系统的重要部分。这些测试可以为我们提供训练模型的行为报告,能够成为错误分析的系统方法。
然而,现实世界则混乱的多,开发机器学习模型还是要依赖于大量的“传统软件开发”模式,以处理数据输入、创建模型特征、执行数据扩张、设计训练模型、向外部系统公开接口,等等。
因此,对机器学习系统的有效测试,依然需要一个传统的软件测试流程(用于模型开发基础设施)和一个模型测试流程(用于训练过的模型)的有机结合。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。