优秀的机器学习开发者都是这样做的!


文章原标题《ADVICE FOR SHORT-TERM MACHINE LEARNING RESEARCH PROJECTS》
作者:Jakob Foerster and Greg Farquhar
译者:虎说八道

每年我们都会与一起从事短期机器学习研究项目的学生沟通。到目前为止,我们已经和很多学生交流过并且在他们的项目中发现了很多问题,并根据问题给予了他们诸多的建议。我们发现很多问题是大家都存在的,在这篇文章中,我们将集中的介绍这些问题并且给出解决方法。这篇文章绝不是全面的,而是强调了我们一遍又一遍地看到的那些陷阱。例如,我们不会谈论如何选择一个好项目。我们的一些建议通常适用于机器学习,特别是深度学习或强化学习研究的项目。

1、主要陷阱:

1.1 假设你的代码没有错误

众所周知,机器学习,特别是深度学习和强化学习模型很难调试。为了让你了解无数的犯错方式,请查看 Andrej Karpathy 的 Twitter 主题。我们所有人,甚至是更高级的研究人员,都会一直犯同样的错误。使这些如此难以察觉的原因是即使是有缺陷的模型通常仍然可以学习并产生有意义的输出。错误可能会对你的模型进行细微更改,并且大多数只会在运行时显示。考虑到这一点,你可以做的最糟糕的事情是假设你的代码不包含任何错误。机器学习研究者对待代码的态度也是将他们分成生产性和非生产性的原意。如果你的默认假设是你的代码可能有问题,那么你将更仔细地搜索错误,逐行完成代码,仔细检查中间输出。如果可能的话,你还会可视化它们。你会考虑张量的形状是否合适? 它们是否已正确初始化? 克隆还是分离? 在训练期间监控梯度并注意 NaN。通过设置随机数生成器的种子来编写单元测试并使你的实验可重现等等。这些措施可以让你的代码更具有实际性用处,有关神经网络调试的更多提示,请参阅 Goodfellow 等人的深度学习书。

1.2 仅看最终评估指标

虽然你的项目目标可能是实现某些评估指标的改进,但更重要的是,你应该充分了解模型的工作原理和原因。特别是在项目的早期阶段,最终评估指标包含的信息很少,但是这些信息对迭代和开发算法或模型很有用。为了获得更多的信息,我们必须提出更深入的问题并获得信息反馈。例如,如果你引入了门控机制或注意机制,你的模型实际上是否使用了它? 你提出的哪些模型创新实际上是有助于整体性能提升? 你的模型需要多少个训练样例 / 时期才能达到合理的性能,这与你使用的基线有何不同? 你的模型运行良好或非常严重的测试实例之间是否存在系统差异? 你可以从模型的隐藏状态预测重要特征吗? 请记住,你的研究和项目报告并非真正告知研究界对先前技术水平的一些 (边际) 改进,而是为我们对该领域的理解作出贡献。

1.3 尝试随机变化并没有明确的期望

使用当前的深度学习库,通过添加更多组件、层和优化技巧,可以轻松地使模型更复杂。但是,当你对代码或模型进行更改时,你至少应该对此更改有一个大致的直觉。同样,当你进行实验时,你应该对其结果有明确的期望。你期望绘制的结果看起来像什么,他们会告诉你什么? 当你发现自己的模型没有按照预期的方式进行时,这一点就更为重要。通过这些措施,你更有可能看到出现错误的原因,因为扩展你的模型不会帮助你找到该错误,甚至可能使得更难以找到问题。在使模型更复杂之前,先了解它可能出错的底线。此外,请记住,在你的报告中,你必须证明你的所作所为。因为你的报告是别人帮你解决问题的唯一切入口。如果你不能制定一个研究假设,并向自己解释为什么你在做这个工作,那么其他任何人更没有机会了解你在干什么。

1.4 过度复杂

我们经常看到积极的学生立即跳出难题并尝试复杂的解决方案。其实真正的出现问题,一般都会很难分析。相反,问问自己:应该起作用的最小的东西是什么? 模型能学会记住一个小数据集吗? 只使用几个参数时会学到什么? 在单个训练实例而不是批处理训练时,代码是否有效? 我们期望看到的最简单的概括形式是什么?

1.5 迭代太慢了

进行训练实验可能需要很长时间。特别是深度学习和强化学习在积累统计显着数量的随机种子时可能非常耗时。因此,在短期项目过程中不要过早陷入缓慢的迭代周期是至关重要。尽量使用简单的环境调试你的模型,并实现你的想法的概念验证,争取整个过程可以在你的个人计算机上运行。有时,简单的矩阵游戏或网格世界实验也可以提供有用的想法验证。类似的你也可以使用 MDP 的精确值函数来测试算法思想,而不必乱用梯度估计,演员评论训练等。当转向更大规模的实验时,简化你启动实验和检查结果的过程。在实验完成全部过程之前检查这些结果,看看性能是否平稳。投资训练模型使用的基础设施在开始时可能很耗时,但在项目结束时都会有所回报。

2 一些建议:

2.1 在项目开始之前,开始阅读背景知识和准备相关工作

我们通常在正式开始日期前就应该分析项目。其中一个原因是了解背景和相关工作,接着我们要进行实施和实验,最后要认真撰写一份好的报告,在做项目之前一定要有一个大局观的设定。另一个原因是我们通常会提出研究项目,如果成功,可能会在机器学习论坛或者杂志上公布。虽然我们都知道整个项目过程中会有很多事情发生,但大多数时候我们都会鼓励你至少提前开始阅读相关文献。理想情况下,当你开始全职工作时,你应该知道该做什么,它如何与现有方法相关,并且知道如何做到这一点。

2.2 正确用软件版本及备份

你真的应该为你的项目代码和项目报告使用严格的版本控制,并且及时做好备份。没有什么比在截止日期之前失去所有辛苦工作更糟的了。如果你还没有,请打开 GitHub 帐户,作为一个学生,你可以获得免费的私人存储库。

2.3 使用随机重复进行评估

在学术界,你不可能在项目期间使用多个 GPU 进行训练。然而,另外一个尴尬的事情,特别是在深层强化学习中,不能简简单单的就从单个或几个实验中得出过早的结论。理想情况下,你希望多次重复实验,并且如上所述,可以了解不同起始条件和超参数的稳健性。

2.4 在实施项目中尽早开始写文档

如果你正在做一个硕士项目,你的工作将根据你的书面报告进行评估,而不是基于你所做的杰出工作,这个时候你需要有足够的时间来写清楚你做了那些工作。我个人建议是尽早开始写作,不要低估传播研究的价值。明确说明你的目标、假设和贡献,并让读者遵循你的思维过程,认真的读你的文章。你需要在文档中解释你的设计选择并清楚地讨论你的发现。理想情况下,你应该在项目过程中始终如一地编写报告。这样,你就强迫自己考虑下一步,在截止日期到达时你不太可能忘记任何重要信息。

2.5 在需要时主动寻求帮助

你的上级是忙碌的人,但他们的存在是为了帮助你。一旦出现问题时一定要及时反馈联系上级,千万不要等到下次预定会议时再反馈。积极主动地沟通并准备你想要提前讨论的结果。充分利用你的主管! 最后,不要惊慌! 他们都经历过这一切,一些问题在你这里可能是个不能解决的问题,但是在你上级哪里可能就是顺手的事情。

来源:网络大数据