解析最接近人腦的智能學(xué)習(xí)機器--深度學(xué)習(xí)及并行化實現(xiàn)

摘要

深度學(xué)習(xí)可以完成需要高度抽象特征的人工智能任務(wù),如語音識別、圖像識別和檢索、自然語言理解等。深層模型是包含多個隱藏層的人工神經(jīng)網(wǎng)絡(luò),多層非線性結(jié)構(gòu)使其具備強大的特征表達能力和對復(fù)雜任務(wù)建模能力。訓(xùn)練深層模型是長期以來的難題,近年來以層次化、逐層初始化為代表的一系列方法的提出給訓(xùn)練深層模型帶來了希望,并在多個應(yīng)用領(lǐng)域獲得了成功。深層模型的并行化框架和訓(xùn)練加速方法是深度學(xué)習(xí)走向?qū)嵱玫闹匾延卸鄠€針對不同深度模型的開源實現(xiàn),Google、Facebook、百度、騰訊等公司也實現(xiàn)了各自的并行化框架。深度學(xué)習(xí)是目前最接近人腦的智能學(xué)習(xí)方法,深度學(xué)習(xí)引爆的這場革命,將人工智能帶上了一個新的臺階,將對一大批產(chǎn)品和服務(wù)產(chǎn)生深遠影響。

1 深度學(xué)習(xí)的革命

人工智能(Artificial Intelligence),試圖理解智能的實質(zhì),并制造出能以人類智能相似的方式做出反應(yīng)的智能機器。如果說機器是人類手的延伸、交通工具是人類腿的延伸,那么人工智能就是人類大腦的延伸,甚至可以幫助人類自我進化,超越自我。人工智能也是計算機領(lǐng)域最前沿和最具神秘色彩的學(xué)科,科學(xué)家希望制造出代替人類思考的智能機器,藝術(shù)家將這一題材寫進小說,搬上銀幕,引發(fā)人們無限的遐想。然而,作為一門嚴肅的學(xué)科,人工智能在過去的半個多世紀中發(fā)展卻不算順利。過去的很多努力還是基于某些預(yù)設(shè)規(guī)則的快速搜索和推理,離真正的智能還有相當(dāng)?shù)木嚯x,或者說距離創(chuàng)造像人類一樣具有抽象學(xué)習(xí)能力的機器還很遙遠。

近年來,深度學(xué)習(xí)(Deep Learning)直接嘗試解決抽象認知的難題,并取得了突破性的進展。深度學(xué)習(xí)引爆的這場革命,將人工智能帶上了一個新的臺階,不僅學(xué)術(shù)意義巨大,而且實用性很強,工業(yè)界也開始了大規(guī)模的投入,一大批產(chǎn)品將從中獲益。

2006年,機器學(xué)習(xí)泰斗、多倫多大學(xué)計算機系教授Geoffery Hinton在Science發(fā)表文章[1],提出基于深度信念網(wǎng)絡(luò)(Deep Belief Networks, DBN)可使用非監(jiān)督的逐層貪心訓(xùn)練算法,為訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)帶來了希望。

2012年,Hinton又帶領(lǐng)學(xué)生在目前最大的圖像數(shù)據(jù)庫ImageNet上,對分類問題取得了驚人的結(jié)果[2],將Top5錯誤率由26%大幅降低至15%。

2012年,由人工智能和機器學(xué)習(xí)頂級學(xué)者Andrew Ng和分布式系統(tǒng)頂級專家Jeff Dean領(lǐng)銜的夢幻陣容,開始打造Google Brain項目,用包含16000個CPU核的并行計算平臺訓(xùn)練超過10億個神經(jīng)元的深度神經(jīng)網(wǎng)絡(luò),在語音識別和圖像識別等領(lǐng)域取得了突破性的進展[3]。該系統(tǒng)通過分析YouTube上選取的視頻,采用無監(jiān)督的方式訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),可將圖像自動聚類。在系統(tǒng)中輸入“cat”后,結(jié)果在沒有外界干涉的條件下,識別出了貓臉。

2012年,微軟首席研究官Rick Rashid在21世紀的計算大會上演示了一套自動同聲傳譯系統(tǒng)[4],將他的英文演講實時轉(zhuǎn)換成與他音色相近、字正腔圓的中文演講。同聲傳譯需要經(jīng)歷語音識別、機器翻譯、語音合成三個步驟。該系統(tǒng)一氣呵成,流暢的效果贏得了一致認可,深度學(xué)習(xí)則是這一系統(tǒng)中的關(guān)鍵技術(shù)。

2013年,Google收購了一家叫DNN Research的神經(jīng)網(wǎng)絡(luò)初創(chuàng)公司,這家公司只有三個人,Geoffrey Hinton和他的兩個學(xué)生。這次收購并不涉及任何產(chǎn)品和服務(wù),只是希望Hinton可以將深度學(xué)習(xí)打造為支持Google未來的核心技術(shù)。同年,紐約大學(xué)教授,深度學(xué)習(xí)專家Yann LeCun加盟Facebook,出任人工智能實驗室主任[5],負責(zé)深度學(xué)習(xí)的研發(fā)工作,利用深度學(xué)習(xí)探尋用戶圖片等信息中蘊含的海量信息,希望在未來能給用戶提供更智能化的產(chǎn)品使用體驗。

