清华计算机入学教育之“关于如何做科研的一些个人经验”

最近开学季,被抓来给研究生新生们做个关于“如何做研究的”的入学教育报告。会后大家希望发 ppt,但里面暴论太多必须得加些备注叠叠甲,所以花了点时间补充了下备注。再然后想着写都写了,干脆也不敝帚自珍了发出来让大家一起拍拍砖。

需要特别申明一下的是,虽然是入学教育但是全篇都是个人主观的、不成熟的、偏颇的意见,不一定适合所有方向,不可能适合所有个人,所以内容仅供参考。特别清华本身大师这么多,之所以是我被抓来给小朋友们讲这么大的题目自然不可能是因为我做的有多好。主要还是因为我和新生们的水平贴的比较近,适合起到一个抛砖引玉的作用。另外就是我个人的经历的确也比较<del/>成分复杂</del>丰富,各种各样的方向都干过一点,所以一定程度上也可以和全系很多方向的同学都能聊得上一点。

言归正传,虽然首先要恭喜一下大家正式入学,走上了<del/>听上去非常光荣的</del>研究之路。不过这里还是需要提醒一下大家实际上这是一条荆棘之路。考验的不只是大家“灵光一闪”的智力迸发强度,更多的还是耐力甚至是心力的投入。大部分的时间是在“熬”的状态,所以大家还是需要劳逸结合,保持心态和身体上的健康。

当然为了大家熬的能轻松一点,这里提供一些基本的思路。毕竟在很大程度上来说“搞研究”这事情中还是有不少有迹可循的经验的。具体分为三个方面,首先从“术”开始,提供一些关于如何读论文,做研究,再到写论文的基本方法。接着是关于如何规划一整个博士生涯的大方向上的思路。最后则是灌点鸡汤。

循序渐进的读论文

读论文作为一切的开始,相信大家未来会经历很多次向导师/学长提出某个问题,然后反手被甩回十几篇论文的情况。这里推荐一种从单篇论文的略读,到一整个系列工作的对比阅读,最后到一整个领域的面上 survey + 按需精读的策略。

而单篇论文略读的思路,如果需要用一个字来总结的话就是“快”,需要通过不断地锻炼提升自己抓住论文重点的能力。在现在这个论文数量泛滥,arxiv 一天能刷出几十篇论文的时代这项能力尤其重要。

当然我也理解关于速度上的要求应该也是和大家当前状态差别最大的地方。我早期和同学交流的时候经常一下甩出去十几篇论文,然后三天后问看的怎么样,回答基本上都是第一篇还没看完。但其实一个理想的节奏因该是第一篇迅速的每篇半小时都过一遍,然后第二天找几篇觉得和当前目标相关性比较大三篇早中晚各读一篇,然后再花一天时间查漏补缺一下,顺带按照自己的理解做做笔记啥的。

为了达成这样的速度首先的前提是对领域本身的熟悉,不然 background 就要花掉不少的时间,这部分属于自然而然就能越读越快的部分。在此之外需要注意的就是把握论文的结构。稍后会提到,论文写作本身是一种八股,有经验的作者会有意识地将重点放在明显的地方,所以只要把握了这个结构本身就能快速定位到关键点。

这里推荐在略读阶段着重注意关注三个方面:

首先是场景,也就是这篇论文针对的是一个什么样的问题中的哪一个具体的方面。这个问题是不是一个真问题,是不是你关心的问题,这些是需要首先判断的,可以用来快速排除掉不需要细读的论文。同时也可以基于这个对论文进行分类,不同类别的论文有不同的读法和应该关注的重点。

一类是所谓的“挖坑”论文,也就是作者提出了一种或大或小的新场景。比如我是系统方向的,我们这边经常会因为某一种新硬件技术的出现带来大规模的新坑。这是因为新的硬件会带来不同的 tradeoff。这一类论文特别是新场景的第一篇论文很多时候解决问题的方法是比较直接的,所以对于它们需要重点学习作者是如何“立住”一个新的场景。可能是通过对某些新应用或者新硬件的特征分析,可能是通过某些统计调研数据,也可能是通过一两个精彩的代表案例阐述。这些都是为了证明这个新场景为什么是重要的,为什么是值得大家关注的。相关素材和论证思路都很值得在后续要延续做这个场景或者自己去立一个新场景时使用。

另外一类则是“填坑”的论文,这个时候就需要重点关注作者如何定义新的“挑战”和对应的解决方法。这里和初学者重点关注方法不同,我个人建议更加关注“挑战”。在很多时候方法都是老方法,在搞明白挑战问题为何之后方法是水到渠成自然而然出现的。当然这完全不是意味着说这样的论文不好,反而的确很多时候提出问题比解决问题要重要得多。同时对于这一类问题也可以重点思考这些经典方法各自的适用场景和 tradeoff。

这个就和游戏一样,这些经典方法的熟悉就是在丰富你的武器库,熟悉了就可以在不同的场景下基于不同的数据或者环境特征去组合使用。当然比较少见的你会看到一些天才般的新方法被提出。对于这一类论文可以重点关注,他们相当于让你多了一把后续可用的武器。

