實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

AI100發表於2017-06-22

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

這個年代,不怕你是大牛,就怕大牛還會寫文章。

作為AI100智庫專家,智亮總是能在口若懸河中,讓人深入淺出地學到一堆堆乾貨,掏心窩子的乾貨。

多年的實戰經驗,讓智亮無論是在知乎解答,還是各路部落格上,都是大神一樣的存在。

就在前幾日,跟智亮聊起來AI入門這個話題,他的滔滔江水延綿不絕實在是震驚了我,太實用了。再三要求下,智亮答應將其多年心得寫出來,這一寫就洋洋灑灑近萬字,無論是他對未來豪情萬丈般的預判,還是對於實戰細緻入微的解析,還是一番苦口婆心的勸導,全在裡面不吐不快了。

這篇文章主要解決三個問題:

1.開發人員是否應該轉向機器學習?

2.需要什麼條件才能轉向機器學習?

3.應該怎麼開始機器學習?

末了,智亮說,寫完有一種身體被掏空的感覺。

看來是真下了功夫啊!

以下,enjoy。

作者 | 智亮

編輯 | 鴿子(rgznai100)

幾何時,我們讀著比爾蓋茲的傳記,感嘆他大學時就能徒手寫OS的天才同時,也不禁唏噓:現在寫一個OS又哪是幾個人幾臺電腦能搞的定的。

賈伯斯的車庫創業,雖然聽著比雞湯還暖心,可是那個時代畢竟已經過去了。留下的,只有無數掙扎著從C++/Delphi轉型的資深程式設計師。

網際網路崛起的時代,馬化騰帶著幾個人就開發出了OICQ,造就瞭如今偌大的騰訊帝國。

智慧手機爆發的時代,隨便山寨一個遊戲就能賺得盆滿缽滿;而現在,即使用心做了一個APP,推廣費用至少也是百萬級吧。

網際網路(以及移動網際網路)時代,已經接近尾聲,草根創業變得無比艱難。

代表著網際網路時代的JAVA程式設計師們,開始日落西山;而代表著移動網際網路時代的Android/iOS程式設計師們,應該也感受到就業形勢的日趨嚴峻吧。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

每一波浪潮的到來,都意味一片無人佔領的藍海,也意味著眾多新成長起來的巨頭,還意味著什麼?意味著大量的人員需求,供不應求的開發市場,以及從業者的高薪與眾多的機會。

我們最常做的事情是目送著上一次浪潮的餘波遠去,感嘆自己生不逢時,卻沒有意識到,下一波浪潮已經到了我們腳下。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

沒錯,我們說的就是AI

百度前首席科學家吳恩達曾經說過,在他看來,機器學習對於世界的改變,可以與電能對於世界的改變相媲美。而更多的人,已經開始用“第四次工業革命”來預言人工智慧帶來的產業革新:

前三次工業革命,讓人類擺脫了重體力勞動、精細體力勞動、簡單計算勞動。而這一次,伴隨著人工智慧而來的機器學習,很可能讓人類不必在簡單思考判斷類勞動上消耗大量人力資源。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

比如,目前僅在中國就有計程車130萬輛,載貨車輛超過千萬,也就是說,每天以“駕駛”作為主要職業的人群就達到千萬量級。如果自動駕駛得以普及,至少在中國就有千萬人被“釋放”,也就是說,老司機們得重新學一門吃飯的手藝了。

再比如安防領域,全國每天坐在各種監控螢幕前的人(沒錯,就是每部諜戰/犯罪類電影裡都會被抹脖子的那個職業)也接近百萬。可是,當智慧攝像頭出現時,監控人員將敗給在0.1秒內就會判斷反常局面、識別數萬人臉的AI;

還有視訊網站鑑黃師,將輸給沒有荷爾蒙卻能每秒檢出數百段色情視訊的AI;

同聲傳譯員會敗給沒有延遲、並且可以同時用幾十種不同語言跟人聊天的AI;

還有網文篩選編輯、快遞地址分揀員等等,這些我們聽說過或者沒有聽說過的職業,這些消耗著無數人的時間和精力的職業,都將一一被AI打敗。

