简介:复现性/一致性是计算科学研究的基本要求,机器学习也不例外。机器学习研究论文无疑是一笔宝贵的财富。这些论文可以用来启发未来的研究;它们可以成为学生有用的教学工具;他们可以为工业应用研究人员提供指导。也许最重要的是,它们可以帮助我们回答关于人类生存的一些最基本的问题:例如,学习的真正含义是什么?成为人类意味着什么?虽然可重复性在科学研究中并不总是可能的,但它是提高研究质量的有力标准。如果研究结果可以重现,则证明研究结果可能更稳健、更有意义,至少消除了很多由实验者造成的错误(如篡改或意外结果)。然而,许多现有的机器学习研究成果要么不可重现,要么难以重现。如何保证研究结果的可靠性和可重复性,是众多机器学习研究者致力于解决的问题。甚至在2017年的ICML上,还专门组织了一个名为“ReproducibilityinMachineLearning”的workshop,讨论机器学习研究成果的可再现性和可复制性。为什么机器学习研究很难重现?看看GoogleTensorFlow团队的深度学习工程师PeteWarden是怎么说的。PeteWarden的文章发表后,许多研究机器学习的工程师和研究人员表示赞同,包括GoogleBrain研究员、SketchRNN之父DavidHa(@hardmaru),他也默默转发了他的推文。我的一个朋友开了一家机器学习初创公司,最近遇到了一些麻烦。他们的机器学习模型一团糟,当他的团队想要基于它们构建某些东西或向客户展示它们时,出现了严重的问题。有时,即使是模型的原作者也无法正常运行他创建的模型,或者得到与之前相同的结果。他向我提出了解决方案,但我不得不承认我在工作中遇到了同样的问题。很难向不了解机器学习的人解释这些东西,我们又回到了不使用代码版本控制系统和从头开始训练模型的日子,尽管有时感觉这样做很糟糕所以。我在90年代中期开始编码,当时Microsoft的VisualSourceSafe是标准的代码版本控制系统。为了提供良好的体验,不支持提交代码原子操作,所以多个开发者不能同时修改同一个文件。晚上需要扫描和复印,以免意外冲突,但即使这样也不能保证早上数据库就完整了。只能说我很幸运,我的团队准备了一堵墙,他们在墙上贴了便利贴,每条便利贴对应项目中的一个文件。当开发人员要修改文件时,他会拿走相应的便利贴,修改完成后将便利贴放回原位。在版本控制系统面前可以说是无所畏惧。我曾经使用过一些非常糟糕的系统,如果有必要,我什至能够使用同步工具自己修改一些解决方案。但即便如此,当涉及到机器学习开发中的变更跟踪和协作时,我可以诚实地说我已经束手无策了。为了解释这一点,让我们看一下典型的机器学习模型生命周期:研究人员想要尝试一种新的图像分类架构。她从以前的项目中复制了一些代码来处理输入数据集。数据集存放在网络上的一个文件目录下,可能是从ImageNet上下载的,但不清楚是哪个目录。在某些时候,有人可能删除了一些非JPEG图像,或进行了一些其他小的编辑,但没有编辑历史记录。她找到了修复错误和调整算法的方法。这些更改都是在她的本地机器上进行的,她需要将大量代码复制到GPU集群中才能训练模型。她训练了几次模型,并在本地机器上继续修改代码,因为训练一个模型需要几天甚至几周的时间。训练快结束时可能出现了错误,她很快修改了其中一个文件并将其复制到集群中的机器上。她可能已经根据刚刚修改的代码使用从某个培训中获得的半成品权重进行新的培训。由于时间关系,她评估了这几次的训练结果,最终选择了其中一个作为最终发布的模型,但这个模型可能是用不同的代码训练出来的。她将代码提交到版本控制系统中她的个人目录。她发布代码和模型。在研究人员足够谨慎的情况下,这已经是一个乐观的情况,但你已经可以想象,如果换一个人,要重复上述步骤并确保同样的结果是多么困难。上述每个步骤都可能不一致,更不用说机器学习框架有时会在性能和数值精度之间做出权衡。即使有人可以一步步重复上面的步骤,还是会有不同的结果。.大多数时候,研究人员可能不会跟踪他们所做的事情,因此他们无法生成相同的模型。就算她把所有的步骤都写下来重新执行,因为框架随时都在变,她必须记录这个系统的快照,才能和之前的模型保持一致。我已经联系研究人员重新生成模型,他们非常慷慨,但通常需要几个月的时间,即使他们是模型的原始作者也是如此。为什么一致性如此重要?我有几个朋友告诉我,他们在写论文时不知道如何重现模型。如果他们不能得到与原作者相同的准确率,他们如何让别人相信他们的新方法是对原始方法的改进?如果您没有办法完全重建模型以响应不断变化的需求或平台,那么在生产中严重依赖现有模型是很正常的。在进行研究实验时,这也是一个大问题,因为代码更改和训练数据很难回滚。尝试执行上述步骤时可能会有更多的风险,就像不使用版本控制系统会增加代码更改的成本一样。当然,事情并没有那么惨淡,社区正在这方面努力解决模型一致性问题。我最喜欢的项目之一是由TobyBoyd领导的TensorFlowBenchmarks部门项目(https://www.tensorflow.org/performance/benchmarks)。这个团队的使命不仅仅是实现如何在多个平台上快速训练一些当前的主流模型,还要让这些模型达到足够高的准确率。我亲眼目睹了他为了提高模型的准确率而辛辛苦苦挥汗如雨,因为以上所有步骤都可能影响结果,而且没有简单的调试方法,即使有模型原作者的帮助。这似乎是一项无休止的工作,TensorFlow框架发生变化,GPU驱动程序发生变化,数据集发生变化,所有这些都会影响结果。Toby的团队可以帮助我们发现和修复TensorFlow的变化导致的bug,发现外部依赖导致的问题,但仍然很难扩展。我也知道一些团队对在生产系统中使用机器学习模型非常谨慎。他们花费了大量的时间和精力来确保训练模型的一致性,但问题是这个过程仍然是手动的。没有版本控制系统或公认的最佳实践可以确保该模型在未来仍会产生相同的结果。我暂时想不出更好的方法,但在尝试解决这个问题时,可以遵循以下一些原则:新想法需要足够容易让研究人员理解,而不需要研究人员花费太多时间和精力。能源,否则他们可能根本不愿意使用这些系统。理想情况下,这些系统应该可以帮助他们大大提高效率。如果研究人员不小心被车撞了(大错,划掉)离开去创业,需要确保即使是第二天加入的新研究人员也可以重新训练他们之前创建的模型并获得相同的结果。的结果。应该有某种方法可以将训练模型所需的元素打包成一个包,可以在不泄露模型作者不希望公开的历史细节的情况下共享。要重现结果、代码、训练数据和整个平台,都需要准确记录。我见过几个开源社区和初创公司在解决这个问题。我也迫不及待地想用我的余生来解决这个问题,但不太可能很快找到一个完整的解决方案。在训练模型这件事上,我们需要改变,就像版本控制系统的出现给我们编码过程带来的巨大改变一样。在尝试重现机器学习研究的结果时,您踩过哪些陷阱?你是不是也想吐槽机器学习结果难以复现?欢迎留言分享你的看法。原文链接:https://petewarden.com/2018/03/19/the-machine-learning-reproducibility-crisis/
