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

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

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

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

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

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

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

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

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

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

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

看來是真下了功夫啊!

以下,enjoy。

作者 | 智亮

編輯 | 鴿子

幾何時,我們讀著比爾蓋茨的傳記,感嘆他大學時就能徒手寫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小編注:下面真的全是乾貨,真如假包換貨真價值的實戰經驗,瞪好眼睛開始了)