這不是簡單的失業和再就業的問題,而是一次全新的社會結構大調整,一次對我們習以為常的生活傷筋動骨的革新。

就在機器學習砸掉這些人飯碗、逼迫他們投入到其他的工作時,我們的社會,已經開啟了新一輪的歷史性革新。

讓我們細細來個例子。

自動駕駛,這是巨頭公司投入了大量精力的領域。很多人直觀的感受是,以後買輛車,開起來可就不用那麼累了。

的確如此,但並非這麼簡單。

讓我們深入這個問題。

如果所有車輛都變成了自動駕駛,你真的還需要買一輛車嗎?

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

我們購買車輛的時候,買的不是四個輪子加一個發動機,而是購買“隨時隨心快速出行的能力”,使我們不必忍受公交太擠、有急事打不到車、偏遠地區去了回不來等等困擾。

而在自動駕駛的情況下,司機交班、扎堆、偏遠地方打不到車,網上叫車沒人接單等情況,還會存在嗎?如此,我們又何必每個人買一輛車,忍受路上堵、停車難這些困擾呢?

到時候,大量的無人車在各種巨型停車場靜靜地趴著,只要有人下單,幾分鐘後,就會有一輛無人車來到你面前,任你驅使。

讓我們再沿著這個思路想深一些。

當無人車充斥我們周圍時,這些車輛是否一定有必要設計成五座?也許根據實際運營資料的分析,單人車輛、二人車輛會成為無人車輛的主流,不僅出行更加便捷,減少浪費,還能大大減輕交通流量壓力,緩解擁堵。

未來,很有可能連交通擁堵也沒有了。設想,當所有車輛的實時狀況,都通過網路彙總到管控機構,管控機構便能根據實時路況,與車輛遙相呼應,車輛自動規劃更為合適的路徑,自動緩解交通壓力。

不妨再想想,當智慧駕駛足夠可靠的時候,現在的交通路口紅綠燈機制是否還有必要?甚至說,現在的一切交通規則是否會有一個巨大的改變?

這還僅僅是針對一項技術開出的腦洞,就已經足夠改變現有的整個出行結構和出行規則。未來人工智慧的每一項技術,都是對所在行業的徹底改寫。至於能改寫成什麼,恐怕沒有人能說得清楚。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

唯一可以想象的是,我們在不需要學習外語,不需要考駕照的同時,會需要更多的機器學習專家和相關開發人員。

我們將需要更多AI從業者

其實,上面這些事情,身在IT圈中的人,應該都有著直觀的認識。最近這兩年,談論機器學習,神經網路的人越來越多,而各種“人工智慧”相關的訊息也是鋪天蓋地,大有“不入圈就淘汰”的洶洶勢頭。

但與此同時,各種不明覺厲的言詞也嚇退了很多非科班出身的開發者。

什麼叫卷積神經網路?什麼叫凸優化?是不是還要回去重讀高數,線代,概率?那麼一大堆公式,感覺完全看不懂啊?聽說沒個名校博士出身都搞不了這個?

不光是普通程式猿這麼說,文藝的程式猿和……額,高大上的程式猿也都這麼說。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

我說,呵呵。

在很久以前的一篇知乎回答中提過,作為開發人員,機器學習界在我看來會分成這麼幾個層次:

➤ 1. 學術研究者

他們的工作是從理論上詮釋機器學習的各個方面,試圖找出“這樣設計模型/引數為什麼效果更好”,並且為其他從業者提供更優秀的模型,甚至將理論研究向前推進一步。

能夠做到這一步的人,可以說鳳毛麟角,天賦是繞不過去的大山,機遇和努力也缺一不可。

➤ 2. 演算法改進者

他們也許無法回答出“我的方法為什麼work”,也許沒有Hinton,LeCun那樣足以載入史冊的重大成果,但是卻能根據經驗和一些奇思妙想,將現有的模型玩出更好的效果,或者提出一些改進的模型。

這些人通常都是各個機器學習巨頭公司的中堅力量或者成長中的獨角獸,使用什麼模型對他們來講也不是問題,根據所處的環境,通常都有固定的幾個選擇。