最后就是论文的实验部分,这里的重点是反向会去验证这些实验的构造是不是真的对应了论文最开始描述的场景。以及论文到底着重对比了哪些前人工作,具体比的维度又是什么。这一部分我们在稍后比较读中会展开。当然其实更重要的部分是发现测试中作者有意无意选取的 bias 和弱化或者隐藏的部分。当然这个需要一些经验来习得。

当然这个时候有同学就要问了:“说好的略读去哪了,这不是整篇论文都读了吗?”这里就需要再强调一下,论文是一种结构化很强的八股文,熟悉这种结构之后带着上述的问题去读就可以做到比较快速的跳着读找到这些重点。具体结构我们会在稍后“写论文”的部分提到。

当然在现在这个时代不要可避免的一个问题是要不要用 AI 帮忙读论文。

这里我个人的意见是 AI 读论文最适合的两个场景一个是帮助总结一下快速排除掉一些不值得读的论文,另一个则是在自己读完之后让 AI 给你去提一些问题看看你自己能不能会答得上来。后者就是所谓的“AI辅助费曼学习法”,面对各种各样杂七杂八的问题能不能快速的回答上来是考验都没读懂的关键。

相对的,如果是判断值得读的论文还是建议自己去读一下。因为行文的过程中其实有“微言大义”,特别是老派的作者从具体措辞上能够读出很多他们的隐藏褒贬,这一类的信息 AI 目前还读不出来。

在完成单篇论文的略读之后进一步的就可以将多篇递进的论文串起来进行对比阅读。通过这个环节重点是学习如何发现一篇论文的局限性。

虽然在论文写作过程中作者会通过文过饰非的手段弱化这些局限性,但是后来引用和比较他们的论文就会更加直接的挑出来进行对比。这里建议画一张图分别用点和边表示论文自己的声称以及后文对这些声称的回应,多看看大概就能知道怎么找问题了。

更进一步的就可以做一整个领域的调研。这里推荐低年级可以先看看比如 CSUR 这样的专门做 survey 的期刊。

从中重点可以学习它们是如何结构化的将一个领域按照细分领域,使用手段,递进关系等进行划分的“Taxonomy”部分。同时也可以关注 survey 作者对于不同论文适用范围和递进关系的分析。

当然作为一个领域其中必然也有一些经典的,或者和你想要做的方向最相关的论文是需要精读的。但其实精读是一个比较有误导性的词,因为如果只是读的话是很难了解清楚一项工作的。这里需要的是进一步的尝试去复现这个工作。

很多时候一开始的复现会发现很多的实验结果不一致的地方,同时也可以自己去做一些更多的原文没有覆盖的实验。这些实验的过程中会发现很多实际的结果和理论分析不一致的地方,比如原则上算下来觉得应该有个 200GBps 的带宽实际一侧发现连 50GBps 都没有。只有通过观察分析和解决这样的所谓“分析和现实间的断裂处”才能真正的掌握。

不过这样的话精读花的时间也会很多,只能读有限的几篇论文。这个在当前数量爆炸的时代是比较困难的。这方面怎么挑选大家需要各自找自己的导师和同学来了解,他们都清楚。

找一个点开始做

以上就是读论文方面的一些基本方法。完成一整个领域的调研之后就可以开始尝试找个点自己做做了。

这里可以考虑尝试一种“棋盘法”,也就是将所在的领域的子领域按照行,经典方法按照列化成一个棋盘然后把对应论文填进去寻找空白比较大的区域。事实上我自己的第一篇工作就是这么找出来的。当时我调研的领域是 Concurrency Bug 调研后发现主要有三类然后其中 Order Violation 大家关注的比较少,特别是它比较适合基于历史 trace 去检测正好有没有人基于这个思路去做它所以就选了这个 topic。

找好点之后就需要开始做了,而这基本上就是煎熬的开始。而且有一点需要提醒大家的是一开始找到的点和实际最后做完发表的点有非常大的概率是不一样的。大家不用担心走入死胡同,不断地调整不断地尝试终归有出路。

比如我刚刚说的 Order Violation 这个出发点实际上一上来就被质疑说覆盖面太小(其实这也是棋盘法的一个明显的缺点,没人做的方向一般都是有原因的),所以我就尝试泛化了这个思路拓展到整个 Concurrency Bug 领域。接着被质疑创新性不够(棋盘法的第二大缺点,毕竟是排列组合),然后我调转了视角从做检测改成了之前很少有工作能做的做预防。再接着就是性能不够好,痛定思痛之下彻底重写一遍才最终中稿。

整个历程被拒了五次还是六次,从大四毕设就开始做,一直做到博二才最终发表,其间辛苦不足以为外人道。

当然这里可以先灌点鸡汤。这篇论文虽然历尽坎坷但是最后拿到了 A 类会议的杰出论文奖,成为了后来系里的安慰同学收到拒稿不要气馁地经典传奇小故事。另外也推荐大家去读读 PhD Grind 这篇我读书时非常有名的小册子,品一品标题中“Grind”的意思。

