程序員為什麽要學深度學習
深度學習本身是壹個非常龐大的知識體系。本文更多想從程序員的視角出發,讓大家觀察壹下深度學習對程序員意味著什麽,以及我們如何利用這樣壹個高速發展的學科,來幫助程序員提升軟件開發的能力。
本文根據費良宏在2016QCon全球軟件開發大會(上海)上的演講整理而成。
前言
1973年,美國上映了壹部熱門的科幻電影《WestWorld》,三年之後又有壹個續集叫做《FutureWorld》。這部電影在80年代初被引進到中國叫《未來世界》。那部電影對我來講簡直可以說得上是震撼。影片中出現了很多機器人,表情豐富的面部下面都是集成電路板。這讓那時候的我覺得未來世界都是那麽遙遠、那麽神秘。
時間到了2016年,很多朋友可能都在追看HBO斥巨資拍攝的同壹題材的系列劇《WestWorld》。如果前兩部電影還是局限在機器人、人工智能這樣的話題,2016年的新劇則在劇情和人工智能的思考方面有了很大的突破。不再渲染機器人是否會威脅到人類,而是在探討“Dreamsaremainlymemories”這壹類更具哲理的問題。
“記憶究竟如何影響了智能”這個話題非常值得我們去思考,也給我們壹個很好的啟示——今天,人工智能領域究竟有了怎樣的發展和進步。
今天我們探討的話題不僅僅是簡單的人工智能。如果大家對深度學習感興趣,我相信各位壹定會在搜索引擎上搜索過類似相關的關鍵字。我在Google上以deeplearning作為關鍵字得到了2,630萬個搜索的結果。這個數字比壹周之前足足多出了300多萬的結果。這個數字足以看得出來深度學習相關的內容發展的速度,人們對深度學習的關註也越來越高。
從另外的壹個角度,我想讓大家看看深度學習在市場上究竟有多麽熱門。從2011年到現在壹***有140多家專註人工智能、深度學習相關的創業公司被收購。僅僅在2016年這種並購就發生了40多起。
其中最瘋狂的是就是Google,已經收購了 11 家人工智能創業公司,其中最有名的就是擊敗了李世石九段的 DeepMind。排名之後的就要數 Apple、Intel以及Twitter。以Intel 公司為例,僅在今年就已經收購了 3 家創業公司,Itseez、Nervana 和 Movidius。這壹系列大手筆的並購為了布局人工智能以及深度學習的領域。
當我們去搜索深度學習話題的時候,經常會看到這樣的壹些晦澀難懂的術語:Gradient descent(梯度下降算法)、Backpropagation(反向傳播算法)、Convolutional Neural Network(卷積神經網絡)、受限玻耳茲曼機(Restricted Boltzmann Machine)等。
如打開任何壹篇技術文章,妳看到的通篇都是各種數學公式。大家看到如下左邊的圖,其實並不是壹篇高水準的學術論文,而僅僅是維基百科關於玻耳茲曼機的介紹。維基百科是科普層面的內容,內容復雜程度就超過了大多數數學知識的能力。
在這樣的背景之下,我今天的的話題可以歸納成三點:第壹,我們為什麽要學習深度學習;第二,深度學習最核心的關鍵概念就是神經網絡,那麽究竟什麽是神經網絡;第三,作為程序員,當我們想要成為深度學習開發者的時候,我們需要具備怎樣的工具箱,以及從哪裏著手進行開發。
為什麽要學習深度學習
首先,我們談談為什麽要學習深度學習。在這個市場當中,最不缺乏的就是各種概念以及各種時髦新技術的詞匯。深度學習有什麽不壹樣的地方?我非常喜歡AndrewNg(吳恩達)曾經用過的壹個比喻。
他把深度學習比喻成壹個火箭。這個火箭有壹個最重要的部分,就是它的引擎,目前來看在這個領域裏面,引擎的核心就是神經網絡。大家都知道,火箭除了引擎之外還需要有燃料,那麽大數據其實就構成了整個火箭另外的重要組成部分——燃料。以往我們談到大數據的時候,更多是強調存儲和管理數據的能力,但是這些方法和工具更多是對於以往歷史數據的統計、匯總。
而對於今後未知的東西,這些傳統的方法並不能夠幫助我們可以從大數據中得出預測的結論。如果考慮到神經網絡和大數據結合,我們才可能看清楚大數據真正的價值和意義。AndrewNg就曾經說過“我們相信(神經網絡代表的深度學習)是讓我們獲得最接近於人工智能的捷徑”。這就是我們要學習深度學習的壹個最重要的原因。
其次,隨著我們進行數據處理以及運算能力的不斷提升,深度學習所代表的人工智能技術和傳統意義上人工智能技術比較起來,在性能上有了突飛猛進的發展。這主要得益於在過去幾十間計算機和相關產業不斷發展帶來的成果。在人工智能的領域,性能是我們選擇深度學習另壹個重要的原因。
這是壹段Nvidia在今年公布的關於深度學習在無人駕駛領域應用的視頻。我們可以看到,將深度學習應用在自動駕駛方面,僅僅經歷了3千英裏的訓練,就可以達到什麽樣的程度。在今年年初進行的實驗上,這個系統還不具備真正智能能力,經常會出現各種各樣的讓人提心吊膽的狀況,甚至在某些情況下還需要人工幹預。
但經過了3千英裏的訓練之後,我們看到在山路、公路、泥地等各種復雜的路況下面,無人駕駛已經有了壹個非常驚人的表現。請大家註意,這個深度學習的模型只經過了短短幾個月、3千英裏的訓練。
如果我們不斷完善這種模型的話,這種處理能力將會變得何等的強大。這個場景裏面最重要的技術無疑就是深度學習。我們可以得出壹個結論:深度學習可以為我們提供強大的能力,如果程序員擁有了這個技術的話,無異於會讓每個程序員如虎添翼。
神經網絡快速入門
如果我們對於學習深度學習沒有任何疑慮的話,接下來就壹定會關心我需要掌握什麽樣的知識才能讓我進入到這個領域。這裏面最重要的關鍵技術就是“神經網絡”。說起“神經網絡”,容易混淆是這樣兩個完全不同的概念。
壹個是生物學神經網絡,第二個才是我們今天要談起的人工智能神經網絡。可能在座的各位有朋友在從事人工智能方面的工作。當妳向他請教神經網絡的時候,他會拋出許多陌生的概念和術語讓妳聽起來雲裏霧裏,而妳只能望而卻步了。
對於人工智能神經網絡這個概念,大多數的程序員都會覺得距離自己有很大的距離。因為很難有人願意花時間跟妳分享神經網絡的本質究竟是什麽。而妳從書本上讀的到的理論和概念,也很讓妳找到壹個清晰、簡單的結論。
今天就我們來看壹看,從程序員角度出發神經網絡究竟是什麽。我第壹次知道神經網絡這個概念是通過壹部電影——1991年上映的《終結者2》。男主角施瓦辛格有壹句臺詞:
“MyCPUisaneural-netprocessor;alearningcomputer.”(我的處理器是壹個神經處理單元,它是壹臺可以學習的計算機)。從歷史來看人類對自身智力的探索,遠遠早於對於神經網絡的研究。
1852年,意大利學者因為壹個偶然的失誤,將人類的頭顱掉到硝酸鹽溶液中,從而獲得第壹次通過肉眼關註神經網絡的機會。這個意外加速了對人類智力奧秘的探索,開啟了人工智能、神經元這樣概念的發展。
生物神經網絡這個概念的發展,和今天我們談的神經網絡有什麽關系嗎?我們今天談到的神經網絡,除了在部分名詞上借鑒了生物學神經網絡之外,跟生物學神經網絡已經沒有任何關系,它已經完全是數學和計算機領域的概念,這也是人工智能發展成熟的標誌。這點大家要區分開,不要把生物神經網絡跟我們今天談到的人工智能有任何的混淆。
90年代中期,由Vapnik等人提出了支持向量機算法(Support Vector Machines,支持向量機)。很快這個算法就在很多方面體現出了對比神經網絡的巨大優勢,例如:無需調參、高效率、全局最優解等。基於這些理由,SVM算法迅速打敗了神經網絡算法成為那個時期的主流。而神經網絡的研究則再次陷入了冰河期。
在被人摒棄的十年裏面,有幾個學者仍然在堅持研究。其中很重要的壹個人就是加拿大多倫多大學的Geoffery Hinton教授。2006年,他的在著名的《Science》雜誌上發表了論文,首次提出了“深度信念網絡”的概念。
與傳統的訓練方式不同,“深度信念網絡”有壹個“預訓練”(pre-training)的過程,這可以方便的讓神經網絡中的權值找到壹個接近最優解的值,之後再使用“微調”(fine-tuning)技術來對整個網絡進行優化訓練。這兩個技術的運用大幅度減少了訓練多層神經網絡的時間。在他的論文裏面,他給多層神經網絡相關的學習方法賦予了壹個新名詞— “深度學習”。
很快,深度學習在語音識別領域嶄露頭角。接著在2012年,深度學習技術又在圖像識別領域大展拳腳。Hinton與他的學生在ImageNet競賽中,用多層的卷積神經網絡成功地對包含壹千個類別的壹百萬張圖片進行了訓練,取得了分類錯誤率15%的好成績,這個成績比第二名高了將近11個百分點。
這個結果充分證明了多層神經網絡識別效果的優越性。從那時起,深度學習就開啟了新的壹段黃金時期。我們看到今天深度學習和神經網絡的火熱發展,就是從那個時候開始引爆的。
利用神經網絡構建分類器,這個神經網絡的結構是怎樣的?
其實這個結構非常簡單,我們看到這個圖就是簡單神經網絡的示意圖。神經網絡本質上就是壹種“有向圖”。圖上的每個節點借用了生物學的術語就有了壹個新的名詞 – “神經元”。連接神經元的具有指向性的連線(有向弧)則被看作是“神經”。這這個圖上神經元並不是最重要的,最重要的是連接神經元的神經。每個神經部分有指向性,每壹個神經元會指向下壹層的節點。
節點是分層的,每個節點指向上壹層節點。同層節點沒有連接,並且不能越過上壹層節點。每個弧上有壹個值,我們通常稱之為”權重“。通過權重就可以有壹個公式計算出它們所指的節點的值。這個權重值是多少?我們是通過訓練得出結果。它們的初始賦值往往通過隨機數開始,然後訓練得到的最逼近真實值的結果作為模型,並可以被反復使用。這個結果就是我們說的訓練過的分類器。
節點分成輸入節點和輸出節點,中間稱為隱層。簡單來說,我們有數據輸入項,中間不同的多個層次的神經網絡層次,就是我們說的隱層。之所以在這樣稱呼,因為對我們來講這些層次是不可見的。輸出結果也被稱作輸出節點,輸出節點是有限的數量,輸入節點也是有限數量,隱層是我們可以設計的模型部分,這就是最簡單的神經網絡概念。
如果簡單做壹個簡單的類比,我想用四層神經網絡做壹個解釋。左邊是輸入節點,我們看到有若幹輸入項,這可能代表不同蘋果的RGB值、味道或者其它輸入進來的數據項。中間隱層就是我們設計出來的神經網絡,這個網絡現在有不同的層次,層次之間權重是我們不斷訓練獲得壹個結果。
最後輸出的結果,保存在輸出節點裏面,每壹次像壹個流向壹樣,神經是有壹個指向的,通過不同層進行不同的計算。在隱層當中,每壹個節點輸入的結果計算之後作為下壹層的輸入項,最終結果會保存在輸出節點上,輸出值最接近我們的分類,得到某壹個值,就被分成某壹類。這就是使用神經網絡的簡單概述。
除了從左到右的形式表達的結構圖,還有壹種常見的表達形式是從下到上來表示壹個神經網絡。這時候,輸入層在圖的最下方,輸出層則在圖的最上方。從左到右的表達形式以AndrewNg和LeCun的文獻使用較多。而在Caffe框架裏則使用的則是從下到上的表達。
簡單來說,神經網絡並不神秘,它就是有像圖,利用圖的處理能力幫助我們對特征的提取和學習的過程。2006年Hinton的那篇著名的論文中,將深度學習總結成三個最重要的要素:計算、數據、模型。有了這三點,就可以實現壹個深度學習的系統。
程序員需要的工具箱
對於程序員來說,掌握理論知識是為了更好的編程實踐。那就讓我們看看,對於程序員來說,著手深度學習的實踐需要準備什麽樣的工具。
硬件
從硬件來講,我們可能需要的計算能力,首先想到的就是CPU。除了通常的CPU架構以外,還出現了附加有乘法器的CPU,用以提升計算能力。此外在不同領域會有DSP的應用場景,比如手寫體識別、語音識別、等使用的專用的信號處理器。還有壹類就是GPU,這是壹個目前深度學習應用比較熱門的領域。最後壹類就是FPGA(可編程邏輯門陣列)。
這四種方法各有其優缺點,每種產品會有很大的差異。相比較而言CPU雖然運算能力弱壹些,但是擅長管理和調度,比如讀取數據,管理文件,人機交互等,工具也豐富。DSP相比而言管理能力較弱,但是強化了特定的運算能力。
這兩者都是靠高主頻來解決運算量的問題,適合有大量遞歸操作以及不便拆分的算法。GPU的管理能力更弱壹些,但是運算能力更強。但由於計算單元數量多,更適合整塊數據進行流處理的算法。
FPGA在管理與運算處理方面都很強,但是開發周期長,復雜算法開發難度較大。就實時性來說,FPGA是最高的。單從目前的發展來看,對於普通程序員來說,現實中普遍采用的計算資源就還是是CPU以及GPU的模式,其中GPU是最熱門的領域。
這是我前天為這次分享而準備的壹個AWS 上p2的實例。僅僅通過幾條命令就完成了實例的更新、驅動的安裝和環境的設置,總***的資源創建、設置時間大概在10分鐘以內。而之前,我安裝調試前面提到的那臺計算機,足足花了我兩天時間。
另外,從成本上還可以做壹個對比。p2.8xLarge 實例每小時的費用是7.2美元。而我自己那臺計算機總***的花費了是?16,904元。這個成本足夠讓我使用350多個小時的p2.8xLarge。在壹年裏使用AWS深度學習站就可以抵消掉我所有的付出。隨著技術的不斷的升級換代,我可以不斷的升級我的實例,從而可以用有限的成本獲得更大、更多的處理資源。這其實也是雲計算的價值所在。
雲計算和深度學習究竟有什麽關系?今年的8月8號,在IDG網站上發表了壹篇文章談到了這個話題。文章中做了這樣壹個預言:如果深度學習的並行能力不斷提高,雲計算所提供的處理能力也不斷發展,兩者結合可能會產生新壹代的深度學習,將帶來更大影響和沖擊。這是需要大家考慮和重視的壹個方向!
軟件
深度學習除了硬件的基礎環境之外。程序員會更關心與開發相關的軟件資源。這裏我羅列了壹些曾經使用過的軟件框架和工具。
Scikit-learn是最為流行的壹個Python機器學習庫。它具有如下吸引人的特點:簡單、高效且異常豐富的數據挖掘/數據分析算法實現; 基於NumPy、SciPy以及matplotlib,從數據探索性分析,數據可視化到算法實現,整個過程壹體化實現;開源,有非常豐富的學習文檔。
Caffe專註在卷及神經網絡以及圖像處理。不過Caffe已經很久沒有更新過了。這個框架的壹個主要的開發者賈揚清也在今年跳槽去了Google。也許曾經的霸主地位要讓位給他人了。
Theano 是壹個非常靈活的Python 機器學習的庫。在研究領域非常流行,使用上非常方便易於定義復雜的模型。Tensorflow 的API 非常類似於Theano。我在今年北京的QCon 大會上也分享過關於Theano 的話題。
Jupyter notebook 是壹個很強大的基於ipython的python代碼編輯器,部署在網頁上,可以非常方便的進行交互式的處理,很適合進行算法研究合數據處理。
Torch 是壹個非常出色的機器學習的庫。它是由壹個比較小眾的lua語言實現的。但是因為LuaJIT 的使用,程序的效率非常出色。Facebook在人工智能領域主打Torch,甚至現在推出了自己的升級版框架Torchnet。
深度學習的框架非常之多,是不是有壹種亂花漸欲迷人眼的感覺?我今天向各位程序員重點介紹的是將是TensorFlow。這是2015年谷歌推出的開源的面向機器學習的開發框架,這也是Google第二代的深度學習的框架。很多公司都使用了TensorFlow開發了很多有意思的應用,效果很好。
用TensorFlow可以做什麽?答案是它可以應用於回歸模型、神經網絡以深度學習這幾個領域。在深度學習方面它集成了分布式表示、卷積神經網絡(CNN)、遞歸神經網絡(RNN) 以及長短期記憶人工神經網絡(Long-Short Term Memory, LSTM)。
關於Tensorflow 首先要理解的概念就是Tensor。在辭典中對於這個詞的定義是張量,是壹個可用來表示在壹些向量、標量和其他張量之間的線性關系的多線性函數。實際上這個表述很難理解,用我自己的語言解釋Tensor 就是“N維數組”而已。
使用 TensorFlow, 作為程序員必須明白 TensorFlow這樣幾個基礎概念:它使用圖 (Graph) 來表示計算任務;在被稱之為 會話 (Session) 的上下文 (context) 中執行圖;使用 Tensor 表示數據;通過 變量 (Variable) 維護狀態;使用 feed 和 fetch 可以為任意的操作(arbitrary operation) 賦值或者從其中獲取數據。
壹句話總結就是,TensorFlow 就是有狀態圖的數據流圖計算環境,每個節點就是在做數據操作,然後提供依賴性和指向性,提供完整數據流。
TensorFlow安裝非常簡單,但官網提供下載的安裝包所支持的CUDA 的版本是7.5。考慮到CUDA 8 的讓人心動的新特以及不久就要正式發布的現狀。或許妳想會考慮立即體驗CUDA 8,那麽就只能通過編譯Tensorflow源代碼而獲得。目前TensorFlow已經支持了Python2.7、3.3+。
此外,對於使用Python 語言的程序員還需要安裝所需要的壹些庫,例如:numpy、protobuf等等。對於卷積處理而言,cuDNN是公認的性能最好的開發庫,請壹定要安裝上。常規的Tensorsorflow的安裝很簡單,壹條命令足矣:
$ pip3 install —upgrade /anishathalye/neural-style。白俄羅斯的現代印象派藝術家Leonid Afremov善於用濃墨重彩來表現都市和風景題材,尤其是其雨景系列作品。他習慣用大色塊的鋪陳來營造光影效果,對反光物體和環境色的把握非常精準。
於是我就找到了壹張上海東方明珠電視塔的壹張攝影作品,我希望通過Tensorflow 去學習壹下Leonid Afremov 的繪畫風格,並將這張東方明珠的照片處理成那種光影色彩豐富的作品風格。利用Tensorflow 以及上面提到的那個項目的代碼,在壹個AWS 的p2類型的實例上進行了壹個壹千次的叠代,於是就得到了下圖這樣的處理結果。
這個處理的代碼只有350行裏,模型使用了壹個成名於2014年ImageNet比賽中的明星 VGG。這個模型非常好,特點就是“go depper”。
TensorFlow 做出這樣的作品,並不僅僅作為娛樂供大家壹笑,還可以做更多有意思的事情。將剛才的處理能力推廣到視頻當中,就可以看到下圖這樣的效果,用梵高著名的作品”星月夜“的風格就加工成了這樣新的視頻風格。
可以想象壹下,如果這種處理能力在更多領域得以應用,它會產生什麽樣的神奇結果?前景是美好的,讓我們有無限遐想。事實上我們目前所從事的很多領域的應用開發都可以通過使用神經網絡和深度學習來加以改變。對於深度學習而言,掌握它並不是難事。每壹個程序員都可以很容易的掌握這種技術,利用所具備的資源,讓我們很快成為深度學習的程序開發人員。
結束語
未來究竟是什麽樣,我們沒有辦法預言。有位作家Ray Kurzweil在2005年寫了《奇點臨近》壹書。在這本書裏面他明確告訴我們,那個時代很快到來。作為那個時代曙光前的人群,我們是不是有能力加速這個過程,利用我們學習的能力實現這個夢想呢?
中國人工智能的發展
人工智能的時代無疑已經到來,這個時代需要的當然就是掌握了人工智能並將其解決具體問題的工程師。坦率的說,市場上這壹類的工程師還屬於鳳毛麟角。職場上的薪酬待遇可以看得出來這樣的工程師的搶手的程度。人工智能這門學科發展到今天,就學術自身而言已經具備了大規模產業化的能力。
所以說,對於工程師而言當務之急就是盡快的掌握應用人工智能的應用技術。當下在互聯網上關於人工智能的學習資料可以說已經是“汗牛充棟”,那些具備了快速學習能力的工程師壹定會在人工智能的大潮當中脫穎而出。
中國發展人工智能產業的環境已經具備。無論從創業環境、人員的素質乃至市場的機遇而言完全具備了產生產業變革的壹切條件。與美國相比較,在人工智能的許多領域中國團隊的表現也可以說是不逞多讓。就人工智能的技術層面而言,中國的工程師與全球最好的技術團隊正處於同壹個起跑線上。
時不我待,中國的工程師是有機會在這個領域大展身手的。不過值得註意的是,要切忌兩點:壹是好高騖遠,盲目與國外攀比。畢竟積累有長短,術業有專攻,我們要立足於已有的積累,尋求逐步的突破。二是壹擁而上,盲目追求市場的風口。人工智能的工程化需要大量的基礎性的積累,並非壹蹴而就簡單復制就可以成功。
中國的科研技術人員在人工智能領域的成就有目***睹。在王詠剛的壹篇文章裏面,他統計了從2013年到2015年SCI收錄的“深度學習”論文,中國在2014年和2015年超已經超過了美國居於領跑者的位置。
另外壹讓我感到驚訝的事情,Google的JeffDean在2016年發表過壹篇名為《TensorFlow:Asystemforlarge-scalemachinelearning》的論文。文章的22個作者裏面,明顯是中國名字的作者占已經到了1/5。如果要列舉中國人/華人在人工智能領域裏的大牛,吳恩達、孫劍、楊強、黃廣斌、馬毅、張大鵬……很容易就可以說出壹大串。
對於中國來說目前的當務之急是人工智能技術的產業化,唯有如此我們才可以講科研/智力領域的優勢轉化為整體的、全面的優勢。在這壹點上,中國是全球最大的消費市場以及制造業強國,我們完全有機會借助市場的優勢成為這個領域的領先者。
矽谷創新企業
矽谷雖然去過許多回,但壹直無緣在那裏長期工作。在人工智能領域的市場我們聽到的更多是圍繞Google、Apple、Intel、Amazon這樣的壹些大型科技公司的壹舉壹動。但是在美國市場上還有壹大批小型的創業企業在人工智能這個領域有驚艷的表現。僅以矽谷區域的公司為例:
Captricity,提供了手寫數據的信息提取;
VIVLab,針對語音識別開發了虛擬助手服務;
TERADEEP,利用FPGA提供了高效的卷積神經網絡的方案;
還有提供無人駕駛解決方案的NetraDyne。
這個名單還可以很長,還有許許多多正在利用人工智能技術試圖去創造歷史的團隊正在打造他們的夢想。這些團隊以及他們正在專註的領域是值得我們去學習和體會的。