如何单元测试机器学习代码

发表于:2017-11-02 16:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:fastai    来源:51Testing软件测试网采编

  过去一年,我花了大部分时间做深度学习的研究和实习。 那一年的很多时候都犯了很大的错误,帮助我不仅仅学习机器学习方面,而且还包括如何正确和健全地对这些系统进行工程设计。我在Google Brain期间学到的主要原则之一是单元测试可以成就或破坏您的算法,并可以节省您几周的调试和训练时间。
  然而,似乎没有一个实用的如何实际编写神经网络代码的单元测试的线上教程。 即使像OpenAI这样的地方也只是通过盯着他们的每一行代码来发现错误,并试着想出为什么会造成一个错误。 显然,我们大多数人没有这种时间或自我批判,所以希望这个教程可以帮助你开始理智地测试你的系统!
  我们先来一个简单的例子。 尝试找到此代码中的错误。
  你看到吗?网络实际上并不是堆叠的。当我编写这段代码时,我复制并粘贴了slim.conv2d(...)行,只修改了内核大小,从来没有实际输入。
  我很尴尬地说,这实际上在一个星期前发生在我身上......但这是一个重要的教训! 由于几个原因,这些错误真的很难发现。
  此代码不会崩溃,引起错误,甚至减慢。
  这个网络还在训练,损失依然会下降。
  值在几个小时后收敛,但是结果真的很差,让您对着你要修复的事情头皮发麻。
  当您唯一的反馈是最终验证错误时,您唯一需要搜索的地方就是整个网络架构。 不用说,你需要一个更好的系统。
  那么在我们进行一个全面的多日训练之前,我们怎么才能实现这个目标呢? 那么最简单的一点就是,这些层的值从来没有实际上达到功能之外的任何其他张量。 所以假设我们有一些类型的损失函数和优化器,这些张量永远不会被优化,所以它们将始终具有默认值。
  我们可以通过简单训练步骤和比较他们的前后来检测它。
  嘭。。。 在不到15行的代码中,我们现在已经验证了至少我们创建的所有变量都已经被训练了。
  这个测试超级简单和超级有用。 假设我们修改了上一个问题,现在我们要开始添加一些批处理归一化。 看看是否可以发现错误。
  你看到了吗?这是超级微妙的。你看,在tensorflow 批处理归一化中有训练产生的错误,所以加入这行代码不会真正规范你在训练中的输入!
  谢天谢地,我们编写的最后一个单元测试将立即捕捉到这个问题!(我知道,因为这是3天前发生在我身上的事)。
  让我们再举一个例子。这实际上来自有一天我看到的书签交易帖子。我不会涉及太多的细节,但基本上,这个人想创建一个分类器,给出的输出范围为(0,1)。看看你能不能找到错误。
  注意这个bug? 这一次真的很难找到,可以导致超级混乱的结果。 基本上这里发生的是,预测只有一个输出,当您将softmax交叉熵施加到其上时,会导致损失总是为0。
  一个简单的方法来测试这个情况是很好的...确保损失永远不会为0。
  另一个很好的测试类似于我们的第一个测试,但是向后。 你可以确保只有你想训练的变量才能得到训练。 以GAN为例。 出现的常见错误之一是意外地忘记在哪个优化过程设定哪些变量去训练。 像这样的代码一直发生。
  最大的问题是优化器有一个优化所有的变量的默认设置。 像GAN这样的架构,意味着对你所有训练时间的判处死刑。 但是,您可以通过写一个这样的测试轻松检测到这些错误:
  可以为判别器写入非常类似的测试。 同样的测试也可用于大量的强化学习算法。 许多演员评论家模型有不同的网络需要被不同的损失优化。
  以下是我推荐的测试样式。
  保持确定性。 这真的很可能让测试以奇怪的方式失败,只能永远无法重新创建它。 如果您真的想要随机输入,请确保随机播放数字,以便您轻松重新运行测试。
  保持测试简短。 没有一个单元测试训练到收敛和检查验证集。 如果你这样做,就是在浪费自己的时间。
  确保在每个测试之间重置图形。
  总而言之,这些黑盒算法仍然有很多方法要被测试! 花一个小时编写测试可以节省您重新训练会话的时间,并可以大大改善您的研究。你 不会因为我们的实施是错误的而扔掉完美的想法吧?
  这个清单显然不全面,但这是一个可靠的开始! 如果您发现有用的额外的建议或具体的测试,请在twitter上给我发消息! 我很想做这个的第二部分。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号