在這個層面,insight和idea才是重要的東西,各種工具的區別,影響真的沒那麼大。可能會讓一個結果早得到或者晚得到幾天或者幾周,卻不可能影響“有沒有成果”。

➤ 3. 工業實現者

這些人基本上不會在演算法領域涉入太深,也就是了解一下各個演算法的實現,各個模型的結構。他們更多地是根據論文去復現優秀的成果,或者使用其他人復現出來的成果,並且試圖去在工業上應用它。

分好了類,來說正事。

想要成為一個機器學習開發人員,究竟需要做些什麼準備?到底如何才能從一個C++/JAVA/Android/iOS程式猿成為一個機器學習開發人員呢?

答案只有一個:

Just Do IT(去搞IT吧,少年)

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

作為程式設計師,讀十遍書不如跑一遍程式,與其花費大量的時間去啃書本,不如親手完成自己的程式並執行它。我們在寫出程式碼的同時,就會了解到自己還有哪些地方不夠清楚,從而有針對性地學習機器學習。

基礎知識

當然,勿在浮沙築高臺(對這句話眼熟的請舉手),有一些基礎的知識還是需要掌握的。例如在計算機視覺領域,根據我們團隊內部培訓的經驗,為了能夠獨立進行機器學習的開發工作,最好首先完成這麼幾項課程:

➤ 入門,瞭解概念,演算法基礎:

Coursera 機器學習課程 - by 吳恩達

Machine Learning Coursera

https://www.coursera.org/learn/machine-learning

進階,多層神經網路,卷積和softmax迴歸:

史丹佛機器學習課程 UFLDL

UFLDL Tutorial

http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

重點關注其中的softmax迴歸,卷積和池化這幾個章節

進階,計算機視覺,卷積神經網路的新進展,實現和應用:

史丹佛計算機視覺課程 CS231n

史丹佛CS231n -深度學習與計算機視覺 - 網易雲課堂http://study.163.com/course/introduction/1003223001.htm

上面的課程大概會消耗你1到2個月的所有業餘時間。但是相信我,這是值得的。網路上的課程非常多,也有很多優秀的免費課程,但是作為入門,我沒有找到過比這三個更適合的。

如果實在連一兩個月的業餘時間都拿不出來,好吧,我來偷偷告訴你最最最基本的一個要求,滿足了這個要求,你就能夠算是機器學習入門了:

會算矩陣乘法

別笑,說正經的,在這個框架高度封裝的年代,梯度不需要自己算,損失不需要自己求,反向傳導更是被處理得妥妥的,在不求甚解的情況下,你甚至只需要知道這麼幾個概念就可以開始著手寫第一個程式了:

  • 它就是通過一系列矩陣運算(或者類似的一些其他運算)將輸入空間對映到輸出空間而已。參與運算的矩陣的值稱為權重,是需要通過不斷迭代來尋找到最優值。

  • 當前的權重值離最優值還差多遠,用一個數值來表示,這個值就叫損失,計算這個值的函式叫損失函式

  • 當前的權重值應該調大還是調小,這個值通過對損失函式求導來判斷,這個求導得到的函式叫做梯度

  • 通過損失和梯度來更新權重的方法叫做反向傳導

  • 迭代的方法稱為梯度下降

雖然這麼寫出來的程式一定是不知其所以然,但是其實20年前我第一次用C++寫Hello world的時候也是一臉懵逼的,我相信,每個能夠投身機器學習開發工作的程式猿,都是有大毅力大勇氣的,自然不會欠缺繼續學習的動力和決心。

選擇框架

好吧,接下來你需要找一個框架來作為第一個程式的開發環境。(AI100小編注:下面真的全是乾貨,真如假包換貨真價值的實戰經驗,瞪好眼睛開始了)

目前機器學習的框架非常的多,從面向的使用者這個維度去劃分,大體上分成這麼兩個陣營:

➤ 學術友好型:Theano,Torch,Caffe

學術研究時,弄出來一個新模型,新演算法,新函式是常有的事,做出新的突破也是學術研究的最基本要求。所以,這些框架通常都可以方便地定製模型,也可以深入修改內部實現。很多新成果都會在發表論文的同時,提供這些框架上的實現程式碼供參考。效能方面也是比較出色。

