實習商湯,校招華爲,我的深度學習之路

大家好,我是爲人造的智能操碎了心的智能禪師。

盡聽說現在國內外一線互聯網巨頭,包括後起的獨角獸,對 AI 人才的需求非常大,Google、Facebook 爲了搶 AI 人才都快 battle 起來了。

然而實際上,AI 崗位還是面臨僧多粥少的窘境。其中一個非常關鍵的問題在於,真正掌握 AI 知識技術的人才,還是非常稀缺。

那麼如何能夠成爲 AI 人才,又如何能夠被搶呢?是很多人都非常關心的問題。人工智能頭條的後臺也經常能夠收到很多類似的留言。

所以禪師聯繫到了曾在商湯實習,目前校招選定華爲的小夥伴,談談他是如何在深度學習這條路上,一步一步往深度走的。

本文較長,建議收藏,轉發,並認真實踐

本文適用人羣:非計算機、非 AI 專業的同學,或剛接觸該專業的本科、碩士生。

作者介紹:

沿途的筆記。西安電子科技大學人工智能學院研三學生,發表論文兩篇,擁有目標檢測、圖像匹配、高光譜圖像分類 3 項專利。遙感領域國際競賽取得第一名

全文大約4500字。讀完可能需要好幾首下面這首歌的時間

?

自 2016 年阿爾法狗問世以來,深度學習的地位無論是在學術界還是在工業屆都逐步攀升。

從事深度學習崗位的工程師們的薪水也水漲船高,拿今年秋招各大互聯網巨頭給應屆生的待遇便可見一斑。

重賞之下,必有勇夫。所以很多學數學、機械等其他專業的同學也想轉行加入深度學習的大浪潮。

與此同時,過剩的人才也導致了該領域的競爭空前激烈,更有甚者傳出某企業的 CV 算法崗投崗量與 HC 比達到 100:1。

下圖是某四個知名互聯網企業簡歷投遞量與 HC 比:

目前關於深度學習入門、進階的教程也很多,琳琅滿目。很多大牛寫的內容,對新人來說,經常顯得太深奧。

很多剛入門的同學們、從其他行業轉行的開發者,往往是一臉懵逼的進去,又一臉懵逼的出來。

於是我決定,自己的實際情況出發,以自己的學習經歷、心得和里程,寫一篇針對性很強的文章。

入門

素材:精準簡潔,切忌貪多

剛接觸深度學習的同學,很容易陷入一個死結:“貪多”。

網上到處搜筆記搜資源,看見“機器學習”“人工智能”…的羣就加。特別熱衷於蒐集類似於“機器學習從入門到精通”、“XXX 大學機器學習公開課”、“X 百 G 的深度學習資料一定要收藏”…

先不說這些資源的完整性,單就內容量來講,這幾十個 G,甚至是幾百 G 的學習資源,也會讓人暈頭轉向。

(禪師插個嘴,其實就想想你硬盤裏那幾十個 G 的視頻,你有沒有看完。這些學習資料,你就能看完了?)

因此,選擇精準的入門教程非常關鍵。

我推薦的視頻資源有:

  1. Coursera 上的吳恩達的《機器學習》
  2. Hinton 的 《Neural Networks for Machine Learning》

推薦的書籍:

  1. 周志華老師的《機器學習》
  2. Ian Goodfellow 的“花書”《深度學習》

這一部分主要是用於夯實基礎,瞭解相關的概念。雖然本文的主題是深度學習的學習歷程,但機器學習與深度學習有着千絲萬縷的聯繫,最好還是要一起看一看。

上面所提到的資料不要覺得看一遍就完事兒,一定要多看幾遍,即使有實戰經驗之後也可以反覆看,保證你每看一遍都會有新的體會。

勤做筆記,動手推導

在學習上面我推薦的兩個視頻資源及書籍的時候,會涵蓋高等數學、矩陣論、凸優化、概率統計等知識。

我們需要熟悉的機器學習和深度學習理論包括:

重要理論上的數學推導,一定要一步步的驗證!

能根據書本(或視頻)一步步走下來。遇到知識盲點、遺忘的部分,就針對性的查閱資料,力爭不放過任何重點。

這裏需要提醒的是,不建議從頭開始學習數學知識,因爲時間週期太長,中途可能仍會遺忘。可以在實際問題涉及到的時候,隨時查閱。

好,恭喜你,你已經一隻腳踏進了深度學習的大門。

確定研究領域後,就可以開始混跡相關網站、論壇。然後開始着手學習經典主流深度學習算法。

進階:從經典主流內容下手