2013年,百度成立了百度研究院及下屬的深度學(xué)習(xí)研究所(IDL),將深度學(xué)習(xí)應(yīng)用于語音識別和圖像識別、檢索,以及廣告CTR預(yù)估(Click-Through-Rate Prediction,pCTR),其中圖片檢索達到了國際領(lǐng)先水平。2014年又將Andrew Ng招致麾下,Andrew Ng是斯坦福大學(xué)人工智能實驗室主任,入選過《時代》雜志年度全球最有影響力100人,是16位科技界的代表之一。

如果說Hinton 2006年發(fā)表在《Science》雜志上的論文[1]只是在學(xué)術(shù)界掀起了對深度學(xué)習(xí)的研究熱潮,那么近年來各大巨頭公司爭相跟進,將頂級人才從學(xué)術(shù)界爭搶到工業(yè)界,則標志著深度學(xué)習(xí)真正進入了實用階段,將對一系列產(chǎn)品和服務(wù)產(chǎn)生深遠影響,成為它們背后強大的技術(shù)引擎。

目前,深度學(xué)習(xí)在幾個主要領(lǐng)域都獲得了突破性的進展:在語音識別領(lǐng)域,深度學(xué)習(xí)用深層模型替換聲學(xué)模型中的混合高斯模型(Gaussian Mixture Model, GMM),獲得了相對30%左右的錯誤率降低;在圖像識別領(lǐng)域,通過構(gòu)造深度卷積神經(jīng)網(wǎng)絡(luò)(CNN)[2],將Top5錯誤率由26%大幅降低至15%,又通過加大加深網(wǎng)絡(luò)結(jié)構(gòu),進一步降低到11%;在自然語言處理領(lǐng)域,深度學(xué)習(xí)基本獲得了與其他方法水平相當(dāng)?shù)慕Y(jié)果,但可以免去繁瑣的特征提取步驟??梢哉f到目前為止,深度學(xué)習(xí)是最接近人類大腦的智能學(xué)習(xí)方法。

2深層模型的基本結(jié)構(gòu)

深度學(xué)習(xí)采用的模型為深層神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNN)模型,即包含多個隱藏層(Hidden Layer,也稱隱含層)的神經(jīng)網(wǎng)絡(luò)(Neural Networks,NN)。深度學(xué)習(xí)利用模型中的隱藏層,通過特征組合的方式,逐層將原始輸入轉(zhuǎn)化為淺層特征,中層特征,高層特征直至最終的任務(wù)目標。

深度學(xué)習(xí)源于人工神經(jīng)網(wǎng)絡(luò)的研究,先來回顧一下人工神經(jīng)網(wǎng)絡(luò)。一個神經(jīng)元如下圖所示[6]:

這個神經(jīng)元接受三個輸入x1,x2,x3,神經(jīng)元輸出為

其中W1, W2, W3和b為神經(jīng)元的參數(shù),f(z)稱為激活函數(shù),一種典型的激活函數(shù)為Sigmoid函數(shù),即

其圖像為

神經(jīng)網(wǎng)絡(luò)則是多個神經(jīng)元組成的網(wǎng)絡(luò),一個簡單的神經(jīng)網(wǎng)絡(luò)如下圖所示

使用圓圈來表示神經(jīng)網(wǎng)絡(luò)的輸入,標上“+1”的圓圈稱為偏置節(jié)點,也就是截距項。神經(jīng)網(wǎng)絡(luò)最左邊的一層叫做輸入層(本例中,有3個輸入單元,偏置單元不計);最右的一層叫做輸出層(本例中,輸出層有2個節(jié)點);中間的節(jié)點叫做隱藏層(本例中,有2個隱藏層,分別包含3個和2個神經(jīng)元,偏置單元同樣不計),因為不能在訓(xùn)練樣本集中觀測到它們的值。神經(jīng)元網(wǎng)絡(luò)中的每一條連線對應(yīng)一個連接參數(shù),連線個數(shù)對應(yīng)網(wǎng)絡(luò)的參數(shù)個數(shù)(本例共有4×3 + 4×2 +3×2=26個參數(shù))。求解這個的神經(jīng)網(wǎng)絡(luò),需要(x(i),y(i))的樣本集,其中x(i)是3維向量,y(i)是2維向量。

上圖算是一個淺層的神經(jīng)網(wǎng)絡(luò),下圖是一個用于語音識別的深層神經(jīng)網(wǎng)絡(luò)。具有1個輸入層,4個隱藏層和1個輸出層,相鄰兩層的神經(jīng)元全部連接。

3 選擇深層模型的原因

為什么要構(gòu)造包含這么多隱藏層的深層網(wǎng)絡(luò)結(jié)構(gòu)呢?背后有一些理論依據(jù):

3.1天然層次化的特征

對于很多訓(xùn)練任務(wù)來說,特征具有天然的層次結(jié)構(gòu)。以語音、圖像、文本為例,層次結(jié)構(gòu)大概如下表所示。

以圖像識別為例,圖像的原始輸入是像素,相鄰像素組成線條,多個線條組成紋理,進一步形成圖案,圖案構(gòu)成了物體的局部,直至整個物體的樣子。不難發(fā)現(xiàn),可以找到原始輸入和淺層特征之間的聯(lián)系,再通過中層特征,一步一步獲得和高層特征的聯(lián)系。想要從原始輸入直接跨越到高層特征,無疑是困難的。

3.2 仿生學(xué)依據(jù)

