导读:可重现性 / 一致性是计算科学研究的一项基本要求,机器学习也不例外。
机器学习研究论文毫无疑问是一笔宝贵的资产。这些论文可以用来启发未来的研究;它们可以成为对学生有用的教学工具;它们可以为工业界的应用研究人员提供指导。也许最重要的是,它们可以帮助我们回答那些有关人类存在的最基本的问题:比如,学习到底是什么意思?人类的存在意味着什么?虽然可重现性在科学研究中并不总能够做到,但它是提高研究质量的有力标准。如果研究结果可重现,那就证明这个研究结果有可能更稳健、更有意义,至少排除了许多由实验者带来的错误(比如弄虚作假或偶然得出的结果)。
然而,现有的很多机器学习研究结果要么不可重现,要么难以重现。如何确保研究成果的可靠性和可重现性,是很多机器学习研究者致力于解决的问题。甚至在 2017 年的 ICML 上,还专门组织了一场名为“Reproducibility in Machine Learning”的 Workshop,以探讨机器学习研究结果的可重现性和可复制性问题。
为什么机器学习研究重现起来那么难?来看看在谷歌 TensorFlow 团队研究深度学习的工程师 Pete Warden 怎么说。
Pete Warden 的文章发出后,很多正在研究机器学习的工程师、研究员纷纷表示赞同,包括谷歌大脑研究员、SketchRNN 的爸爸 David Ha(@hardmaru)也默默转发了他的推文。
我从 90 年代中期开始我的代码生涯,那个时候,微软的 Visual SourceSafe 是标准的代码版本控制系统。为了提供良好的体验,它不支持提交代码原子操作,所以多个开发者不能同时修改同一个文件。在晚上的时候需要进行扫描和拷贝,避免出现意外的冲突,但即使是这样,也无法保证在早上的时候数据库是完整的。只能说我足够幸运,我所在的团队准备了一面墙,他们在墙上贴上便条,每张便条对应项目里的一个文件。当某个开发人员想要修改某个文件时,就拿走对应的便条,等改完了再把便条放回去。
可以说,在版本控制系统面前,我是毫无畏惧的。我曾经使用过一些非常糟糕的系统,如果有必要,我甚至可以使用同步工具自己捣鼓出一些解决方案。但即使是这样,在机器学习开发的变更跟踪和协作这个问题上,我可以非常坦诚地说,我也是束手无措。
为了解释这个问题,先来看看典型的机器学习模型生命周期:
- 研究人员想尝试一个新的图像分类架构。
- 她从之前的项目拷贝了一些代码用于处理输入数据集。
- 数据集存放在网络上的某个文件目录下,有可能是从 ImageNet 上下载下来的,但不清楚是哪个目录。在某个时候,可能有人移除了部分非 JPEG 格式的图像,或者做了其他一些细微的修改,但没有留下任何修改历史。
- 她想方设法修复 bug,并调整算法。这些变更都发生在她的本地机器上,为了训练模型,她需要把大量的代码拷贝到 GPU 集群上。
- 她反复训练了几次模型,并在本地机器上继续修改代码,因为训练一次模型需要几天甚至几周的时间。
- 在训练接近尾声时可能出现了 bug,她就在赶紧修改了其中一个文件,并把它拷贝到集群的机器上。
- 她可能将某一次训练得到的半成品权重用在了新的训练上,而新的训练是基于刚修改过的代码。
- 因为时间的关系,她评估了这几次的训练结果,并选择其中一个作为最终要发布的模型,但这个模型有可能是使用不同的代码训练出来的。
- 她把代码提交到版本控制系统的个人目录下。
- 她把代码和模型发布出来。
这已经是当研究人员足够小心谨慎时的一种比较乐观的情况了,但你已经可以想象到,如果换了另外一个人,要重复上面这些步骤,并保证得到同样的结果,会有多难。上述的每一个步骤都有可能出现不一致,更何况机器学习框架有时候会在性能和数字准确性之间做出权衡,就算真的有人可以按部就班地重复上述的步骤,仍然会出现不一样的结果。
大多数情况下,研究人员可能没有记下自己都做了些什么,所以无法生成同样的模型。即使她记下了所有步骤,并再次执行这些步骤,但因为框架会随时发生变化,她必须记录下这个系统的快照,才有可能做到与之前的模型保持一致。我曾经找研究人员帮忙,让他们重新生成模型,他们很慷慨,但通常需要花上几个月时间,即使他们是模型的原作者。
为什么一致性这么重要?我有几个朋友跟我说,他们在写论文时不知道该如何重现模型。如果他们无法得到与原作者一样的准确率,那么该如何说服别人自己的新方法是对原有方法的改进呢?如果你没有办法为了应对变更的需求或平台完全重建一个模型,那么重度依赖生产系统已有的模型也是很正常的。在进行研究实验时,这也是个大问题,因为代码变更和训练数据很难进行回滚。在尝试执行上述的那些步骤时,可能存在更多的风险,这就好比不使用版本控制系统会增加代码变更所带来的成本。
当然,事情也不是那么悲观,社区正在这方面做出努力,以解决模型的一致性问题。其中我最喜欢的是由 Toby Boyd 领导的 TensorFlow Benchmarks 系项目(https://www.tensorflow.org/performance/benchmarks)。这个团队的使命不仅是要实现如何在多平台上快速训练当前的一些主流模型,而且要让这些模型达到足够高的准确率。我曾亲眼目睹他挥汗如雨地为提高模型准确性而做出努力,因为上述的那些步骤都有可能影响结果,而且没有简单的调试方法,即使有模型原作者的帮助也无济于事。而且这看起来就像是一项无止境的工作,TensorFlow 框架在变化,GPU 驱动器在变化,数据集在变化,这些都会影响到结果。Toby 的团队可以帮助我们发现和修复因 TensorFlow 的变更引起的 bug,并找出由外部依赖导致的问题,但要把规模扩大仍然很困难。
我也知道有些团队对于在生产系统中使用机器学习模型非常小心翼翼,他们为了确保训练模型的一致性花了很多时间和精力,但问题是,这一过程仍然是手动进行的。现在还不存在一种版本控制系统或被大家一致认可的***实践,可以确保模型在未来仍然可以产出相同的结果。我暂时也想不到更好的办法,不过在这里抛砖引玉一下,在尝试解决这个问题时,还是有一些原则可以遵循的:
- 新想法需要足够容易被研究人员所理解,不需要研究人员花费太多时间和精力,否则的话,他们可能压根不愿意使用这些系统。理想情况下,这些系统应该要能帮助他们大大提升效率。
- 如果某个研究人员不小心被车撞了(大误,划掉)出走去搞创业了,需要保证,哪怕是第二天新加入的研究员也能够重新训练他们之前创建好的模型,并得到相同的结果。
- 应该存在某种打包方式,将训练某个模型所需的元素打成包,这个包可以被共享出来,并且不会露模型作者不希望暴露的历史细节。
- 为了重现结果,代码、训练数据和整个平台需要被准确地记录下来。
我已经看到一些开源社区和初创公司正致力于解决这个问题。我也迫不及待地想要用我的余生来解决这个问题,但在短期内难有完整的解决方案。在训练模型这件事情上,我们需要一次变革,就像版本控制系统的出现给我们的编码流程带来的巨变那样。
在尝试重现机器学习研究结果的过程中,你踩过哪些坑?对于机器学习结果难以重现,你是否也想吐槽?欢迎留言分享你的看法。
原文链接:https://petewarden.com/2018/03/19/the-machine-learning-reproducibility-crisis/