等你真正進入大門後,你就會發現,深度學習實在是一個非常龐大的系統,涵蓋的知識面很廣,那麼我們該從那個方向下手呢?

答案是:

  1. 內容,選擇經典主流
  2. 方向,選擇自己感興趣的

爲什麼要強調經典主流呢?因爲新出的論文,太容易遇到水論文了。無論什麼領域,經過時間積澱下來的東西,纔是好東西。

相反,經典主流的東西,理論完備,積累的資料多,研究的人多,碰到問題也相對容易找到前輩的解答。

爲什麼選擇自己感興趣的方向呢?還不是因爲興趣是最好的老師!

例如如果你比較感興趣 CV,就可以從 CV 的目標檢測爲切入口。然後再深入一線去看相關論文。

以 CV 中的目標檢測爲例,它的發展歷程如下圖所示:

目標檢測發展史?

現階段在視覺頂會上,關於目標檢測的文章就已經很多了,短時間內根本不可能全部吃透。

所以要有針對性的重點進行突破,其實很多算法都是觸類旁通的。比如?上圖中紅色內容所表示的算法需要精讀,其他檢測算法瞭解即可。

更具體的,瞭解傳統 DMP 算法及主要缺陷,然後 two-stage 思路發展到 RCNN 做出了哪些改進。

再到 SPP-Net 做了哪些改進,然後到 Fast-RCNN、Faster-RCNN 又改進了什麼?以及 one-stag 思路中 SSD 系列、YOLO 系列之間的差別。

恭喜你,你已經正式踏上了深度學習這條不歸路了。

實操

解決問題

上面提到需要重點精度的論文,由於我們自身水平有限,而論文受到篇幅限制,沒辦法把細節都解釋清楚。

這就導致我們再實操過程中,會遇到很多問題。遇到問題不可怕,我們可以從下面兩個方向入手解決:

  1. 在相關論壇蒐集高手們對該論文的解讀
  2. 閱讀論文開源代碼

還解決不了的,Google、論壇、博客、人工智能頭條的股東粉羣……

你會發現,你遇到的問題,別人可能早就遇到並且得到解決,這樣就事半功倍啦。

總結經驗

問題解決之後,應該做總結,便於鞏固理解,加深印象。

尤其要做的是,找出論文各部件之間的差異,分析這個差異是“改進”造成的差異還是由於對主體算法“因地制宜”而造成的差異。

比如,YOLO 和 YOLOv2 之間,bbox 的迴歸計算方法是不一樣的。我們要體會作者的初衷,不斷去靠近這些大神們的思路。

再比如,Faster-RCNN 和 YOLOv2 雖然均是有事先 Anchor Boxes 來對 bbox 做迴歸,但是迴歸的計算方式也不一樣,這就是由於這兩個 Anchor Boxes 的由來不同導致的。

Faster-RCNN 是由三種寬高比、三種尺寸形成的 Anchor Boxes,而 YOLOv2 則是由先驗框聚類得到的。

將這些細枝末節以圖表,文字的形式總結起來(可以寫在 CSDN 或 GitHub 上,也可以寫在紙質版筆記本上),能夠有助於我們找到一些算法的改進空間或者一些新的靈感。

選擇合適的框架

對於重要的論文文章,光看是遠遠不夠的,我們還得學習其工程實現。

一來是編程復現論文算法有助於加深理解,二來是可以將我們所學知識轉化爲生產力。

下圖是某機構對各大深度學習框架的綜合評估。

這裏重點推薦 TensorFlow 和 PyTorch,因爲它們不僅靈活性高,而且背後有強大的團隊維護,可查閱的文檔也很豐富。

當選定一個深度學習框架之後,應當通過具體工程實例去學習,而非直接去閱讀源碼。

遇到一些常用的或者複雜的函數用法,要總結到個人博客中。

更重要的一點是,要時常混跡於 GitHub 之中,將 star/fork 數量較多的、且與自己研究方向相近的代碼 clone 下來去練習,學習大佬們的編程風格。

講真,好的編程習慣寫出來的代碼簡直是一個非常愉悅的藝術享受,這裏切記自己閉門造車,一定要多讀大神們的代碼。

這裏拿 TensorFlow 舉例。先去看 TensorFlow 文檔,接下來看《TensorFlow 實戰 Google 深度學習框架》,然後是《TensorFlow 實戰》。注意別弄錯了順序,前面那本書稍微簡單點,後面那本書主要是 demo。

待到 TensorFlow 能夠靈活運用的時候,我們就得學習調參技巧了,這裏推薦魏秀參的大作《解析深度學習網絡——深度學習實戰手冊》(當初看這本書的時候,感覺自己的很多想法都與大神在這本書中提到的結論一致,感覺能與大神想到一起,真是十分開心)。