人工神經(jīng)網(wǎng)絡(luò)本身就是對人類神經(jīng)系統(tǒng)的模擬,這種模擬具有仿生學(xué)的依據(jù)。1981年,David Hubel 和Torsten Wiesel發(fā)現(xiàn)可視皮層是分層的[8]。人類的視覺系統(tǒng)包含了不同的視覺神經(jīng)元,這些神經(jīng)元與瞳孔所受的刺激(系統(tǒng)輸入)之間存在著某種對應(yīng)關(guān)系(神經(jīng)元之間的連接參數(shù)),即受到某種刺激后(對于給定的輸入),某些神經(jīng)元就會活躍(被激活)。這證實了人類神經(jīng)系統(tǒng)和大腦的工作其實是不斷將低級抽象傳導(dǎo)為高級抽象的過程,高層特征是低層特征的組合,越到高層特征就越抽象。

3.3 特征的層次可表示性

特征的層次可表示性也得到了證實。1995年前后,Bruno Olshausen和David Field[9]收集了很多黑白風(fēng)景照,從這些照片中找到了400個16×16的基本碎片,然后從照片中再找到其他一些同樣大小的碎片,希望將其他碎片表示為這400個基本碎片的線性組合,并使誤差盡可能小,使用的碎片盡可能少。表示完成后,再固定其他碎片,選擇更合適的基本碎片組合優(yōu)化近似結(jié)果。反復(fù)迭代后,得到了可以表示其他碎片的最佳的基本碎片組合。他們發(fā)現(xiàn),這些基本碎片組合都是不同物體不同方向的邊緣線。

這說明可以通過有效的特征提取,將像素抽象成更高級的特征。類似的結(jié)果也適用于語音特征。

4 從淺層模型到深層模型

前文談到了深層模型的結(jié)構(gòu)和它的優(yōu)勢。事實上,深層模型具有強大的表達能力,并可以像人類一樣有效提取高級特征,并不是新的發(fā)現(xiàn)。那么為什么深層模型直到最近幾年才開始得到廣泛的關(guān)注和應(yīng)用呢?還是從傳統(tǒng)的機器學(xué)習(xí)方法和淺層學(xué)習(xí)談起。

4.1淺層模型及訓(xùn)練方法

反向傳播算法(Back Propagation,BP算法)[10]是一種神經(jīng)網(wǎng)絡(luò)的梯度計算方法。反向傳播算法先定義模型在訓(xùn)練樣本上的代價函數(shù),再求代價函數(shù)對于每個參數(shù)的梯度。反向傳播算法巧妙的利用了下層神經(jīng)元的梯度可由上層神經(jīng)元的殘差導(dǎo)出的規(guī)律,求解的過程也正如算法的名字那樣,自上而下反向逐層計算,直至獲得所有參數(shù)的梯度。反向傳播算法可以幫助訓(xùn)練基于統(tǒng)計的機器學(xué)習(xí)模型,從大量的訓(xùn)練樣本中挖掘出統(tǒng)計規(guī)律,進而可對未標注的數(shù)據(jù)進行預(yù)測。這種基于統(tǒng)計的學(xué)習(xí)方法比起傳統(tǒng)的基于規(guī)則的方法具備很多優(yōu)越性[11]。

上世紀八九十年代,人們提出了一系列機器學(xué)習(xí)模型,應(yīng)用最為廣泛的包括支持向量機(Support Vector Machine,SVM)[12]和邏輯回歸(Logistic Regression,LR)[13],這兩種模型分別可以看作包含1個隱藏層和沒有隱藏層的淺層模型。訓(xùn)練時可以利用反向傳播算法計算梯度,再用梯度下降方法在參數(shù)空間中尋找最優(yōu)解。淺層模型往往具有凸代價函數(shù),理論分析相對簡單,訓(xùn)練方法也容易掌握,取得了很多成功的應(yīng)用。

4.2 深層模型的訓(xùn)練難度

淺層模型的局限性在于有限參數(shù)和計算單元,對復(fù)雜函數(shù)的表示能力有限,針對復(fù)雜分類問題其泛化能力受到一定的制約。深層模型恰恰可以克服淺層模型的這一弱點,然而應(yīng)用反向傳播和梯度下降來訓(xùn)練深層模型,就面臨幾個突出的問題[14]:

1.局部最優(yōu)。與淺層模型的代價函數(shù)不同,深層模型的每個神經(jīng)元都是非線性變換,代價函數(shù)是高度非凸函數(shù),采用梯度下降的方法容易陷入局部最優(yōu)。

2.梯度彌散。使用反向傳播算法傳播梯度的時候,隨著傳播深度的增加,梯度的幅度會急劇減小,會導(dǎo)致淺層神經(jīng)元的權(quán)重更新非常緩慢,不能有效學(xué)習(xí)。這樣一來,深層模型也就變成了前幾層相對固定,只能改變最后幾層的淺層模型。

3.數(shù)據(jù)獲取。深層模型的表達能力強大,模型的參數(shù)也相應(yīng)增加。對于訓(xùn)練如此多參數(shù)的模型,小訓(xùn)練數(shù)據(jù)集是不能實現(xiàn)的,需要海量的有標記的數(shù)據(jù),否則只能導(dǎo)致嚴重的過擬合(Over fitting)。

4.3 深層模型的訓(xùn)練方法

盡管挑戰(zhàn)很大,Hinton教授并沒有放棄努力,他30年來一直從事相關(guān)研究,終于有了突破性的進展。2006年,他在《Science》上發(fā)表了一篇文章[1],掀起了深度學(xué)習(xí)在學(xué)術(shù)界和工業(yè)界的浪潮。這篇文章的兩個主要觀點是:

