“机器学习,太难了!”
“3个月才跑通GitHub模型代码,要崩溃了!”
“还要跟博士生开会,怕了!”
发出如此绝望声音的,正是一名在读本科生,起初兴致勃勃参与了机器学习兴趣小组。
但谁曾想到,却演变成了一入ML深似海,从此半点不由人的这般境遇。
在Reddit上的一通“吐槽”,引来了网友们的高度关注。
很好奇。
一个本科生,触及了大主流的机器学习,具体发生了怎样头秃的事情?
为什么ML会让这位本科生如此痛苦?
这段“痛苦”的故事,是这样的。
一开始,这位本科生同学自告奋勇地参加了一个“机器学习小组”,而后被分配去协助一位博士生的工作。
从去年9月份开始,这位博士生就给他布置了一些与“知识图谱”相关的任务,并让他去实现。
问题从这里就开始出现了。
这位本科生,花了整整3个月的时间,才让GitHub上一些模型的代码跑通。
不仅如此,自己还苦诉道:
在此之前,我还花了无数个小时去搞懂预处理和评估相关的代码。
结果如何呢?
我现在还是搞不懂如何让这些ML代码跑起来!
本就很是苦恼,没想到让他更加崩溃的事情,来得如此猝不及防。
博士生给他提了个“更上一层楼”的要求——让他从一篇论文中,找到了另一个实现类似功能的GitHub repo。
于是,这位本科生便把现有的代码插了进去……结果可想而知,一团糟。
原地爆炸!
我把每一个步骤都做了一遍,但就是想不明白问题出在了哪里。
Hold不住了,“再也做不下去了”……
他现在每周与博士见面都会感到恐惧,“因为我知道再也没有进展可以汇报了”。
但是痛定思痛,作为本科生的他,便在Reddit上发出了一个“灵魂拷问”:
机器学习代码本来就这么难吗?
是我脑袋有什么问题吗?
你们又是怎么做到的呀?
问题出在了哪里?
“用了一周时间,却连一个问题都没解决,根本没有进展可以汇报?”
网友@santiagobmx1993 提出了一种解决方法。根据实验期限,这位本科生可以迅速定下遇到问题的解决时间,如果完不成,就去寻求同级、上一级的帮助,快速提升效率。
例如,如果自己花了1天时间未能完成,就再花5小时找同级本科生一起解决,如果依旧不行,再试着花上2小时找博士生、导师梳理。
“我一直在重复操作步骤,却想不明白问题出在哪里?”
网友@help-me-grow 认为,在科研实验中,一定要寻求帮助。有时候自己看不出来的问题,有经验的人一看就能发现。
网友@linverlan作为博士生,也认为沟通非常重要。于他而言,帮助本科生助理完成代码调试、解决困难,或是换份更有兴趣的工作,都是可以通过沟通实现的。
“被分配到了完全不在研究范围内的任务,比其他人落后了一大截?”
网友@starfries 表示,这位本科生或许也需要找准自己擅长的任务,做起来才有成就感。否则如果给本科生分配博士才能完成的任务,那自然会很困难。
“我的代码能通过编译,但一运行起来就出错?”
网友@todeedee则提出了基础技能:学习做模块测试(unit test)。
将机器学习模型分解成数据收集代码、网络代码和训练代码几部分,并进一步将代码拆分成5~25行的小模块,分别进行调试,有助于尽快找出问题所在。
“给我的一些代码,我真的没办法看懂,这是我的问题吗?”
网友@milkteaoppa 认为,代码运行不起来,也可能是因为随便搞来的代码质量非常差,理解起来也同样困难。
如果只是希望运行机器学习代码的话,学会识别低质量代码、并与博士生沟通改进代码质量,都是有必要的。
“身为本科生,调试代码没问题,但却完全没办法调试机器学习的代码?”
网友@TachyonGun 认为,对本科生来说,机器学习代码确实困难,因为得掌握许多必要知识,例如数学。而在代码调试时,会出现许多数值问题,例如奇异矩阵、数值稳定性……
因此,想运行机器学习代码,必须先学会数学知识(数值分析、应用线性代数、数学建模、概率论/高级统计学)、以及熟练掌握方法(数值和可视化方法)。
事实上,对于这位本科生遇到的困难,对于搞科研的网友们来说,同样感同身受:
辛辛苦苦做实验一个月却汇报不出任何进展,被导师无情吐槽;
想要复现一篇论文的代码,结果光是解决“代码出错、编译出错、环境代码不兼容”等问题,就耗费了大量时间……
但也正是如此,他们积攒了对应的经验,帮助这位本科生找到合适的解决办法。
“感谢大家的帮助”
在网友们的帮助下,这位本科生也冷静了下来,并仔细归纳了网友们给出的建议。
他找出了自己崩溃的原因:缺乏与那位博士生和其他研究者的沟通,不了解项目应该如何进行;此外,也的确缺乏对机器学习模型和参数设置的理论基础知识。
当然,他也意识到,交到自己手里的那些代码,的确质量不高:不仅难以阅读,而且各个模块非常破碎,很难整合到一起。
他现在决定,去找那位博士生沟通一下,坦白自己遇到的问题。
……
不过话说回来,作为一名本科生,无论是做毕设还是进实验室,或多或少的都会有这位“发帖者”遇到的困惑。
是否存在快速上手、入道的方法呢?
清华特奖本科生的秘诀
其实,同是本科生,也有同学已经手握四篇论文。
这是清华特奖得主高天宇的真实经历,而发表的4篇论文,均在AI顶会上:两篇AAAI,两篇EMNLP。
对于这些科研成果,他同样有话说,不过都是实打实的干货分享。
例如,让这位本科生崩溃的、很多人同样难以启齿的“拖延压力”,高天宇就给出了缓解办法:
经常高负荷做实验的同学,在忙碌的时候可以切换一下任务,平时也可以记录日常工作,缓解自己拖延工作造成的心理压力。
另外,还有一条看似违反常理的建议,那就是把事情推到明天,这不是鼓励拖延,而是让你从一天的忙碌中跳出思维定式,也许明天会有更好的解决方案。
以及,高天宇也同样建议,要多与导师、学长学姐进行沟通:
他们对过往研究更了解,也在实验中拥有更丰富的经验,能防止你走很多弯路。
当然,如果想要加强自己机器学习的基础理论,高天宇也给出了快速读论文的方法:
大部分论文只需要看摘要,然后快速分类。如果确实觉得有帮助,再按下面的结构进行分析。
- 摘要:研究意义(包括前人研究、研究的缺陷),研究方法,研究结果
- 简介:很多大道理(解决了什么问题)
- 相关工作:文献综述
- 方法:细节
- 实验:打脸专用(论文试金石)
- 结论:基本没用(重复摘要)
文献管理工具也是有必要的:
Nature:成为“本科研究员”的三个步骤
除了高天宇的个人“秘诀”之外,Nature也曾发表过与“本科生做科研”相关的文章。
Nature在文中指出,本科生参与科研项目,在顶尖大学是一个普遍的现象。
更具体一些,例如在MIT,这一比例就超过了90%。
从在课堂上课,到实验室的生活,确实是一个巨大的转变。
对此,Nature认为在这种转变过程中个,通常会经历三个阶段 (并不适用于每个人)。
第一个阶段是“在不理解的情况下做科研”。
对于初来乍到的本科生而言,要做什么事情肯定是头等的问题。
以及正在做着某项实验,对于其背后的原因、本质,或许还不是特别清楚。
第二个阶段是“在理解的基础上做科研”。
Nature表示,以此状态搞科研的学生,是实验室往往想要留住的人才。
他们在实验室之外,会投入更多时间和经历,去观察实验所存在的局限性。这将有助于培养参与团队的意识。
第三个阶段是“学生研究员(student research)”。
这个阶段的学生,就会像研究员一样进行思考:制定新的问题和假设、计划新的实验来测试等等。
Nature认为,这一阶段的学生对于实验室的贡献是最大的。
除此之外,Nature进一步还提出了一些细节的建议,例如时间管理方面,做研究和休息时间要得当、要做到批判性阅读、要有保存记录的习惯等等。
……
最后,作为正在经历或者过来者,你是否也遇到过什么类似的问题?
以及,如果你有更好的本科生科研方法,欢迎在评论区留言分享、讨论。
参考链接:
https://www.reddit.com/r/MachineLearning/comments/l6bncg/r_why_is_it_so_hard_to_get_ml_code_to_work_i_am/
https://www.nature.com/articles/d41586-018-05823-5
“