教你编写一个机器学习代码也能使用的单元测试

简介: 想不想节省重新训练数据的时间?想不想让你的研究成果有个质的飞跃?来看看这些单元测试,助你一臂之力。

bb640fc167abb78bf6603d3610ffe6a2c50e6802

注:这篇文章自从发布出来,就受到读者的好评和关注,因此,我编写了一个机器学习测试库,请点击链接查看!

在过去的一年里,我花了很多时间来研究深度学习,并且也犯过很多错误,这些错误不仅帮助我对机器学习有了更加深入的理解,也让我学会了如何正确合理的设计这些系统。在Google Brain工作期间,我学到了很多设计原则,其中之一就是单元测试可以制定或打破原有的算法,并且能够节省数周的调试和训练时间。

然而,到目前为止,似乎还没有为神经网络代码编码测试单元的比较可靠的教程。即使是在OpenAI上,也只是通过一行行的盯着代码来发现bug,然后再思考导致这一bug的原因到底是什么。显然,大部分人都不愿意这么耗费时间,因此,我希望看完这个教程,你就可以开始着手测试你的系统!

我们从一个简单的例子开始:试试在这段代码中找到bug

59d990e0898c3642284a21dfa5f9312329c92eb5 

有找到bug?实际上,这个神经网络并没有进行堆叠。我在编写代码的时候,只是对slim.conv2d...)代码行做了简单的复制粘贴,然后对内核大小进行修改,而并没有实际的输入。

略微尴的来说,这其实是我上周编写的代码……是个很重要的教训!但是由于某些原因,这些bug很难被发现:

1.这段代码永远不会崩溃,或者引发错误,又或者是运行速度变慢。

2.这个神经网络仍在训练,并且损失函数会越来越小。

3.几个小时后,会收敛到某一数值,结果非常糟糕,但是,你又不知道应该修改哪里。

当唯一的反馈只有最终那个错误验证时,那么,你只有一个办法——就是搜索整个网络架构。不用再多说了,你需要的是一个更好的网络系统。

在我们对数据进行了一整天的训练以后,该如何发现这一bug呢? 我们发现,最容易注意到的是,层的值实际上从未到达函数外的任何其他张量。因此,假设我们有某种类型的损失函数和优化器,这些张量永远都不会得到优化,它们将始终保持为默认值。

通过简单的训练,我们来比较训练之前和训练之后的结果:

d269d07a386ecda077ee4bdc26b5a9b9088d9eca 

在这不到15行的代码中,我们基本上验证了训练过的所有的变量。

这个测试非常简单、实用。现在,假设我们已经修复了上一个问题,现在,添加一些批量优化,看看是否能发现这一bug

8d25fea60a02ca90edafc1bfab13d8656d4b6d00 

看到了没?这个非常微妙。在tensorflow中,batch_norm实际上将is_training默认为False,所以添加这行代码并不能在训练期间将输入规范化!值得庆幸的是,我们编写的最后一个单元测试将会立刻找到这个问题!

我们来看另外一个例子,来自于reddit的一个帖子:该作者想创建一个分组器,其输出范围为(0,1),你是否能够找出其中的bug

873e37506725220ab60e3af7de1c5b1d2961aa73 

这个bug很难发现,并且稍不注意就会导致特别混乱的结果。基本上,这个预测只有一个输出,当你使用softmax交叉熵时,总会导致损失函数为0

测试这段代码最简单的方法就是——确保损失函数永远不为0

8d25fea60a02ca90edafc1bfab13d8656d4b6d00 

这个测试类似于我们的第一个测试,唯一不同的就是回退。在这个测试中,你可以确保只训练你想要训练的变量。拿生成对抗网络来(GAN)说,常常出现的bug就是忘记在优化期间训练了哪些变量,类似这种的bug经常会发生。

a27e7a1424ad8df19d30f1a930d87e100dc87d6c 

这其中最大的问题就是:优化器有一个默认设置来优化所有的变量。对于类似于对抗生成网络的架构来说,这是对所有训练时间判了一个死刑。在这里,使用下面的测试代码,你就可以轻松检测到这些bug

18d4347af768f69554a13391d0727191c7bed522 

同样,我们也可以为鉴别器或其它强化学习算法编写类似的测试代码。很多演员-评论模型都有自己相对独立的网络,需要通过不同的损失进行优化。

为了你在阅读完本文后,能够更好的进行测试,我认为以下几个建议很重要:

1.保证测试的确定性。如果你真的想要随机输入数据,那么,请确保输入的随机性,以便于轻松的完成测试。

2.保证测试的简短性。一定要有能够训练收敛并检查验证集的单元测试,否则你就是在浪费时间。

3.确保在每次测试前重置图表。

总之,还会有很多测试方法可以测试这些算法。花一个小时的时间来编写一个测试代码,不仅可以帮你节省重新训练的时间,还能够大大改善你的研究成果!

  数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

以上为译文。

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《How to unit test machine learning code》,译者:Mags,审校:袁虎。

文章为简译,更为详细的内容,请查看原文 

相关文章
|
3月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
104 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
3月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
17天前
|
算法 Java 测试技术
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
46 13
|
2月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
46 6
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
76 1
|
2月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
36 1
|
2月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
65 2
|
2月前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
3月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
257 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
2月前
|
机器学习/深度学习 数据采集 人工智能
自动化测试的未来:AI与机器学习的融合之路
【10月更文挑战第41天】随着技术的快速发展,软件测试领域正经历一场由人工智能和机器学习驱动的革命。本文将探讨这一趋势如何改变测试流程、提高测试效率以及未来可能带来的挑战和机遇。我们将通过具体案例分析,揭示AI和ML在自动化测试中的应用现状及其潜力。
55 0