而代價就是,要麼使用了困難(Caffe:C++)或者小眾(Torch:Lua)的開發語言介面,要麼具有一些古怪的缺點(Theano:編譯超級慢)。

而且,這些框架似乎都沒怎麼考慮過“怎麼提供服務”的問題。想要部署到伺服器上?Caffe已經是最簡單的了,然而仍然要經歷漫長而痛苦的摸索歷程。

➤ 工業友好型:Tensorflow,MXnet,Caffe

工業上往往更注重“把一個東西做出來,並且讓它執行得良好”。所以這些框架首先就需要支援並行訓練。其中Tensorflow和MXnet支援多機多卡、單機多卡,多機單卡並行,Caffe支援單機多卡。雖然這些效能都不是特別理想。

在我們的測試中,Tensorflow的雙卡並行只能達到單卡的1.5倍左右效能,卡越多,這個比例越低。

Caffe要好一些,但是引數同步和梯度計算無論如何也都需要時間,所以沒有哪個框架能沒有效能損失地實現擴充套件。

而多機的情況下,效能損失更大,很多時候都讓人感到無法接受(這方面的優化只能以後有機會再提,如果有這方面的同好,歡迎討論)。

相對來說,Tensorflow提供了比較好的部署機制(Serving),並且有直接部署到移動端的方案。而MXnet和Caffe則是直接編譯的方式,雖然也可以實現,但是說實話,還是很麻煩。

至於缺點,就是除了Caffe之外,其他兩種框架對於學術界的動態跟蹤的都不太緊,Tensorflow到現在都沒有pRelu的官方實現,在前陣子也才剛剛推出了一系列檢測(Detection)的模型。

MXnet這一點要積極些,可是受限於較小的開發者社群,很多成果都只能等待大神們的contribution或者自行實現。

這樣看來,難道最好的框架是Caffe?兼顧學術和實現,靈活性和效能兼備……

我得說,我的確是這麼認為的。當然有一個前提,得懂C++……

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

如果不是C++開發人員出身,這門語言也不比機器學習容易多少了。

對於大多數有志於投身於機器學習開發(而不是研究)的同學們來說,我推薦首選Tensorflow作為你的第一個開發框架。

除了上述的優點之外,最主要的因素是,它人氣高。在遇到任何問題的時候,你都會找到一群志同道合的夥伴們去諮詢或者一起研究。這對於初學者而言,重要程度不言而喻。

好吧,選擇就是這麼的簡單粗暴。

此外,還有一個良心建議,不論你選擇哪個框架,千萬不要試圖在windows上執行它。哪怕是號稱支援windows的MXnet或者新版Tensorflow,不要問我怎麼知道……還是去裝個Linux系統吧。建議使用ubuntu14.04或16.04。

學習用機配置

OK,接下來我們就需要一臺機器去把框架搭建起來,並且去寫我們的helloAI。然而我在很多地方都看到小夥伴們在問:

我需要什麼樣的配置能學機器學習?

我需要買塊GTX1080/Titan/Tesla嗎?

我應該裝幾塊顯示卡?一塊?兩塊?還是四塊?

答案也傾向於:“必須得有GPU啊,至少1080,沒有四路titan你都不好意思和人打招呼”

其實,並不完全是這樣。

如果僅是入門和學習的話,CPU或者GPU完全不影響對程式碼和框架的學習。執行起類似Mnist或者Cifar之類的玩具資料集,其實差距也並不大。比如在我的機器上,執行自帶的Cifar demo,i7 CPU和GTX 1080 Ti的速度大概 770 pics/s VS. 2200 pics/s。GPU大概是不到三倍的效能優勢。

瞧,差距也沒那麼大。

不過這裡有一個小竅門,如果想用CPU版本的Tensorflow,最好不要使用pip下載的方式,而是用自行編譯的方法。因為在開發機上編譯時它會自動開啟所有支援的加速指令集(SSE4.1/SSE4.2/AVX/AVX2/FMA),從而使CPU的運算大大加快。

根據我們的測試,在開啟全部加速指令集的情況下,訓練速度大概會有30%的提升,而預測的速度大概會提升一倍。

