机器学习研究项目的常见误区

电子说

1.2w人已加入

描述

编者按:FAIR研究科学家Tim Rocktäschel、牛津大学人工智能研究者Jakob Foerster、Greg Farquhar讨论了机器学习研究项目的常见误区,同时给出了有助于项目成功的中肯建议。

每年都有很多学生联系我们,表示想要和我们一起进行短期的机器学习研究项目。到目前为止,我们已经指导了不少学生了。我们注意到有一些反复出现的指导意见,因此写了这篇文章分享。我们相信本文的建议会对机器学习领域的暑期实习研究项目或硕士论文项目有帮助。我们并不打算写一篇全面指导的文章,而是想要强调我们反复碰到的误区。例如,我们不会讨论如何选择一个好项目,或者进行机器学习研究项目的一般方法。文中的一些建议适用于所有机器学习研究项目,特别是深度学习和强化学习研究项目。不过,有些建议只适用于短期项目,在3个月的时间限制下,这些建议很重要,但对于3-5年的博士生而言,相对而言不那么重要。

1 主要误区

1.1 假设你的代码没有bug

众所周知,机器学习,特别是深度学习模型和强化学习模型,很难调试。Andrej Karpathy曾发推列举一些常见的犯错情况:

没有首先尝试过拟合单个batch。

忘了切换训练/评估模式。

在.backward()前忘了.zero_grad()。

将softmax输出传给期望原始logit的损失函数。

搭配BatchNorm使用线性层/二维卷积层时没有设置bias=False,或者相反,忘了在输出层中设置bias。

以为view()和permute()是一回事(然后在该用permute的地方错误地使用了view)。

我们所有人,甚至包括非常资深的研究者,都经常犯这类错误。由于有bug的模型经常仍然能够学习并生成有意义的输出,所以很难检测到这类错误。bug也许会给你的模型带来微妙的改变,而大多数情况下只有到了运行时才会显现。意识到这点后,假定你的代码没有任何错误实在是大错特错。对自己代码的态度常常能够区分高效的研究者和低效的研究者。如果你的默认假定是你的代码可能有错误,那么你会更仔细地检查bug。逐行步进代码,仔细地检查中间输出。可能的话,可视化中间输出。张量的形状对不对?张量的初始化、克隆、剥离是否恰当?检测训练过程中的梯度,留意NaN。编写单元测试,还有通过设定随机数生成器的种子使试验可重现,这些都可能有帮助。关于更多神经网络调试的窍门,可以看Goodfellow等的Deep Learning(花书)的11.5节。

1.2 只看最终评估测度

尽管你的项目的目标之一也许是提高某项评估测度的分数,但更重要的是发展模型如何起效和为何奏效的良好理解。特别是在项目的初期,最终评估测度几乎不含有助于迭代和开发算法或模型的信息。相反,问一些深入的问题,开发信息丰富的诊断方法才是有帮助的。如果你引入了门控或注意力机制,那么你的模型是否实际利用了它呢?你提出的哪项模型创新对整体表现提升实际起到了作用?你做了消融测试吗?为了达到合理的表现,你的模型需要多少训练样本,需要跑多少epoch,这些配置和你用的基线一样吗?你的模型表现良好和表现糟糕的测试实例之间有没有什么系统性的差异?结果对超参数变动的鲁棒性有多好?基于模型的隐藏状态,可以预测重要的特征吗?牢记你的研究和项目报告主要不是告诉研究社区相对之前最先进模型的表现,你取得了一些(微弱的)提升,而是要贡献你对这一主题的理解。领域中的其他人想要知道什么有效,什么无效,你的发现的哪些部分可以应用到他们的问题上。

1.3 尝试解释不清的随机改动

基于现在这些深度学习库,让模型变得复杂很容易,加上更多的组件、网络层和优化技巧。然而,当你改动代码或模型时,你至少应该在直觉上理解改动为何有帮助。同理,运行试验时,你应该对它的输出有清楚的预期。你期望绘制出的结果图像看起来是什么样的?你期望它们将告诉你什么?当你发现模型的表现不对劲的时候,这些理解就更重要了。模型表现不对劲,更可能是bug的症状,这种情况下扩展模型无助于找出bug,也许甚至会让定位问题变得更困难。在复杂化模型之前,深入问题的根源,找到可能出错的地方。另外,别忘了你的报告需要论证你所做的改动的意义。报告的审阅人员对理解你的思考过程很有兴趣。如果你不能形式化研究假说,并向自己解释为何你做的能够起效,那么很可能没人能做到这一点。

