做底層AI框架和上層AI應(yīng)用,哪個對自己的學(xué)術(shù)水平(或綜合能力)促進(jìn)更大?這一問題引起了知乎上不少的討論。本文對解浚源、微調(diào)等用戶的精彩回答做了整理,與讀者共享。
左手“底層AI框架”,右手“上層AI應(yīng)用”,如何選擇?
對于做AI相關(guān)工作的人來說,具體選擇做哪個方向,可能是需要深深糾結(jié)的一個問題。
知乎上就用戶提出了此問題,引起了不小的關(guān)注和討論:
新智元獲得了解浚源和微調(diào)兩位用戶的授權(quán),將他們對此問題的深度解析做了整理,與讀者共享。
要有側(cè)重,但兩方面都需了解
作為一個深度學(xué)習(xí)轉(zhuǎn)系統(tǒng)的人,我最近也在反思一個問題:深度學(xué)習(xí)系統(tǒng)(Deep Learning System)的核心到底是深度學(xué)習(xí)還是系統(tǒng)?
先放結(jié)論:無論你想做深度學(xué)習(xí)還是深度學(xué)習(xí)系統(tǒng),都需要同時了解兩方面的知識,根據(jù)自己的方向可以有所側(cè)重,但一定不能對一方面完全不懂,否則是很難做出在實踐中有用的成果的。
首先我們來看一下目前流行框架的開發(fā)團(tuán)隊和他們開發(fā)框架的驅(qū)動力:
Caffe:賈揚清和伯克利視覺實驗室的小伙伴們開發(fā)。開始主要是自己用,屬于需求驅(qū)動。
Torch:Yann LeCun的學(xué)生。需求驅(qū)動。
Theano:Yoshua Benjio的學(xué)生。用于自己科研,但是也發(fā)了系統(tǒng)的paper,屬于需求+科研驅(qū)動。
Tensorflow:Jeff Dean帶領(lǐng)的Google員工,主要是系統(tǒng)出身。源于Google在AI領(lǐng)域的布局需求,資本驅(qū)動。
Neon:nervana員工,作為創(chuàng)業(yè)公司的產(chǎn)品。資本驅(qū)動。
MXNet:DMLC(主要是華人機(jī)器學(xué)習(xí)和分布式系統(tǒng)學(xué)生)的小伙伴。主要是Minerva,Purine,和cxxnet的開發(fā)團(tuán)隊合在一起,一半搞機(jī)器學(xué)習(xí)的,一半搞系統(tǒng)的。需求+興趣驅(qū)動。
剩下還有很多搞系統(tǒng)的人出于興趣或者科研目的開發(fā)的框架,但大多沒有流行起來,就不再贅述了。
可以看出,除了Google強推的Tensorflow,大多都是從自用和興趣開始的。而Tensorflow的開發(fā)經(jīng)費比其他所有框架的經(jīng)費加起來還要多出幾十倍,但是一年下來并沒能一統(tǒng)江湖??梢娦枨篁?qū)動的力量,所謂“需要是發(fā)明之母”。
為什么主流深度學(xué)習(xí)框架多數(shù)出自“懂一點系統(tǒng)的搞深度學(xué)習(xí)的人”之手,而不是“懂一點深度學(xué)習(xí)的搞系統(tǒng)的人”呢?
我認(rèn)為主要是因為深度學(xué)習(xí)系統(tǒng)和傳統(tǒng)系統(tǒng)(比如操作系統(tǒng),數(shù)據(jù)庫)有一個本質(zhì)區(qū)別:深度學(xué)習(xí)算法各部分的耦合非常緊密,牽一發(fā)而動全身。
搞系統(tǒng)的人的思路是,我做一個系統(tǒng),定義好接口,保證接口正確,用戶用就可以了,不需要了解實現(xiàn)細(xì)節(jié)。畢竟你用操作系統(tǒng)并不需要了解文件系統(tǒng)格式,用數(shù)據(jù)庫并不需要了解一致性是怎么實現(xiàn)的。
但是這套思維用在深度學(xué)習(xí)系統(tǒng)上卻不合適。
其一,一個數(shù)據(jù)矩陣流過整個系統(tǒng),每一步的細(xì)節(jié)都可能對一百步以后的結(jié)果造成影響。而對于中間結(jié)果,你無法嚴(yán)格定義什么是正確的,一個好的算法不是N個好的部分的簡單疊加。Hinton就說過,Dropout看起來像個Bug,但是它提高了精度,所以是個“好bug”。
其二,因為深度學(xué)習(xí)算法復(fù)雜,需要控制的因素多,一個固定接口很難滿足所有用戶的需要。還不如把系統(tǒng)寫的簡單靈活一點,讓用戶根據(jù)需要可以很方便的自己修改。
反過來對搞深度學(xué)習(xí)的人來說,如果你不了解系統(tǒng)內(nèi)部細(xì)節(jié),當(dāng)你的算法效果好的時候,你并不知道到底是哪些因素導(dǎo)致了效果好??赡軗Q了一個框架,效果就不好了,而原因是你根本不知道的某個實現(xiàn)細(xì)節(jié)。當(dāng)效果不好時,你也不知道如何改進(jìn)。
另一方面來說,當(dāng)你需要實現(xiàn)一個新的算法的時候,經(jīng)常會發(fā)現(xiàn)框架現(xiàn)有的接口不能解決你的問題,這時候就需要對系統(tǒng)內(nèi)部的了解才能修改系統(tǒng)已實現(xiàn)自己的目的。
底層開發(fā)較難,上層更接地氣
上周開會時遇到了TAMU的胡俠老師,他介紹了他們組最近開發(fā)的一個自動機(jī)器學(xué)習(xí)開源框架Auto Keras。胡老師原話是這么說的:“做開源框架是非常有意義的事情,尤其是你的工作在短時間內(nèi)被很多人關(guān)注并使用是非常有成就感的?!?/p>
確實如此,很多業(yè)內(nèi)人士在逐漸把目光投向到更底層更接近“基礎(chǔ)設(shè)施”的方向上,比如自動調(diào)參、大規(guī)模機(jī)器學(xué)習(xí)、并行式機(jī)器學(xué)習(xí)。畢竟好的算法想要被更多人使用,就需要降低使用門檻,提供通用的框架。假設(shè)如果沒有Sklearn,估計做機(jī)器學(xué)習(xí)的人最起碼要少一半。如果沒有TF或者Torch,做深度學(xué)習(xí)的人估計也要少一半。
其實嚴(yán)格意義上來說,從提出算法,封裝算法,到應(yīng)用在現(xiàn)實數(shù)據(jù)集上是一個流水線作業(yè),是從上游到下游的工作。我的一個觀察是,做算法研究的很多人代碼寫的很糙,運行效率可能非常低。
舉個簡單例子,當(dāng)你展示一個簡單的K近鄰算法時,你可以寫成每次都進(jìn)行重新搜索,也可以先構(gòu)造一課K-D樹來降低時間復(fù)雜度。僅聰邏輯角度來看,前者和后者都是正確的,但效率可能相差不少。
這種現(xiàn)象造成了大部分前沿研究的結(jié)果不容易落地,因為代碼未經(jīng)優(yōu)化或者在實現(xiàn)時存在各種各樣的bug。我覺得一個非常好的突破角度就是研究如何高效實現(xiàn)各種傳統(tǒng)及前沿算法,從最簡單的向量化、并行運算,到更復(fù)雜的結(jié)構(gòu)設(shè)計甚至到大規(guī)模的并行計算。如果把底層框架做好,那么對于工業(yè)界和科研界都有很大的意義:
工業(yè)界可以快速嘗試前沿算法,在真實數(shù)據(jù)上驗證算法的可靠性及實用性。
科研界可以公平的對比前沿算法,防止科研造假。很多論文聲稱他們的算法是遠(yuǎn)超當(dāng)前的最佳算法(SOTA),但事實上可能僅僅是因為他們沒有正確實現(xiàn)SOTA而已。
我從去年起開始嘗試造一些小輪子,也做了一些小框架。這個過程中由不少全新的感受:
設(shè)計、實現(xiàn)框架很容易,發(fā)現(xiàn)原有算法中的不足,有助于激發(fā)新的點子。以基于K近鄰的算法為例,假設(shè)在實現(xiàn)時你發(fā)現(xiàn)整個程序效率受制于K近鄰部分,你就可以嘗試用K-D樹來加速,甚至替換掉K近鄰的步驟,用聚類來模擬這個過程。所以當(dāng)你了解算法的瓶頸時,你就可以提出新的有意義改進(jìn),反哺學(xué)術(shù)研究。
增強自己的實現(xiàn)能力,避免沉溺研究后的紙上談兵。近兩年最受關(guān)注的傳統(tǒng)分類方法要數(shù)陳天奇的XGBOOST,的確非常的好用。我認(rèn)為XGBOOST的成功要歸功于算法很早就被封裝成了成熟的工具庫,這是基于陳天奇老師深厚的系統(tǒng)設(shè)計和實現(xiàn)功力。我想過去十年肯定有一些很優(yōu)秀的算法蒙塵,只是因為它們的作者無法把它們封裝成成熟的輪子供大家使用,非??上А?/p>
更符合工業(yè)界的定位,為求職路加分。其實大部分情況下,工業(yè)界并不在意你發(fā)過多少厲害的文章,而更在意你是否可以把公司的需求落地。我自己的經(jīng)驗是即使是學(xué)術(shù)參會,也沒有多少人對我的水文感興趣,而更多的是聊我開發(fā)框架的經(jīng)歷,因為他們不僅聽說過可能還是使用者。
成就感??蚣艿氖褂谜哌h(yuǎn)比論文的閱讀者要多得多,當(dāng)你發(fā)現(xiàn)你設(shè)計的框架被全世界的人廣泛使用時,會有很強的成就感,會覺得自己為這個領(lǐng)域發(fā)展做出了一點點貢獻(xiàn),而不是僅僅寫出了一些這輩子不會再有人看的水文。
以上觀點主要在討論要不要嘗試學(xué)習(xí)開發(fā)框架,嘗試造出一些新的輪子?;氐秸},「底層框架」哪個「上層應(yīng)用」更好?我的觀點是這取決于你所擁有的技能:
底層框架:難點在于封裝和性能。比如如何設(shè)計API(接口),如何提高運行速度進(jìn)行優(yōu)化,如何寫好測試保證方法正確。
上層應(yīng)用:難點在于如何把已有的輪子用在現(xiàn)實數(shù)據(jù)上去,這涉及里很多現(xiàn)實的問題比如數(shù)據(jù)清理,比如理解如何正確的調(diào)用底層的功能。
一般來說,大部分人不適合寫底層。畢竟優(yōu)秀的框架已經(jīng)很多,而且對于系統(tǒng)架構(gòu)以及代碼優(yōu)化的要求很高,大部分人并不具備所需的知識。
而上層應(yīng)用就顯得更接地氣,可以加深我們對于數(shù)據(jù)的敏感度,擅長做上層應(yīng)用的同學(xué)也會是職場offer收割機(jī)。其實能夠做好上層應(yīng)用并不容易,這需要對于問題的深入理解。
換句話說,底層框架和上層應(yīng)用分的是不同的蛋糕,側(cè)重點各不相同。
從做研究的角度來看,發(fā)明一個算法其實不該是終點。作為算法的提出者更應(yīng)該自己動手實現(xiàn)自己的模型,畢竟酒香也怕巷子深。
-
AI
+關(guān)注
關(guān)注
87文章
31493瀏覽量
270076 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5512瀏覽量
121452
原文標(biāo)題:做底層 AI 框架和做上層 AI 應(yīng)用,哪個對自己的學(xué)術(shù)水平(或綜合能力)促進(jìn)更大?
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論