當然,如果真的想要使用一個複雜模型去處理實際的生產問題,模型的複雜度和資料量都不是Cifar這樣的玩具資料集可以相比的。如果用我們的一個模型同樣去執行Cifar資料集,其他引數和條件完全相同,它在i5/i7/960/GTX1080/GTX1080Ti的速度分別是(單位還是pics/s,越大越好):

19/25/140/460/620

這個時候大概就能看出差距了,1080Ti大概是i7 CPU的25倍。而在模型上線使用(inference)時,GPU也會有10-20倍的效能優勢。模型越複雜,GPU的優勢越明顯。

綜合這些來看,如果僅僅是入門時期的學習,我建議先不用專門購買帶GPU的機器,先用你現有的機器,使用CPU版本,去學習框架和一些基礎。等到你對基礎已經掌握得比較紮實,那麼自然就會有跑一些更復雜的模型和更“真實”的資料的想法,這個時候,可以考慮買一塊GPU,來縮短訓練的時間。

在選擇GPU時,我聽過一些朋友們推薦GTX1070 x 2這種選擇。從理論上講,1070的效能大概能達到1080的75%,而價格只是1080的一半,從各個方面來看,似乎都是雙1070更有優勢。

然而不要忘記,雙卡的效能是不可能達到單卡的2倍的,在目前的Tensorflow上,大概只能達到1.5倍上下,算下來其實和1080單卡差不多。而雙顯示卡的主機板和電源以及機箱散熱都需要更多的考慮,從價效比上來看未必真的划算。

不過,如果顯示卡預算剛好卡在5000-6000這個檔位,雙1070也有它的優勢。比如可以學習使用多顯示卡平行計算的用法,在不著急的時候可以同時用兩塊顯示卡跑兩個不同的任務,合併起來就相當於有了16G的視訊記憶體等等。考慮到這些因素,雙1070的確是最適合入門學習的選擇——如果買不起雙1080/雙TITAN的話(哈哈哈)。

如果你打算用筆記本來作為主力學習用機的話,我的建議是:最好不要,除非你使用Linux經驗很豐富或者不打算用GPU加速。很多筆記本在安裝Liunx之後出現驅動方面的問題,而且使用GPU加速時的高熱量也會非常影響系統的穩定性。如果沒有很豐富的經驗,經常會在一個問題上卡掉幾個小時寶貴的學習時間。

➤ 安裝Tensorflow時的那些坑

一般來說,嚴格按照官網說明,在乾淨的系統上通過PIP安裝CPU版,都不會遇到什麼問題。

新手常犯的錯誤是忘記了執行:

sudo pip install --upgrade pip

導致在安裝tensorflow時找不到。

而GPU版本最常見的坑是:

  • 忘記關閉lightdm就去裝驅動

這個不要緊,執行

sudo stop lightdm

就好了。ubuntu 16.04用

sudo systemctl stop lightdm

  • 安裝CUDA時的第二個詢問

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 xxx.xx?

這裡輸入yes是錯的!

記住輸入no!一定不要安裝CUDA自帶驅動。這一點格外重要,裝上去以後往往就卡在GUI輸入密碼介面死迴圈了。

入門資料集選擇

mnist?cifar?ImageNet?COCO?這些都是啥?

MNIST

不論選擇哪本教材,哪個框架,在剛剛接觸機器學習的時候,一定會接觸到Mnist(讀作M- nist)這個名字。

這是個由Yann LeCun(讀成楊樂坤,不是嚴樂村)建立的手寫數字庫,每條資料是固定的784個位元組,由28x28個灰度畫素組成,大概長這樣:

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

目標是對輸入進行10-分類,從而輸出每個手寫數字所表達的真實數字。因為它體積小(10M左右),資料多(6萬張訓練圖片),適用範圍廣(NN/CNN/SVM/KNN都可以拿來跑跑)而天下聞名,其地位相當於機器學習界的Hello World。在LeCun的Mnist官方網站上,貼有各種模型跑這個資料集的最好成績,當前的最好得分是CNN的大概99.7%。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgeshttp://yann.lecun.com/exdb/mnist/

因為這個資料集實在非常的小,所以即使在CPU上,也可以用幾秒鐘時間跑完NN的訓練,或者幾分鐘跑完一個簡單的CNN的模型。

