計算機視覺研究生文獻和復現哪個更重要?

點擊上方“算法猿的成長“,關注公衆號,選擇加“星標“或“置頂”

總第 144 篇文章,本文大約 6000 字,閱讀大約需要 15 分鐘

前言

這是來自知乎上的一個問題,但我覺得應該是對很多初入深度學習領域,不只是計算機視覺,特別是跨領域,或者編程基礎也不好的初學者,可能感到疑惑的問題。而且,提問者還被導師催進度,給的壓力也比較大。

問題的鏈接:

https://www.zhihu.com/question/381154035

問題

問題的具體描述如下:

大前提:導師催得緊,催進度,我不知道我該怎麼辦了,我感覺我就是爲了完成任務,感覺不到自己的進步!

(我是完全是做自己的事情,沒其他與我無關的任務佈置給我,現在是研一下學期,三年制,計算機視覺)

描述一下我的現狀:

**文獻:**一篇英文文獻我最快讀完花費是一天半的時間,而這個就是完全是在讀文章,完全沒有引申去看,有些名詞文章裏提了我也就是知道有這個東西,文章裏說了多少就知道多少。

**復現:**cvpr代碼作者都是公開的,但是復現對我來說仍然是問題,我是跨考到計算機的,python更是完全沒有系統的學過,整整三天我一直在改bug,具體代碼到底怎麼寫的我根本就沒有看,我不知道這樣有什麼意義,感覺不到自己的進步。

我不知道我該怎麼辦了,尤其是代碼這裏,我非常希望去學習一些pytorch框架的基礎知識(看教程敲代碼),而不是像這樣一直在debug別人的代碼,讓我自己寫都無從下手。

別人論文裏出現的方法(就是借鑑的一些方法,一些數學基礎),出現的公式,我根本不具備這樣的儲備,我怎麼就能想出來新的算法呢?

老師一直在催我,讓我多看文獻,讓我運行別人的代碼,而我就是爲了完成任務而完成任務,老師還讓我儘快提出新的算法,運行我自己的算法,讓我感覺到了壓力,我到底該怎麼辦?

回答

然後這裏,給出我的回答:

https://www.zhihu.com/question/381154035/answer/1285356371

首先,論文閱讀和復現代碼同等重要

從樓主的描述可以知道,樓主目前是編程和算法的初學者,兩方面都是剛剛入門,對你來說,你的導師對你很 push,給你的壓力很大,所以你可能希望能先解決其中一個問題,比如先系統學好 python,或者先好好看論文,瞭解對應領域的基礎知識理論等等。

但是閱讀論文和復現代碼都是同樣重要的。

論文閱讀

閱讀論文讓你能瞭解研究領域的基礎理論、經典算法以及領域最新研究成果,更重要的是通過看論文,給你提供思想和方法論,你覺得自己想不出新的算法,對初學者很正常,這種時候確實就需要多看論文,特別是看作者的動機,Motivation,建議樓主可以帶着下面這些問題來閱讀一篇論文:

  • 作者想解決什麼問題?

  • 作者通過什麼理論/模型來解決這個問題?

  • 作者給出的答案是什麼?

  • 作者爲什麼研究這個課題?

  • 目前這個課題的研究進行到了哪一階段

  • 作者使用的理論是基於哪些假設?

  • 這篇文章存在哪些缺陷?

  • 作者關於這個課題的構思有哪幾點?

樓主說到看一篇論文需要 1 天半的時間,這個速度其實是很正常的,當初我讀研的時候,看論文的速度可能更慢,一方面是存在很多專有名詞,很多單詞分開你都懂,但是組成一個句子就不知道是什麼意思;另一方面,不少算法涉及很多數學公式,要讀懂這些數學公式也需要花一些時間,特別是數學基礎薄弱。

代碼復現

關於代碼復現部分,樓主希望有時間系統學習 pytorch 的內容,而不是把時間花在 debug 別人代碼。