實戰演練,paper 復現

當自己的編程能力、使用深度學習框架的能力達到一定水平後,我們要進入實戰演練階段:復現經典論文。

剛開始可能會比較難,所以我們可以先從論文作者或者熱心同行們開源的代碼入手。具體步驟是:

  1. 瀏覽開源代碼,比對代碼與論文描述是否一致,代碼是否對自己更進一步理解論文有所幫助
  2. 調試代碼。建議初學者不要囫圇吞棗,只是“看”代碼,還要一步步調試,看各個函數的用法,學習各種編程小技巧,驗證每步的結果與自己在“大腦編譯”的結果是否一致
  3. 動手復現。復現之前,可以先根據開源的代碼畫一個程序框圖,然後根據框圖逐次實現。然後將自己編寫的代碼調通,對比開源代碼看看有哪些差距。一般差距主要體現在:代碼的簡潔性和功能的完整性。
  4. 重複第 2、3 步,直到自己能一目十行閱讀開源代碼,能掌握每個地方的編程技巧,復現出來的代碼與開源代碼基本一致,且能與論文對應的上的時候,這篇文章可以算是吃透了。

延伸

專注自己的東西

當自己復現的論文達到一定數量之後,編程水平會得到一個飛躍的提升。這時,我們要將自己從一個“學習者”的角色轉換到“模仿者、改進者”的角色。

一方面,我們要整合自己已經吃透的論文(包括代碼),另一方面,我們要與時俱進跟進前沿研究,跟着大佬們“分一杯羹”。

經典文章和新論文兩手抓

到了這個階段,我們就不僅僅只讀經典的文章了,還要開始接觸新領域,新文章。我們千辛萬苦學這麼多東西,最終就是要有產出。

對於很多年前的研究課題,它們只能幫助我們夯實基礎,提升基本功,並不能有助於我們發表屬於自己的論文或者專利。

因爲這些經典主題,早就被前輩同行們嚼爛了,只剩下骨頭渣了。

碎片化閱讀

當我們對深度學習領域堅持學習到一段時間之後,總會收藏一些自己感興趣的論壇、專欄,以及大牛們的個人主頁,他們會分享一些最新的經驗或者研究成果。

對於這些經驗成果,我們可以選取自己感興趣的或者與所研究領域相關的部分重點閱讀(而不是全盤通讀,這樣太浪費時間)。

比如前一陣子吳恩達分享的《Machine Learning Yearning》裏面有些實戰經驗就很值得學習。

學會辨別新出來的好論文

對於年代較爲久遠的論文,我們可以通過文章的索引量或者開源代碼 star 數量的多少來判斷其是否值得讀。

對於新出爐的論文,我們可以去相關論壇看大神們的推薦(如關注一些知乎上的大 V 們,他們會經常在專欄裏推薦一些新出爐的好文章)。

還有一些高質量的公衆號(比如禪師特別推薦人工智能頭條),論壇等。這裏重點推薦 paperweekly。

將這些新文章裏的 idea 與自己儲備的基本知識相互碰撞,尋找一切可能產生的關聯,或者找到新文章 idea 的不足,自己能加以改進。

發表屬於自己的文章

當經典文獻和新文章積累到一定程度時,我們一定會有一些自己的想法。這時候就需要我們紮實的代碼功底,將我們自己的想法實現出來。

對於新手,我覺得有這樣幾種情況可以視爲自己的成果發表成論文:新問題用老方法,老問題用新方法,改進他人的新方法。

然後將自己的 idea 及實驗結果嚮導師彙報,讓導師幫忙將自己的 idea“潤色加工”,就可以愉快的發 paper 啦。

總結

本貼是對我個人學習深度學習歷程的一個總結,更偏實際應用。

如果自己時間充裕,且導師願意放人的話,可以去一些科研氛圍濃厚的企業實習,如商湯科技、Face++、地平線、阿里達摩院、騰訊 AI Labs 等。

筆者曾有幸在商湯研究院實習過一段時間,當真是人才濟濟,被組內的小夥伴淵博的知識,敏捷的頭腦所折服,對提升自己的見識水平大有裨益。

但如果找的企業太偏向業務,我個人認爲還不如呆在實驗室多做做科研,多發幾篇論文來的實在。在大神們創造的理論框架下,千錘百煉、精益求精,就一定能有所收穫。

我整理過的一些重要書籍,LeetCode 刷題代碼,以及面試經驗等,詳見

https://github.com/computervisionlearner/Start_DeepLearning

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