1.多隱藏層的人工神經(jīng)網(wǎng)絡(luò)具有優(yōu)異的特征學(xué)習(xí)能力,學(xué)習(xí)到的特征對數(shù)據(jù)有更本質(zhì)的刻畫,從而有利于可視化或分類。

2.深度神經(jīng)網(wǎng)絡(luò)在訓(xùn)練上的難度,可以通過“逐層初始化”(Layer-wise Pre-training)來有效克服,文中給出了無監(jiān)督的逐層初始化方法。

優(yōu)異的特征刻畫能力前文已經(jīng)提到,不再累述,下面重點解釋一下“逐層初始化”的方法。

給定原始輸入后,先要訓(xùn)練模型的第一層,即圖中左側(cè)的黑色框。黑色框可以看作是一個編碼器,將原始輸入編碼為第一層的初級特征,可以將編碼器看作模型的一種“認知”。為了驗證這些特征確實是輸入的一種抽象表示,且沒有丟失太多信息,需要引入一個對應(yīng)的解碼器,即圖中左側(cè)的灰色框,可以看作模型的“生成”。為了讓認知和生成達成一致,就要求原始輸入通過編碼再解碼,可以大致還原為原始輸入。因此將原始輸入與其編碼再解碼之后的誤差定義為代價函數(shù),同時訓(xùn)練編碼器和解碼器。訓(xùn)練收斂后,編碼器就是我們要的第一層模型,而解碼器則不再需要了。這時我們得到了原始數(shù)據(jù)的第一層抽象。固定第一層模型,原始輸入就映射成第一層抽象,將其當(dāng)作輸入,如法炮制,可以繼續(xù)訓(xùn)練出第二層模型,再根據(jù)前兩層模型訓(xùn)練出第三層模型,以此類推,直至訓(xùn)練出最高層模型。

逐層初始化完成后,就可以用有標簽的數(shù)據(jù),采用反向傳播算法對模型進行整體有監(jiān)督的訓(xùn)練了。這一步可看作對多層模型整體的精細調(diào)整。由于深層模型具有很多局部最優(yōu)解,模型初始化的位置將很大程度上決定最終模型的質(zhì)量。“逐層初始化”的步驟就是讓模型處于一個較為接近全局最優(yōu)的位置,從而獲得更好的效果。

4.4 淺層模型和深層模型的對比

淺層模型有一個重要的特點,需要依靠人工經(jīng)驗來抽取樣本的特征,模型的輸入是這些已經(jīng)選取好的特征,模型只用來負責(zé)分類和預(yù)測。在淺層模型中,最重要的往往不是模型的優(yōu)劣,而是特征的選取的優(yōu)劣。因此大多數(shù)人力都投入到特征的開發(fā)和篩選中來,不但需要對任務(wù)問題領(lǐng)域有深刻的理解,還要花費大量時間反復(fù)實驗摸索,這也限制了淺層模型的效果。

事實上,逐層初始化深層模型也可以看作是特征學(xué)習(xí)的過程,通過隱藏層對原始輸入的一步一步抽象表示,來學(xué)習(xí)原始輸入的數(shù)據(jù)結(jié)構(gòu),找到更有用的特征,從而最終提高分類問題的準確性。在得到有效特征之后,模型整體訓(xùn)練也可以水到渠成。

5 深層模型的層次組件

深層模型是包含多個隱藏層的神經(jīng)網(wǎng)絡(luò),每一層的具體結(jié)構(gòu)又是怎樣的呢?本節(jié)介紹一些常見的深層模型基本層次組件。

5.1 自編碼器(Auto-Encoder)

一種常見的深層模型是由自編碼器(Auto-Encoder)構(gòu)造的[6]。自編碼器可以利用一組無標簽的訓(xùn)練數(shù)據(jù){x(1), x(2), … }(其中x(i)是一個n維向量)進行無監(jiān)督的模型訓(xùn)練。它采用反向傳播算法,讓目標值接近輸入值。下圖是一個自編碼器的示例:

自編碼器嘗試訓(xùn)練一個恒等函數(shù),讓輸出接近等于輸入值,恒等函數(shù)看似沒有學(xué)習(xí)的意義,但考慮到隱藏層神經(jīng)元的數(shù)目(本例中為3個)小于輸入向量的維數(shù)(本例中為6維),事實上隱藏層就變成了輸入數(shù)據(jù)的一種壓縮的表示,或說是抽象的簡化表示。如果網(wǎng)絡(luò)的輸入是完全隨機的,將高維向量壓縮成低維向量會難以實現(xiàn)。但訓(xùn)練數(shù)據(jù)往往隱含著特定的結(jié)構(gòu),自編碼器就會學(xué)到這些數(shù)據(jù)的相關(guān)性,從而得到有效的壓縮表示。實際訓(xùn)練后,如果代價函數(shù)越小,就說明輸入和輸出越接近,也就說明這個編碼器越靠譜。當(dāng)然,自編碼器訓(xùn)練完成后,實際使用時只需要它的前一層,即編碼部分,解碼部分就沒用了。

稀疏自編碼器(Sparse Auto-Encoder)是自編碼器的一個變體,它在自編碼器的基礎(chǔ)上加入正則化(Regularity)。正則化是在代價函數(shù)中加入抑制項,希望隱藏層節(jié)點的平均激活值接近于0,有了正則化的約束,輸入數(shù)據(jù)可以用少數(shù)隱藏節(jié)點表達。之所以采用稀疏自編碼器,是因為稀疏的表達往往比稠密的表達更有效,人腦神經(jīng)系統(tǒng)也是稀疏連接,每個神經(jīng)元只與少數(shù)神經(jīng)元連接。

