深度學(xué)習(xí)(Deep Learning),這是一個(gè)在近幾年火遍各個(gè)領(lǐng)域的詞匯,似乎所有的算法只要跟它扯上關(guān)系,瞬間就顯得高大上起來(lái)。但其實(shí),從2006年Hinton在Science上的論文算起,深度學(xué)習(xí)發(fā)展至今才不到十年。
四大金剛鎮(zhèn)樓
在這短短幾年時(shí)間里,深度學(xué)習(xí)顛覆了語(yǔ)音識(shí)別、圖像分類、文本理解等眾多領(lǐng)域的算法設(shè)計(jì)思路,漸漸形成了一種從訓(xùn)練數(shù)據(jù)出發(fā),經(jīng)過(guò)一個(gè)端到端(end-to-end)的模型,然后直接輸出得到最終結(jié)果的一種新模式。這不僅讓一切變得更加簡(jiǎn)單,而且由于深度學(xué)習(xí)中的每一層都可以為了最終的任務(wù)來(lái)調(diào)整自己,最終實(shí)現(xiàn)各層之間的通力合作,因而可以大大提高任務(wù)的準(zhǔn)確度。隨著大數(shù)據(jù)時(shí)代的到來(lái)以及GPU等各種更加強(qiáng)大的計(jì)算設(shè)備的發(fā)展,深度學(xué)習(xí)如虎添翼,可以充分利用各種海量數(shù)據(jù)(標(biāo)注數(shù)據(jù)、弱標(biāo)注數(shù)據(jù)或者僅僅數(shù)據(jù)本身),完全自動(dòng)地學(xué)習(xí)到抽象的知識(shí)表達(dá),即把原始數(shù)據(jù)濃縮成某種知識(shí)。
當(dāng)然,深度學(xué)習(xí)不見(jiàn)得是最完美的框架,離最終所謂的智能也還差得很遠(yuǎn),而且目前還基本沒(méi)有理論上的有效性解釋。但是,無(wú)論如何,深度學(xué)習(xí)之風(fēng)已經(jīng)勢(shì)不可擋!
深度學(xué)習(xí)本質(zhì)上其實(shí)就是多層神經(jīng)網(wǎng)絡(luò),而神經(jīng)網(wǎng)絡(luò)這個(gè)東西幾十年前大家就開(kāi)始研究了。我們知道,神經(jīng)網(wǎng)絡(luò)的一層,其實(shí)就是一個(gè)線性變換加上一個(gè)簡(jiǎn)單的非線性操作,而多層神經(jīng)網(wǎng)絡(luò)其實(shí)就是多個(gè)簡(jiǎn)單的非線性函數(shù)的復(fù)合。一層、兩層的網(wǎng)絡(luò)用途比較有限,往往很難刻畫輸入與輸出之間的復(fù)雜關(guān)系。但是深層的網(wǎng)絡(luò),歷史上又一直無(wú)法進(jìn)行有效訓(xùn)練。這大概是因?yàn)橛幸韵氯齻€(gè)難點(diǎn)難以突破:
由于以上種種原因,神經(jīng)網(wǎng)絡(luò)一度曾經(jīng)非常低調(diào)。直到2006年,著名的學(xué)者Geoffrey Hinton在Science上發(fā)表了一篇論文,給出了訓(xùn)練深層網(wǎng)絡(luò)的新思路。大概想法是先分層進(jìn)行預(yù)訓(xùn)練,然后把預(yù)訓(xùn)練的結(jié)果當(dāng)成模型參數(shù)的初始值,再?gòu)念^進(jìn)行正常的訓(xùn)練過(guò)程。這個(gè)想法現(xiàn)在看起來(lái)很簡(jiǎn)單,但對(duì)于全連型的深層網(wǎng)絡(luò)來(lái)說(shuō)卻是非常有效的。
2009年,Hinton把深層神經(jīng)網(wǎng)絡(luò)介紹給做語(yǔ)音識(shí)別的學(xué)者們。然后2010年,語(yǔ)音識(shí)別就產(chǎn)生了巨大突破。本質(zhì)上是把傳統(tǒng)的混合高斯模型(GMM)替換成了深度神經(jīng)網(wǎng)絡(luò)(DNN)模型,但相對(duì)識(shí)別錯(cuò)誤率一下降低20%多,這個(gè)改進(jìn)幅度超過(guò)了過(guò)去很多年的總和。這里的關(guān)鍵是把原來(lái)模型中通過(guò)GMM建模的手工特征換成了通過(guò)DNN進(jìn)行更加復(fù)雜的特征學(xué)習(xí)。在此之后,在深度學(xué)習(xí)框架下,人們還在不斷利用更好的模型和更多的訓(xùn)練數(shù)據(jù)進(jìn)一步改進(jìn)結(jié)果。現(xiàn)在語(yǔ)音識(shí)別已經(jīng)真正變得比較成熟,并且被廣泛商用,且目前所有的商用語(yǔ)音識(shí)別算法沒(méi)有一個(gè)不是基于深度學(xué)習(xí)的。
人們初步看到了深度網(wǎng)絡(luò)的優(yōu)勢(shì),但還是有很多人質(zhì)疑它。語(yǔ)音識(shí)別是成功了,那么圖像分類呢?2012年之前,深度學(xué)習(xí)好像還是只能處理像MNIST手寫體分類這樣的簡(jiǎn)單任務(wù)。說(shuō)來(lái)也巧,這時(shí)候正舉行了兩屆ImageNet比賽。這是一個(gè)比手寫體分類復(fù)雜得多的圖像分類任務(wù),總共有100萬(wàn)張圖片,分辨率300x300左右,1000個(gè)類別。前兩屆的冠軍采用的都是傳統(tǒng)人工設(shè)計(jì)特征然后學(xué)習(xí)分類器的思路。第一屆是2010年,當(dāng)時(shí)冠軍的準(zhǔn)確率(top 5精度)是71.8%,而2011年是74.3%。由于Hinton經(jīng)常被其它研究人員“嘲諷”說(shuō)深度學(xué)習(xí)在圖像領(lǐng)域沒(méi)有用,于是2012年,Hinton和他的學(xué)生Alex等人參賽,把準(zhǔn)確率一下提高到84.7%。
當(dāng)然,他們的成功借助了ImageNet這個(gè)足夠大的數(shù)據(jù)集,借助了GPU的強(qiáng)大計(jì)算能力,借助了比較深層的CNN網(wǎng)絡(luò),借助了隨機(jī)梯度下降(SGD)和Dropout等優(yōu)化技巧,借助了訓(xùn)練數(shù)據(jù)擴(kuò)充策略(Data Augmentation)。但無(wú)論如何,他們靠著深度學(xué)習(xí)震驚了機(jī)器學(xué)習(xí)領(lǐng)域,從此大量的研究人員開(kāi)始進(jìn)入這個(gè)領(lǐng)域,一發(fā)不可收拾。2013年是89%,2014年是93.4%,截止到現(xiàn)在(2015年5月份),ImageNet數(shù)據(jù)集的精度已經(jīng)達(dá)到了95%以上,某種程度上跟人的分辨能力相當(dāng)了。
不僅僅是圖像分類,在更廣泛的視覺(jué)問(wèn)題上,深度學(xué)習(xí)都產(chǎn)生了重大影響。簡(jiǎn)要列舉幾個(gè)如下:
人臉識(shí)別——LFW數(shù)據(jù)庫(kù)上的結(jié)果,從最早的90%左右的正確率,一路被研究人員刷到了99.5%以上。人臉相關(guān)的應(yīng)用受此影響,也越來(lái)越多。
通用物體檢測(cè)——ImageNet上的檢測(cè)任務(wù)結(jié)果,MAP從最早的0.3左右,一路提高到0.66,感覺(jué)提高空間還有不少。
圖像分割——現(xiàn)在深度學(xué)習(xí)已經(jīng)可以做到輸入是一張圖片,輸出就是逐個(gè)像素分割后的結(jié)果,中間也不需要任何預(yù)處理,并且精度遠(yuǎn)超非深度學(xué)習(xí)的結(jié)果。
光學(xué)字符識(shí)別——這里指一般意義的字符序列識(shí)別。這個(gè)問(wèn)題的傳統(tǒng)做法也是非常復(fù)雜的,需要進(jìn)行字符分割,各種預(yù)處理,然后單個(gè)字符預(yù)測(cè)完成后如何拼成完整輸出等等。深度學(xué)習(xí)的做法也是端到端的,輸入是圖片形式的文字,輸出直接就是識(shí)別結(jié)果了,簡(jiǎn)單、方便還更準(zhǔn)確。所以,現(xiàn)在很多簡(jiǎn)單點(diǎn)的驗(yàn)證碼,想作為圖靈測(cè)試,分辨人還是robot的話,已經(jīng)沒(méi)太大用處了。
玩游戲——DeepMind團(tuán)隊(duì)的杰作。基于深度學(xué)習(xí)和強(qiáng)化學(xué)習(xí)(Reinforcement Learning),計(jì)算機(jī)已經(jīng)可以自己學(xué)習(xí)玩一些簡(jiǎn)單游戲了,整個(gè)過(guò)程不需要任何人的干預(yù)。對(duì)于打磚塊這樣的簡(jiǎn)單游戲,甚至已經(jīng)超過(guò)了普通玩家的水平。
簡(jiǎn)單總結(jié)一下視覺(jué)的部分。我們經(jīng)常在媒體上看到深度學(xué)習(xí)在某領(lǐng)域又超過(guò)人的水平了。還有些樂(lè)觀的人說(shuō),深度學(xué)習(xí)可以處理所有人的視覺(jué)在0.1秒內(nèi)可以解決的問(wèn)題。這些或許言過(guò)其實(shí),不過(guò)毫無(wú)疑問(wèn)體現(xiàn)了深度學(xué)習(xí)帶給人們的強(qiáng)烈震撼!
除了語(yǔ)音和圖像之外,另一個(gè)機(jī)器學(xué)習(xí)的重要前沿陣地就是文本理解了,深度學(xué)習(xí)的大量研究人員都集中于此。這里簡(jiǎn)單介紹三點(diǎn)。
說(shuō)了這么多,大家可能還是云里霧里。畢竟各種模型都有很多細(xì)節(jié),而且還有很多的所謂“trick”,甚至深度學(xué)習(xí)也曾經(jīng)因此而戲稱為是一種“藝術(shù)”而不是“科學(xué)”。
所以下面列舉幾個(gè)工具包,并配上一點(diǎn)非常簡(jiǎn)單的說(shuō)明,方便大家進(jìn)行實(shí)戰(zhàn)演練。
首先你最好要有個(gè)能支持cuda的GPU,否則純CPU是很慢的,尤其是處理圖像的問(wèn)題。
Theano(基于Python), http://deeplearning.net/tutorial/系列教材就是基于Theano工具的。它的最大優(yōu)點(diǎn)是支持自動(dòng)符號(hào)求導(dǎo),避免了初學(xué)者很害怕的BP推導(dǎo),有很多擴(kuò)展包,比如keras等,支持各類模型。其實(shí)列舉這一個(gè)就夠了。因?yàn)椋绻屑?xì)的話,你會(huì)在這個(gè)網(wǎng)站看到無(wú)數(shù)的深度學(xué)習(xí)相關(guān)工作鏈接,足夠慢慢擴(kuò)展到深度學(xué)習(xí)的所有前沿研究和工具了。
Torch (https://github.com/torch/torch7/wiki/Cheatsheet),基于lua編程語(yǔ)言(類matlab)。用的人非常多,因此很多常見(jiàn)模塊的實(shí)現(xiàn)都很全面。
DeepLearnToolbox (https://github.com/rasmusbergpalm/DeepLearnToolbox),基于matlab。代碼邏輯清楚,適合跟著代碼學(xué)習(xí)深度學(xué)習(xí)的每個(gè)細(xì)節(jié)。
Caffe (http://caffe.berkeleyvision.org/),純c++,科學(xué)研究中很多學(xué)者常用的工具,文檔也很齊全。做物體檢測(cè)相關(guān)任務(wù)的話,非常推薦!
Cuda-convnet2 (https://code.google.com/p/cuda-convnet2/),效率高,支持單機(jī)多卡。ImageNet2012年冠軍Alex的作品!不過(guò)代碼有點(diǎn)抽象難改,而且只支持GPU并且是特定的幾款GPU(也就是說(shuō)是Alex大神是做過(guò)特定GPU優(yōu)化的)。做簡(jiǎn)單的分類、回歸問(wèn)題推薦!不支持RNN。
Cxxnet (https://github.com/dmlc/cxxnet),純c++。優(yōu)點(diǎn):支持多機(jī)多卡訓(xùn)練,適合公司級(jí)的部署。
深度學(xué)習(xí)不管未來(lái)發(fā)展如何,至少在目前看來(lái)是非常有效的一種機(jī)器學(xué)習(xí)方法。但是,它的不確定性也讓很多人又愛(ài)又恨。
聯(lián)系客服