CIFAR

而對於打算從影象方面入手的同學,Cifar(讀做see far)資料庫則是更好的入門選項。

官網:CIFAR-10 and CIFAR-100 datasets

http://www.cs.toronto.edu/~kriz/cifar.html

這個資料庫分為2個版本,CIFAR-10和CIFAR-100,顧名思義,CIFAR-10有10個分類,每個分類有5000張訓練圖片和1000張測試圖片,每張圖片是32x32畫素的3通道點陣圖。大概長這樣:

而CIFAR-100有100個分類,每個分類變成了500張訓練圖片+100張測試圖片,而圖片的大小並沒什麼變化。

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

之所以說它比Mnist更適合作為圖片處理的入門,是因為它雖然解析度低了些,但是卻是三通道,真實拍攝的照片。其中有些圖片的背景還略微複雜,更貼近我們真實的圖片處理場景。相對而言,Mnist的灰度輸入和乾淨背景就顯得有些過於簡單,而且99.7%的準確率也確實很難有提升的空間。

Tensorflow給出了Cifar的例程:

https://www.tensorflow.org/tutorials/deep_cnn

並附有程式碼 :tensorflow/models

https://github.com/tensorflow/models/tree/fb96b71aec356e054678978875d6007ccc068e7a/tutorials/image/cifar10

ImageNet 和 MS COCO