降噪自編碼器是另一種自編碼器的變體。通過在訓(xùn)練數(shù)據(jù)中加入噪聲,可訓(xùn)練出對輸入信號更加魯棒的表達,從而提升模型的泛化能力,可以更好地應(yīng)對實際預(yù)測時夾雜在數(shù)據(jù)中的噪聲。

得到自編碼器后,我們還想進一步了解自編碼器到底學(xué)到了什么。例如,在10×10的圖像上訓(xùn)練一個稀疏自編碼器,然后對于每個隱藏神經(jīng)元,找到什么樣的圖像可以讓隱藏神經(jīng)元獲得最大程度的激勵,即這個隱藏神經(jīng)元學(xué)習(xí)到了什么樣的特征。將100個隱藏神經(jīng)元的特征都找出來,得到了如下100幅圖像:

可以看出,這100幅圖像具備了從不同方向檢測物體邊緣的能力。顯然,這樣的能力對后續(xù)的圖像識別很有幫助。

5.2 受限玻爾茲曼機(Restricted Boltzmann Machine,RBM)

受限玻爾茲曼機(Restricted Boltzmann Machine, RBM)是一個二部圖,一層是輸入層(v),另一層是隱藏層(h),假設(shè)所有節(jié)點都是隨機二值變量節(jié)點,只能取值0或1,同時假設(shè)全概率分布p(v, h)滿足Boltzmann分布。

由于同層節(jié)點之間沒有連接,因此已知輸入層的情況下,隱藏層的各節(jié)點是條件獨立的;反之,已知隱藏層的情況下,輸入層各節(jié)點也是條件獨立的。同時,可以根據(jù)Boltzmann分布,當(dāng)輸入v時通過p(h|v)生成隱藏層,得到隱藏層之后再通過p(v|h)生成輸入層。相信很多讀者已經(jīng)猜到了,可以按照訓(xùn)練其他網(wǎng)絡(luò)類似的思路,通過調(diào)整參數(shù),希望通過輸入v生成的h,再生成的v’與v盡可能接近,則說明隱藏層h是輸入層v的另外一種表示。這樣就可以作為深層模型的基本層次組件了。全部用RBM形成的深層模型為深度玻爾茲曼機(Deep Boltzmann Machine,DBM)。如果將靠近輸入層的部分替換為貝葉斯信念網(wǎng)絡(luò),即有向圖模型,而在遠離輸入層的部分仍然使用RBM,則稱為深度信念網(wǎng)絡(luò)(Deep Belief Networks,DBN)。

5.3 卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)

以上介紹的編碼器都是全連通網(wǎng)絡(luò),可以完成10×10的圖像識別,如手寫體數(shù)字識別問題。然而對于更大的圖像,如100×100的圖像,如果要學(xué)習(xí)100個特征,則需要1,000,000個參數(shù),計算時間會大大增加。解決這種尺寸圖像識別的有效方法是利用圖像的局部性,構(gòu)造一個部分聯(lián)通的網(wǎng)絡(luò)。一種最常見的網(wǎng)絡(luò)是卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)[15][16],它利用圖像固有的特性,即圖像局部的統(tǒng)計特性與其他局部是一樣的。因此從某個局部學(xué)習(xí)來的特征同樣適用于另外的局部,對于這個圖像上的所有位置,都能使用同樣的特征。

具體地說,假設(shè)有一幅100×100的圖像,要從中學(xué)習(xí)一個10×10的局部圖像特征的神經(jīng)元,如果采用全連接的方式,100×100維的輸入到這個神經(jīng)元需要有10000個連接權(quán)重參數(shù)。而采用卷積核的方式,只有10×10=100個參數(shù)權(quán)重,卷積核可以看作一個10×10的小窗口,在圖像上上下左右移動,走遍圖像中每個10×10的位置(共有91×91個位置)。每移動到一個位置,則將該位置的輸入與卷積核對應(yīng)位置的參數(shù)相乘再累加,得到一個輸出值(輸出值是91×91的圖像)。卷積核的特點是連接數(shù)雖然很多,有91×91×10×10個連接,但是參數(shù)只有10×10=100個,參數(shù)數(shù)目大大減小,訓(xùn)練也變得容易了,并且不容易產(chǎn)生過擬合。當(dāng)然,一個神經(jīng)元只能提取一個特征,要提取多個特征就要多個卷積核。

下圖揭示了對一幅8×8維圖像使用卷積方法提取特征的示意過程。其中使用了3×3的卷積核,走遍圖像中每個3×3的位置后,最終得到6×6維的輸出圖像:

如圖所示是Hinton的研究小組在ImageNet競賽中使用的卷積神經(jīng)網(wǎng)絡(luò)[2],共有5個卷積層,每層分別有96,256,384,384和256個卷積核,每層卷積核的大小分別為11×11,5×5,3×3,3×3和3×3。網(wǎng)絡(luò)的最后兩層是全連接層。

6 深度學(xué)習(xí)的訓(xùn)練加速

