計(jì)算機(jī)視覺研究生文獻(xiàn)和復(fù)現(xiàn)哪個(gè)更重要?
【整理】深度學(xué)習(xí)技術(shù)前沿
【導(dǎo)讀】來(lái)自知乎上的一個(gè)提問(wèn),本文截取了一些點(diǎn)贊數(shù)較多的回答,希望對(duì)大家有幫助!本文僅作為學(xué)術(shù)分享,如有侵權(quán),請(qǐng)聯(lián)系刪除!
計(jì)算機(jī)視覺研究生文獻(xiàn)和復(fù)現(xiàn)哪個(gè)更重要?
作者:鑫鑫淼淼焱焱
https://www.zhihu.com/question/381154035/answer/1285356371
首先,論文閱讀和復(fù)現(xiàn)代碼同等重要。
從樓主的描述可以知道,樓主目前是編程和算法的初學(xué)者,兩方面都是剛剛?cè)腴T,對(duì)你來(lái)說(shuō),你的導(dǎo)師對(duì)你很 push,給你的壓力很大,所以你可能希望能先解決其中一個(gè)問(wèn)題,比如先系統(tǒng)學(xué)好 python,或者先好好看論文,了解對(duì)應(yīng)領(lǐng)域的基礎(chǔ)知識(shí)理論等等。
但是閱讀論文和復(fù)現(xiàn)代碼都是同樣重要的。
論文閱讀
閱讀論文讓你能了解研究領(lǐng)域的基礎(chǔ)理論、經(jīng)典算法以及領(lǐng)域最新研究成果,更重要的是通過(guò)看論文,給你提供思想和方法論,你覺得自己想不出新的算法,對(duì)初學(xué)者很正常,這種時(shí)候確實(shí)就需要多看論文,特別是看作者的動(dòng)機(jī),Motivation,建議樓主可以帶著下面這些問(wèn)題來(lái)閱讀一篇論文:
作者想解決什么問(wèn)題?
作者通過(guò)什么理論/模型來(lái)解決這個(gè)問(wèn)題?
作者給出的答案是什么?
作者為什么研究這個(gè)課題?
目前這個(gè)課題的研究進(jìn)行到了哪一階段
作者使用的理論是基于哪些假設(shè)?
這篇文章存在哪些缺陷?
作者關(guān)于這個(gè)課題的構(gòu)思有哪幾點(diǎn)?
樓主說(shuō)到看一篇論文需要 1 天半的時(shí)間,這個(gè)速度其實(shí)是很正常的,當(dāng)初我讀研的時(shí)候,看論文的速度可能更慢,一方面是存在很多專有名詞,很多單詞分開你都懂,但是組成一個(gè)句子就不知道是什么意思;另一方面,不少算法涉及很多數(shù)學(xué)公式,要讀懂這些數(shù)學(xué)公式也需要花一些時(shí)間,特別是數(shù)學(xué)基礎(chǔ)薄弱。
代碼復(fù)現(xiàn)
關(guān)于代碼復(fù)現(xiàn)部分,樓主希望有時(shí)間系統(tǒng)學(xué)習(xí) pytorch 的內(nèi)容,而不是把時(shí)間花在 debug 別人代碼。
其實(shí)很多編程初學(xué)者都會(huì)有這樣的想法,等我好好系統(tǒng)學(xué)完編程的課程了,我再來(lái)進(jìn)行編程實(shí)戰(zhàn)項(xiàng)目,但更好的做法應(yīng)該是邊學(xué)邊做,學(xué)以致用。
事實(shí)上,樓主你看別人的代碼就是一個(gè)很好學(xué)習(xí)編程,學(xué)習(xí) pytorch 這個(gè)框架的過(guò)程,你可以看看別人是如何用 pytorch 來(lái)實(shí)現(xiàn)他的算法,然后記錄一些有用的代碼,這些你后續(xù)要實(shí)現(xiàn)自己代碼的時(shí)候,都是非常有用的。
當(dāng)然還有看看別人的整個(gè)代碼結(jié)構(gòu),怎么組織整個(gè)算法的項(xiàng)目代碼,當(dāng)然有的論文作者的代碼其實(shí)寫得一般,也沒有好好重構(gòu),但是一些大公司出品的代碼,那就是非常值得學(xué)習(xí),比如 pytorch的預(yù)訓(xùn)練模型 github 項(xiàng)目:
https://github.com/Cadene/pretrained-models.pytorch
最后,稍微總結(jié)一下:論文論文還是要多看,而且可以帶著我剛剛說(shuō)的幾個(gè)問(wèn)題,來(lái)看一篇論文,進(jìn)行總結(jié)。論文要挑著看,對(duì)經(jīng)典的、大牛的論文要詳細(xì)閱讀,一般經(jīng)典論文就是領(lǐng)域里很多人會(huì)引用到的,這里看看引用數(shù)量可以知道,而大牛這個(gè)你可以通過(guò)問(wèn)你的導(dǎo)師、師兄師姐,或者上知乎提問(wèn),當(dāng)然還有一些大公司的論文也值得好好看;對(duì)于一些比較水的論文,當(dāng)你看論文多了,一般你看看作者提出的方法,就能知道是不是比較水的論文,這種論文就粗略看一下摘要、方法和實(shí)驗(yàn)結(jié)果即可,不需要花太多時(shí)間;給自己制定一個(gè)論文閱讀計(jì)劃,規(guī)定好每周要看完多少篇論文,并且做好筆記,畢竟好記性不如爛筆頭,而且分享到網(wǎng)上,還可以和相同領(lǐng)域的一些討論一下。代碼復(fù)現(xiàn)代碼復(fù)現(xiàn)是必然要做的,好好看看別人如何實(shí)現(xiàn)他們的代碼,可以學(xué)習(xí)他們的代碼風(fēng)格,整體組織的架構(gòu),以及一些算法的實(shí)現(xiàn)。另外,你是要學(xué)習(xí) pytorch 的話,這里簡(jiǎn)單推薦幾個(gè)教程和 github 項(xiàng)目:官方教程:Welcome to PyTorch Tutorials官方中文文檔:主頁(yè) - PyTorch中文文檔Awesome-pytorch-list:bharathgs/Awesome-pytorch-list預(yù)訓(xùn)練網(wǎng)絡(luò)模型:Cadene/pretrained-models.pytorch導(dǎo)師你需要和你的導(dǎo)師進(jìn)行一個(gè)好好的溝通,將你自身的情況(編程和算法基礎(chǔ)薄弱)告訴你的導(dǎo)師,和你導(dǎo)師商量好這個(gè)看論文復(fù)現(xiàn)代碼的計(jì)劃。比如最初的 1 個(gè)月每周看一篇論文,復(fù)現(xiàn)一篇論文代碼,然后做一個(gè)分享,寫下你看完論文的心得體會(huì),以及有什么想法,可以說(shuō)你覺得這篇論文有哪些不足,然后慢慢提升到每周 2 篇,3 篇,甚至更多,這個(gè)就需要根據(jù)樓主的實(shí)際情況。最重要的還是你需要先做好一個(gè)計(jì)劃,打算前期花幾個(gè)月時(shí)間看論文復(fù)現(xiàn)代碼,在這個(gè)過(guò)程積累自己的新想法,然后根據(jù)這些新想法,嘗試去實(shí)現(xiàn)他們,做實(shí)驗(yàn),看看效果。你需要讓你的導(dǎo)師知道你是有計(jì)劃,有在認(rèn)真完成他給的任務(wù),認(rèn)真對(duì)待你的研究生學(xué)業(yè)的。最后,查找論文和代碼的地方,可以在這三個(gè)網(wǎng)站查找:https://arxiv.org/:免費(fèi)獲取最新論文的網(wǎng)站https://paperswithcode.com/sota:展示了深度學(xué)習(xí)最新的性能最佳的論文,不僅僅是計(jì)算機(jī)視覺方面的;https://github.com/topics/computer-vision?l=python:可以在這找到代碼實(shí)現(xiàn)的算法以及,之前寫了一篇計(jì)算機(jī)視覺的學(xué)習(xí)指南,這里有推薦幾個(gè)方向的經(jīng)典論文https://zhuanlan.zhihu.com/p/138585363總之,無(wú)論是你希望走科研的道路,接下來(lái)讀博,還是選擇算法的工作,都需要一個(gè)好的基礎(chǔ),對(duì)于算法來(lái)說(shuō),扎實(shí)的理論基礎(chǔ)和工程能力都需要,讀博可能工程能力可以稍弱一些,只需要可以通過(guò)深度學(xué)習(xí)框架,如 pytorch 實(shí)現(xiàn)你的算法即可。所以,你現(xiàn)在需要的就是努力,非常的努力將基礎(chǔ)打好,提升自己的算法和編程能力。如果你希望讀博,那你也需要在剩余的兩年時(shí)間發(fā)至少一篇論文,還得是頂會(huì)論文;而如果你希望工作,那么你的時(shí)間就更少了,大概不到一年時(shí)間,因?yàn)檎麄€(gè)算法崗位的競(jìng)爭(zhēng)在短短兩三年內(nèi)變得非常的激烈,更好的找到工作方法,是通過(guò)實(shí)習(xí)轉(zhuǎn)正,而實(shí)習(xí)一般在 2 月底左右開始,一般不錯(cuò)的公司,比如 BAT、頭條等在 4 月份之前就結(jié)束正式面試了,后面可能會(huì)有少量的補(bǔ)錄,但數(shù)量少,競(jìng)爭(zhēng)自然更激烈了,所以你更需要在不到一年時(shí)間內(nèi)做好準(zhǔn)備。
作者:favor
https://www.zhihu.com/question/381154035/answer/1094056196在研究生初期,我認(rèn)為有老師push不一定是一件壞事,壓力產(chǎn)生動(dòng)力,能讓你盡快入門(我見過(guò)太多太多放羊的老師了)。下面正兒八經(jīng)的答題:個(gè)人認(rèn)為文獻(xiàn)閱讀和復(fù)現(xiàn)都同等重要,前者為你提供了科研的世界觀和方法論,后者會(huì)幫助你填補(bǔ)理論到實(shí)踐的差距。首先文獻(xiàn)閱讀,像題主這樣的閱讀方式其實(shí)不太容易了解這個(gè)領(lǐng)域/方向。根據(jù)我的經(jīng)驗(yàn),想要了解某個(gè)領(lǐng)域,讀文章時(shí)一定要深入,要學(xué)會(huì)溯源和刨根。如題主所說(shuō)的某篇經(jīng)典文章里的某個(gè)名詞,作為這個(gè)領(lǐng)域的研究者來(lái)說(shuō),這是一定要弄懂的。除此之外,還要根據(jù)讀完的這篇文章在google schoolar上刨出這個(gè)作者的一系列工作。像這些領(lǐng)域里集大成者的工作,往往揭示了某個(gè)領(lǐng)域的發(fā)展脈絡(luò),你看他的一系列文章能感受到領(lǐng)域的發(fā)展過(guò)程和發(fā)展方向。以此類推來(lái)閱讀每一篇經(jīng)典文獻(xiàn)會(huì)為你的科研道路打好結(jié)實(shí)的基礎(chǔ)。這里順便提一下,當(dāng)你了解完某個(gè)領(lǐng)域想要?jiǎng)?chuàng)新突破時(shí),這時(shí)候讀文章一定要廣泛。不要局限于你所在的領(lǐng)域的文獻(xiàn)內(nèi)容,否則你永遠(yuǎn)都跟在別人后面做increamental的事情,要學(xué)會(huì)泛讀各大領(lǐng)域的文章,通過(guò)abstract來(lái)精挑啟發(fā)性的文章來(lái)精讀。再說(shuō)論文復(fù)現(xiàn),我認(rèn)為是必要的。當(dāng)然目前浮躁的背景下,不少人認(rèn)為代碼都是公開的,在前人基礎(chǔ)上修修改改即可。但前提是你要全盤吃下前人的代碼。復(fù)現(xiàn)的目的不僅僅是復(fù)現(xiàn)而已,更重要的是了解領(lǐng)域里的一些通用技巧(trick)以及學(xué)習(xí)代碼的架構(gòu)。這些都是為了以后的顛覆性工作打下基礎(chǔ)。而且據(jù)我了解,即使是前人的工作也存在很多弊端甚至錯(cuò)誤的地方。舉個(gè)真實(shí)例子,某個(gè)工作的第一份代碼出錯(cuò)后,后續(xù)基于此的工作就接著一錯(cuò)再錯(cuò),后來(lái)我改正確之后跑了個(gè)baseline,比這些SOTAs還高出一大截。因此,深入了解代碼也是必要的,復(fù)現(xiàn)則是一個(gè)相對(duì)扎實(shí)的路徑。綜合來(lái)講,萬(wàn)丈高樓平地起,想要做有價(jià)值的科研必須循序漸進(jìn)。我建議你先補(bǔ)足基礎(chǔ)知識(shí),沒必要上來(lái)就硬啃別人代碼,這樣效率確實(shí)很低。另外,老師Push你是一件好事,但是具體要怎么操作你應(yīng)該根據(jù)自身情況來(lái)跟老師及時(shí)溝通。
作者:ELPSYCONGROOhttps://www.zhihu.com/question/381154035/answer/1095912052我也是半路出來(lái)學(xué)機(jī)器學(xué)習(xí)(和NLP)的哈~提供點(diǎn)想法希望能有幫助。
首先關(guān)于讀文獻(xiàn),如果你是想好了要在這個(gè)小領(lǐng)域深挖,那么最好是用google scholar把與目標(biāo)文獻(xiàn)【相關(guān)】的引文都看一下,這里的相關(guān)主要分為以下幾類:1. 目標(biāo)文章的引文,這里又可以分為三類:a. Introduction中,介紹background的文章。這里的文章很多都非常寬泛,比如用了Deeplearning的很可能就把之前那篇nature給引用了。這類【很大】的文章不建議仔細(xì)看,等有比較閑的時(shí)間的時(shí)候再去看看這些經(jīng)典文章。不過(guò)有一類文章叫【細(xì)分領(lǐng)域的綜述】這個(gè)可以在確定具體研究方向的時(shí)候看看,這有助于讓你對(duì)領(lǐng)域有客觀廣泛的了解,不至于踩坑或者做了別人已經(jīng)做完的東西。當(dāng)然,這個(gè)細(xì)分領(lǐng)域的綜述也可以通過(guò)讀最新的文章的related work來(lái)代替。b. Related work里提到的相關(guān)工作。比如一篇文章的contribution是將A領(lǐng)域和B領(lǐng)域結(jié)合起來(lái)發(fā)現(xiàn)的方法,那么一般related work里就會(huì)分別就兩個(gè)領(lǐng)域介紹。一般會(huì)將每個(gè)領(lǐng)域從一開始的發(fā)展介紹到最近的最相關(guān)的工作。這里【最近的最相關(guān)的工作】是要仔細(xì)讀的,尤其是這些文章的具體方法,越新的越重要。你的idea很大程度上來(lái)自于對(duì)這些方法的改進(jìn)或者融合。c. 基礎(chǔ)知識(shí)類的引文。比如一篇CV相關(guān)的文章里提到SGD啊,CNN,XXXNet的時(shí)候引用的,這一類引文不建議在當(dāng)下就去讀原文。這些是基礎(chǔ)知識(shí),最好是找個(gè)集中的時(shí)候補(bǔ)一下。而且很多時(shí)候這些基礎(chǔ)知識(shí)看二手的講解(比如知乎,其他人的博客)會(huì)理解的更好。在這個(gè)過(guò)程中最好是給每篇文章寫個(gè)簡(jiǎn)短的點(diǎn)評(píng),這會(huì)讓我們?cè)谧约簩慽ntroduction或者related work的時(shí)候更輕松。2. 關(guān)于復(fù)現(xiàn)代碼:由于我也是半路出家做AI,沒有計(jì)算機(jī)科班出身的訓(xùn)練,寫代碼和復(fù)現(xiàn)的能力肯定是弱不少的。這個(gè)時(shí)候花大量的時(shí)間去從頭復(fù)現(xiàn)肯定是不劃算的。當(dāng)然我們也不要走向另一個(gè)極端:完全拿來(lái)別人開源的代碼就用。一來(lái)因?yàn)槲覀冞€不是很熟悉pytorch之類的使用,拿別人代碼來(lái)跑大部分時(shí)間就都在調(diào)莫名其妙的bug了;二來(lái)是因?yàn)槟呐率琼敃?huì)的文章,開源的代碼寫的不一定漂亮,照著這些代碼學(xué)很容易跑偏。所以我的經(jīng)驗(yàn)是:a. 先跟著優(yōu)秀的代碼簡(jiǎn)單打基礎(chǔ)。以在pytorch上做圖像的分類為例,直接找到pytorch【官網(wǎng)上的tutorial】,仔細(xì)研究他們的代碼。將每個(gè)模塊是干啥的,怎么干的都用小本本記好。這樣的好處是接下來(lái)真正看你想復(fù)現(xiàn)的代碼時(shí)就可以心中有一個(gè)骨架:這一部分是預(yù)處理,這一部分是算metric...當(dāng)然這一步不用進(jìn)行得太細(xì)節(jié),比如softmax在pytorch里咋實(shí)現(xiàn)的就別看了,效率要緊。b. 帶著【批判的眼光】看要復(fù)現(xiàn)的代碼。有了這一步的準(zhǔn)備,我們已基本經(jīng)明白了啥是規(guī)范的代碼,啥是不好的設(shè)計(jì),并且在心中已經(jīng)有了一個(gè)標(biāo)準(zhǔn)的框架。那么我們就可以對(duì)著這個(gè)框架去在要復(fù)現(xiàn)的代碼中找對(duì)應(yīng)的功能模塊。這個(gè)過(guò)程中我們也能發(fā)現(xiàn)要復(fù)現(xiàn)的代碼究竟寫的好不好,以及他使用的trick究竟是很巧妙,還是多此一舉。。。c. 特殊而通用的功能模塊要回歸【官方文檔】。這一步就比較細(xì)節(jié)了,針對(duì)的是我們?cè)谧x代碼或者寫代碼的時(shí)候,一些明明很通用,但是沒被封裝的功能;或者是已經(jīng)被封裝,我們卻不太了解原理的過(guò)程。前者的典型代表就是將一個(gè)class變成one-hot:沒有被pytorch封裝,但是經(jīng)常會(huì)用到,用的時(shí)候基本兩行搞定。這一類就要在stackflow這種論壇上找找標(biāo)準(zhǔn)寫法了。后者的典型代表是CrossEntropyLoss和NLLLoss的區(qū)別,一個(gè)是hidden直接給,另一個(gè)要自己過(guò)一個(gè)softmax,這個(gè)區(qū)別如果不仔細(xì)看官方文檔也是搞不定的。3. 關(guān)于數(shù)學(xué):我感覺既然是半路轉(zhuǎn)行,那么打基礎(chǔ)這件事兒要適度。比如CNN,你知道了卷積層是利用了local correlated特性,池化層是在downsample,softmax是要得到概率表示,resnet的跨層連接是為了防止信息通過(guò)多層網(wǎng)絡(luò)衰減嚴(yán)重,這樣就OK了。沒必要糾結(jié)數(shù)學(xué)上是咋表示的。(NLP的文章里總愿意把LSTM的公式堆出來(lái),個(gè)人感覺是浪費(fèi)版面。。)在Deep learning的背景下,重要的是網(wǎng)絡(luò)結(jié)構(gòu)以及其背后的intuition,因?yàn)檫@些網(wǎng)絡(luò)的數(shù)學(xué)邏輯是啥,搞Machine Learning那邊還吵個(gè)沒完沒有定論,我們做應(yīng)用的就先別摻和了。。這也是為啥我在1-c里說(shuō)學(xué)這些基礎(chǔ)知識(shí)我們寧可看博客,看notes也別看原文。因?yàn)椴┛秃蚽otes有【動(dòng)圖】啊,一下就明白了。當(dāng)然這只是科研入門時(shí)候的建議,如果以后想PhD,想深入研究,基礎(chǔ)是要系統(tǒng)的補(bǔ)一下的。4. 關(guān)于老師催你:嗯。。。這個(gè)我也不知道,我當(dāng)時(shí)導(dǎo)師是放養(yǎng)狀態(tài),整個(gè)文章的構(gòu)思到發(fā)表到rebuttal老師都沒咋參與。不過(guò)我感覺你就和老師好好說(shuō),每天50%時(shí)間打基礎(chǔ),50%時(shí)間看文獻(xiàn),然后把你看文獻(xiàn)付出的努力吹成200%給老師聽。半年后你就能發(fā)現(xiàn)你已經(jīng)可以很熟練的進(jìn)行研究和探索了。大概就分享這么多啦~半路轉(zhuǎn)行的都不容易~祝題主早日入門,享受搞AI的樂趣哈哈~
往期精彩:
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法20:隨機(jī)森林
一個(gè)算法工程師的成長(zhǎng)之路

長(zhǎng)按二維碼.關(guān)注機(jī)器學(xué)習(xí)實(shí)驗(yàn)室
喜歡您就點(diǎn)個(gè)在看!