1.4 过度复杂化

我们经常看到积极性很高的学生直接上手困难问题,并且马上尝试复杂的方案。如果有地方出错了,很难分析错误的原因。相反,你应该问自己:应该可以奏效的最小化的方案是什么?模型能够学习记忆一个小型数据集吗?只使用少量参数的情况下模型学到了什么?代码可以在单个训练实例而不是一组样本上训练吗?我们期望看到的最简单的概括性是什么样的?我们期望会失败的简单基线是什么?给这一基线加上什么样的最小扩展应该能让它工作?

1.5 迭代过慢

试验可能需要很多时间。特别是深度学习和强化学习,极耗时间。因此,在短期项目中,不要过早地陷入缓慢的迭代周期很关键。基于简单环境调试你的模型,实现一个可以在你的个人电脑上跑的概念证明实现。有时候简单的矩阵操作或者网格试验有助于验证你的想法。有时你可以直接使用MDP的价值函数测试算法设想,无需摆弄梯度估计、actor-critic训练等。当开始进行大规模试验时,流程化运行试验和查看结果的过程。在试验完全进行完毕之前,查看结果,看看表现是否失败。刚开始,基础设施上的投入可能会花不少时间,但到项目结束的时候,你会发现这很有价值。

2 一些建议

2.1 在开始项目之前阅读背景内容和相关工作

我们经常在正式开始日期的几个月前就公布项目。原因之一是三个月完成以下内容实在是很紧张:1) 学习背景内容和相关工作;2) 实现和试验;3)撰写一份好报告。另一个原因是,我们一般提出的项目,如果成功的话,是可以在机器学习期刊或会议发表的。虽然我们知道学生有很多事情需要忙的,但我们一般鼓励学生至少提前开始阅读相关文献。理想情况下,当你开始全职从事项目的时候,你应该知道要做什么,它和现有的方法有什么关系,并且对如何做已经有一些想法。另外,在全职从事项目之前,熟悉你选择的机器学习框架也是一个好主意(我们推荐PyTorch!)。

2.2 使用版本控制

你实在是应该在研究代码和项目报告上使用版本控制。没有什么比在截止日期前丢失所有的辛勤工作更糟了。如果你还没注册过GitHub,那就去GitHub注册个账号。学生有免费私有仓库。如果你不知道什么是版本控制,现在就学习,以后的你会对此感激不尽的。

2.3 基于随机重复评估

在学术界,项目期间你一般最多能使用几个GPU。然而,你不应该从一次试验或几次试验得出不成熟的结论,这一点在深度强化学习上尤其重要。理想情况下,你应该多次重复试验,并且像前文提到的,对不同初始情况和超参数的鲁棒性有所了解。

2.4 及早开写,持续地写

如果你做的是硕士论文项目,对你工作的评估将基于你撰写的报告,而不是基于你所做的缺乏足够时间清楚报告的杰出工作。及早开始撰写报告,不要低估传播研究的作用。清晰地陈述你的目标、假设和贡献,让读者可以领会你的进展。清晰地解释你的设计决策,清晰地讨论你的发现。理想情况下,你应该在进行项目的过程中持续撰写报告,这可以迫使你仔细思考下一步要做什么,也可以避免你因为在截止日期前赶工而漏写重要信息。

2.5 需要帮助的时候,主动寻求帮助

你的指导者工作繁忙,但指导者的意义正是帮助你。遇到解决不了的问题,不要拖到下次约定好的碰面才提出来,在你需要的时候,联系你的指导者。主动地安排碰面,提前准备好你打算讨论的结果、代码、报告文字,避免浪费指导者的时间。最后,别恐慌!我们都经历过这类困境,知道这会是多么令人气馁的经历,特别是你的工作机会和博士申请取决于研究项目的结果的时候。我们真心希望你能成功。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分