一名研究生的自我修养
今天浏览本科学院网站时,看到张岩峰老师博客中的几篇文章,很有感悟,希望能记录下来,以后再次学习,侵删。
一名研究生的自我修养
一、如何学习
研究生阶段是学习效率最高的阶段。第一是因为动机纯粹,以前上学这么多年大部分的学习动机只是为了成绩,这个学习动机其实会很大限制同学的主动学习意愿,往往是被动学习,为了成绩而学习往往对提升自己能力并没有那么大的益处。而研究生阶段的学习动机是为了解决导师项目中的实际问题,它驱动你去主动去寻找答案,去网上搜去问同学老师,这就不同于为了考试而学习那种低效的方式;第二是因为研究生阶段面临着生存压力,好多同学读研只是因为自己没有准备好工作,那么到了研究生阶段,就会有就业压力,驱使他去主动学习;第三是因为学习方法更好,以前都是授课方式,研究生阶段是项目驱动、问题驱动,这种方式更利于主动学习。
关于学习,大家学了这么多年都很拿手,但是有几个我认为的关键,需要跟大家澄清:
第一、轻松的学习是无效的。
比如说要背一个单词integrity,很多同学做法是,把单词里的字母逐一读出来,大声朗读多遍integrity,integrity...,然后再把对应的中文释义读出来integrity,正直,而且只背第一个释义。这样背单词的效率极为低下,但很多同学没有察觉。其实最好的记忆方法是找到词根,拆解词根记忆,in是没有的意思,比如inhappy, inhuman, injustice, impossible。tegr是touch,接触。连起来就是没有接触过的,相当于没有受污染的,中文是出淤泥而不染。加上ity名词后缀。就是名词的正直,廉洁。也扩展到表示一个事物,完整。
或者读论文,从头读到尾,在论文上画了很多五颜六色的,然后把某些概念再抄一遍,讲论文的时候也照着ppt念,其实你只是假装努力,花了很多时间做了很多无用功。读论文,应该是先第一读懂问题,就是motivation,然后自己想我怎么解决这个问题,想一会,然后看他怎么做的,是不是比我做的好。不要重复他的话,要用自己话总结描述。认知心理学研究,人们在学习一个概念的时候,花费越多的心思,尝试用自己的话语去重新演绎它,或者是尝试理解这个概念在不同语境下的不同意义,就能越牢固地掌握这个概念。很多刚开始读论文的同学最大的问题不是看不懂论文的贡献,而是看不懂问题,需要大量背景知识在别人交给你答案前,先尝试自己解决问题,哪怕在尝试中会犯下一些错误。
第二、不要过于关注结果而忽视了成长的过程。
有两种人学习的目的不同:第一种为了证明自己的能力,第二种为了学到新知识和技能。关注成绩而忽视学习与成长让人不敢冒险,而过于关注自己的形象,就会害怕别人说自己必须竭尽全力才能取得不错的成果。哈佛和耶鲁都不强调考试成绩的重要性,因为学校给大部分学生A,也就是说,只是在成绩单上混一个全A并不是一件难事。为什么这两所大学在成绩的把控上如此宽松?并非它们不知道成绩的重要性,而是要向学生们透露一个信息——你们的学业足够优秀了,你们应该关注课程以外的东西。事实上,在耶鲁大学,学生一半的时间都花在了课外活动中,因为这些看似和考试无关的活动,培养了学生的各种优秀品质,比如拼搏精神、团队精神、领导能力、社交能力、表达能力、全球视野和社会责任感。事实上,如果在哈佛和耶鲁没有学到这些内容,就失去了在那里读书的意义。我也走访了很多中国的一流工科大学,发现学生把90%的时间都用在了学习和准备考试上。这样固然可以得到很好的专业训练,却让年轻人在一生中最宝贵的时间里失去了培养优秀品质和综合能力的机会。
第三、养成终身学习习惯。
有两种思维模式,第一种是相信自己的才能是一成不变的——也就是固定型的思维模式——会使你急于一遍遍地证明自己的能力。如果你只拥有一般水平的智力和品德,以及普通的个性——那么,你最好证明你自己能够在这些方面达到正常水平,不能让自己在这些基本的特征方面看上去或者给人感觉不足。我们当中有些人从很小的时候就被训练成这种思维模式。我小时候就非常关注自己是不是足够聪明,在这种思维模式中,全班同学都有一个强烈的目标,就是要让自己显得聪明而不是愚蠢。在每次考试或者在课堂上被她叫起来回答问题时,我们整个人都可以说是处在成败的紧要关头,谁还会在乎和享受学习的内容呢?我见过的太多人都抱有这种要证实自己的强烈目标——在课堂上,在工作中,甚至在他们的个人关系中。每种时刻都需要他们对自己的智力、个性以及特征进行证明。每一个时刻,他们都在接受评估:我会成功还是失败?我看上去是聪明还是愚蠢?我是会被接受还是被拒绝?我看上去像是个成功者还是失败者?所以你本来手里只是一对K,非要显得让别人以为你是俩王。
但是,世界上还存在另一种思维模式。在这种思维模式中,这些品质不是你非要打且不得不打的牌,你不需要总在担心自己手里只有对十的时候去说服大家和自己,你手里的是一副同花顺。在这种思维模式影响下,你需要打的牌不过是你成长的起始点。这种成长型思维模式建立在这样一种理念上:你的基本能力是可以通过你的努力来培养的。即使人们在先天的才能和资质、兴趣或者性情方面有着各种各样的不同,每个人都可以通过努力和个人经历来改变和成长。你可以看到,这种认为“人的才能可以发展”的信念如何给人们带来了学习的激情。当你有时间提升自己的时候,为什么要浪费时间一遍又一遍地去证明自己的杰出?为什么要掩饰自己的不足而不是去改变它们?为什么要找那些只能保护自己自尊心的人,而不是那些可以促进你成长的人作为自己的朋友和搭档?为什么要去找那些自己屡试不爽的事,而不是去选择一些可以提高自己的事来做呢?即使是(或特别是)事情发展不顺利时也能拥有这种想要提升自己并坚持不懈的激情,这就是拥有成长型思维模式的人身上的标志。这种思维模式,让人们在人生遭遇重大挑战的时刻,依然可以茁壮成长。
二、如何科研
研究生阶段三年,如果能完整走一遍科研流程的话,将有助于同学们从菜鸟进阶为一个小领域专家。下面分享下个人在指导研究生科研当中的经验。
第一步. 调研、入门
1. 确定一个感兴趣的大领域,比如分布式系统或者机器学习,或者深度神经网络。读这个领域经典算法和技术,也可以是几本比较好的书,读完然后再实践实践,动手加深理解。这个过程做完就算是初步入门了。
2. 找该领域的顶级会议,比如系统领域的有OSDI、SOSP,机器学习的领域有ICML、CVPR,深度学习的有NIPS、ICLR等等,可以搜CCF会议推荐列表看各领域的顶会列表。然后看近几年这些顶会的论文,因为这代表了最新的研究热点,咱不是说一味的追热点啊,毕竟对于初学者没有足够的领域专业背景,追热点是最快的方法。因为热点往往是该领域最亟待解决的问题,往往是发展最快的小方向,也最容易产生新成果。如果是老问题,人家都研究十几年了,给你留下的待解决的问题就很少或者不是很重要。当然如果是有几十年经验的研究者就不必追热点,他们知道该领域哪些是fundamental的问题,哪些是最值得研究的问题。
3. 读了这些前沿论文后,确定一个小方向,比如分布式系统是个大方向,小方向可能是机器学习分布式训练;大方向是深度学习,小方向可能就是graph embedding;大方向是机器学习,小方向可能是半监督学习等等。确定小方向的过程是个知识不断积累的过程,非常重要,这需要你对大方向有很多了解,对小方向有更深入更全面的理解,需要读好至少100篇以上论文,需要你知道该小方向的研究进展历史,这需要你知道该小方向别人都在哪方面做工作,做该小方向的顶级研究组都有哪些,他们正在干什么。
第二步. 发现问题
这步超级难,如果发现了个好问题,那就是成功的一半。这个问题最好是重要的、本质的、没有直观解决方法的。
4. 确定小方向后,你需要阅读大量的这个小方向的论文和了解开源项目,再不断聚焦,再确定一个要改进和优化的小小方向,这个可能就是论文的主题。小小方向可能是机器学习分布式系统中的parameter server通信模型,可能是dynamic graph embedding等。然后就要更聚焦地读这方面的相关论文,这时候论文就比较少了,几篇到几十篇到几百篇都有可能,这些论文要精读,花几个月时间研究一篇论文也不为过。
5. 挑几个重要的论文工作实现,也可以找开源的运行跑一跑试一试,idea往往从实际运行中来,光靠读是不行的。这个跑一跑可能需要你尝试不同的运行环境,不同的workload数据集,不同的应用场景等。比如,parameter server(PS)模型在本地集群上跑是不是和paper声明的一样、在异构的动态性极强的集群环境下效果怎么样、除了paper提到的算法处理其他算法的时候效果怎么样、除了paper提到的数据集换另外一类数据集怎么样;graph embedding方法处理密集图和稀疏图都怎么样,处理动态变化的图怎么样,等等吧。你要发现X方法仅在a环境下好用,在b环境不好用。这个就是发现问题的过程。当然,没经验的研究者可能很难想到多种环境、多种workload、多种应用场景,这就需要积累。
另外一个发现问题的方法是从实际生产中来,这个当然是最好的,但是往往是大企业环境下才有这个条件。
6. 确定你发现的问题还没有被解决。这又需要广泛的阅读和调研,但是问题已经很聚焦了,搜索也会很容易,用你特定问题的关键字在google 搜索(这里强烈建议用google,其他搜索引擎基本搜不到),找到解决相关问题的论文。看看这些论文是不是已经解决了该问题,如果解决了,你有两种方案:第一,该问题已经解决的非常好了,放弃解决该问题。第二,该问题的解决方案还有问题,我还有更好的办法。我建议后者,最起码尽量尝试尝试。
5和6步是个迭代的过程…
第三步. 分析问题
7. 分析问题产生的本质原因。这个往往和第5步发现问题同时进行。这一步靠的是功底和积累,靠的是对问题的理解程度。理解的越深刻,分析的越透测,你之后产生的解决思路就越有可能正确和有效。比如分布式机器学习的PS模型在异构环境下、和在处理数据不均匀的情况下就不好,本质原因是其同步的集中式通信模型,造成PS集中服务器往往需要等待。传统graph embedding方法采用批处理模式,需要graph的全局信息做embedding,当然无法应付动态性非常强的局部更新情况。
8. 基于分析,就是对该问题的深刻理解,产生改进的idea。这个可能很难,可能靠运气,但我觉得更多的是靠对问题的理解程度,理解的越深刻,本质原因抓的越准,就越可能产生创新idea。读过一本介绍google企业文化的书,google产品的成功,既不是靠技术能力,也不是靠用户需求,而是靠技术洞见(insight),这就是对问题本质的深刻理解。比如,PS模型在某环境下问题的本质原因是集中式的同步模型,那么我们就可以提出尝试异步通信的模型的idea。
分析能力跟个人的批判性思维、独立思考能力都有关,而这正是中国人欠缺的,可以通过读有深刻见地的书籍文章、经常提问来锻炼。
第四步. 解决问题
9. 实现你的idea,做大量实验验证。这需要动手能力,需要编程能力,需要坐得住。
10. 验证你的解决方案,根据实验分析不断优化你的方法。做了大量试验后,得到了若干结果,可能是不好的结果,但是不要一下子否定自己的解决方案,这不能说明你的idea不好用。一个好的方法往往经过千锤百炼,同样,你的idea通常不会一下子就成功。需要你根据实验结果分析不好的原因,然后基于你的理解改进方法,这是一个反复不断迭代的过程。
比如,你发现异步PS模型效果还不如原来的呢。那么关键的是,你要问自己为什么?为什么理应提升的却没有提升?你要看实验运行的日志,看看是哪里慢了,差在哪里,最后你经过不断的实验、分析、思考,你发现了,你提出的异步PS模型虽然没有了等待开销,但是计算的有效性却降低了,结果整体性能反而下降了。那么你下一次迭代就要想怎么把这个计算有效性提上来。我又有了个方法,可以评估每次计算的有效性,然后把计算资源都投到有效性高的计算上。OK,idea不错,那么怎么评估有效性呢?不能开销太大,否则又得不偿失了,你可能想到了一种近似地评估方法。重新实现后,发现效果还不错。OK,恭喜你!你可以准备发论文了!
整个研究过程,导师将起到关键的作用。导师可能会给你个问题,这是难能可贵的,基本帮你做了一半的事了,否则你可能需要花上一年时间找问题。然后整个研究过程,都是在导师的引导下进行,需要定期向导师汇报,与导师讨论idea和请导师分析实验结果。最好自己也要经常找同门讨论,而不是闭门造车。
第五步. 撰写论文
11. 设计你的论文,草拟论文的骨架。每一章都写啥,每一段都写啥,实验都做啥。论文的逻辑往往比语言重要的多,逻辑合理的论文更易读懂,即使咱华人有天生的英语语言缺陷,但是好的逻辑就可以弥补这个不足。写论文就和讲故事一样,怎么能把一个事说明白,不那么简单,甚至说很难,需要不断锻炼。写完给老师看,老师同意后进行下一步
12. 写作论文。这个就是根据骨架填肉的过程,但是这一步也不简单,特别对于英语不好的同学,写出来的东西简直是不忍直视、不堪入目、毁人三观。研究生没有写作经验,但是要保证写作态度,毕竟这不是一朝一夕能提高的,需要你不断积累。
有几个写作的方法吧。第一,不要自己想当然,对于不确定的句型,用“”扩上上google搜,看看你这句型有多少人用过,如果没有几个人用,那就别用,换个写法。第二,读别人论文时,遇到好的句型就记下来,不断积累才能提高。第三,避免一切语法错误,我觉得这个是可以做到的,现在网上那么多工具都可以用。语法错误都避免不了那基本就是态度问题。遗憾的是,我很少遇到能避免语法错误的学生,我生气往往是因为态度问题,而不是能力问题。第四,尽量用短句用简单句子,别用长句。你写论文是为了让别人理解你的方法,不是写文艺作品,能说明白就行。
13. 提炼总结,改进方法。写作的过程也是屡顺自己思路的过程,写作的过程中往往也能发现自己方法的漏洞,那么就要继续回到8,重新思考解决方案,又或者你发现需要补实验来支撑你的论点,那么就继续实现系统做实验,得到实验结果。
14. 关于实验。怎么做实验是学生总问的问题,怎么做科学实验也是一个很重要的问题,有对照组、无偏的、定量的,这些都是科学实验的重要要素。如果有解决该问题的其他方法你首先要说明你的方法更好,至少在某一方面更好,这其中可能要涉及到不同的执行环境,或不同的算法数据集。然后设计实验说明你的方法好在哪里,用实验数据说明,比如异步PS和同步PS对比。然后你要进一步用实验数据说明,异步PS的有效性也提高了,如果不考虑有效性的话那么结果就不好。然后你的方法是否有些重要的超参数,试试variation导致各种结果。在实验结果展示方面,要学会用各种工具画各种图,把重要的因素用可视化方式体现出来。
第六步. 投稿和看待审稿意见
15. 接下来就是投稿。选一个合适的会议或期刊投稿,这个可以听老师的,老师基本有这方面的常识,根据你工作的方向和档次选择合适的去处。确定好了哪个会议期刊后,就需要按照会议期刊要求来整理论文格式,latex是必会的工具了。之后赶在deadline之前提交论文,这个最后的几天可能很痛苦,因为你的论文和方法总有改进的地方,老师的要求会让你最后几天是最忙的几天。但是需要认识到,凡事无完美,你总也改不到完美,你需要一个deadline来督促你完成一个milestone。开始进一步工作或下一个工作。
16. 看待评审意见。接下来是漫长的等待,会议一般是2-3个月的时间,结果可能是接收也可能是拒掉,相比于结果,更应该看评审意见,看看这些意见是否合理,是否能解决,无论是接收还是拒绝,然后接下来就再次回到解决问题的部分,再次开始优化方法的过程。如果是接收了,那就可以准备订机票开会旅游去了。如果是拒掉那一般是有比较大的问题,那就再仔细深思下一下你的方法。继续优化,还是降低档次投个差点的会,就看你导师的了。
第七步. 后续
17. 宣传你的工作,扩大影响力。首先你可能是要去参加会议,做个漂亮的ppt,反复演练,争取有比较好的演讲效果。有时你导师有机会去一些地方做报告,把这个工作介绍一下,都是扩大影响力的方法。
18. 开放源码。还有是尽量把自己工作的代码和数据开放,挂到网上,让别人来使用,接受别人的改进意见或者是简单的debug。咱不是专业的工程人员,也不用指望你的成果可以马上用于生产,个人觉得开放代码主要是为了让别人更好滴了解你的方法,这有助于扩大影响力,产生后续研究工作。如果有人引用你的论文、或咨询论文内容、又或是使用了你的代码和数据,这也算是你对整个科研事业有那么一丁点的贡献了,这比水论文有意义多了。
整体来说,发表论文需要你有:批判思维能力,动手能力,知识面,写作能力,表达能力,英语,韧劲(抗打击能力)等等一系列能力,如果在研究生期间真能发表一篇论文,经历了以上这么多磨难和锻炼,我想你的能力也是不知不觉提高了很多,成为了该小小方向的一个小小的专家了。这对你来说,是最最重要的。
这里我提到了韧劲,就是说,在解决问题过程中,你会受到不断的打击,包括来自导师的、来自自己的实验结果方面的、来自评审意见的,但是你要做的就是,站起来,继续凿,直到导师满意,直到reviewer满意,直到大家满意。别把这事想简单了,当你想象一下周围好多人都发好多sci了,而你还在为这么一篇完全未知结果的论文而这么努力的时候,我觉得大部分人可能就是缺少这个韧劲才最终以失败告终的…
最后,我想再强调一下,发论文不是简单地发论文,而是通过发论文宣传你的工作,以便对某技术或人有那么一丁点影响。无论你发哪个档次的论文,只要目标正确,我觉得你都会有收获和有贡献的。相比较于为了发论文而发论文,你会觉得你是那么地高尚和高大,他们只是造废纸,而你已经对社会有贡献了…
三、未来职业规划
几年来带研究生总结了一些经验,思考了一下学生的职业发展,大部分硕士生入学时候都不清楚未来职业规划,很多人浪费了大量时间精力,或者选错了导师和方向,觉得有必要分享下我个人的一些小建议。
计算机硕士生毕业去向主要有四个方向:做科研继续读博、做技术去大厂、考公或事业单位、去传统垄断行业国企。这个未来规划我觉得最好在本科生时候就想好,而不是在读研过程中去尝试某一个方向,这会浪费很多时间精力不说,如果选错了导师和方向,还会很痛苦。但是基本上大部分学生都没想好,本科光刷绩点去了,不去读书、不去尝试各种路线、不知道思考未来,很多重要的事都没想清楚,即使绩点够高保研了,结果也找不到合适的导师和方向,抓不住研究生阶段的发展机遇,典型的短视。
导师和方向没有最好的,只有最合适的。最好是能先想清楚自己想要什么,什么才是最适合自己的。大学四年应该思考自己的定位和特长,这样才不至于在读研阶段太被动。下面我就每一个发展方向谈谈我的理解。
做科研继续读博。毕业后留高校或者去企业研究院、和研究所。这种职业选择好处是工作比较自由,接触的是技术前沿,有博士学位后无论是去企业还是高校都会有比较高的地位,更有机会做大事;坏处是读博期间比较清贫,以后去高校的话相对于计算机行业平均薪资收入较低,读博阶段很苦。选择读博的话在研究生阶段需要培养编程能力、某一领域的较深的认知积累、独立思考、批判思维、写作、表达的能力。适合找论文成果好的年轻导师或者有一定资源的大导师,年轻导师会给你精心指导写论文甚至替你写论文,大导师有平台、团队、人际资源等,有团队的reputation,这些都有助于出好的成果。
作技术去大厂。好处是绝大多数人的主流选择,薪水高,做实际东西;坏处是工作辛苦,有时候可能做自己不认同的项目,因为毕竟就是打工人。去大厂要挑部门,最好去核心部门和团队氛围好的团队,这样工作会比较顺心。研究生需要培养较强的编程能力、项目调试调优、独立思考、一定的情商、沟通协作的能力。适合找有企业合作项目的导师,最好是与大厂的校企合作项目,参与项目积累经验,比较容易提升技术能力。
考公或去事业单位。好处是对于一些不喜欢编程和搞技术的可以脱离技术了,主要处理和人的关系,社会地位较高,可以积累人脉资源,工作相对轻松,对于有野心的年轻人其实工作也不轻松;坏处是薪水较低,放弃了目前公认的最好的专业。研究生阶段需要培养锻炼极高的情商和表达能力,写作能力、沟通表达能力。适合找散养的导师,因为这些能力导师基本教不了你,都得靠自己磨练。
去传统垄断行业国企。对于许多想躺平的人可能更喜欢这个选项,吃垄断红利,拿着不错的薪水,还不累。但是我个人认为这个并不太推荐,科技在发展,社会在进步,时代在变化,电话颠覆邮政、互联网娱乐颠覆电视台、微信颠覆移动,新技术颠覆垄断的例子比比皆是,无论什么垄断行业都可能会被颠覆,现在微信担心抖音抢流量、汽车担心新能源车、传统行业担心人工智能,优秀的人永远应该有危机意识,所以强烈不建议选择躺平。
美好生活是奋斗出来的,无论什么职业,都有前途,但是养尊处优绝对没有前途,努力提升自己,掌握不可或缺的能力,让自己成为不可或缺的人,才是研究生最应该做的。
不可否认有些情况确实是选择大于努力,但是选择的难度要远远大于努力,不学习不思考怎么能做出最好的选择?相信越努力越幸运,把自己能做的做好,其他一切交给时间和命运,我觉得才是正确的心态。
下面几个point摘抄自吴军老师的《大学之路》:
珍惜平台:“如果让我必须在那种由老师管着、选够学分就能毕业的大学,和那种没有教授、考试,让年轻人在一起共同生活、互相学习三四年的大学中选择一种,我将毫不犹豫地选择后者……为什么呢?我是这样想的:当许多聪明、求知欲强、富有同情心而又目光敏锐的年轻人聚到一起,即使没有人教,他们也能互相学习。他们互相交流,了解到新的思想和看法,看到新鲜事物并且学会独到的行为判断力。”
终身学习:“教育是一辈子的事情,我们不必担心输在起跑线上,因为世界上大部分人跑到一半就不会再跑了,只要你在自我教育的道路上坚持得足够久,就一定能够成为那个笑到最后的人。”“回过头来看,一些过去比我们读书更优秀、在起跑线上抢到了更好位置的人,早已放弃了人生的马拉松;我们能够跑得更远,仅仅是因为我们还在跑,仅此而巳。”
事业心和使命感:“我希望我们的下一代能够更多地考虑如何成为更好的人、更有用的人,把教育看成是实现自己梦想的过程,而不只是为了未来的生计而学习。”
原文链接:http://faculty.neu.edu.cn/zhangyf/zh_CN/article/39663/content/1652.htm