做底層 AI 框架和做上層 AI 應用,哪個對自己的學術水平(或綜合能力)促進更大?
底層如tensorflow或caffe或mxnet的源碼,
上層即把最前沿的paper上的技術應用到工作中吧我理解
作為一個深度學習轉系統的人,我最近也在反思一個問題:深度學習系統(Deep Learning System)的核心到底是深度學習還是系統?
先放結論:無論你想做深度學習還是深度學習系統,都需要同時了解兩方面的知識,根據自己的方向可以有所側重,但一定不能對一方面完全不懂,否則是很難做出在實踐中有用的成果的。
首先我們來看一下目前流行框架的開發團隊和他們開發框架的驅動力:
Caffe:賈揚清和伯克利視覺實驗室的小夥伴們開發。開始主要是自己用,屬於需求驅動。
Torch:Yann LeCun的學生。需求驅動。
Theano:Yoshua Benjio的學生。用於自己科研,但是也發了系統的paper,屬於需求+科研驅動。
Tensorflow:Jeff Dean帶領的Google員工,主要是系統出身。源於Google在AI領域的布局需求,資本驅動。
Neon:nervana員工,作為創業公司的產品。資本驅動。
MXNet:DMLC(主要是華人機器學習和分散式系統學生)的小夥伴。主要是Minerva,Purine,和cxxnet的開發團隊合在一起,一半搞機器學習的,一半搞系統的。需求+興趣驅動。
剩下還有很多搞系統的人出於興趣或者科研目的開發的框架,但大多沒有流行起來,就不再贅述了。
可以看出,除了Google強推的Tensorflow,大多都是從自用和興趣開始的。而Tensorflow的開發經費比其他所有框架的經費加起來還要多出幾十倍,但是一年下來並沒能一統江湖。可見需求驅動的力量,所謂「需要是發明之母」。
為什麼主流深度學習框架多數出自「懂一點系統的搞深度學習的人」之手,而不是「懂一點深度學習的搞系統的人」呢?我認為主要是因為深度學習系統和傳統系統(比如操作系統,資料庫)有一個本質區別:深度學習演算法各部分的耦合非常緊密,牽一髮而動全身。
搞系統的人的思路是,我做一個系統,定義好介面,保證介面正確,用戶用就可以了,不需要了解實現細節。畢竟你用操作系統並不需要了解文件系統格式,用資料庫並不需要了解一致性是怎麼實現的。
但是這套思維用在深度學習系統上卻不合適。其一,一個數據矩陣流過整個系統,每一步的細節都可能對一百步以後的結果造成影響。而對於中間結果,你無法嚴格定義什麼是正確的,一個好的演算法不是N個好的部分的簡單疊加。Hinton就說過,Dropout看起來像個Bug,但是它提高了精度,所以是個「好bug」。其二,因為深度學習演算法複雜,需要控制的因素多,一個固定介面很難滿足所有用戶的需要。還不如把系統寫的簡單靈活一點,讓用戶根據需要可以很方便的自己修改。
反過來對搞深度學習的人來說,如果你不了解系統內部細節,當你的演算法效果好的時候,你並不知道到底是哪些因素導致了效果好。可能換了一個框架,效果就不好了,而原因是你根本不知道的某個實現細節。當效果不好時,你也不知道如何改進。另一方面來說,當你需要實現一個新的演算法的時候,經常會發現框架現有的介面不能解決你的問題,這時候就需要對系統內部的了解才能修改系統已實現自己的目的。
謝邀
對能力促進的程度是一個非常主觀的判斷,這取決你你對自己的定位,以及對於大趨勢的理解。我在這裡分享一下我思考的過程,希望有所幫助。
我一直在嘗試做機器學習在各個領域的應用,特別是小眾領域的應用。在 CMU 的時候我花了大概一年的時間研究機器學習和法律領域的結合,並發表了論文,積累了不少如何踏入陌生領域的經驗。我在之前的答案中也提到過 如何看待人工智慧律師的誕生,類似Ross的人工智慧律師在中國是否可行? - 陳然的回答 - 知乎 。從 CMU 畢業之後我沒有選擇去純互聯網公司,而是選擇去了一個互聯網和房地產結合的公司 Trulia (Zillow Group),也是希望能夠了解真實的商業世界,找到融合的角度,真正地改變行業。
我做這樣的原因一是覺得做應用更有趣,二是覺得現在是最好的時代。有趣是一個主觀的判斷,在此不表。而現在是做演算法最好的時代,因為無論從學術模型還是工程積累都沒有壁壘,我們正處在一個模型表達能力無限強,計算速度無限快,數據無限多的時代。我在這個答案中有詳述:如何評價谷歌的「人工智慧先行」(AI First)戰略?
然而,我做應用的日常工作與大家心中的想像並不完全一樣。一個 AI 應用項目從最早的探索到上線,從項目負責人的角度看,大概要經歷這樣一個流程:Realize -&> Discuss -&> Try MVP -&> Optimize。很多人心中的做演算法,是做最後一步優化,也即不斷地調整參數,更換模型,收集新的數據等等等,而事實上在我工作的經歷中,前三步是最困難的,也是絕大多數時間所在;而一旦進入了優化演算法的過程,一切都有章可循,只要投入時間和精力就能有結果。
前三步困難,因為絕大多是業務的負責人並沒有意識到演算法可以帶來巨大的 KPI 提升,甚至業務形式的改變。有些人就算意識到了,也不知道如何開始,如何衡量投入與產出。前三步雖然看似普通,但每一步的前進來來回回都要花費大量的時間。為了解決這個問題,我在公司實踐中有一些方法:
- Change Culture。人只有理解了新技術,才會嘗試新技術。但改變人的意識和公司的氛圍是一件細水長流的事情。我們一直在各種場合推銷我們的技術,比如我們組一直在組織 Data Science Lunch,通過提供免費午餐的形式,聚集感興趣的同事在一起,共同觀看視頻學習機器學習領域的最新進展,分享我們組的工作成果,介紹其他公司的成功案例。谷歌提出了 AI First 的戰略,是一種從上到下的改變,但是對於絕大多數公司來說,很難有這種魄力,所以我們一直試圖推動從下而上的改變。
- Demo Driven。單純的案例分享並不能很直觀地讓人理解,但 Demo 的力量是巨大的,一旦負責人看到如此直觀的體驗,幾乎很難拒絕上線測試的想法。因此,我負責的幾乎每一項目都有 Demo 網頁,負責人不需要靠想像力來理解產品,而是可以直接地交互與思考。這一項的難度很大,一是需求往往並不來自於業務負責人,而是靠我對於業務的理解,因此我需要通過各種場合了解公司數十個業務的進展,學習領域知識,再結合自己的理解開發 Demo。二是要寫HTML JavaScript CSS。
- End-To-End Solution。為了快速響應業務需求,我們組也搭建起了 API 系統,這樣我們可以直接對接業務部門,隨時發布新的更新。同時受益於工程上的進步,我一個人就可以完成若干項目的從開發到運維一套可以負載整個公司流量的 API 系統的所有工作,我在文章中也有記錄 知乎專欄 - Docker for Data Science at Trulia 和一點感悟
能把應用做好,特別是能做出全新的應用,是一件非常困難的事情,需要不斷地學習新的領域知識,包括各種公司的業務邏輯。而這需要自己足夠主動,想辦法接觸各個業務負責人,獲得詳細的業務信息,甚至去了解所有的業務實施,才能找到最好的辦法進行整合。也正如我在 2016~20 年矽谷需求量最大的是什麼方向的技術人才? 中說的,可以說任何時代,最需要的人,都一樣,就是那些既懂得最新的技術,也懂得現在的商業環境,並且有能力把最新的技術應用到目前的市場上的人。
最後,回到那句老話,做決定的時候,一定要考慮自己的興趣所在,也要參考時代的環境。畢竟:
一個人的命運啊,當然要靠自我奮鬥,但是也要考慮到歷史的行程。
----
@陳然
學術上,一般是直接使用現有框架,做一些創新。
工程上,既有使用現有框架做應用的,也有搭建大規模深度學習平台的。
兩個方向做深入了,都挺好,關鍵看提主興趣吧。
如果代碼能力強,建議先把大部分精力放在代碼上。當然時間也是比較花的,如果有限時出論文的任務,可能就不行了。我也有過這樣的疑惑,要不要自己開發工具箱,因為開發需要花費太多時間,特別是開頭。後來發現,搞了代碼後,對論文的理解力大幅上升,看了基本方法,就能想像出黑箱子裡面的特徵變化,這是光從數學角度理解論文所不能具備的。同時具備了小樣本學習的能力,就是把一個實例反覆實驗,就能理解許多東西,就像看到了數據變化的過程,同時思路迸發。所以我也看到某位宗師說,代碼能力非常重要。至於你說看caffe之類的源碼,我想是必須的。如果連工具的源碼都不知道,那黑箱子永遠是黑箱子。
」底層如tensorflow或caffe或mxnet的源碼,上層即把最前沿的paper上的技術應用到工作中」
你總能找到前沿paper的cpp乃至基於所需庫的實現?
找不到的話,倆事難道不是一件事?
即便找到了,你要改進它的話,難道不需要懂源碼?
倆事還不是一件事
就算找到了現成實現,又不需要改進。你有把握一應用就好使?
倆事還不是一件事
一切脫離科研規矩談論學術的都是耍流氓。
我承認現在深度學習門檻很低,可能一個本科生都能用公開庫實現很多論文的演算法,甚至做點改進,超越大牛的結果。
但這不算科研,遑論學術。要知道,深度學習研究的目的不是高性能,而是為什麼會有高性能和怎麼才能達到高性能。
嘗試很多參數的排列組合後得到了很好的結果,對學術上的貢獻趨近於零。當然這話說的偏頗,起碼還提供了一些實驗結果。不過就是這個意思。
再精美的瓷器也是工藝,再沒用的理論也是科學。老祖宗沒少吃這個虧。
真的想從學術上進步,就去好好學學數學,統計學,概率論,矩陣論。沒必要花時間在深度學習的庫上。
另外,個人看法,多學一下近世代數,分型,這很有可能是能夠闡釋深度學習的數學工具。再次強調這是個人看法。
如果真的糾結庫得問題,我建議Theano。這個庫不會把你局限在大路貨的網路結構上。
我記得 @vczh以前提過的,綜合能力受到最短的那塊板的制約。
所以我覺得,如果想提高綜合戰鬥力的話,立足在一個維度上(假設你的主要工作是應用),另一個維度同時發展應該也是很自然的(因為使用工具的時候會遇到問題,有坑就去看代碼,然後發現自己能做一些事情,參與到開源項目中去,慢慢的就提高了)這個答案需要具體問題具體分析,取決於個人實際水平、個人目標和具體做的事情。
不要騙自己,現在的前沿paper都是要改源碼再編譯的
想走科研這條路的話,做AI底層 不可避免有精力會分散給純工程方面的事 比如架構優化,而不能專註演算法創新
應用。我選就選應用
這兩個是相輔相成的,沒有對源碼的了解,就不能改源碼實現paper中的idea,而且像跑出paper中的結果,就需要不斷的去實際實驗,同時深入源碼也可以加深對paper中演算法的理解
推薦閱讀:
※OPTA 發布的球員在每場比賽中的熱點圖和傳球線路是怎樣製作出來的?
※CV/ML頂級會議上的灌水文都有哪些特徵?如何快速判斷頂會論文是在灌水?
※如何評價 Kaiming He 最新的 Mask R-CNN?
※怎麼及時掌握/把握深度學習的發展動向和狀態?
※Instance Segmentation 比 Semantic Segmentation 難很多嗎?