至於ImageNet(ImageNet)和COCO(http://mscoco.org/),則是兩個工業級別的影象資料集。通常我們提到他們時,ImageNet指的是ILSVRC2012的訓練集,而COCO則是COCO-2014訓練集。

ImageNet具有大量的圖片(一百多萬張,分成1000個分類)和標註,大部分都是這樣的:

COCO雖然圖片數量少一些(8萬多張,80個分類),但是每張圖片都有輪廓標記,並且附帶分類標註和5句描述話語(英文的)。大概是這樣的:

所以當我們進入實際的工作時,可以根據具體的需要從中選擇適合自己的資料集作為benchmark或者pretrain資料集。

執行一個CIFAR demo與顯示卡、視訊記憶體的分配

在Tenforflow 安裝完成後,我們可以用這種方式最快地跑起來第一個Cifar demo:

git clone https://github.com/tensorflow/models.git my_models

cd my_models/tutorials/image/cifar10/

python cifar10_train.py

OK,只需幾分鐘下載資料,我們就可以看到我們的第一個“影象識別模型”正在訓練了。

訓練過程中我們可以看到log中在不斷地輸出loss資訊,但是我們除了想要跟蹤loss之外,還希望能夠看到當前訓練的模型到底識別的準確率如何,這個就不是cifar10_train.py這個指令碼能提供的了。我們還需要執行

python cifar10_eval.py

這個指令碼會不斷地驗證最近的檢查點的識別準確率。

如果使用GPU的話,會發現在執行起來訓練指令碼之後,所有的視訊記憶體都已經被這個程式佔滿,再啟動驗證指令碼的話會報錯一大堆的記憶體不足(OOM),這是Tensorflow的機制決定的,它會預設佔據所有顯示卡的所有視訊記憶體,而不管自己是否真的用到那麼多。

解決這個問題的辦法也很簡單。

首先,我們可以指定Tensorflow使用哪幾塊顯示卡進行訓練。要做到這一點,可以在執行較本前,用命令列指定環境變數:

export CUDA_VISIBLE_DEVICES="0,2"

其中的“0,2”就是希望使用的GPU編號,從0開始,用逗號分隔開。

或者在程式碼中建立一個GPUOption,設定visible_device_list=‘0,2',也能起到同樣的效果。

然後,我們可以限制Tensorflow使用的視訊記憶體,使其動態增長而不是啟動就佔滿。方法和上面的類似,程式碼中建立一個GPUOption,並設定allow_growth=True即可。

官方的Cifar例程大概能達到86%的準確率,這個成績在現在可以說算是比較差的了,最新的模型通常都有97%左右的準確率,即使是不仔細調參隨便訓訓,也能輕鬆達到93%左右,大家可以嘗試著修改cifar10.py中定義的模型,得到更好的效果。

我跑完了,然後呢?

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

那麼,在執行完這個例子之後,其實你已經可以算是機器學習工程師中的一員了。

接下來就可以收集一些自己的資料,並且訓練一些自己的識別引擎;或者嘗試著優化這個模型,感受一下所謂調參黨的痛苦;又或者直接嘗試實現ResNet、Inception這些更為先進的網路來刷刷Cifar;再不然可以嘗試著向NLP或者強化學習方向去學習一下。

總之,這些事情遠沒有看起來那麼難。

當然,不論那條路,學習,進步和自我鞭策都是逃避不掉的必修課。

一個新生的領域,勃勃的生機必然也意味著新成果的層出不窮。完成我上面提到的三門課程只能讓一個人從門外漢變成圈裡人,有了進入這個領域,趕上這波浪潮的基本資格,至於到底是成為弄潮兒還是直接被大浪吞沒,還是那句話,不勞苦必然無所得。努力學習不一定能修成正果,而不去努力學習,則註定是一無所獲。

對於堅強地完成了所有課程的同學們,我得說聲恭喜,從我們掌握的資料來看,只有10%左右的現役程式設計師決定向AI轉身,並付諸了行動;而能夠完成基礎課程的人,只佔了其中的30%不到。也就是說,當你完成CS231n的最後一個作業開始,你就已經站在了開發者的Top 5%之列。

在這個層面上,通常就會面臨兩件更加困難的任務:追論文和補數學

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

現在的機器學習界,“ArXiv醒”已經成了症候群,幾乎每週都會有更先進的內容冒出來,隔一兩個月就會發現很多公認的知識被重新整理了,隔一兩年?簡直無法想象。所以跟蹤學術界的動態就成了從業者的必修課。哪怕作為工業實現者,如果不能第一時間掌握學術界的動態,就一定會面臨對手突然實力碾壓自己的窘境。

好在機器學習界的風氣和傳統領域的學術界有一個很大的區別,得益於鋼鐵俠Elon Musk的OpenAI組織,學術界形成了ArXiv上預印論文和開源的風氣。只是要想看懂這些論文和程式碼,前面提到的那些知識,卻遠遠不夠。看到這種論文([1706.02515] Self-Normalizing Neural Networks)的時候,你才會真正理解什麼叫“沒個博士學位都搞不了這東西”:

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

[1706.02515] Self-Normalizing Neural Networks

https://arxiv.org/abs/1706.02515

無論如何,感謝這開源的學術環境,讓所有從業者都站在了同一起跑線上:最新的成果不再是大公司壟斷,小公司也一樣可以彎道超車,用最先進的產品佔領某個細分領域市場。

同時,這也讓所有人都變得壓力倍增:也許辛辛苦苦積累的經驗技巧模型和資料,在一個顛覆性的成果面前突然變得一文不值,隨時隨地都要面對後來者的降維打擊。

這是個讓人辛勞痛苦的領域。

這是個讓人振奮鼓舞的領域。

這是個讓人慾罷不能的領域。

這是個讓人充滿期待的領域。

這是天堂。

這是地獄。

我們已經在這裡等你,來嗎,少年?

實戰乾貨 | 這位成功轉型機器學習的老炮,想把他多年的經驗分享給你

本文作者智亮:魯朗軟體聯合創始人,tensorflow contributor,花伴侶團隊機器學習負責人。

擁有十餘年開發和管理經驗。2010年起在移動網際網路行業創業,團隊曾開發多個千萬使用者級別的移動端產品。近期帶領團隊開發的人工智慧識花應用上線數月,在0推廣的情況下迅速達到百萬使用者,獲得2017阿里雲棲API Solution大賽一等獎,並受邀成為微信公開課北京站九位演講嘉賓之一。由於其團隊內部機器學習開發者,大部分從移動網際網路開發者通過內部培訓轉型而來,其對行業的判斷,以及對程式設計師轉型到機器學習領域的經驗值得借鑑。

版權宣告:本文為AI100智庫專家的獨家投稿,由AI100編輯整理,如需轉載,請在微信後臺回覆“轉載”獲取授權。文章內容僅代表作者獨立觀點。

相關文章