其實很多編程初學者都會有這樣的想法,等我好好系統學完編程的課程了,我再來進行編程實戰項目,但更好的做法應該是邊學邊做,學以致用。

事實上,樓主你看別人的代碼就是一個很好學習編程,學習 pytorch 這個框架的過程,你可以看看別人是如何用 pytorch 來實現他的算法,然後記錄一些有用的代碼,這些你後續要實現自己代碼的時候,都是非常有用的。

當然還有看看別人的整個代碼結構,怎麼組織整個算法的項目代碼,當然有的論文作者的代碼其實寫得一般,也沒有好好重構,但是一些大公司出品的代碼,那就是非常值得學習,比如 pytorch的預訓練模型 github 項目:

https://github.com/Cadene/pretrained-models.pytorchgithub.com

最後,稍微總結一下:

論文

  1. 論文還是要多看,而且可以帶着我剛剛說的幾個問題,來看一篇論文,進行總結。

  2. 論文要挑着看,對經典的、大牛的論文要詳細閱讀,一般經典論文就是領域裏很多人會引用到的,這裏看看引用數量可以知道,而大牛這個你可以通過問你的導師、師兄師姐,或者上知乎提問,當然還有一些大公司的論文也值得好好看;對於一些比較水的論文,當你看論文多了,一般你看看作者提出的方法,就能知道是不是比較水的論文,這種論文就粗略看一下摘要、方法和實驗結果即可,不需要花太多時間;

  3. 給自己制定一個論文閱讀計劃,規定好每週要看完多少篇論文,並且做好筆記,畢竟好記性不如爛筆頭,而且分享到網上,還可以和相同領域的一些討論一下。

代碼復現

代碼復現是必然要做的,好好看看別人如何實現他們的代碼,可以學習他們的代碼風格,整體組織的架構,以及一些算法的實現。

另外,你是要學習 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:可以在這找到代碼實現的算法

以及,之前寫了一篇計算機視覺的學習指南,這裏有推薦幾個方向的經典論文

2020 年計算機視覺學習指南

總之,無論是你希望走科研的道路,接下來讀博,還是選擇算法的工作,都需要一個好的基礎,對於算法來說,紮實的理論基礎和工程能力都需要,讀博可能工程能力可以稍弱一些,只需要可以通過深度學習框架,如 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的時候更輕鬆。

  1. 關於復現代碼:

由於我也是半路出家做AI,沒有計算機科班出身的訓練,寫代碼和復現的能力肯定是弱不少的。這個時候花大量的時間去從頭復現肯定是不划算的。當然我們也不要走向另一個極端:完全拿來別人開源的代碼就用。一來因爲我們還不是很熟悉pytorch之類的使用,拿別人代碼來跑大部分時間就都在調莫名其妙的bug了;二來是因爲哪怕是頂會的文章,開源的代碼寫的不一定漂亮,照着這些代碼學很容易跑偏。所以我的經驗是:

a. 先跟着優秀的代碼簡單打基礎。以在pytorch上做圖像的分類爲例,直接找到pytorch【官網上的tutorial】,仔細研究他們的代碼。將每個模塊是幹啥的,怎麼幹的都用小本本記好。這樣的好處是接下來真正看你想復現的代碼時就可以心中有一個骨架:這一部分是預處理,這一部分是算metric...當然這一步不用進行得太細節,比如softmax在pytorch裏咋實現的就別看了,效率要緊。

b. 帶着【批判的眼光】看要復現的代碼。有了這一步的準備,我們已基本經明白了啥是規範的代碼,啥是不好的設計,並且在心中已經有了一個標準的框架。那麼我們就可以對着這個框架去在要復現的代碼中找對應的功能模塊。這個過程中我們也能發現要復現的代碼究竟寫的好不好,以及他使用的trick究竟是很巧妙,還是多此一舉。。。

