如何有效测试机器学习系统(上)

前言

作者Jeremy Jordan,是一位机器学习工程师,也是 PyTorch Lightning项目的核心成员。

他谈及在进行该项目的维护工作时,对软件开发中的测试价值有了更新的一层认识;同时,对于如何才是有效测试这一主题,

在参考大量相关题材的论文基础之上,结合自己的项目实践和对应的思考,完成了这一篇干货满满的心得。应该说,这篇心得写的入情入理,对于相关从业者颇具参考意义。

具体而言,在这篇博客文章中,作者讨论了传统软件开发中的测试内容,为什么机器学习系统的测试会有所不同,并专门为机器学习系统编写了有效的测试策略。

而且,作为模型开发过程的一部分,该博文同时也阐明并评估了那些与测试环节密切相关的各个元素的作用。

在这篇博客文章的最后,作者期待读者能够到了解到如何有效的测试机器学习系统,并认同这其中体现的价值。

本文主体转译自这篇技术博客,Effective testing for machine learning systems.

(https://www.jeremyjordan.me/testing-ml/)

测试机器学习系统有什么不同?

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

然而,在机器学习系统(software 2.0)中,数据经过训练,为人们所期待或需要的行为提供经验性实例,并在模型优化过程中产生系统逻辑。那么问题来了,我们如何确保这个习得的逻辑(learned logic)能够持续产生期待的行为?

传统软件开发中的测试

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

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

  • 单元测试(unit tests):在开发过程中,对最小可测试单元,比如一个模块、一个函数或者一个类,进行检查和验证,该过程通常可以快速运行

  • 回归测试(regression tests):在修改旧代码之后,重新进行测试以确认修改没有引入新的错误,或导致其他代码产生错误

  • 集成测试(integration tests),将所有模块按照设计要求,如根据结构图,组装成为子系统或系统,进行测试,由于涉及观察并检测代码中诸多个组件的高级行为,通常需要较长时间

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

  • 除非所有测试都通过,否则不要合并代码

  • 在编写代码时,一定要为新引入的逻辑编写测试,

  • 当修复了一个bug时,一定要编写一个测试来预防这一类bug的复发

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

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

机器学习系统开发中的测试

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

  • 内容数据指标在验证集上的性能表现

  • 模型效果指标的可视化,如准确率,召回率等

  • 模型运行方面的统计数据,如推理速度

  • 模型推断中的不适用性,如在哪里出错最多

所遵循的一般原则如下:

  • 保存所有用于训练模型的超参数,

  • 当对同一数据集进行评估时,只选择那些对现有模型(或常规基准)有改进的新模型

当面对一个新的机器学习模型时,我们通常会检查在验证集上跑出来的模型性能指标和对应的可视化。

一般而言,我们能够比较出多个模型之间的性能并作出相对的判断,但此时还是不能立即描述具体的模型行为。

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

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

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

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

Odena等人引入了一种可能的覆盖率指标,旨在跟踪所有测试示例的模型日志,并量化这些激活向量的邻域内所覆盖的面积。然而,在工业界还找不出符合该论文所提及条件的完美实例。实际上,机器学习系统的测试还仅仅处于早期阶段,测试覆盖率的问题并没有被很多人真正提出并深入讨论过。

(http://proceedings.mlr.press/v97/odena19a/odena19a.pdf)

模型测试和模型评估

先看下基本定义:

  • 模型评估,涵盖总结验证集或测试集上的性能指标和相应的可视化

  • 模型测试:包含对模型中所期待达到的行为进行显式检查

在模型开发过程中,固然模型的评估指标是保证模型质量的必要手段,但显然还远远不够。

如果没有关于具体行为的详细报告,我们仍然无法立即理解:当切换到新的模型,相应行为会产生何等的细微差别。

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

虽然可以改进总体评估指标,但是会在某些重要的子集中变得不合时宜,而又难以察觉。

再者,尽管模型可以在训练期在新的数据集中看起来运行正常,却已经在不知不觉中向模型添加了一定程度的偏差。

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

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

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

本文结语

实际上,机器学习系统的测试还仅仅处于早期阶段,测试覆盖率的问题并没有被很多人真正提出并深入讨论过。

那么如何才是对该主题的一番真正探索,欲知后事如何,且看下文分解

猜你喜欢

转载自blog.csdn.net/qq_40433634/article/details/109390553