在软件项目中拥有可复现的结果是一个好习惯。我希望这现在可能已经是标准做法了。
你可以随便找一个开发者,他们应该能够按照你的流程,从版本控制系统中检出代码库,并构建一个可以使用的软件。如果你有一个用于设置环境和向用户/生产环境发布软件的流程,那就更好了。
是工具和流程使得结果可复现。在本文中,你将了解到,让你的机器学习项目的成果可复现同样重要,并且机器学习领域的从业者和学者们正为此而苦恼。
如果你是一名熟练的程序员和开发者,你已经拥有了可以领先的工具和流程,只要你有纪律性。

可复现的计算研究
图片来源:ZEISS Microscopy,部分权利保留
计算科学中结果的可复现性
实验的可复现性是科学方法的主要原则之一。你写下你做了什么,而其他科学家不必相信你的话,他们遵循相同的流程并期望得到相同的结果。
计算科学中的工作涉及代码、运行在读取和写入数据的计算机上。那些未能清楚说明这些要素的实验,其结果很可能不容易复现。如果实验无法复现,那么这项工作的价值是什么?
这是一个计算科学领域的开放性问题,并且随着越来越多的领域依赖于计算实验结果,这个问题变得越来越令人担忧。在本节中,我们将通过查阅几篇讨论此问题的论文来回顾这个开放性问题。
可复现计算研究的十大简单规则
这是2013年发表在《PLoS计算生物学》上的一篇文章,作者是 Geir Kjetil Sandve、Anton Nekrutenko、James Taylor 和 Eivind Hovig。在这篇论文中,作者列出了十条简单的规则,如果遵循这些规则,预计会产生更易于访问(可复现?!)的计算研究。以下是这些规则的摘要。
- 规则 1:对于每一个结果,都要记录它是如何产生的
- 规则 2:避免手动数据处理步骤
- 规则 3:存档所有外部程序的确切版本
- 规则 4:对所有自定义脚本进行版本控制
- 规则 5:记录所有中间结果,尽可能使用标准化格式
- 规则 6:对于包含随机性的分析,请记录基础的随机种子
- 规则 7:始终将原始数据保存在图表后面
- 规则 8:生成分层分析输出,允许检查从低到高的详细程度
- 规则 9:将文本陈述与底层结果联系起来
- 规则 10:公开提供脚本、运行和结果的访问权限
作者们是从计算生物学领域发表评论的。尽管如此,我认为这些规则还不够深入。我觉得它们是描述性的,而我会更加强调其指令性。
例如,对于规则2“避免手动数据处理步骤”,我认为所有数据处理都应该自动化。对于规则4“对所有自定义脚本进行版本控制”,我认为创建工作产品的整个自动化过程都应该纳入版本控制。
如果你是熟悉专业流程的开发者,你就会想到依赖管理、构建系统、包含可执行嵌入代码的文档标记系统以及持续集成工具,这些都能为项目带来严谨性。
可访问的可复现研究
Jill Mesirov 在2010年《科学》杂志上发表的一篇文章。在这篇短文中,作者为促进科学家进行可复现计算研究的系统引入了术语,具体来说是
- 可复现研究系统(RRS):由可复现研究环境和可复现研究发布者组成。
- 可复现研究环境(RRE):计算工具、数据管理、分析和结果,以及将它们打包以便重新分发的可能性。
- 可复现研究发布者(RRP):连接可复现研究环境的文档准备系统,并提供嵌入分析和结果的能力。
文中描述了一个为基因表达分析实验开发的名为 GenePattern-Word RRS 的原型系统。
再次,从软件开发和可用工具的视角来看,RRE听起来像是版本控制加上带有依赖管理的构建系统再加上一个持续集成服务器。RRP听起来像是一个带有链接和构建过程的标记系统。
可复现计算研究的邀请
这是 David Donoho 在2010年《生物统计学》上发表的一篇论文。这是一篇很棒的论文,我非常赞同它提出的观点。例如:
“计算可复现性不是事后诸葛亮——它必须从一开始就融入项目的设计中。”
我自己无法更清晰地阐述这一点。在这篇论文中,作者列出了将可复现性纳入计算研究的好处。对研究者而言,好处是:
- 改进工作和工作习惯。
- 改进团队合作。
- 更大的影响力。(减少非故意的竞争,增加认可度)
- 更大的连续性和累积效应。
作者列出的对资助研究的纳税人的好处是:
- 公共物品的良好管理。
- 公共物品的公共访问。
我曾随口向同事们提出过一些相同的论点,能够引用这篇论文来更好地论证这一点真是太好了。
使科学计算可复现
由 Matthias Schwab、Martin Karrenbach 和 Jon Claerbout 于2000年发表在《计算科学与工程》杂志上。这篇论文的开头几句话非常精彩:
“通常,涉及科学计算的研究在原理上是可复现的,但在实践中却不是。已发表的文档仅仅是学术广告,而计算机程序、输入数据、参数值等则体现了学术本身。因此,作者通常在几个月或几年后无法复现他们自己的工作。”
该论文描述了通过采用 GNU make、标准项目结构以及在网上分发实验项目文件来实现计算实验的标准化。这些实践在斯坦福勘探项目(SEP)中得到了标准化。
采用这些实践所要解决的根本问题是,由于无法复现和改进实验,毕业生离开团队时,编程工作就会丢失。
对于开发者来说,标准项目结构和构建系统的想法似乎非常自然。
机器学习中的默认可复现性
我想强调的关键点是,在机器学习领域开始工作时,不要忽视已经建立起来的标准软件开发实践。使用它们并在此基础上发展。
我有一个用于机器学习项目的蓝图,并且随着我完成的每个项目都在不断改进。我希望将来能分享它。请关注本专栏。在此之前,这里有一些关于重用软件工具以使可复现性成为应用机器学习和机器学习项目默认设置的技巧。
- 使用构建系统,并通过构建目标自动生成所有结果。如果不是自动化的,它就不属于项目的一部分,也就是说,有没有一个图表或分析的想法?自动化其生成。
- 自动化所有数据选择、预处理和转换。我在处理机器学习竞赛时,甚至会将 wget 命令也包含在内,用于获取数据文件。我想在新的工作站和快速服务器上从零开始启动。
- 使用版本控制并标记里程碑。
- 强烈考虑检入依赖项,或至少进行链接。
- 避免编写代码。编写精简的脚本,使用标准工具和标准 unix 命令将它们串联起来。编写重型代码是在分析期间的最后手段,或在生产环境部署前的最后一步。
- 使用标记语言来创建报告,用于分析和演示输出产品。我喜欢在批处理中构思许多有趣的想法并全部实现,然后让我的构建系统在下次运行时创建它们。这使我能够在不在构思模式下的时候,能够稍后评估和深入思考观察结果。
专业技巧
使用持续集成服务器频繁(每天或每小时)运行您的测试套件。