c. 特殊而通用的功能模塊要回歸【官方文檔】。這一步就比較細節了,針對的是我們在讀代碼或者寫代碼的時候,一些明明很通用,但是沒被封裝的功能;或者是已經被封裝,我們卻不太瞭解原理的過程。前者的典型代表就是將一個class變成one-hot:沒有被pytorch封裝,但是經常會用到,用的時候基本兩行搞定。這一類就要在stackflow這種論壇上找找標準寫法了。後者的典型代表是CrossEntropyLoss和NLLLoss的區別,一個是hidden直接給,另一個要自己過一個softmax,這個區別如果不仔細看官方文檔也是搞不定的。

  1. 關於數學:

我感覺既然是半路轉行,那麼打基礎這件事兒要適度。比如CNN,你知道了卷積層是利用了local correlated特性,池化層是在downsample,softmax是要得到概率表示,resnet的跨層連接是爲了防止信息通過多層網絡衰減嚴重,這樣就OK了。沒必要糾結數學上是咋表示的。(NLP的文章裏總願意把LSTM的公式堆出來,個人感覺是浪費版面。。)在Deep learning的背景下,重要的是網絡結構以及其背後的intuition,因爲這些網絡的數學邏輯是啥,搞Machine Learning那邊還吵個沒完沒有定論,我們做應用的就先別摻和了。。這也是爲啥我在1-c裏說學這些基礎知識我們寧可看博客,看notes也別看原文。因爲博客和notes有【動圖】啊,一下就明白了。當然這只是科研入門時候的建議,如果以後想PhD,想深入研究,基礎是要系統的補一下的。

  1. 關於老師催你:

嗯。。。這個我也不知道,我當時導師是放養狀態,整個文章的構思到發表到rebuttal老師都沒咋參與。不過我感覺你就和老師好好說,每天50%時間打基礎,50%時間看文獻,然後把你看文獻付出的努力吹成200%給老師聽。半年後你就能發現你已經可以很熟練的進行研究和探索了。

大概就分享這麼多啦~半路轉行的都不容易~祝題主早日入門,享受搞AI的樂趣哈哈~

小結

最後總結一下,一般對於跨領域到人工智能方向的研究生,編程基礎比較薄弱,都可能會遇到這樣的疑惑,應該先好好看論文,瞭解研究領域的情況,還是先系統學習編程知識呢,但這兩個方面都很重要,應該選擇同時走,這其實就需要一個比較好的規劃,對時間的安排,提高自己的效率。

特別遇到提問者的這類導師,會比較催趕你的研究進度的,提高效率就很重要了,學會挑選重要的論文來仔細閱讀,那麼如何判斷哪些論文才是重要的值得一看,看看引用數量、作者是否業界有名的大神,或者看看相關的論文筆記(公衆號、知乎、博客等)來判斷是否要精讀,還是簡單泛讀即可。

點擊文章底部“閱讀原文”可以跳轉到我的回答


精選AI文章

1.  2020年計算機視覺學習指南

2. 是選擇Keras還是PyTorch開始你的深度學習之旅呢?

3. 編寫高效的PyTorch代碼技巧(上)

4. 編寫高效的PyTorch代碼技巧(下)

5. 深度學習算法簡要綜述(上)

6. 深度學習算法簡要綜述(下)

7. 10個實用的機器學習建議

8. 實戰|手把手教你訓練一個基於Keras的多標籤圖像分類器

精選python文章

1.  python數據模型

2. python版代碼整潔之道

3. 快速入門 Jupyter notebook

4. Jupyter 進階教程

5. 10個高效的pandas技巧

精選教程資源文章

1. 22 款設計和可視化神經網絡的工具

2. [資源]推薦一些Python書籍和教程,入門和進階的都有!

3. Github|基於 Jittor 的 GAN 模型庫

4. Github上的各大高校資料以及國外公開課視頻

5. GitHub上有哪些比較好的計算機視覺/機器視覺的項目?

歡迎關注我的微信公衆號--算法猿的成長,或者掃描下方的二維碼,大家一起交流,學習和進步!

 

如果覺得不錯,在看、轉發就是對小編的一個支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章