当前位置:   article > 正文

AI-如何有效测试机器学习模型_机器学习测试

机器学习测试

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程

测试机器学习模型有什么不同?

在传统的软件开发体系中,从业人员编写与数据交互的逻辑来产生预期的行为,而软件测试则是帮助检测是否编写逻辑(written logic)与实际预期的行为一致。

然而,在机器学习系统中,数据经过训练,为人们所期待或需要的行为提供经验性实例,并在模型优化过程中产生系统逻辑。那么问题来了,

我们如何确保这个习得的逻辑(learned logic)能够持续产生期待的行为?

传统软件开发中的测试

这里,我们看一下,在传统软件系统测试和高质量软件开发的实践过程中,都有哪些内容。

通常,一个典型的软件测试套路包括:

  • 单元测试(unit tests):在开发过程中,对最小可测试单元,比如一个模块、一个函数或者一个类,进行检查和验证,该过程通常可以快速运行
  • 回归测试(regression tests):在修改旧代码之后,重新进行测试以确认修改没有引入新的错误,或导致其他代码产生错误
  • 集成测试(integration tests),将所有模块按照设计要求,如根据结构图,组装成为子系统或系统,进行测试。由于涉及观察并检测代码中诸多个组件的高级行为,通常需要较长时间

以上过程一般遵循下列惯例

  • 除非所有测试都通过,否则不要合并代码
  • 在编写代码时,一定要为新引入的逻辑编写测试
  • 当修复了一个bug时,一定要编写一个测试来预防这一类bug的复发

当我们针对新代码进行测试时,可以看到输出的测试报告,并验证所完成的代码更改不会影响系统的预期行为。

如果一个测试失败,我们将知道哪个特定的行为不再符合预期,还可以通过查看诸如代码覆盖率(code coverage)之类数据指标,来了解该测试的适用程度如何。

机器学习系统中的测试

此处,可以进行一番对比,我们来看一下一个典型的机器学习模型在训练完成后,相应的模型评估报告所包含的具体内容:

  • 内容数据指标在验证集上的性能表现
  • 模型效果指标的可视化,如准确率,召回率等
  • 模型运行方面的统计数据,如推理速度
  • 模型推断中的不适用性,如在哪里出错最多

所遵循的一般原则如下:

  • 保存所有用于训练模型的超参数
  • 当对同一数据集进行评估时,只选择那些对现有模型(或常规基准)有改进的新模型

当面对一个新的机器学习模型时,我们通常会检查在验证集上跑出来的模型性能指标和对应的可视化。一般而言,我们能够比较出多个模型之间的性能并作出相对的判断,但此时还是不能立即描述具体的模型行为。

例如,定位模型失败的原因通常需要额外的调查工作。一个常见的做法是首先查看验证集上那些最严重的模型错误列表,并手动对这些失败模式进行归类。

假设我们为模型编写行为测试(下文会讨论这个内容),此时还有一个问题--我们是否进行了足够的测试?

虽然传统的软件测试有诸如运行测试代码覆盖率等指标,但当将这种应用程序逻辑从代码行数转换为机器学习模型的参数时,已经变得难以量化。

于是便要追问:我们是想要量化与输入数据分布相关的测试覆盖率,还是模型内部各种激活行为的可能性?

Odena等人引入了一种可能的覆盖率指标,旨在跟踪所有测试示例的模型日志,并量化这些激活向量的邻域内所覆盖的面积。

然而,在业界还找不出符合该论文所提及条件的完美实例。实际上,机器学习系统的测试还仅仅处于早期阶段,测试覆盖率的问题并没有被很多人真正提出并深入讨论过。

模型测试和模型评估

先看下基本定义:

  • 模型评估:涵盖总结验证集或测试集上的性能指标和相应的可视化
  • 模型测试:包含对模型中所期待达到的行为进行显式检查

在模型开发过程中,固然模型的评估指标是保证模型质量的必要手段,但显然还远远不够。如果没有关于具体行为的详细报告,我们仍然无法立即理解:当切换到新的模型,相应行为会产生何等的细微差别。

此外,对于之前遇到的错误,也无法跟踪,并对其进行有效的预防。对于机器学习系统来说,这些都尤其危险,因为失败常常会发生的悄无声息。

虽然可以改进总体评估指标,但是会在某些重要的子集中变得不合时宜,而又难以察觉。再者,尽管模型可以在训练期在新的数据集中看起来运行正常,却已经在不知不觉中向模型添加了一定程度的偏差。

因此,我们需要更细致的模型行为报告进行鉴别,而这正是模型测试可以发力之处。

对于机器学习系统的开发,建议从业者将模型评估和模型测试两者并重,以构建高质量的模型。

在实践中,大多数从业者将这两种方法结合在一起,其中评估指标是自动计算的,而某种程度的模型“测试”则是手动完成错误分析。事实上,开发机器学习系统的模型测试能够为错误分析提供一个系统的方法。