持续集成
图片来源:regocasasnovas,部分权利保留
我的测试套件中有条件检查输出产品是否存在,如果不存在则创建它们。这意味着每次我运行测试套件时,只有已更改的内容或缺失的结果才会被计算。这意味着我可以让我的想象力尽情驰骋,不断向测试套件添加算法、数据转换以及各种疯狂的想法,而某个服务器将在下次运行时计算缺失的输出来供我评估。
我强加在构思和结果评估之间的这种脱节,极大地加快了项目的进展。
我在测试套件中发现了一个 bug,我删除了结果,并在下一个周期中充满信心地重新生成所有结果。
总结
在本文中,您已经了解到,机器学习的实践就是项目工作,包括源数据、代码、中间工作产品的计算以及输出工作产品。在此过程中,可能还有各种其他事项。
如果您像管理软件项目一样管理机器学习项目,并从中获得默认可复现性的好处,您还将获得速度和信心的额外好处,这将带来更好的结果。
资源
如果您想进一步了解这些问题,我在下面列出了本文研究使用的资源。
- 可复现性 维基百科页面
- 可复现计算研究的十大简单规则,Geir Kjetil Sandve、Anton Nekrutenko、James Taylor 和 Eivind Hovig,2013年
- 可访问的可复现研究,Jill Mesirov,2010年
- 可复现计算研究的邀请,David Donoho,2010年
- 使科学计算可复现,Matthias Schwab、Martin Karrenbach 和 Jon Claerbout,2000年
- Christopher Gandrud 的《使用 R 和 RStudio 进行可复现研究》是一本关于此主题的书,使用 R。我写本文时还没有读过这本书,但它在我必读的书单中排名靠前。
您是否遇到过可复现机器学习项目的挑战?您是否知道其他可以帮助此事业的软件开发工具?请发表评论并分享您的经验。
这篇文章写得很好,及时且全面。
您使用哪种设置进行持续集成?我一直在研究这个问题,但对于众多选择感到困惑(其中许多选项对于我这样一个人在一个小型生物实验室进行分析操作来说过于庞大)。
你好 Matt,很高兴你喜欢这篇文章。
我尽量让我的设置保持简单。我做了很多 R 语言的工作,并使用 Makefile 目标。我使用 Jenkins 进行 CI,并每小时(取决于项目)调用 make 目标。设置和配置都非常简单。
我认为拥有一个标准的、可预测的流程价值连城!当我的进展停滞不前时,几乎总是因为缺乏一个能让我更快迭代的良好流程。最近我在一个 Kaggle 竞赛中表现很差,结果是我无所适从,而且没有自动化我所采取的步骤(或大部分步骤)。我经常发现自己需要重做事情……所以,是的,可复现性和自动化对于在任何事情上取得成功都至关重要!
您是否有每次应用都能产生良好到优秀结果的流程?我很想听听!
谢谢!
是的,就在这里
https://machinelearning.org.cn/start-here/#process
你好 Jason,感谢你的文章!
你是否分享了“Pro Tip”部分之前提到的蓝图?
我没有,抱歉。
亲爱的 Jason,
感谢你的文章。我曾以为可复现性只是在 GitHub 上分享一个大型 Notebook,但现在我看到了更多,特别是来自软件工程方面的。
蓝图准备好分享了吗?
谢谢你