前言
上篇言过,处于早期阶段的机器学习系统的测试方法,还有很大的发展空间,此中涉及的方向也不在少数,
在讨论过模型评估和模型测试之后,我们来看看如何将这些方法的进行结合与实践。
如何编写模型测试
模型测试通常有两种类型:
-
训练前测试(Pre-train tests), 扫除早期错误,力求训练前错误最少,减少不必要模型训练时间
-
训练后测试(Post-train tests),使用训练出来的模型,进行场景化的行为鉴别
训练前测试
作为不包含模型参数的测试,相关内容如下:
-
检查模型输出的形式,确保与数据集的标签一致
-
检查输出范围并确保与期望一致(比如,分类模型的输出应该是一个概率分布)
-
保证每一梯度步骤在每一批量数据上的效果是损失减小的
-
对数据集进行合理断言
-
检查训练集和验证集的标签完整性
训练后测试
为了让我们能够理解模型行为,有必要针对训练过的模型进行测试,目的在于检查训练模型的逻辑是否合理。
这里推荐一篇论文: Beyond Accuracy: Behavioral Testing of NLP Models with CheckList.
(https://homes.cs.washington.edu/~marcotcr/acl20_checklist.pdf)
文中介绍了三种不错的理解行为和属性的模型测试方法,我们来一一看下。
不变性测试
不变性测试在于引入一组扰动量,但要做到使这种输入不影响模型的输出。
实操上,可以使用这些扰动来产生一对一对的输入值(原始的和扰动的),并以此检查模型预测的一致性。
这种方法与数据增量的概念密切相关,意味着在训练期间对输入应用扰动,并保留原始标签。
比如,在以下两句话上运行一个情感分析模型:
-
马克是一个伟大的教练。(Mark was a great instructor.)
-
萨曼莎是个很棒的教练。(Samantha was a great instructor.)
此处的期待在于,仅仅改变行为主体的名字,但不会影响模型的预测。
定向期望测试
对比而言,定向期望测试,则在于对输入定义一组扰动,但这些扰动要应该对模型输出产生可预测的影响。
例如,如果对一个房价预测模型,我们可能会断言:
-
增加浴室的数量(保持所有其他功能不变)不应该导致价格下降
-
降低房子的面积(保持所有其他特征不变)不应该导致价格上涨
这里,让我们设想一个模型在这种测试中失败的场景——从验证数据集中随机抽取一行并减少某一特征特性,
结果其预期价格高于原始标签。或许这与直觉不符,于是我们决定进一步研究。
最后发现,数据集的选择以非预期的方式影响了模型的逻辑,而这可不是仅仅通过检查验证集的性能指标就可以轻易发现的。
最小功能测试(数据单元测试)
正如软件单元测试旨在隔离与测试代码中基本模块一样,这里的数据单元测试,则面向特定情况中量化模型的性能测试。
这样做可以保证识别出那些导致错误的关键场景,还可以为在错误分析期间发现的故障模式编写更加泛化的数据单元测试,以保证日后可以在模型中自动搜索类似的错误。
还算幸运,目前已经有有很多成型的方法存在了,以Snorkel为例,可以通过其切片函数来高效便利的识别满足某些标准的数据集的子集。
(https://www.snorkel.org/use-cases/03-spam-data-slicing-tutorial)
比如,可以编写一个切片函数来识别少于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)
机器学习模型开发流程
把上述所谈的各种方法与元素 放在一起,这时就可以修改我们在本系列第一篇中提及的模型开发流程了,包括训练前和训练后的测试。
这些测试输出可以与模型评估报告一起显示,以便在流程的最后一步能够进行审查。
当然,根据训练模型各自的性质,以及某些指定标准,可以选择是否进行自动化审批。
结论
不得不说,在现实中,机器学习系统的测试还是比较棘手的,因为在开发过程中无法明确的编写系统逻辑。
然而,这也并不意味着需要涉及大量手动调整,而自动化测试仍然是开发高质量软件系统的重要部分。
这些测试可以为我们提供训练模型的行为报告,能够成为错误分析的系统方法。
在这篇博客文章中,作者将“传统软件开发”和“机器学习模型开发”分隔为两个相对独立的概念,这种简化使得测试机器学习系统相关的讨论变得容易;。
然而,现实世界则混乱的多,开发机器学习模型还是要依赖于大量的“传统软件开发”模式,以处理数据输入、创建模型特征、执行数据扩张、设计训练模型、向外部系统公开接口,等等。
因此,对机器学习系统的有效测试,依然需要一个传统的软件测试流程(用于模型开发基础设施)和一个模型测试流程(用于训练过的模型)的有机结合。
期待本文能够为相关从业者的工作提供 些许参考,同时也欢迎广大的读者多多共享自己在工作中的心得。