深層模型訓(xùn)練需要各種技巧,例如網(wǎng)絡(luò)結(jié)構(gòu)的選取,神經(jīng)元個數(shù)的設(shè)定,權(quán)重參數(shù)的初始化,學(xué)習(xí)率的調(diào)整,Mini-batch的控制等等。即便對這些技巧十分精通,實踐中也要多次訓(xùn)練,反復(fù)摸索嘗試。此外,深層模型參數(shù)多,計算量大,訓(xùn)練數(shù)據(jù)的規(guī)模也更大,需要消耗很多計算資源。如果可以讓訓(xùn)練加速,就可以在同樣的時間內(nèi)多嘗試幾個新主意,多調(diào)試幾組參數(shù),工作效率會明顯提升,對于大規(guī)模的訓(xùn)練數(shù)據(jù)和模型來說,更可以將難以完成的任務(wù)變成可能。這一節(jié)就談?wù)勆顚幽P偷挠?xùn)練加速方法。

6.1 GPU加速

矢量化編程是提高算法速度的一種有效方法。為了提升特定數(shù)值運算操作(如矩陣相乘、矩陣相加、矩陣-向量乘法等)的速度,數(shù)值計算和并行計算的研究人員已經(jīng)努力了幾十年。矢量化編程強調(diào)單一指令并行操作多條相似數(shù)據(jù),形成單指令流多數(shù)據(jù)流(SIMD)的編程泛型。深層模型的算法,如BP,Auto-Encoder,CNN等,都可以寫成矢量化的形式。然而,在單個CPU上執(zhí)行時,矢量運算會被展開成循環(huán)的形式,本質(zhì)上還是串行執(zhí)行。

GPU(Graphic Process Units,圖形處理器)的眾核體系結(jié)構(gòu)包含幾千個流處理器,可將矢量運算并行化執(zhí)行,大幅縮短計算時間。隨著NVIDIA、AMD等公司不斷推進其GPU的大規(guī)模并行架構(gòu)支持,面向通用計算的GPU(General-Purposed GPU, GPGPU)已成為加速可并行應(yīng)用程序的重要手段。得益于GPU眾核(many-core)體系結(jié)構(gòu),程序在GPU系統(tǒng)上的運行速度相較于單核CPU往往提升幾十倍乃至上千倍。目前GPU已經(jīng)發(fā)展到了較為成熟的階段,受益最大的是科學(xué)計算領(lǐng)域,典型的成功案例包括多體問題(N-Body Problem)、蛋白質(zhì)分子建模、醫(yī)學(xué)成像分析、金融計算、密碼計算等。

利用GPU來訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),可以充分發(fā)揮其數(shù)以千計計算核心的高效并行計算能力,在使用海量訓(xùn)練數(shù)據(jù)的場景下,所耗費的時間大幅縮短,占用的服務(wù)器也更少。如果對針對適當(dāng)?shù)纳疃壬窠?jīng)網(wǎng)絡(luò)進行合理優(yōu)化,一塊GPU卡可相當(dāng)于數(shù)十甚至上百臺CPU服務(wù)器的計算能力,因此GPU已經(jīng)成為業(yè)界在深度學(xué)習(xí)模型訓(xùn)練方面的首選解決方案。

6.2數(shù)據(jù)并行

數(shù)據(jù)并行是指對訓(xùn)練數(shù)據(jù)做切分,同時采用多個模型實例,對多個分片的數(shù)據(jù)并行訓(xùn)練。

要完成數(shù)據(jù)并行需要做參數(shù)交換,通常由一個參數(shù)服務(wù)器(Parameter Server)來幫助完成。在訓(xùn)練的過程中,多個訓(xùn)練過程相互獨立,訓(xùn)練的結(jié)果,即模型的變化量ΔW需要匯報給參數(shù)服務(wù)器,由參數(shù)服務(wù)器負責(zé)更新為最新的模型W’ = W – η ? ΔW,然后再將最新的模型W’分發(fā)給訓(xùn)練程序,以便從新的起點開始訓(xùn)練。

數(shù)據(jù)并行有同步模式和異步模式之分。同步模式中,所有訓(xùn)練程序同時訓(xùn)練一個批次的訓(xùn)練數(shù)據(jù),完成后經(jīng)過同步,再同時交換參數(shù)。參數(shù)交換完成后所有的訓(xùn)練程序就有了共同的新模型作為起點,再訓(xùn)練下一個批次。而異步模式中,訓(xùn)練程序完成一個批次的訓(xùn)練數(shù)據(jù),立即和參數(shù)服務(wù)器交換參數(shù),不考慮其他訓(xùn)練程序的狀態(tài)。異步模式中一個訓(xùn)練程序的最新結(jié)果不會立刻體現(xiàn)在其他訓(xùn)練程序中,直到他們進行下次參數(shù)交換。

參數(shù)服務(wù)器只是一個邏輯上的概念,不一定部署為獨立的一臺服務(wù)器。有時候它會附屬在某一個訓(xùn)練程序上,有時也會將參數(shù)服務(wù)器按照模型劃分為不同的分片,分別部署。

6.3模型并行

模型并行將模型拆分成幾個分片,由幾個訓(xùn)練單元分別持有,共同協(xié)作完成訓(xùn)練。當(dāng)一個神經(jīng)元的輸入來自另一個訓(xùn)練單元上的神經(jīng)元的輸出時,產(chǎn)生通信開銷。

