当前位置: 首页 > 科技观察

机器学习论文重现,这5大问题你需要注意_0

时间:2023-03-17 20:39:04 科技观察

在刚接触机器学习的时候,我花了很多时间阅读论文并尝试实现。当然,我不是天才。实现它意味着做一个gitclone并尝试运行论文作者的代码。对于我感兴趣的概念,我可能还会手动输入一些代码并对其进行注释,以更好地理解论文和项目。这样的学习方法令人沮丧。尝试复制一篇论文的过程大致如下:一些达到??新SOTA的论文在新闻媒体上引起了关注;读者深入或快速浏览论文内容;读者对论文中的实验结果印象深刻,并有兴趣重现它们。接下来是对项目代码的疯狂搜索,并试图在作者使用的数据集上运行它。这时候需要祈祷项目具备以下要素:操作说明(README.md)、代码、参数、数据集、数据集路径、软件环境、所需依赖、硬件条件。只有理解了这些,才能成功复现论文中的SOTA结果。在此过程中,您可能会遇到许多常见问题(见下文)。在遇到问题之前了解问题很有帮助,毕竟没有人喜欢空手而归。机器学习论文复现常见问题复现过程中常见问题如下:README文件不完整或缺失;未定义的依赖项,代码有错误,预训练模型缺失;参数不公开;私有数据集或缺少预处理步骤;对GPU资源的不切实际的需求。1.README文件不完整或丢失如果一篇论文在发表时是开源的,那么README就是你开始复现该项目的文件之一。一个好的README文件通常包含以下组件:依赖项列表、训练脚本、评估脚本、预训练模型和运行脚本的结果。事实上,这些已经在PaperswithCode发布的《机器学习代码完整性自查清单》中列出(该列表已成为NeurIPS2020代码提交过程的一部分)。该名单的灵感来自于麦吉尔大学副教授、Facebook蒙特利尔FAIR实验室负责人JoellePineau。请参阅PaperswithCode提供的示例README:https://github.com/paperswithcode/releasing-research-code不完整的README是运行代码的糟糕开端。要注意的一个信号是示例笔记本或示例代码。笔记本的目的是演示代码的使用。理想情况下,除了单击“全部运行”之外,notebook应该在没有任何其他调整的情况下运行。通过使用参数和数据路径预填充命令行可以实现相同的效果。还有一些次要但有用的信息,例如作者的联系信息或显示模型架构或数据转换过程的gif等,这些信息应包含在完整的README文件中。如果代码库托管在GitHub上,请检查问题区域以查看问题是否得到积极回答并且拉取请求是否得到定期审查。这些项目可以证明图书馆得到精心维护,以确保后续的复制工作得到有效支持。当然也有例外,但如果没有上述任何情况,请仔细考虑。MachineLearningReproducibilityChecklist由JoellePineau发布(来源:https://www.cs.mcgill.ca/~jpineau/ReproducibilityChecklist.pdf)2.未定义的依赖项,代码中的错误,缺乏预训练模型一旦你满意对于示例笔记本,您可能想在您自己的数据集上使用不同的参数尝试该模型。在此阶段,您可能会因调用示例笔记本中未使用的函数或在您自己的数据集上尝试预训练模型而遇到问题。例如,您可能会注意到requirements.txt丢失,或者软件包版本不固定(例如tensorflow==2.2)。想象一下当你发现TensorFlow版本是1.15而不是2.2因为作者没有指定版本时你的爆炸。假设你检查了依赖关系,现在你发现预训练模型不见了!在这种情况下,您可以调试代码、提交错误报告或忽略代码。请谨慎选择第一个选项,因为您可能会花费数小时。当然有些错误很容易修复,如果我能修复它,我会提交一个pullrequest。但也并非总是那么幸运,这些触手可及的果实有时很难摘到。缺少预训练模型是一个危险信号,但实际上并不少见。毕竟,论文作者没有义务发布模型。那么,另一种选择是使用公开可用的可重复性参数训练模型。但是参数并不总是公开的...3.未公开参数根据模型情况,超参数对于实现SOTA结果非常重要。下图显示不同的参数产生不同的f1分数(范围从0.5到1.0)。模型中的参数通常是学习率、嵌入大小、层数、dropout量、batchsize、训练epoch数等。因此,如果作者没有提供他们使用的确切参数,你可能需要执行所有实验自己重现SOTA结果。顺便说一句,Facebook的HiPlot是一个很棒的工具,可以帮助您在使用不同的参数组合时可视化模型结果。HiPlot地址:https://github.com/facebookresearch/hiplot4。私有数据集或缺乏预处理步骤在很多方面,我们很幸运能够拥有世界各地研究人员提供的开源数据集。事实上,收集数据绝非易事,清理数据并格式化以供研究使用则更加困难。感谢学术机构和Kaggle免费托管这些开源数据集,因为带宽和存储成本很高。但是,使用私有数据集并不容易。数据集可能包含受版权保护的信息,例如ImageNet。通常您需要填写一份申请表,版权所有者将自行决定是否批准。这个过程有时会很麻烦,如果您需要的数据集不可用,请在申请之前仔细考虑。或者您可以从其他来源搜索或下载数据,例如AcademicTorrents:https://academictorrents.com/。5.对GPU资源的不切实际需求最近有一种趋势,即更大的模型性能更好。一些论文使用整个数据中心的计算能力来达到SOTA的结果。当然,这些论文很难重现。例如,2019年10月,谷歌发表了一篇论文《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,试图通过将参数扩展到110亿来探索Transformer模型架构的局限性。然而几个月后,微软创建了170亿参数的Turning-NLG,很快OpenAI又发布了1750亿参数的预训练语言模型GPT-3……要训练一个10亿参数的模型,需要使用分布式训练方法和某种形式的高性能计算(HPC)或GPU集群。具有110亿和170亿参数的模型分别需要大约44GB和68GB的??内存,因此这些模型不能仅使用一个GPU进行训练。总之,早点发现论文中使用的大模型是否超出了你个人的能力。微软培训Turning-NLG。总结和复现论文的代码并不容易,但越来越多的项目尝试标准化SOTA模型。我个人最喜欢的是HuggingFace的Transformers,它为研究人员和开发人员提供了足够低的进入门槛。此外,TensorFlow的ModelGarden和PyTorch的ModelZoo也在快速发展(这些是分别由TensorFlow和PyTorch团队构建的预训练模型)。这些库旨在标准化预训练模型的使用,并为模型贡献和分发提供合适的条件。他们提供代码质量保证并有良好的文档。我希望社区能从这些库中受益,并帮助重现SOTA结果并轻松使用SOTA模型。【本文为栏目组织《机器之心》、微信公众号《机器之心(id:almosthuman2014)》原创翻译】点此查看作者更多好文