1
本文作者: Ticwear | 2015-11-11 17:04 |
【編者按】本文作者李理 ,人工智能科技公司出門(mén)問(wèn)問(wèn)NLP工程師。
這兩天發(fā)現(xiàn)朋友圈被Google開(kāi)源深度學(xué)習(xí)系統(tǒng)TensorFlow的新聞刷屏了。這當(dāng)然是一個(gè)很好的消息,尤其對(duì)我們這種用機(jī)器學(xué)習(xí)來(lái)解決實(shí)際問(wèn)題的工程師來(lái)說(shuō)更是如此。但同時(shí)很多人并不清楚聽(tīng)起來(lái)神乎其神的“TensorFlow”到底是什么,有什么意義。
我是人工智能科技公司“出門(mén)問(wèn)問(wèn)”的工程師,對(duì)人工智能“深度學(xué)習(xí)”理論有一定的了解,在這里就為大家“破霧”,聊一聊Google的開(kāi)源系統(tǒng)TensorFlow。
什么是深度學(xué)習(xí)?
在機(jī)器學(xué)習(xí)流行之前,都是基于規(guī)則的系統(tǒng),因此做語(yǔ)音的需要了解語(yǔ)音學(xué),做NLP的需要很多語(yǔ)言學(xué)知識(shí),做深藍(lán)需要很多國(guó)際象棋大師。
而到后來(lái)統(tǒng)計(jì)方法成為主流之后,領(lǐng)域知識(shí)就不再那么重要,但是我們還是需要一些領(lǐng)域知識(shí)或者經(jīng)驗(yàn)來(lái)提取合適的feature(特征),feature的好壞往往決定了機(jī)器學(xué)習(xí)算法的成敗。對(duì)于NLP來(lái)說(shuō),feature還相對(duì)比較好提取,因?yàn)檎Z(yǔ)言本身就是高度的抽象;而對(duì)于Speech或者Image來(lái)說(shuō),我們?nèi)祟?lèi)自己也很難描述我們是怎么提取feature的。比如我們識(shí)別一只貓,我們隱隱約約覺(jué)得貓有兩個(gè)眼睛一個(gè)鼻子有個(gè)長(zhǎng)尾巴,而且它們之間有一定的空間約束關(guān)系,比如兩只眼睛到鼻子的距離可能差不多。但怎么用像素來(lái)定義”眼睛“呢?如果仔細(xì)想一下就會(huì)發(fā)現(xiàn)很難。當(dāng)然我們有很多特征提取的方法,比如提取邊緣輪廓等等。
但是人類(lèi)學(xué)習(xí)似乎不需要這么復(fù)雜,我們只要給幾張貓的照片給人看,他就能學(xué)習(xí)到什么是貓。人似乎能自動(dòng)“學(xué)習(xí)”出feature來(lái),你給他看了幾張貓的照片,然后問(wèn)貓有什么特征,他可能會(huì)隱隱預(yù)約地告訴你貓有什么特征,甚至是貓?zhí)赜械奶卣?,這些特征豹子或者老虎沒(méi)有。
深度學(xué)習(xí)為什么最近這么火,其中一個(gè)重要的原因就是不需要(太多)提取feature。
從機(jī)器學(xué)習(xí)的使用者來(lái)說(shuō),我們以前做的大部分事情是feature engineering,然后調(diào)一些參數(shù),一般是為了防止過(guò)擬合。而有了深度學(xué)習(xí)之后,如果我們不需要實(shí)現(xiàn)一個(gè)CNN或者LSTM,那么我們似乎什么也不用干。(機(jī)器讓工人失業(yè),機(jī)器學(xué)習(xí)讓搞機(jī)器學(xué)習(xí)的人失業(yè)!人工智能最終的目的是讓人類(lèi)失業(yè)?)
但是深度學(xué)習(xí)也不是萬(wàn)能的,至少現(xiàn)在的一個(gè)問(wèn)題是它需要更強(qiáng)的計(jì)算能力才能訓(xùn)練出一個(gè)比較好的模型。它還不能像人類(lèi)那樣通過(guò)很少的訓(xùn)練樣本就能學(xué)習(xí)很好的效果。
其實(shí)神經(jīng)網(wǎng)絡(luò)提出好幾十年了,為什么最近才火呢?其中一個(gè)原因就是之前它的效果并不比非深度學(xué)習(xí)算法好,比如SVM。
到了2006年之后,隨著計(jì)算能力的增強(qiáng)(尤其是GPU的出現(xiàn)),深度神經(jīng)網(wǎng)絡(luò)在很多傳統(tǒng)的機(jī)器學(xué)習(xí)數(shù)據(jù)集上體現(xiàn)出優(yōu)勢(shì)來(lái)之后,后來(lái)用到Image和Speech,因?yàn)樗詣?dòng)學(xué)出的feature不需要人工提取feature,效果提升更加明顯。這是否也說(shuō)明,我們之前提取的圖像feature都不夠好,或者是根據(jù)人腦的經(jīng)驗(yàn)提取的feature不適合機(jī)器的模型?
很多人對(duì)深度學(xué)習(xí)頗有微詞的一個(gè)理由就是它沒(méi)有太多理論依據(jù),更多的像蠻力的搜索——非常深的層數(shù),幾千萬(wàn)甚至上億參數(shù),然后調(diào)整參數(shù)擬合輸入與輸出。其實(shí)目前所有的機(jī)器學(xué)習(xí)都是這樣,人類(lèi)的大腦的學(xué)習(xí)有所不同嗎,不是神經(jīng)元連接的調(diào)整嗎?
但不管怎么說(shuō),從深度神經(jīng)網(wǎng)絡(luò)的使用者(我們這樣的工程師)的角度來(lái)說(shuō),如果我們選定了一種網(wǎng)絡(luò)結(jié)構(gòu),比如CNN,那么我們要做的就是根據(jù)經(jīng)驗(yàn),選擇合適的層數(shù),每層的神經(jīng)元數(shù)量,激活函數(shù),損失函數(shù),正則化的參數(shù),然后使用validation數(shù)據(jù)來(lái)判定這次訓(xùn)練的效果。從效果來(lái)說(shuō),一般層次越多效果越好(至少相對(duì)一兩層的網(wǎng)絡(luò)來(lái)說(shuō)),但是層次越多參數(shù)也越多,訓(xùn)練就越慢。單機(jī)訓(xùn)練一個(gè)網(wǎng)絡(luò)花幾天甚至幾周的時(shí)間非常常見(jiàn)。因此用多個(gè)節(jié)點(diǎn)的計(jì)算機(jī)集群來(lái)訓(xùn)練就是深度學(xué)習(xí)的核心競(jìng)爭(zhēng)力——尤其對(duì)于用戶數(shù)據(jù)瞬息萬(wàn)變的互聯(lián)網(wǎng)應(yīng)用來(lái)說(shuō)更是如此。
常見(jiàn)深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和問(wèn)題
對(duì)于機(jī)器學(xué)習(xí)來(lái)說(shuō),訓(xùn)練是最關(guān)鍵也最困難的部分,一般的機(jī)器學(xué)習(xí)模型都是參數(shù)化的模型,我們可以把它看成一個(gè)函數(shù)y=f(w;x)。
比如拿識(shí)別圖像來(lái)說(shuō),輸入x是這張圖片的每個(gè)像素值,比如MNIST的數(shù)據(jù)是28*28的圖片,每個(gè)點(diǎn)是RGB的顏色值,那么x就是一個(gè)28*28*3的向量。而一個(gè)模型有很多參數(shù),用w表示。輸出y是一個(gè)向量,比如MNIST的數(shù)據(jù)是0-9的10個(gè)數(shù)字,所以我們可以讓y輸出一個(gè)10維的向量,分別代表識(shí)別成0-9的置信度(概率),選擇最大的那個(gè)作為我們的識(shí)別結(jié)果(當(dāng)然更常見(jiàn)的是最后一層是softmax而不是普通的激活函數(shù),這樣這個(gè)10維向量加起來(lái)等于1,可以認(rèn)為是分類(lèi)的概率)。
而訓(xùn)練就是給這個(gè)模型很多(x,y),然后訓(xùn)練的過(guò)程就是不斷的調(diào)整參數(shù)w,然后使得分類(lèi)錯(cuò)誤盡可能少(由于分類(lèi)錯(cuò)誤相對(duì)w不連續(xù)因而不可求導(dǎo),所以一般使用一個(gè)連續(xù)的Loss Function)。
對(duì)于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),標(biāo)準(zhǔn)的訓(xùn)練算法就是反向傳播算法(BackPropagation)。從數(shù)學(xué)上來(lái)說(shuō)就是使用(隨機(jī))梯度下降算法,求Loss Function對(duì)每個(gè)參數(shù)的梯度。另外我們也可以從另外一個(gè)角度來(lái)看反向傳播算法,比如最后一層的神經(jīng)網(wǎng)絡(luò)參數(shù),直接造成錯(cuò)誤(Loss);而倒數(shù)第二層的神經(jīng)網(wǎng)絡(luò)參數(shù),通過(guò)這一次的激活函數(shù)影響最后一層,然后間接影響最終的輸出。反向傳播算法也可以看成錯(cuò)誤不斷往前傳播的過(guò)程。
由于深度神經(jīng)網(wǎng)絡(luò)的參數(shù)非常多,比如GoogleNet, 2014年ILSVRC挑戰(zhàn)賽冠軍,將Top5 的錯(cuò)誤率降低到6.67%,它是一個(gè)22層的CNN,有5百多萬(wàn)個(gè)參數(shù)。所以需要強(qiáng)大的計(jì)算資源來(lái)訓(xùn)練這么深的神經(jīng)網(wǎng)絡(luò)。
其中,CNN是Image領(lǐng)域常見(jiàn)的一種深度神經(jīng)網(wǎng)絡(luò)。由Yann LeCun提出,通過(guò)卷積來(lái)發(fā)現(xiàn)位置無(wú)關(guān)的feature,而且這些feature的參數(shù)是相同的,從而與全連接的神經(jīng)網(wǎng)絡(luò)相比大大減少了參數(shù)的數(shù)量。
(cnn深度神經(jīng)網(wǎng)絡(luò))
最開(kāi)始的改進(jìn)是使用GPU來(lái)加速訓(xùn)練,GPU可以看成一種SIMT的架構(gòu),和SIMD有些類(lèi)似,但是執(zhí)行相同指令的warp里的32個(gè)core可以有不同的代碼路徑。對(duì)于反向傳播算法來(lái)說(shuō),基本計(jì)算就是矩陣向量乘法,對(duì)一個(gè)向量應(yīng)用激活函數(shù)這樣的向量化指令,而不像在傳統(tǒng)的代碼里會(huì)有很多if-else這樣的邏輯判斷,所以使用GPU加速非常有用。
但即使這樣,單機(jī)的計(jì)算能力還是相對(duì)有限的。
深度學(xué)習(xí)開(kāi)源工具
從數(shù)學(xué)上來(lái)講,深度神經(jīng)網(wǎng)絡(luò)其實(shí)不復(fù)雜,我們定義不同的網(wǎng)絡(luò)結(jié)構(gòu),比如層次之間怎么連接,每層有多少神經(jīng)元,每層的激活函數(shù)是什么。前向算法非常簡(jiǎn)單,根據(jù)網(wǎng)絡(luò)的定義計(jì)算就好了。
而反向傳播算法就比較復(fù)雜了,所以現(xiàn)在有很多深度學(xué)習(xí)的開(kāi)源框架來(lái)幫助我們把深度學(xué)習(xí)用到實(shí)際的系統(tǒng)中。
我們可以從以下幾個(gè)不同的角度來(lái)分類(lèi)這些開(kāi)源的深度學(xué)習(xí)框架。
通用vs專(zhuān)用
深度學(xué)習(xí)抽象到最后都是一個(gè)數(shù)學(xué)模型,相對(duì)于傳統(tǒng)的機(jī)器學(xué)習(xí)方法來(lái)說(shuō)少了很多特征抽取的工作,但是要把它用到實(shí)際的系統(tǒng)中還有很多事情要做。而且對(duì)于很多系統(tǒng)來(lái)說(shuō),深度學(xué)習(xí)只是其中的一個(gè)模塊。
拿語(yǔ)音識(shí)別來(lái)說(shuō),語(yǔ)音識(shí)別包含很多模塊,比如聲學(xué)模型和語(yǔ)言模型,現(xiàn)在的聲學(xué)模型可以用LSTMs(一種RNN,也是一種深度學(xué)習(xí)網(wǎng)絡(luò))來(lái)做,但是我們需要把它融入整個(gè)系統(tǒng),這就有很多工作需要做。而且目前大部分的機(jī)器學(xué)習(xí)方法包括深度學(xué)習(xí),都必須假設(shè)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)是相同(或者類(lèi)似)的分布的。所以在實(shí)際的應(yīng)用中,我們需要做很多數(shù)據(jù)相關(guān)的預(yù)處理工作。
比如Kaldi,它是一個(gè)語(yǔ)音識(shí)別的工具,實(shí)現(xiàn)了語(yǔ)音識(shí)別的所有模塊,也包括一些語(yǔ)音識(shí)別常用的深度神經(jīng)網(wǎng)絡(luò)模型,比如DNN和LSTM。
而Caffe更多的是用在圖像識(shí)別,它實(shí)現(xiàn)了CNN,因?yàn)檫@個(gè)模型在圖像識(shí)別上效果非常好。
框架vs庫(kù)
大部分開(kāi)源的深度學(xué)習(xí)工具把整個(gè)模型都封裝好了,我們只需要指定一些參數(shù)就行了。比如我們使用Caffe的CNN。
但是還有一些工具只是提供一些基礎(chǔ)庫(kù),比如Theano,它提供了自動(dòng)求梯度的工具。
我們可以自己定義網(wǎng)絡(luò)的結(jié)構(gòu),我們不需要自己求梯度。使用Theano的好處是如果我們“創(chuàng)造”一個(gè)新的網(wǎng)絡(luò)結(jié)構(gòu)或者是很新的深度神經(jīng)網(wǎng)絡(luò),那么其它框架很可能還沒(méi)有實(shí)現(xiàn),所以Theano在學(xué)術(shù)界很流行。當(dāng)然壞處就是因?yàn)樗豢赡茚槍?duì)特定的模型做優(yōu)化,所以可能性能不如特定的實(shí)現(xiàn)那么好。
單機(jī)vs集群
目前大部分的開(kāi)源工具都是單機(jī)版的,有些支持在一個(gè)節(jié)點(diǎn)的多個(gè)GPU訓(xùn)練,但是支持GPU cluster比較少,目前支持多機(jī)訓(xùn)練的有GraphLab和Deeplearning4j。
Tensor Flow到底是什么?
Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計(jì)算,TensorFlow即為張量從圖的一端流動(dòng)到另一端。
TensorFlow 表達(dá)了高層次的機(jī)器學(xué)習(xí)計(jì)算,大幅簡(jiǎn)化了第一代系統(tǒng),并且具備更好的靈活性和可延展性。TensorFlow一大亮點(diǎn)是支持異構(gòu)設(shè)備分布式計(jì)算,它能夠在各個(gè)平臺(tái)上自動(dòng)運(yùn)行模型,從電話、單個(gè)CPU / GPU到成百上千GPU卡組成的分布式系統(tǒng)。
從目前的文檔看,TensorFlow支持CNN、RNN和LSTM算法,這都是目前在Image,Speech和NLP最流行的深度神經(jīng)網(wǎng)絡(luò)模型。
而且從Jeff Dean的論文來(lái)看,它肯定是支持集群上的訓(xùn)練的。
在論文里的例子來(lái)看,這個(gè)架構(gòu)有點(diǎn)像Spark或者Dryad等圖計(jì)算模型。就像寫(xiě)Map-reduce代碼一樣,我們從高層的角度來(lái)定義我們的業(yè)務(wù)邏輯,然后這個(gè)架構(gòu)幫我們調(diào)度和分配計(jì)算資源(甚至容錯(cuò),比如某個(gè)計(jì)算節(jié)點(diǎn)掛了或者太慢)。目前開(kāi)源的實(shí)現(xiàn)分布式Deep learning的GraphLab就是GAS的架構(gòu),我們必須按照它的抽象來(lái)編寫(xiě)Deep Learing代碼(或者其它分布式代碼,如果PageRank),而Deeplearning4j直接使用了Spark。
Map-Reduce的思想非常簡(jiǎn)單,但是要寫(xiě)出一個(gè)穩(wěn)定可用的工業(yè)級(jí)產(chǎn)品來(lái)就不容易了。而支持分布式機(jī)器學(xué)習(xí)尤其是深度學(xué)習(xí)的產(chǎn)品就更難了,Google的TensorFlow應(yīng)該是一種抽象方式,可惜現(xiàn)在開(kāi)源的部分并沒(méi)有這些內(nèi)容。有點(diǎn)像Google開(kāi)源了一個(gè)單機(jī)版的Hadoop,可以用這種抽象(Map-reduce)來(lái)簡(jiǎn)化大數(shù)據(jù)編程,但是實(shí)際應(yīng)用肯定就大大受限制了。
深度學(xué)習(xí)能解決所有問(wèn)題嗎?
至少目前來(lái)看,深度學(xué)習(xí)只是在Speech和Image這種比較“淺層”的智能問(wèn)題上效果是比較明顯的,而對(duì)于語(yǔ)言理解和推理這些問(wèn)題效果就不那么好了,也許未來(lái)的深度神經(jīng)網(wǎng)絡(luò)能解決更“智能”的問(wèn)題,但只是目前還不行。
Google開(kāi)源TensorFlow的意義
這一次的Google開(kāi)源深度學(xué)習(xí)系統(tǒng)TensorFlow在很多地方可以應(yīng)用,如語(yǔ)音識(shí)別,自然語(yǔ)言理解,計(jì)算機(jī)視覺(jué),廣告等等。但是,基于以上論點(diǎn),我們也不能過(guò)分夸大TensorFlow這種通用深度學(xué)習(xí)框架在一個(gè)工業(yè)界機(jī)器學(xué)習(xí)系統(tǒng)里的作用。在一個(gè)完整的工業(yè)界語(yǔ)音識(shí)別系統(tǒng)里, 除了深度學(xué)習(xí)算法外,還有很多工作是專(zhuān)業(yè)領(lǐng)域相關(guān)的算法,以及海量數(shù)據(jù)收集和工程系統(tǒng)架構(gòu)的搭建。
不過(guò)總的來(lái)說(shuō),這次谷歌的開(kāi)源很有意義,尤其是對(duì)于中國(guó)的很多創(chuàng)業(yè)公司來(lái)說(shuō),他們大都沒(méi)有能力理解并開(kāi)發(fā)一個(gè)與國(guó)際同步的深度學(xué)習(xí)系統(tǒng),所以TensorFlow會(huì)大大降低深度學(xué)習(xí)在各個(gè)行業(yè)中的應(yīng)用難度。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。