多數(shù)情況下,模型并行帶來的通信開銷和同步消耗超過數(shù)據(jù)并行,因此加速比也不及數(shù)據(jù)并行。但對于單機內(nèi)存無法容納的大模型來說,模型并行是一個很好的選擇。令人遺憾的是,數(shù)據(jù)并行和模型并行都不能無限擴展。數(shù)據(jù)并行的訓(xùn)練程序太多時,不得不減小學(xué)習(xí)率,以保證訓(xùn)練過程的平穩(wěn);模型并行的分片太多時,神經(jīng)元輸出值的交換量會急劇增加,效率大幅下降。因此,同時進行模型并行和數(shù)據(jù)并行也是一種常見的方案。如下圖所示,4個GPU分為兩組,GPU0,1為一組模型并行,GPU2,3為另一組,每組模型并行在計算過程中交換輸出值和殘差。兩組GPU之間形成數(shù)據(jù)并行,Mini-batch結(jié)束后交換模型權(quán)重,考慮到模型的藍色部分由GPU0和GPU2持有,而黃色部分由GPU1和GPU3持有,因此只有同色的GPU之間需要交換權(quán)重。

6.4計算集群

搭建CPU集群用于深度神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練也是業(yè)界常用的解決方案,其優(yōu)勢在于利用大規(guī)模分布式計算集群的強大計算能力,利用模型可分布式存儲、參數(shù)可異步通信的特點,達到快速訓(xùn)練深層模型的目的。

CPU集群方案的基本架構(gòu)包含用于執(zhí)行訓(xùn)練任務(wù)的Worker、用于分布式存儲分發(fā)模型的參數(shù)服務(wù)器(Parameter Server)和用于協(xié)調(diào)整體任務(wù)的主控程序(Master)。CPU集群方案適合訓(xùn)練GPU內(nèi)存難以容納的大模型,以及稀疏連接神經(jīng)網(wǎng)絡(luò)。Andrew Ng和Jeff Dean在Google用1000臺CPU服務(wù)器,完成了模型并行和Downpour SGD數(shù)據(jù)并行的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練[17]。

結(jié)合GPU計算和集群計算技術(shù),構(gòu)建GPU集群正在成為加速大規(guī)模深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練的有效解決方案。GPU集群搭建在CPU-GPU系統(tǒng)之上,采用萬兆網(wǎng)卡或Infiniband等更加快速的網(wǎng)絡(luò)通信設(shè)施,以及樹形拓撲等邏輯網(wǎng)絡(luò)拓撲結(jié)構(gòu)。在發(fā)揮出單節(jié)點較高計算能力的基礎(chǔ)上,再充分挖掘集群中多臺服務(wù)器的協(xié)同計算能力,進一步加速大規(guī)模訓(xùn)練任務(wù)。

7 深度學(xué)習(xí)的軟件工具及平臺

目前,在深度學(xué)習(xí)系統(tǒng)實現(xiàn)方面,已有諸多較為成熟的軟件工具和平臺。

7.1 開源軟件

在開源社區(qū),主要有以下較為成熟的軟件工具:

Kaldi是一個基于C++和CUDA的語音識別工具集[18][19],提供給語音識別的研究人員使用。Kaldi中既實現(xiàn)了用單個GPU加速的深度神經(jīng)網(wǎng)絡(luò)SGD訓(xùn)練,也實現(xiàn)了CPU多線程加速的深度神經(jīng)網(wǎng)絡(luò)SGD訓(xùn)練。

Cuda-convnet基于C++/CUDA編寫,采用反向傳播算法的深度卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn)[20][21]。2012年cuda-convnet發(fā)布,可支持單個GPU上的訓(xùn)練,基于其訓(xùn)練的深度卷積神經(jīng)網(wǎng)絡(luò)模型在ImageNet LSVRC-2012對圖像按1000個類目分類,取得Top 5分類15%錯誤率的結(jié)果[2];2014年發(fā)布的版本可以支持多GPU上的數(shù)據(jù)并行和模型并行訓(xùn)練[22]。

Caffe提供了在CPU以及GPU上的快速卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn),同時提供訓(xùn)練算法,使用NVIDIA K40或Titan GPU可以1天完成多于40,000,000張圖片的訓(xùn)練[23][24]。

Theano提供了在深度學(xué)習(xí)數(shù)學(xué)計算方面的Python庫,它整合了NumPy矩陣計算庫,可以運行在GPU上,并提供良好的算法上的擴展性[25][26]。

OverFeat是由紐約大學(xué)CILVR實驗室開發(fā)的基于卷積神經(jīng)網(wǎng)絡(luò)系統(tǒng),主要應(yīng)用場景為圖像識別和圖像特征提取[27]。

Torch7是一個為機器學(xué)習(xí)算法提供廣泛支持的科學(xué)計算框架,其中的神經(jīng)網(wǎng)絡(luò)工具包(Package)實現(xiàn)了均方標準差代價函數(shù)、非線性激活函數(shù)和梯度下降訓(xùn)練神經(jīng)網(wǎng)絡(luò)的算法等基礎(chǔ)模塊,可以方便地配置出目標多層神經(jīng)網(wǎng)絡(luò)開展訓(xùn)練實驗[28]。

7.2 工業(yè)界平臺

在工業(yè)界,Google、Facebook、百度、騰訊等公司都實現(xiàn)了自己的軟件框架:

Google的DistBelief系統(tǒng)是CPU集群實現(xiàn)的數(shù)據(jù)并行和模型并行框架,集群內(nèi)使用上萬CPU core來訓(xùn)練多達10億參數(shù)的深度神經(jīng)網(wǎng)絡(luò)模型。DistBelief應(yīng)用的主要算法有Downpour SGD和L-BFGS,支持的目標應(yīng)用有語音識別和2.1萬類目的圖像分類[17]。

Google的COTS HPC系統(tǒng)是GPU實現(xiàn)的數(shù)據(jù)并行和模型并行框架,GPU服務(wù)器間使用了Infiniband連接,并由MPI控制通信。COTS可以用3臺GPU服務(wù)器在數(shù)天內(nèi)完成對10億參數(shù)的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練[29]。