如何编写模型测试

模型测试通常有两种类型:

  • 训练前测试(Pre-train tests), 扫除早期错误,力求训练前错误最少,减少不必要模型训练时间
  • 训练后测试(Post-train tests),使用训练出来的模型,进行场景化的行为鉴别

训练前测试

作为不包含模型参数的测试,相关内容如下:

  • 检查模型输出的形式,确保与数据集的标签一致
  • 检查输出范围并确保与期望一致(比如,分类模型的输出应该是一个概率分布)
  • 保证每一梯度步骤在每一批量数据上的效果是损失减小的
  • 对数据集进行合理断言
  • 检查训练集和验证集的标签完整性

训练后测试

为了让我们能够理解模型行为,有必要针对训练过的模型进行测试,目的在于检查训练模型的逻辑是否合理。

这里介绍三种不错的理解行为和属性的模型测试方法,我们来一一看下。

不变性测试

不变性测试在于引入一组扰动量,但要做到使这种输入不影响模型的输出。实操上,可以使用这些扰动来产生一对一对的输入值(原始的和扰动的),并以此检查模型预测的一致性。

这种方法与数据增量的概念密切相关,意味着在训练期间对输入应用扰动,并保留原始标签。

比如,在以下两句话上运行一个情感分析模型

  1. 马克是一个伟大的教练。(Mark was a great instructor.)
  2. 萨曼莎是个很棒的教练。(Samantha was a great instructor.)

此处的期待在于,仅仅改变行为主体的名字,但不会影响模型的预测。

定向期望测试

对比而言,定向期望测试,则在于对输入定义一组扰动,但这些扰动要应该对模型输出产生可预测的影响。

例如,如果对一个房价预测模型,我们可能会断言:

  1. 增加浴室的数量(保持所有其他功能不变)不应该导致价格下降
  2. 降低房子的面积(保持所有其他特征不变)不应该导致价格上涨

这里,让我们设想一个模型在这种测试中失败的场景——从验证数据集中随机抽取一行并减少某一特征特性,结果其预期价格高于原始标签。

或许这与直觉不符,于是我们决定进一步研究。最后发现,数据集的选择以非预期的方式影响了模型的逻辑,而这可不是仅仅通过检查验证集的性能指标就可以轻易发现的。

最小功能测试(数据单元测试)

正如软件单元测试旨在隔离与测试代码中基本模块一样,这里的数据单元测试,则面向特定情况中量化模型的性能测试。

这样做可以保证识别出那些导致错误的关键场景,还可以为在错误分析期间发现的故障模式编写更加泛化的数据单元测试,以保证日后可以在模型中自动搜索类似的错误。

还算幸运,目前已经有很多成型的方法存在了,以Snorkel为例,可以通过其切片函数来高效便利的识别满足某些标准的数据集的子集。

比如,可以编写一个切片函数来识别少于5个单词的句子,以评估模型在短文本片段上的执行情况。

构建测试

在传统的软件测试中,通常会构建可以反映代码组织结构的测试。然而,这种方法不能很好的服务于机器学习模型,原因是由习得的参数而构成的机器学习模型逻辑已经变得非常动态,使得传统测试方法不再适用。

在这篇论文Beyond Accuracy: Behavioral Testing of NLP Models with CheckList中,作者的建议是:要针对期望模型在学习执行给定任务时获得的“技能”来构建测试

例如,一个情感分析模型需要对下列条目有一定理解:

  • 词汇和词类(vocabulary and parts of speech)
  • 稳健的抗噪声性(robustness to noise)
  • 识别命名实体(identifying named entities)
  • 时间关系(emporal relationships)
  • 语法中的否定含义(negation of words)

而一个图像识别模型,则需要认知以下概念:

  • 对象旋转(object rotation)
  • 局部阻塞/遮挡(partial occlusion)
  • 视角转变(perspective shift)
  • 照明条件(lighting conditions)
  • 气候相状,如雨、雪、雾(weather artifacts ,e.g.,rain, snow, fog)
  • 相机虚像,如ISO噪声,运动模糊(camera artifacts ,e.g.,ISO noise, motion blur)

结论

不得不说,在现实中,机器学习系统的测试还是比较棘手的,因为在开发过程中无法明确的编写系统逻辑。

然而,这也并不意味着需要涉及大量手动调整,而自动化测试仍然是开发高质量软件系统的重要部分。这些测试可以为我们提供训练模型的行为报告,能够成为错误分析的系统方法。

然而,现实世界则混乱的多,开发机器学习模型还是要依赖于大量的“传统软件开发”模式,以处理数据输入、创建模型特征、执行数据扩张、设计训练模型、向外部系统公开接口,等等。

因此,对机器学习系统的有效测试,依然需要一个传统的软件测试流程(用于模型开发基础设施)和一个模型测试流程(用于训练过的模型)的有机结合。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/726908
推荐阅读
相关标签
  

闽ICP备14008679号