做完了把它写出来

做完之后需要的就是把论文写出来!要写出来了的论文才可以被接受!因为重要的事情需要说三遍所以再强调一遍如果单纯考虑提升中稿概率的话,好好写论文某种意义上比好好做实验还要更加关键!

写论文这部分最大的问题就是所有的初学者都会把论文写成技术报告的形式。这里面的核心区别点在于“技术报告”假设对方想要了解你的技术,想要钻研其中的细节。而论文是一个“贩卖故事”的过程,首先你得卖得出去。所以需要仔细的考虑行文的方式,安排悬念和故事性,尽可能引人入胜地让人读下去。

千万不要当 reviewer 提出某个问题后振振有词的回答说“我在第 X 章第 X 节第 X 段的第 X 句话其实写了,他没看到而已”。如果目标是论文中稿的话没有在显眼的地方让 reviewer “略读”你的论文的时候就看到就是你的问题。

不过好在论文作为一种经历上百年发展的标准文体,存在很多类似于八股的结构。

这里只是给出我自己比较常用(当然每次都会有所调整)的结构。当然这种八股仅供参考,不同领域也有很多种不同的写法。通过学习自己领域的论文自己总结一套写的顺手的更为重要。

再多强调一点的话就是人是视觉动物所以话好看的图对于论文也非常重要。

这里推荐近期看到的几个好的例子供参考,比如 MInference 这个即便你不做 MLSys 这个方向,也能很直观的感觉到它的方法大概就是三种模式的组合,同时有很好的效果。

这样的展示就是好的展示。另外需要注意的是画图的目的是“清晰”的表达观点,不是去画花里胡哨信息量极端密集没法看的图。如果图自身没有足够的“自明”性,需要复杂的解释才能看明白的话,其实一定程度上就已经削弱了图的作用。

当然再次作为当前时代绕不过去的一个话题就是要不要用大模型帮忙写论文。对此我个人实践下来 AI 在帮助写地道的英语方面是有非常大的好处的,可以极大地提升写作速度。

但是!但是逻辑部分,行文脉络的安排部分,如何做到前后呼应轻重有次的部分还是需要人自己来思考,不然产出的论文绝对就是一篇通篇废话的平庸“技术报告”。而且也需要不断地修改迭代才行。所以至少你需要知道什么样的论文是好的论文,需要多读好的论文培养自己的“审美”能力。

循序渐进做研究

以上是一些技术性的开展思路。

关于整个博士生涯的规划个人主要是有三个建议。首先是第一个工作无论什么样的都行,重点是快速的完成一次完整的学术锻炼。这个世界上有这么多的论文不是因为有这么多的突破在发生,单纯是因为有这么多的博士要毕业而已。

但是能够完成一篇论文绝对对自己的信息收集调研能力,逻辑思维能力,推动工作往前到收束的能力,总结提炼的能力都有非常大的锻炼。重点是越快越好。如果只是练手工作的话画上一年以上显然并不是划得来的。

在经过一次完整的锻炼之后大家就可以有更多的余裕去仔细思考自己真正感兴趣的方向是什么。

博士的历程是很煎熬的,如果不做点自己真的感兴趣的事情的话很容易陷入虚无,不知道自己到底为啥要这么苦逼的在这里熬。也希望大家都能产出自己认可的工作,可以发自内心的在内心喊出“我做的玩意这么酷!根本不需要有毛用!”这句话。当然要是真的特别有用也是另外一个维度下非常好的工作。

再之后如果大家选定了方向,比起东一榔头西一棒槌的做工作,更加能建立影响力的思路其实反而是不断地深挖一个方向。其实别看我最开始介绍的时候拿自己好多方向都做过来吹,实际上反思下来这反而是我走的一段弯路。能够慢慢的从低到上的 build 一个领域在很多时候会有更大的锻炼和收获。

而走上这条路之后大家也会发现,实际想要建设一个领域面临着茫茫多的落地难题。这个时候基本上就不会再愁没有点可做,而是哀叹时间和智商不够搞不出来或者搞不完。

同时在论文之外就还可以进一步的考虑做一些其他维度的有影响力的工作。

不过像是开源项目这一类的其实更难,相对来说反而是发论文的前置依赖比较小,爬坡难度也比较平缓。

最后的鸡汤

以上就是这次分享的主要内容。宣扬了不少苦难,不过最后为了加强大家的动力还是需要灌点鸡汤。

这图很多人都看过了,虽然是老鸡汤但是是经典的好鸡汤,越熬越香那种。

另外也不用太担心自己很煎熬,其实大家都在熬。但是能有机会有时间做一些好的工作还是非常值得的。

同时也不是说博士是啥那么独一无二的了不起的东西,世界上还有很多东西值得去探索。

最后祝大家研究顺利!

来源:知乎 www.zhihu.com

作者:ZHANG Mingxing

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载