写点什么

如何应对机器学习模型的一致性风险?

2018 年 3 月 26 日

机器学习研究论文毫无疑问是一笔宝贵的资产。这些论文可以用来启发未来的研究;它们可以成为对学生有用的教学工具;它们可以为工业界的应用研究人员提供指导。也许最重要的是,它们可以帮助我们回答那些有关人类存在的最基本的问题:比如,学习到底是什么意思?人类的存在意味着什么?虽然可重现性在科学研究中并不总能够做到,但它是提高研究质量的有力标准。如果研究结果可重现,那就证明这个研究结果有可能更稳健、更有意义,至少排除了许多由实验者带来的错误(比如弄虚作假或偶然得出的结果)。

然而,现有的很多机器学习研究结果要么不可重现,要么难以重现。如何确保研究成果的可靠性和可重现性,是很多机器学习研究者致力于解决的问题。甚至在 2017 年的 ICML 上,还专门组织了一场名为“Reproducibility in Machine Learning”的 Workshop,以探讨机器学习研究结果的可重现性和可复制性问题。

为什么机器学习研究重现起来那么难?来看看在谷歌 TensorFlow 团队研究深度学习的工程师 Pete Warden 怎么说。

更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)

Pete Warden 的文章发出后,很多正在研究机器学习的工程师、研究员纷纷表示赞同,包括谷歌大脑研究员、SketchRNN 的爸爸 David Ha(@hardmaru)也默默转发了他的推文。

以下内容为 AI 前线根据原文编译整理而成:

我有个朋友创办了一家机器学习初创公司,最近,他碰到了一些麻烦。他们的机器学习模型杂乱无章,当他的团队想基于这些模型构建一些东西或把它们展示给客户时,出现了严重的问题。有时候,即使是模型原作者都无法正常地运行自己创建的模型,或者得到与之前同样的结果。他向我求助,希望我给他建议一个解决方案,但我不得不承认,我在工作中也正遭遇着同样的问题。向不了解机器学习的人解释这些东西真的很难,我们最后还是回到了那个不使用代码版本控制系统的年代,并从头开始训练模型,尽管有时候觉得这样做简直糟透了。

我从 90 年代中期开始我的代码生涯,那个时候,微软的 Visual SourceSafe 是标准的代码版本控制系统。为了提供良好的体验,它不支持提交代码原子操作,所以多个开发者不能同时修改同一个文件。在晚上的时候需要进行扫描和拷贝,避免出现意外的冲突,但即使是这样,也无法保证在早上的时候数据库是完整的。只能说我足够幸运,我所在的团队准备了一面墙,他们在墙上贴上便条,每张便条对应项目里的一个文件。当某个开发人员想要修改某个文件时,就拿走对应的便条,等改完了再把便条放回去。

可以说,在版本控制系统面前,我是毫无畏惧的。我曾经使用过一些非常糟糕的系统,如果有必要,我甚至可以使用同步工具自己捣鼓出一些解决方案。但即使是这样,在机器学习开发的变更跟踪和协作这个问题上,我可以非常坦诚地说,我也是束手无措。

为了解释这个问题,先来看看典型的机器学习模型生命周期:

  • 研究人员想尝试一个新的图像分类架构。
  • 她从之前的项目拷贝了一些代码用于处理输入数据集。
  • 数据集存放在网络上的某个文件目录下,有可能是从 ImageNet 上下载下来的,但不清楚是哪个目录。在某个时候,可能有人移除了部分非 JPEG 格式的图像,或者做了其他一些细微的修改,但没有留下任何修改历史。
  • 她想方设法修复 bug,并调整算法。这些变更都发生在她的本地机器上,为了训练模型,她需要把大量的代码拷贝到 GPU 集群上。
  • 她反复训练了几次模型,并在本地机器上继续修改代码,因为训练一次模型需要几天甚至几周的时间。
  • 在训练接近尾声时可能出现了 bug,她就在赶紧修改了其中一个文件,并把它拷贝到集群的机器上。
  • 她可能将某一次训练得到的半成品权重用在了新的训练上,而新的训练是基于刚修改过的代码。
  • 因为时间的关系,她评估了这几次的训练结果,并选择其中一个作为最终要发布的模型,但这个模型有可能是使用不同的代码训练出来的。
  • 她把代码提交到版本控制系统的个人目录下。
  • 她把代码和模型发布出来。

这已经是当研究人员足够小心谨慎时的一种比较乐观的情况了,但你已经可以想象到,如果换了另外一个人,要重复上面这些步骤,并保证得到同样的结果,会有多难。上述的每一个步骤都有可能出现不一致,更何况机器学习框架有时候会在性能和数字准确性之间做出权衡,就算真的有人可以按部就班地重复上述的步骤,仍然会出现不一样的结果。

大多数情况下,研究人员可能没有记下自己都做了些什么,所以无法生成同样的模型。即使她记下了所有步骤,并再次执行这些步骤,但因为框架会随时发生变化,她必须记录下这个系统的快照,才有可能做到与之前的模型保持一致。我曾经找研究人员帮忙,让他们重新生成模型,他们很慷慨,但通常需要花上几个月时间,即使他们是模型的原作者。

为什么一致性这么重要?我有几个朋友跟我说,他们在写论文时不知道该如何重现模型。如果他们无法得到与原作者一样的准确率,那么该如何说服别人自己的新方法是对原有方法的改进呢?如果你没有办法为了应对变更的需求或平台完全重建一个模型,那么重度依赖生产系统已有的模型也是很正常的。在进行研究实验时,这也是个大问题,因为代码变更和训练数据很难进行回滚。在尝试执行上述的那些步骤时,可能存在更多的风险,这就好比不使用版本控制系统会增加代码变更所带来的成本。

