更新时间:2020-07-21
【导读】来自知乎上的一个提问,本文截取了一些点赞数较多的回答,希望对大家有帮助:
*计算机视觉研究生文献和复现哪个更重要?
作者:鑫鑫淼淼焱焱
https://www.zhihu.com/question/381154035/answer/1285356371
首先,论文阅读和复现代码同等重要。
从楼主的描述可以知道,楼主目前是编程和算法的初学者,两方面都是刚刚入门,对你来说,你的导师对你很 push,给你的压力很大,所以你可能希望能先解决其中一个问题,比如先系统学好 python,或者先好好看论文,了解对应领域的基础知识理论等等。
但是阅读论文和复现代码都是同样重要的。
论文阅读
阅读论文让你能了解研究领域的基础理论、经典算法以及领域最新研究成果,更重要的是通过看论文,给你提供思想和方法论,你觉得自己想不出新的算法,对初学者很正常,这种时候确实就需要多看论文,特别是看作者的动机,Motivation,建议楼主可以带着下面这些问题来阅读一篇论文:1、作者想解决什么问题?2、作者通过什么理论/模型来解决这个问题?3、作者给出的答案是什么?4、作者为什么研究这个课题?5、目前这个课题的研究进行到了哪一阶段6、作者使用的理论是基于哪些假设?7、这篇文章存在哪些缺陷?8、作者关于这个课题的构思有哪几点?
楼主说到看一篇论文需要 1 天半的时间,这个速度其实是很正常的,当初我读研的时候,看论文的速度可能更慢,一方面是存在很多专有名词,很多单词分开你都懂,但是组成一个句子就不知道是什么意思;另一方面,不少算法涉及很多数学公式,要读懂这些数学公式也需要花一些时间,特别是数学基础薄弱。
代码复现
关于代码复现部分,楼主希望有时间系统学习 pytorch 的内容,而不是把时间花在 debug 别人代码。
其实很多编程初学者都会有这样的想法,等我好好系统学完编程的课程了,我再来进行编程实战项目,但更好的做法应该是边学边做,学以致用。
事实上,楼主你看别人的代码就是一个很好学习编程,学习 pytorch 这个框架的过程,你可以看看别人是如何用 pytorch 来实现他的算法,然后记录一些有用的代码,这些你后续要实现自己代码的时候,都是非常有用的。
当然还有看看别人的整个代码结构,怎么组织整个算法的项目代码,当然有的论文作者的代码其实写得一般,也没有好好重构,但是一些大公司出品的代码,那就是非常值得学习,比如 pytorch的预训练模型 github 项目:
https://github.com/Cadene/pretrained-models.pytorch
最后,稍微总结一下:
论文
论文还是要多看,而且可以带着我刚刚说的几个问题,来看一篇论文,进行总结。
论文要挑着看,对经典的、大牛的论文要详细阅读,一般经典论文就是领域里很多人会引用到的,这里看看引用数量可以知道,而大牛这个你可以通过问你的导师、师兄师姐,或者上知乎提问,当然还有一些大公司的论文也值得好好看;对于一些比较水的论文,当你看论文多了,一般你看看作者提出的方法,就能知道是不是比较水的论文,这种论文就粗略看一下摘要、方法和实验结果即可,不需要花太多时间;
给自己制定一个论文阅读计划,规定好每周要看完多少篇论文,并且做好笔记,毕竟好记性不如烂笔头,而且分享到网上,还可以和相同领域的一些讨论一下。
代码复现
代码复现是必然要做的,好好看看别人如何实现他们的代码,可以学习他们的代码风格,整体组织的架构,以及一些算法的实现。
另外,你是要学习 pytorch 的话,这里简单推荐几个教程和 github 项目:
官方教程:Welcome to PyTorch Tutorials
官方中文文档:主页 - PyTorch中文文档
Awesome-pytorch-list:bharathgs/Awesome-pytorch-list
预训练网络模型:Cadene/pretrained-models.pytorch
导师
你需要和你的导师进行一个好好的沟通,将你自身的情况(编程和算法基础薄弱)告诉你的导师,和你导师商量好这个看论文复现代码的计划。
比如最初的 1 个月每周看一篇论文,复现一篇论文代码,然后做一个分享,写下你看完论文的心得体会,以及有什么想法,可以说你觉得这篇论文有哪些不足,然后慢慢提升到每周 2 篇,3 篇,甚至更多,这个就需要根据楼主的实际情况。
最重要的还是你需要先做好一个计划,打算前期花几个月时间看论文复现代码,在这个过程积累自己的新想法,然后根据这些新想法,尝试去实现他们,做实验,看看效果。
你需要让你的导师知道你是有计划,有在认真完成他给的任务,认真对待你的研究生学业的。
最后,查找论文和代码的地方,可以在这三个网站查找:
https://arxiv.org/:免费获取最新论文的网站
https://paperswithcode.com/sota:展示了深度学习最新的性能最佳的论文,不仅仅是计算机视觉方面的;
https://github.com/topics/computer-vision?l=python:可以在这找到代码实现的算法
以及,之前写了一篇计算机视觉的学习指南,这里有推荐几个方向的经典论文
https://zhuanlan.zhihu.com/p/138585363
总之,无论是你希望走科研的道路,接下来读博,还是选择算法的工作,都需要一个好的基础,对于算法来说,扎实的理论基础和工程能力都需要,读博可能工程能力可以稍弱一些,只需要可以通过深度学习框架,如 pytorch 实现你的算法即可。
所以,你现在需要的就是努力,非常的努力将基础打好,提升自己的算法和编程能力。如果你希望读博,那你也需要在剩余的两年时间发至少一篇论文,还得是顶会论文;而如果你希望工作,那么你的时间就更少了,大概不到一年时间,因为整个算法岗位的竞争在短短两三年内变得非常的激烈,更好的找到工作方法,是通过实习转正,而实习一般在 2 月底左右开始,一般不错的公司,比如 BAT、头条等在 4 月份之前就结束正式面试了,后面可能会有少量的补录,但数量少,竞争自然更激烈了,所以你更需要在不到一年时间内做好准备。
作者:favor
https://www.zhihu.com/question/381154035/answer/1094056196
在研究生初期,我认为有老师push不一定是一件坏事,压力产生动力,能让你尽快入门(我见过太多太多放羊的老师了)。
下面正儿八经的答题:
个人认为文献阅读和复现都同等重要,前者为你提供了科研的世界观和方法论,后者会帮助你填补理论到实践的差距。
首先文献阅读,像题主这样的阅读方式其实不太容易了解这个领域/方向。根据我的经验,想要了解某个领域,读文章时一定要深入,要学会溯源和刨根。如题主所说的某篇经典文章里的某个名词,作为这个领域的研究者来说,这是一定要弄懂的。除此之外,还要根据读完的这篇文章在google schoolar上刨出这个作者的一系列工作。像这些领域里集大成者的工作,往往揭示了某个领域的发展脉络,你看他的一系列文章能感受到领域的发展过程和发展方向。以此类推来阅读每一篇经典文献会为你的科研道路打好结实的基础。这里顺便提一下,当你了解完某个领域想要创新突破时,这时候读文章一定要广泛。不要局限于你所在的领域的文献内容,否则你永远都跟在别人后面做increamental的事情,要学会泛读各大领域的文章,通过abstract来精挑启发性的文章来精读。
再说论文复现,我认为是必要的。当然目前浮躁的背景下,不少人认为代码都是公开的,在前人基础上修修改改即可。但前提是你要全盘吃下前人的代码。复现的目的不仅仅是复现而已,更重要的是了解领域里的一些通用技巧(trick)以及学习代码的架构。这些都是为了以后的颠覆性工作打下基础。而且据我了解,即使是前人的工作也存在很多弊端甚至错误的地方。举个真实例子,某个工作的第一份代码出错后,后续基于此的工作就接着一错再错,后来我改正确之后跑了个baseline,比这些SOTAs还高出一大截。因此,深入了解代码也是必要的,复现则是一个相对扎实的路径。
综合来讲,万丈高楼平地起,想要做有价值的科研必须循序渐进。我建议你先补足基础知识,没必要上来就硬啃别人代码,这样效率确实很低。另外,老师Push你是一件好事,但是具体要怎么操作你应该根据自身情况来跟老师及时沟通。
作者:ELPSYCONGROO
https://www.zhihu.com/question/381154035/answer/1095912052
我也是半路出来学机器学习(和NLP)的哈~提供点想法希望能有帮助。
首先关于读文献,如果你是想好了要在这个小领域深挖,那么最好是用google scholar把与目标文献【相关】的引文都看一下,这里的相关主要分为以下几类:
1. 目标文章的引文,这里又可以分为三类:
a. Introduction中,介绍background的文章。这里的文章很多都非常宽泛,比如用了Deeplearning的很可能就把之前那篇nature给引用了。这类【很大】的文章不建议仔细看,等有比较闲的时间的时候再去看看这些经典文章。不过有一类文章叫【细分领域的综述】这个可以在确定具体研究方向的时候看看,这有助于让你对领域有客观广泛的了解,不至于踩坑或者做了别人已经做完的东西。当然,这个细分领域的综述也可以通过读最新的文章的related work来代替。
b. Related work里提到的相关工作。比如一篇文章的contribution是将A领域和B领域结合起来发现的方法,那么一般related work里就会分别就两个领域介绍。一般会将每个领域从一开始的发展介绍到最近的最相关的工作。这里【最近的最相关的工作】是要仔细读的,尤其是这些文章的具体方法,越新的越重要。你的idea很大程度上来自于对这些方法的改进或者融合。
c. 基础知识类的引文。比如一篇CV相关的文章里提到SGD啊,CNN,XXXNet的时候引用的,这一类引文不建议在当下就去读原文。这些是基础知识,最好是找个集中的时候补一下。而且很多时候这些基础知识看二手的讲解(比如知乎,其他人的博客)会理解的更好。
在这个过程中最好是给每篇文章写个简短的点评,这会让我们在自己写introduction或者related work的时候更轻松。
2. 关于复现代码:
由于我也是半路出家做AI,没有计算机科班出身的训练,写代码和复现的能力肯定是弱不少的。这个时候花大量的时间去从头复现肯定是不划算的。当然我们也不要走向另一个极端:完全拿来别人开源的代码就用。一来因为我们还不是很熟悉pytorch之类的使用,拿别人代码来跑大部分时间就都在调莫名其妙的bug了;二来是因为哪怕是顶会的文章,开源的代码写的不一定漂亮,照着这些代码学很容易跑偏。所以我的经验是:
a. 先跟着优秀的代码简单打基础。以在pytorch上做图像的分类为例,直接找到pytorch【官网上的tutorial】,仔细研究他们的代码。将每个模块是干啥的,怎么干的都用小本本记好。这样的好处是接下来真正看你想复现的代码时就可以心中有一个骨架:这一部分是预处理,这一部分是算metric...当然这一步不用进行得太细节,比如softmax在pytorch里咋实现的就别看了,效率要紧。
b. 带着【批判的眼光】看要复现的代码。有了这一步的准备,我们已基本经明白了啥是规范的代码,啥是不好的设计,并且在心中已经有了一个标准的框架。那么我们就可以对着这个框架去在要复现的代码中找对应的功能模块。这个过程中我们也能发现要复现的代码究竟写的好不好,以及他使用的trick究竟是很巧妙,还是多此一举。。。
c. 特殊而通用的功能模块要回归【官方文档】。这一步就比较细节了,针对的是我们在读代码或者写代码的时候,一些明明很通用,但是没被封装的功能;或者是已经被封装,我们却不太了解原理的过程。前者的典型代表就是将一个class变成one-hot:没有被pytorch封装,但是经常会用到,用的时候基本两行搞定。这一类就要在stackflow这种论坛上找找标准写法了。后者的典型代表是CrossEntropyLoss和NLLLoss的区别,一个是hidden直接给,另一个要自己过一个softmax,这个区别如果不仔细看官方文档也是搞不定的。
3. 关于数学:
我感觉既然是半路转行,那么打基础这件事儿要适度。比如CNN,你知道了卷积层是利用了local correlated特性,池化层是在downsample,softmax是要得到概率表示,resnet的跨层连接是为了防止信息通过多层网络衰减严重,这样就OK了。没必要纠结数学上是咋表示的。(NLP的文章里总愿意把LSTM的公式堆出来,个人感觉是浪费版面。。)在Deep learning的背景下,重要的是网络结构以及其背后的intuition,因为这些网络的数学逻辑是啥,搞Machine Learning那边还吵个没完没有定论,我们做应用的就先别掺和了。。这也是为啥我在1-c里说学这些基础知识我们宁可看博客,看notes也别看原文。因为博客和notes有【动图】啊,一下就明白了。当然这只是科研入门时候的建议,如果以后想PhD,想深入研究,基础是要系统的补一下的。
4. 关于老师催你:
嗯。。。这个我也不知道,我当时导师是放养状态,整个文章的构思到发表到rebuttal老师都没咋参与。不过我感觉你就和老师好好说,每天50%时间打基础,50%时间看文献,然后把你看文献付出的努力吹成200%给老师听。半年后你就能发现你已经可以很熟练的进行研究和探索了。