查看原文
其他

机器学习正面临着可重现性危机!

2018-03-22 Pete Warden CSDN

点击上方“CSDN”,选择“置顶公众号”

关键时刻,第一时间送达!

最近和一位朋友聊天时,他提到自己的创业公司创建的机器学习模型非常混乱,以至于团队在彼此的基础上进一步工作或与客户分享时引发了很严重的问题。即使模型的作者有时都无法训练同一个模型,并得到类似的结果!他希望我可以提供一些参考的解决方法,但我不得不承认,在自己的工作中也遭遇了同样的问题。可能没有使用机器学习的人很难理解,但是对于机器学习领域内跟踪变更以及重建模型,我们仍然处于摸索期。有时候感觉我们的编程工作回到了没有源代码版本控制的年代,让人十分糟心。

我从90年代中期开始以编程为生,当时源代码跟踪与协调的标准工具是微软的VSS(Visual SourceSafe)。当时这个软件没有原子check-in,所以同一个文件无法支持多人编辑,网络副本需要每晚进行扫描,以避免莫名其妙的损伤,但即使如此也不能保证到了第二天早上数据库完好无损。尽管如此我还是感到很幸运,因为我曾经面试过的一家公司还在使用往墙上贴便条的方法管理代码版本,还有一家公司将所有文件都挂在树上,编程人员在修改文件时将它们取下来,修改完了再放回去!

我想说的是,在版本控制方面,我不是一个畏首畏尾的人。我经历过一些很糟糕的系统,如果有必要的话,我可以用rsync和一些安全措施自己拼凑一个版本控制系统出来。抛开所有的这些不说,我可以摸着良心说,机器学习是迄今为止我接触过的在协作和变化跟踪方面最糟糕的环境。

为了解释清楚其中的原因,首先让我们来看一个典型的机器学期模型的生命周期:

  • 一位研究人员(她)决定尝试一种新的图像分类架构。

  • 她从之前的项目中复制粘贴一部分代码,用于处理数据集的输入。

  • 这个数据集保存在她的某个网络文件夹内。这可能是从ImageNet中下载的一个数据集,但是不清楚究竟是哪一个。有一天,有人删除了一些非JPEG格式的图像文件,或做了一些很小的修改,但是并没有记录这些改动。

  • 她尝试了一些略微不同的想法,修正了一些bug并修改了算法。她在自己的机器上进行这些改动,然后将源代码全部复制到GPU集群内,启动了全面的训练。

  • 她运行了很多不同的训练,由于这个过程需要几天或几周的时间,所以她可能经常修改本地机器上的代码。

  • 在大型集群运行结束后可能会出现bug,这意味着她需要修改某个文件,然后复制到所有机器上,然后再继续训练。

  • 她可能采用从一次运行结果中得出的部分训练好的权重,然后将它们作为起点,用不同的代码重新运行。

  • 她将所有运行中得到的模型权重和评估分数保留下来,当没有时间运行更多实验时,她选择了其中之一作为最终模型上的权重。这些权重可能是由不同的代码运行产生的,而非当前她的开发机器上的代码。

  • 她可能将最终的代码放进源代码控制仓库中她自己的文件夹内。

  • 她发表了实验结果、代码以及训练得到的权重。

对于一个尽职尽责的研究人员来说,这算是乐观的情况了,但是我相信你已经见识了如果其他人参与进来,试图重复所有的步骤,并得到相同的结果有多难了。上述每一点都有可能混入造成最后结果不一致的因素。另外,更麻烦的是,ML框架为了保证性能而牺牲了确切数字的确定性,所以即便有人很神奇地重复了上述步骤,那么最终的结果也会有微小的差异!

在许多现实情况中,研究人员不会准确地记录或记住她所做的事情,所以甚至连作者本人(她)都很难重现这个模型。即便她本人做到了,但是模型代码所依赖的框架也会随着时间的推移而改变,有时甚至会出现根本性的改变,所以她可能还需要对整个系统做快照,才能确保其正常工作。在与ML研究人员的接触中,我发现他们非常愿意付出时间帮忙重现模型的结果,但是即便在作者的协助下,通常也需要花费几个月的时间。

为什么这一切很重要?我的很多朋友在试图重现已发表的模型作为自己的论文的基准时,都遇到了问题而找我帮忙。如果他们无法得到与原作者相同的准确度,又如何判断他们的新方法是否有所改进呢?如果面对需求或平台的变更,而没有办法重建模型的话,那么在生产系统中依赖于模型的顾虑也是显而易见的。如果真是这样,那么意味着模型的技术债务就不再是高息信用卡了,而是变得更像高利贷交易了。这个问题还会抑制研究实验,因为如果代码和训练数据的变更很难还原,那么尝试不同的参数就会带来更大的风险,就像没有源代码控制的编程会增加试验变化的成本。

然而,这方面的发展也并非全无希望,有一些社区已经在重现性上做出了很大的努力。我最喜欢的其中一个是由Toby Boyd领导的TensorFlow Benchmarks项目。他要求团队的使命为:不仅要准确地展示如何在各种不同的平台上快速地从零训练模型,还要保证模型训练能够达到预期的精确度。我亲眼目睹他为了让模型达到精确度累得满头大汗,因为我上面列举的任何步骤的变化都有可能影响最终的结果,并且即使在作者的帮助下,也没有简便的方法可以调试查出其根本原因。由于任何发生在TensorFlow、GPU等驱动程序中的变化,或者甚至数据集中的变化,都有可能以微妙的方式影响精确度,因此这似乎是个永无止境的工作。在工作的过程中,Toby的团队帮助我们找到并修改了模型中TensorFlow变化引起的bug,并追查了引起该问题的外部因素,但这很难适用于相对较大的平台与模型。

我还知道一些其他的团队也在很认真地思考在产品中使用模型的问题,他们也花费了大量的时间和精力来确保训练好的模型可以重现,但问题在于这一切工作全部依赖于手工作业。对于如何记录训练的过程,以便日后可以再次成功地运行,我们并没有类似的源代码控制,甚至没有最佳的实践方案。我个人也没有很好的解决办法,但是我想在这里讨论一些原则,我认为任何想要取得成功的方法都需要遵从这些原则:

  • 研究人员必须能够很轻松地实现新的想法,而无需花费大量时间“走流程”。如果做不到这一点,他们就不会使用这个方法。理想情况下,系统实际上可以提高他们的生产力。

  • 如果一位研究人员发生意外(希望永远不要有意外)或创业去了,那么其他人应该可以在第二天接管他们创建的模型,继续训练并得到相同的结果。

  • 应该有一种方式来打包需要训练的某个特定的模型,并可以公开分享,而不用泄漏作者不希望透漏的修改历史。

  • 为了重现结果,代码、数据以及整个平台上都需要进行精确的记录。

我已经看到开源和一些创业公司围绕这些挑战的解决方案,展开了一些有趣的反响,我个人迫不及待想要将自己所有的时间都花在处理这些相关的问题上,但是我并不敢奢望短期内可以完全地解决这个问题。无论我们提出怎样的创意,都必然需要改变我们所有人使用模型的方式,就像源代码控制改变了我们个人编码的流程一样。我们需要在最佳实践与社区教育上达成共识,这与我们创建这些工具同等重要。我迫不及待希望看到这一天的到来!

原文:https://petewarden.com/2018/03/19/the-machine-learning-reproducibility-crisis/amp/

译者:马晶慧

责编:言则

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存