作者:中国人民大学教师赵鑫
主页:http://aibox.ruc.edu.cn/
写这篇文章的初衷,是与本科生的接触过程中看到了一些对于科研的困惑或者误区,所以想大概介绍一下本科生的科研之路第一脚该从哪里走起。所以本篇文章的定位不是侧重学术性,也不会侧重于教育性,而是一些个人经验的分享。由于是个人的经验,希望大家带着批判的角度去读,但是兼听则明,很愿意和各位本科生做进一步的交流。全文写的比较口语,尽量不包含学术名词。
话不多说,下面我开始自问自答。
我自己大概是在大三下学期真正开始接触科研。大三上学期之前,如果不是学有余力,不建议太早开展科研,除非已经有了较强的动手能力。本科生教学的核心目标,不是以培养能够发表A类论文的同学为最终目标。我始终也不认为,一位同学如果本科阶段能够发A类论文就意味着绝对的强、绝对的适合做科研。相反,我强烈建议大一大二的同学一定把课程学好。本科的课程体系非常丰富,而研究生逐渐聚焦。要利用好本科的时间打好基础,多看看计算机的大千世界。特别推荐每门计算机课程都尽量阅读一本国外经典教材;特别建议打好数据结构与算法的基础,尝试一些ACM或者相似性质的竞赛;特别推荐加强数学基础的学习,很多理论性的学习所带来的收益要用很长时间才能发现。
如果大一大二已经将基础打好,我建议可以跟随性的开展科研。现在国内计算机科研水平在逐步提升,很多学校都有一些很好的实验室,我建议本科生早些加入实验室,哪怕只是听听报告会或者参与读书都是很有好处的。任何科研的入门都需要时间浸染,寻找兴趣也需要时间和机会,那么可以从加入实验室开始。因为这个时间段,绝大部分同学还是以一种观望的、旁听的角度参与学习,我想这个过程能够较好地帮助大家熟悉科研,也能较为轻松地进行入门。我也建议在大三下学期开始就要做好转型,因为研究生的学习不再是GPA驱动,而是真正的实力说话:是否具有科研实力、是否具有完成大型项目的能力、是否具有解决复杂问题的能力、是否具有快速学新知识的能力等等。这个转型会让很多本科生迷惑,特别是一些专注于考试成绩的“学霸”:因为不再有固定的参考书、固定的科研方法以及科研途径等,要进行二次转型,及早地进入研究生的生活。也不要太过于焦急,觉得不做科研,自己的学习就拖后了。科研需要持续专注的投入,早开始半年或者一年,不会有太多的优势。
科研和GPA没有直接关联。有关联的是,基础知识、编程能力、思维能力、强烈的学习动力等。尽管很多人吐槽GPA,但是我想,GPA能够反映出上述的部分能力。当然,我见过很多厉害的同学,GPA不高,但是其他能力真的很强。所以结论是,不要将成绩与科研绑定,而是看自己的核心能力是否真正具备了开展科研学习的基础。不要因为成绩低就妄自菲薄,放弃了尝试科研的机会。
这一问题明显是否定的。我觉得科研是一场天赋与努力并持的慢跑。天赋存在的目的在于入门的快慢以及努力可以达到的极限,例如,不是所有人拼尽全力都可以获得图灵奖。但是,绝大部分科研者离图领奖的水平相距甚远,当进入轨道之后,在大众科研者的马拉松比赛中,天赋的作用基本上不明显了。对于正常人来说,起主导角色的是努力。而且有趣的是,你会发现天资平凡的我们,随着不断努力,似乎也会越来越聪明,貌似天赋与悟性也提升了。这就是学习与努力的力量,让你的天赋也得到了加持。
其实,这一问题也会出现在高中进入大学的转型过程中。常常看到类似“我高中不用听老师讲课都能拿到满分,大学数学不在话下”、“这个东西看一眼就会,不用做练习了”之类的话。我实际很不认同这类看法,因为确实看到了一些学生从高中的状元成为了大学的伤仲永的实例,替他们惋惜。很多时候,学生的认识,包括我自己现在,我觉得都是非常有限的,只能在一些熟悉的事情上做得较好。天才是有,但是真的很少。科研的很多步骤都不能省略,不能靠聪明完全搞定。聪明只能偶尔加速这个过程,但是只有努力才能导致质变。
读研究生就是做科研吗?这一问题有点像,刚上本科的同学被问“计算机系同学毕业就要去互联网大公司吗?”。研究生培养应该是多样的。不少学校有学硕、工硕以及一些其他类型的硕士,这也反应在招生政策里。即使是学硕,不少学生到最后可能从来没有真正做过科研,很多学校的毕业要求也没有任何发表论文的限制。我觉得所有正在夏令营的学生还是要与实验室老师进行一定的沟通,到底自己毕业要干什么、自己的人生计划是怎样的。研究生还是要做好从学校到社会的过渡、做好能量和能力的储备,这是最关键的,而科研未必是所有人最适合的培养方式。
但是我还是建议所有读研究生的同学至少试着去按照科研的思路学习和训练。这一过程涉及到思维训练、写作训练等等全方位的训练。设想一下,如果工作之后有这样的一个综合能力培训班,它的学费可能大的惊人;而且如果之后不从事科研,这就是你人生中唯一一段对于科研的体验,以后再以难以寻找。
老实说,做科研在不喜欢的人看来,其实很枯燥;但是真正享受其中的人也是快乐的。每天刷着各种论文,如同刷游戏攻略一样;每天调试以及书写代码,如同打怪通关。但是对于初学者来说,这其实大部分时间就是枯燥的。举一个例子,大家经常在朋友圈立下一个flag,从今天开始我就要开始健身了,并且花了高价办了健身卡,还试图请教练监督。最后,健身卡又经常被转卖了。大家都知道健身有意义,羡慕健康的身体以及漂亮的肌肉,但是坚持过程中确实挺枯燥,也没有太多捷径可走。
很多同学不止一次都问过我这个问题。我自己觉得这是一个抉择性的问题,不是一个二元判定的问题。设想你去了一个公司,但是公司都是新业务,需要你学习,那么你能要求只能接受自己适应的任务吗?人生的局限很多都是自身的认识所限,自身的安逸所致,而不是自己真的不适合。所以读博士一样,这是一种选择,会影响着你人生下半场的轨迹,而不是是否适合的问题,也没有对错。不快乐的人即使不选择读博士,最后可能也不快乐。只要这样想,我想很多同学就会轻松很多,因为至少不会再轻易否定自己不适合做科研。
但是确实有一些痕迹可以初步判断一个人是否适合读博士。我建议读博士前问一下自己:
(1)我是否愿意为一个事情反复折腾,每次只是将这个事情做得好了一点;
(2)我是否能够承受短时间高强度的工作,自己的身体和心理能否承受;
(3)我是否能够安静地做一些思考,而不是盲从别人的意见;
(4)我是否有强烈的自我驱动能力,假使没有人提醒和安排,仍能够有做事的动力;
(5)我是否有强烈的责任感,愿意将分配给自己的事情完成,或者自己承担的工作努力做到最好;
(6)我是否能够长时间专注的做一件事,即使里面的正反馈可能很少或者很慢。
其实说差别,我觉得真的有点难,需要根据具体的导师以及具体的学生来看。但是可以说一下具体的培养目标其实不一样。对于硕士来说,一般是掌握初步的科研方法,能够胜任某一特定问题的解决即可。而博士来说,则是一个全方面的训练过程,所以才需要那么长的时间来完成,可能包括需要提升的能力主要为分析解决问题的能力、独立科研的能力以及沟通表达的能力等。我自己认为一个合格的博士应该是,有一项代表性的技术或者工作,有2至3篇高质量的发表论文,能够独立找到研究方向并且独立完成,能够有能力带领学生做科研。能够给别人讲授课程以及培养别人做科研的能力,这是一个博士向教职过渡所需要的能力。一般来说,应该是在读博士结束之后就应该初步具备的。
另外,读博士所谓的压力近些年来有点被神化了。我的理解是,既然选择读博士了,就要对有持续的付出和承受随之而来的辛苦和压力。生活没有完美的无压空间。可以理解为,这只不过是个人综合能力的训练过程。举一个例子,喜欢看武侠剧的同学,一个常见的情节就是一个小和尚上山学武术,吃尽了苦中苦,终于修炼成了“绝世武功”。虽然这个例子有点夸张,但是想想里面的剧情,有哪个武功高手上山两三年修炼就练就了一身本事。还有运动员,有的是花近十年的时间练习,最后才取得的奥运金牌。如果想不通读博士为啥吃苦,就可以想一下,这个过程其实自己一直在成长;而论文可以理解为片刻的正反馈,让参与过程中的人们不至于那么无聊罢了。整个过程,应该关注的是,自己到底是否变强了,是否真的变强了,是否可以在一个研究点或者一个研究方向上,“指点江山”、“激扬文字”。
读博士是一个综合能力的比拼。很多ACM金牌的同学未必喜欢做科研,也未必真的适合做科研。但是代码基础不好,真的会造成比较大的影响。好不容易做了几天实验,最后发现代码写错了;数据跑了几天也不出结果,因为是算法太低效了。特别是现在的开源时代,如果自己写的代码开源出去,又被别人发现bug,或者被别人吐槽代码风格以及正确性,那么就很不好了。所以代码基础不行,那就学吧。
从另外一个角度来说,很多研究题目并不是代码驱动的,核心的想法、设计才是关键。毕竟不是所有的项目都要求能够通过互联网大公司的代码检验。很多科研题目也并不是从头开发,有着前辈们为我们写好的代码。那样的话,改代码或者照葫芦画瓢的写应该是不难了。而且也可以侧重理论或者想法的提出,这样也可以多进行合作,与一些代码能力较强的同学合作,从合作中学习与提升。
兴趣的寻找和发现是一个极为缓慢的过程。回想起来,大家小的时候是否也学过弹琴、写字或者跳舞的经历,又有几个说自己真的是因为兴趣学的。即使小时候可能非常喜欢,现在是否又真的喜欢?所以做任何事情,如果仅仅通过短期判断,是很难发现自己是否有兴趣。对于科研来说,也是一样。目前的学术工作满天飞,每隔几天就来一个所谓的“爆炸性科研进展”,很容易让局外人产生错误判断。其实很多时候,你之所以喜欢,可能是环境对你的反复渲染。
有些同学凭借在实验室短短几个月的时间就下定判断,自己对某某方向彻底没兴趣、对某某方向很有兴趣。我觉得这种判断对于“意志不坚定”的同学来说,可能不太准确。举个最简单的例子,很多小朋友初次看到钢琴的时候,如果父母和他说,你有兴趣学钢琴吗,我想应该有很多小朋友回答是。但是如果经历了半年的艰苦学琴的历程,再问小朋友说,你还有兴趣学钢琴吗,我想开始有些小朋友回答说不喜欢了。再过一段时间后,可能放弃的小朋友将会越来越多。举这个例子就是要说明,兴趣是真的长期接触后才能知道。另外,不知道大家有没有经历过,开始很多事情实际上很厌倦的,但是由于不断的去做,最后竟然也喜欢上了这个事情。我猜想很多运动员可能有类似的感觉吧。
我想表达的是,不要想太多关于方向是否感兴趣的问题。只要选择的方向还处于蓬勃发展期,我觉得对于初学者来说,问题都不大。当然,即使是冷门方向,随着时间的投入,也可能有技术上的突破。
总之,研究方向可以判断的更为简单一些,别想太多。选好导师比研究方向重要多了。
我建议科研训练从开始就要专业,不要说先随便找点东西学,因为学术就是一个严谨的事情。有条件的同学,可以及时进入实验室,多和老师讨论。没有条件的同学,我给出一个简单的科研训练列表,仅供参考:
(1)从视频网站中(如“后浪”之站)选择 机器学习、深度学习、自然语言处理、计算机视觉等国外知名大学的知名在线视频,一集一集地看。同时利用搜索引擎找到对应课程的课程主页,然后找到作业部分,尽量认真完成。不要贪多,要循序而渐进,要力争整门课程大部分内容最后跟下来了。遇到公式部分,建议一定自己推导;遇到模型,建议自己实现一遍或者看看网上的开源代码。
(2)在上课程同时,一般课程都会推荐读书或者读论文。我建议要一起做一下。初次看论文的时候一定会有一种感觉,满篇的论文至少有几十个单词不认识。我建议是尽量认真读一遍论文后,寻找网络的中文解读(如知乎、论坛等)。注意,不是因为外语才推荐大家这样做的,而是中文的解释有可能给初学者最为直观的理解,可以快速入门。这些都结束后,可以再回去精读该论文。如果还有读不懂的地方,不建议长时间纠结,因为很多地方可能原始论文也没写清楚或者不是暂时的知识所能够理解。
(3)动手写代码。一旦读过几篇论文之后,建议选择一篇具有源代码的工作进行复现。注意,一定要选择好工作的好代码,确保一开始入门就是按照最正规的途径进行。试着从代码的角度再次分析论文中的部分。当源代码读懂后,可以试图下载数据,并且试图跑通论文中的实验。如果能够得到和论文中相似的结果后,说明已经基本可以达到初步的论文理解。下一步就是复现代码,确保能够复现源代码。
(4)如果系统性的上完一门课、又实现过若干论文的源码后,可以多找找最新的一些Survey文章来读。各个方向的都可以看看。最后可以挑一个眼缘好的方向深入阅读,并且看Survey中对于这一个研究方向中的核心研究问题是什么、哪些研究学者的论文被大量引用。一旦问题和对应的学者锁定后,就可以考虑follow一个问题了。
(5)初次上手一个问题,我建议首先找到该问题最为经典的一篇文章,了解清楚基本的问题定义、评测方法以及已有方法。通过下载真实数据集合,构建评测实验,实现代码,分析bad case等途径查看已有方法具有什么问题。然后试图模仿已有论文论述的研究动机,看看能否将数据中发现的问题转化为学术问题。总体来说,这一过程很难,不要着急,不要急于求成。也不是这篇文章的重点。
本来还想写第十个问题“本科生如何能够发表顶级论文”,但是想想当初我自己并不是那种科研小天才类型的学生,而且科研的导向应该是全面系统化的,而不是论文为王,要有真本事,如白纸推公式、vim写代码。我记得自己当时本科阶段非常希望能够发出来一篇论文,但是一直到研一下学期才发出了人生的第一篇论文。时至今日,我还清楚记得论文发表的前一天晚上,断续地睡觉,一直到早上收到了接受邮件,我反复读了几次,确定这是真的后,才又继续睡觉了。可以肯定的是,在接到邮件的一瞬间,感觉人生到达了“巅峰”。第二天,这封接收邮件,我想应该是反复读了十几次。这种感觉只有经历过科研的人才能懂。鉴于此,不谈第十个问题了。
科研虽难,但是不经历会有缺失;正在经历的人,有的得意、有的痛苦、有的正在考虑放弃。无论怎样,总有人为它的魅力着迷。学术如苦旅,我亦是行人。