当然,事情也不是那么悲观,社区正在这方面做出努力,以解决模型的一致性问题。其中我最喜欢的是由 Toby Boyd 领导的 TensorFlow Benchmarks 系项目( https://www.tensorflow.org/performance/benchmarks )。这个团队的使命不仅是要实现如何在多平台上快速训练当前的一些主流模型,而且要让这些模型达到足够高的准确率。我曾亲眼目睹他挥汗如雨地为提高模型准确性而做出努力,因为上述的那些步骤都有可能影响结果,而且没有简单的调试方法,即使有模型原作者的帮助也无济于事。而且这看起来就像是一项无止境的工作,TensorFlow 框架在变化,GPU 驱动器在变化,数据集在变化,这些都会影响到结果。Toby 的团队可以帮助我们发现和修复因 TensorFlow 的变更引起的 bug,并找出由外部依赖导致的问题,但要把规模扩大仍然很困难。

我也知道有些团队对于在生产系统中使用机器学习模型非常小心翼翼,他们为了确保训练模型的一致性花了很多时间和精力,但问题是,这一过程仍然是手动进行的。现在还不存在一种版本控制系统或被大家一致认可的最佳实践,可以确保模型在未来仍然可以产出相同的结果。我暂时也想不到更好的办法,不过在这里抛砖引玉一下,在尝试解决这个问题时,还是有一些原则可以遵循的:

  • 新想法需要足够容易被研究人员所理解,不需要研究人员花费太多时间和精力,否则的话,他们可能压根不愿意使用这些系统。理想情况下,这些系统应该要能帮助他们大大提升效率。
  • 如果某个研究人员不小心被车撞了(大误,划掉)出走去搞创业了,需要保证,哪怕是第二天新加入的研究员也能够重新训练他们之前创建好的模型,并得到相同的结果。
  • 应该存在某种打包方式,将训练某个模型所需的元素打成包,这个包可以被共享出来,并且不会露模型作者不希望暴露的历史细节。
  • 为了重现结果,代码、训练数据和整个平台需要被准确地记录下来。

我已经看到一些开源社区和初创公司正致力于解决这个问题。我也迫不及待地想要用我的余生来解决这个问题,但在短期内难有完整的解决方案。在训练模型这件事情上,我们需要一次变革,就像版本控制系统的出现给我们的编码流程带来的巨变那样。

在尝试重现机器学习研究结果的过程中,你踩过哪些坑?对于机器学习结果难以重现,你是否也想吐槽?欢迎留言分享你的看法。

在 AI 前线公众号后台回复“重现”,可以下载 ICML 2017 上机器学习可重现性 Workshop 中,谷歌大脑研究院 Hugo Larochelle 的演讲 PPT,或许能带给你一些启发。

(链接: https://pan.baidu.com/s/18nve_6YT3ZWYgAhHFw6XSA 密码:utpj,需要在后台加一下关键字)

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

感谢蔡芳芳对本文的审校。

2018 年 3 月 26 日 17:401205
用户头像

发布了 731 篇内容, 共 376.4 次阅读, 收获喜欢 1880 次。

关注

评论

发布
暂无评论
发现更多内容

Python利用sphinx构建个人博客

雪雷

sphinx Blog

Docker+Jenkins+Gitlab+Django应用部署实践

雪雷

DevOps jenkins CI/CD

RabbitMQ实践

雪雷

RabbitMQ 消息队列

微服务API网关-Kong详解

雪雷

kong api 网关

SonarQube集成gitlab/jenkins

雪雷

jenkins sonar gitlab ci 代码扫描

Gitlab Pipeline+Supervisor 实战Python项目CI/CD

雪雷

gitlab jenkins CI/CD Supervisor

Jenkins部署Python项目实战

雪雷

Python jenkins CI/CD

Linux自定义快捷工具

雪雷

Linux Shell tools scripts

JVM-技术专题-管程技术分析

李浩宇/Alex

JVM 管程

玩K8S不得不会的HELM

雪雷

k8s Helm

一文带你检查Kubernetes应用是否为最佳实践

雪雷

k8s k8s最佳实践

Docker Web管理工具

雪雷

Docker shipyard dockerui

记一次混合监控的反思

雪雷

监控 zabbix redis监控 监控宝

Flink高可用性设置-4

小知识点

scala 大数据 flink 流计算

Elasticsearch安装

北漂码农有话说

Guacamole实战

雪雷

guacamole 远程登录 堡垒机

API统一管理平台-YApi

雪雷

YAPI API接口管理

Serverless初探

雪雷

Serverless Lambda 无服务器云函数

lower_case_table_names参数详解

Simon

MySQL

MySQL线程状态详解

Simon

MySQL 线程状态

同态加密

soolaugust

学习 加密 同态加密

Jenkins 详解

雪雷

jenkins

记一次混合云API发布的反思

雪雷

iptables API api发布

探测mysqldump详细过程

Simon

MySQL

微服务注册发现配置中心-consul

雪雷

Consul 服务注册与发现 配置中心

Linux系统检查脚本

雪雷

Shell 系统检测

Ceph集群部署

雪雷

分布式存储 Ceph rdb pvc

业务容器化改造

雪雷

Docker 容器 微服务 服务化改造

Apache常用配置指北

亻尔可真木奉

Apache 代理 跨域

JVM-技术专题-GCViewer调优GC

李浩宇/Alex

JVM

Golang领域模型-开篇

奔奔奔跑

golang 微服务 领域驱动设计 架构设计 后端开发

低代码的认知误区与落地实践

低代码的认知误区与落地实践

如何应对机器学习模型的一致性风险?-InfoQ