Facebook實現(xiàn)了多GPU訓(xùn)練深度卷積神經(jīng)網(wǎng)絡(luò)的并行框架,結(jié)合數(shù)據(jù)并行和模型并行的方式來訓(xùn)練CNN模型,使用4張NVIDIA Titan GPU可在數(shù)天內(nèi)訓(xùn)練ImageNet的1000分類網(wǎng)絡(luò)[30]。

百度搭建了Paddle(Parallel Asynchonous Distributed Deep Learning)多機GPU訓(xùn)練平臺[31]。將數(shù)據(jù)分布到不同機器,通過Parameter Server協(xié)調(diào)各機器訓(xùn)練。Paddle支持數(shù)據(jù)并行和模型并行。

騰訊深度學(xué)習(xí)平臺(Mariana)是為加速深度學(xué)習(xí)模型訓(xùn)練而開發(fā)的并行化平臺,包括深度神經(jīng)網(wǎng)絡(luò)的多GPU數(shù)據(jù)并行框架,深度卷積神經(jīng)網(wǎng)絡(luò)的多GPU模型并行和數(shù)據(jù)并行框架,以及深度神經(jīng)網(wǎng)絡(luò)的CPU集群框架。Mariana基于特定應(yīng)用的訓(xùn)練場景,設(shè)計定制化的并行化訓(xùn)練平臺,支持了語音識別、圖像識別,并積極探索在廣告推薦中的應(yīng)用[32]。

8 總結(jié)

近年來人工智能領(lǐng)域掀起了深度學(xué)習(xí)的浪潮,從學(xué)術(shù)界到工業(yè)界都熱情高漲。深度學(xué)習(xí)嘗試解決人工智能中抽象認知的難題,從理論分析和應(yīng)用方面都獲得了很大的成功??梢哉f深度學(xué)習(xí)是目前最接近人腦的智能學(xué)習(xí)方法。

深度學(xué)習(xí)可通過學(xué)習(xí)一種深層非線性網(wǎng)絡(luò)結(jié)構(gòu),實現(xiàn)復(fù)雜函數(shù)逼近,并展現(xiàn)了強大的學(xué)習(xí)數(shù)據(jù)集本質(zhì)和高度抽象化特征的能力。逐層初始化等訓(xùn)練方法顯著提升了深層模型的可學(xué)習(xí)型。與傳統(tǒng)的淺層模型相比,深層模型經(jīng)過了若干層非線性變換,帶給模型強大的表達能力,從而有條件為更復(fù)雜的任務(wù)建模。與人工特征工程相比,自動學(xué)習(xí)特征,更能挖掘出數(shù)據(jù)中豐富的內(nèi)在信息,并具備更強的可擴展性。深度學(xué)習(xí)順應(yīng)了大數(shù)據(jù)的趨勢,有了充足的訓(xùn)練樣本,復(fù)雜的深層模型可以充分發(fā)揮其潛力,挖掘出海量數(shù)據(jù)中蘊含的豐富信息。強有力的基礎(chǔ)設(shè)施和定制化的并行計算框架,讓以往不可想象的訓(xùn)練任務(wù)加速完成,為深度學(xué)習(xí)走向?qū)嵱玫於藞詫嵉幕A(chǔ)。已有Kaldi,Cuda-convnet,Caffe等多個針對不同深度模型的開源實現(xiàn),Google、Facebook、百度、騰訊等公司也實現(xiàn)了各自的并行化框架。

深度學(xué)習(xí)引爆的這場革命,將人工智能帶上了一個新的臺階,不僅學(xué)術(shù)意義巨大,而且實用性很強,深度學(xué)習(xí)將成為一大批產(chǎn)品和服務(wù)背后強大的技術(shù)引擎。

我們是一群熱愛IT的年輕人,如果你也愛IT、愛移動端開發(fā),歡迎加入我們,讓我們共同為夢想發(fā)聲。

關(guān)注藍鷗(lanou3g),推送IT新知識與資訊,讓你每天進步一點點。

PS:喜歡你就點個贊,有用你就收進后宮,認識程序員你就轉(zhuǎn)發(fā)一下辣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 五、Deep Learning的基本思想 假設(shè)我們有一個系統(tǒng)S,它有n層(S1,…Sn),它的輸入是I,輸出是O,...
    dma_master閱讀 1,904評論 1 2
  • 文/老叟 如果我們能相遇 我會告訴你 關(guān)于一株花、一株草 詢問春天即將到來的消息 如果我們能相遇 請你不要悄悄的離...
    編輯鹿深閱讀 219評論 0 0
  • 晌午的太陽高高的掛在頂頭的天空,耀眼的光芒刺得人睜不開雙眼,大片大片的樹葉停留在半空中沒有一絲絲的擺動,火辣辣的空...
    小饅頭0601閱讀 241評論 1 2
  • 理解封裝 封裝是面向?qū)ο蟮娜筇卣髦唬硗鈨蓚€是繼承和多態(tài)),它將實例的狀態(tài)信息、實現(xiàn)細節(jié)隱藏在實例內(nèi)部,不允許...
    A_rcher34閱讀 842評論 0 1
  • 1NF::表中的列不可分割,如果有的列包含多種信息,可以把它抽取出來成為一個單獨的表:例如學(xué)生表中的所屬班級 2N...
    我不說你不懂_f0c6閱讀 856評論 1 4

友情鏈接更多精彩內(nèi)容