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

摘要

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

其圖像為

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

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

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

3 選擇深層模型的原因

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

3.1天然層次化的特征

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

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

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

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

3.3 特征的層次可表示性

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

這說(shuō)明可以通過(guò)有效的特征提取,將像素抽象成更高級(jí)的特征。類(lèi)似的結(jié)果也適用于語(yǔ)音特征。

4 從淺層模型到深層模型

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.4 淺層模型和深層模型的對(duì)比

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

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

5 深層模型的層次組件

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

5.1 自編碼器(Auto-Encoder)

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

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

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

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

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

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

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

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

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

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

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

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

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

如圖所示是Hinton的研究小組在ImageNet競(jìng)賽中使用的卷積神經(jīng)網(wǎng)絡(luò)[2],共有5個(gè)卷積層,每層分別有96,256,384,384和256個(gè)卷積核,每層卷積核的大小分別為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)元個(gè)數(shù)的設(shè)定,權(quán)重參數(shù)的初始化,學(xué)習(xí)率的調(diào)整,Mini-batch的控制等等。即便對(duì)這些技巧十分精通,實(shí)踐中也要多次訓(xùn)練,反復(fù)摸索嘗試。此外,深層模型參數(shù)多,計(jì)算量大,訓(xùn)練數(shù)據(jù)的規(guī)模也更大,需要消耗很多計(jì)算資源。如果可以讓訓(xùn)練加速,就可以在同樣的時(shí)間內(nèi)多嘗試幾個(gè)新主意,多調(diào)試幾組參數(shù),工作效率會(huì)明顯提升,對(duì)于大規(guī)模的訓(xùn)練數(shù)據(jù)和模型來(lái)說(shuō),更可以將難以完成的任務(wù)變成可能。這一節(jié)就談?wù)勆顚幽P偷挠?xùn)練加速方法。

6.1 GPU加速

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

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

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

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

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

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

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

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

6.3模型并行

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

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

6.4計(jì)算集群

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

CPU集群方案的基本架構(gòu)包含用于執(zhí)行訓(xùn)練任務(wù)的Worker、用于分布式存儲(chǔ)分發(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臺(tái)CPU服務(wù)器,完成了模型并行和Downpour SGD數(shù)據(jù)并行的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練[17]。

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

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

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

7.1 開(kāi)源軟件

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

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

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

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

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

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

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

7.2 工業(yè)界平臺(tái)

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

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

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

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

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

騰訊深度學(xué)習(xí)平臺(tái)(Mariana)是為加速深度學(xué)習(xí)模型訓(xùn)練而開(kāi)發(fā)的并行化平臺(tái),包括深度神經(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)練場(chǎng)景,設(shè)計(jì)定制化的并行化訓(xùn)練平臺(tái),支持了語(yǔ)音識(shí)別、圖像識(shí)別,并積極探索在廣告推薦中的應(yīng)用[32]。

8 總結(jié)

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

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

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

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

關(guān)注藍(lán)鷗(lanou3g),推送IT新知識(shí)與資訊,讓你每天進(jìn)步一點(diǎn)點(diǎn)。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

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