摘要: 深度學習能夠完成須要高度抽象特徵的人工智能任務,如語音識別、圖像識別和檢索、天然語言理解等。深層模型是包含多個隱藏層的人工神經網絡,多層非線性結構使其具有強大的特徵表達能力和對複雜任務建模能力。訓練深層模型是長期以來的難題,近年來以層次化、逐層初始化爲表明的一系列方法的提出給訓練深層模型帶來了但願,並在多個應用領域得到了成功。深層模型的並行化框架和訓練加速方法是深度學習走向實用的重要基石,已有多個針對不一樣深度模型的開源實現,Google、Facebook、百度、騰訊等公司也實現了各自的並行化框架。深度學習是目前最接近人腦的智能學習方法,深度學習引爆的這場革命,將人工智能帶上了一個新的臺階,將對一大批產品和服務產生深遠影響。php
深度學習採用的模型爲深層神經網絡(Deep Neural Networks,DNN)模型,即包含多個隱藏層(Hidden Layer,也稱隱含層)的神經網絡(Neural Networks,NN)。深度學習利用模型中的隱藏層,經過特徵組合的方式,逐層將原始輸入轉化爲淺層特徵,中層特徵,高層特徵直至最終的任務目標。html
深度學習源於人工神經網絡的研究,先來回顧一下人工神經網絡。一個神經元以下圖所式[15]:git
圖1 神經元結構github
這個神經元接受三個輸入x1,x2,x3,神經元輸出爲算法
h(W,b) (x)=f(∑(i=1)^3▒〖W_i x_i+b〗),編程
其中W1, W2, W3和b爲神經元的參數,f(z)稱爲激活函數,一種典型的激活函數爲Sigmoid函數,即f(z)=1/(1+e^(-z) )其圖像爲:服務器
圖2 Sigmoid函數圖像網絡
神經網絡則是多個神經元組成的網絡,一個簡單的神經網絡以下圖所示:數據結構
圖3 一個簡單的神經網絡架構
使用圓圈來表示神經網絡的輸入,標上「+1」的圓圈稱爲偏置節點,也就是截距項。神經網絡最左邊的一層叫作輸入層(本例中,有3個輸入單元,偏置單元不計);最右的一層叫作輸出層(本例中,輸出層有2個節點);中間的節點叫作隱藏層(本例中,有2個隱藏層,分別包含3個和2個神經元,偏置單元一樣不計),由於不能在訓練樣本集中觀測到它們的值。神經元網絡中的每一條連線對應一個鏈接參數,連線個數對應網絡的參數個數(本例共有4×3 + 4×2 +3×2=26個參數)。求解這個的神經網絡,須要(x(i),y(i))的樣本集,其中x(i)是3維向量,y(i)是2維向量。
上圖算是一個淺層的神經網絡,下圖是一個用於語音識別的深層神經網絡。具備1個輸入層,4個隱藏層和1個輸出層,相鄰兩層的神經元所有鏈接。
圖4 一種典型的深層神經網絡模型
爲何要構造包含這麼多隱藏層的深層網絡結構呢?背後有一些理論依據:
對於不少訓練任務來講,特徵具備自然的層次結構。以語音、圖像、文本爲例,層次結構大概以下表所示。
表1 幾種任務領域的特徵層次結構
以圖像識別爲例,圖像的原始輸入是像素,相鄰像素組成線條,多個線條組成紋理,進一步造成圖案,圖案構成了物體的局部,直至整個物體的樣子。不難發現,能夠找到原始輸入和淺層特徵之間的聯繫,再經過中層特徵,一步一步得到和高層特徵的聯繫。想要從原始輸入直接跨越到高層特徵,無疑是困難的。
圖5 人臉識別系統的多層結構和特徵表示 [7]
特徵的層次可表示性也獲得了證明。1995年先後,Bruno Olshausen和David Field[8]收集了不少黑白風景照,從這些照片中找到了400個16×16的基本碎片,而後從照片中再找到其餘一些一樣大小的碎片,但願將其餘碎片表示爲這400個基本碎片的線性組合,並使偏差儘量小,使用的碎片儘量少。表示完成後,再固定其餘碎片,選擇更合適的基本碎片組合優化近似結果。反覆迭代後,獲得了能夠表示其餘碎片的最佳的基本碎片組合。他們發現,這些基本碎片組合都是不一樣物體不一樣方向的邊緣線。
圖6 初級圖像特徵的提取和表示(Sparse Coding)(原圖由Andrew Ng提供)
這說明能夠經過有效的特徵提取,將像素抽象成更高級的特徵。相似的結果也適用於語音特徵。
前文談到了深層模型的結構和它的優點。事實上,深層模型具備強大的表達能力,並能夠像人類同樣有效提取高級特徵,並非新的發現。那麼爲何深層模型直到最近幾年纔開始獲得普遍的關注和應用呢?仍是從傳統的機器學習方法和淺層學習談起。
反向傳播算法(Back Propagation,BP算法)[11]是一種神經網絡的梯度計算方法。反向傳播算法先定義模型在訓練樣本上的代價函數,再求代價函數對於每一個參數的梯度。反向傳播算法巧妙的利用了下層神經元的梯度可由上層神經元的殘差導出的規律,求解的過程也正如算法的名字那樣,自上而下反向逐層計算,直至得到全部參數的梯度。反向傳播算法能夠幫助訓練基於統計的機器學習模型,從大量的訓練樣本中挖掘出統計規律,進而可對未標註的數據進行預測。這種基於統計的學習方法比起傳統的基於規則的方法具有不少優越性[16]。
上世紀八九十年代,人們提出了一系列機器學習模型,應用最爲普遍的包括支持向量機(Support Vector Machine,SVM)[12]和邏輯迴歸(Logistic Regression,LR)[13],這兩種模型分別能夠看做包含1個隱藏層和沒有隱藏層的淺層模型。訓練時能夠利用反向傳播算法計算梯度,再用梯度降低方法在參數空間中尋找最優解。淺層模型每每具備凸代價函數,理論分析相對簡單,訓練方法也容易掌握,取得了不少成功的應用。
淺層模型的侷限性在於有限參數和計算單元,對複雜函數的表示能力有限,針對複雜分類問題其泛化能力受到必定的制約。深層模型偏偏能夠克服淺層模型的這一弱點,然而應用反向傳播和梯度降低來訓練深層模型,就面臨幾個突出的問題[10]:
1.梯局部最優。與淺層模型的代價函數不一樣,深層模型的每一個神經元都是非線性變換,代價函數是高度非凸函數,採用梯度降低的方法容易陷入局部最優。
2.梯度彌散。使用反向傳播算法傳播梯度的時候,隨着傳播深度的增長,梯度的幅度會急劇減少,會致使淺層神經元的權重更新很是緩慢,不能有效學習。這樣一來,深層模型也就變成了前幾層相對固定,只能改變最後幾層的淺層模型。
3.數據獲取。深層模型的表達能力強大,模型的參數也相應增長。對於訓練如此多參數的模型,小訓練數據集是不能實現的,須要海量的有標記的數據,不然只能致使嚴重的過擬合(Over fitting)。
儘管挑戰很大,Hinton教授並無放棄努力,他30年來一直從事相關研究,終於有了突破性的進展。2006年,他在《Science》上發表了一篇文章[1],掀起了深度學習在學術界和工業界的浪潮。這篇文章的兩個主要觀點是:
1.多隱藏層的人工神經網絡具備優異的特徵學習能力,學習到的特徵對數據有更本質的刻畫,從而有利於可視化或分類。
2.深度神經網絡在訓練上的難度,能夠經過「逐層初始化」(Layer-wise Pre-training)來有效克服,文中給出了無監督的逐層初始化方法。
優異的特徵刻畫能力前文已經提到,再也不累述,下面重點解釋一下「逐層初始化」的方法。
圖7 逐層初始化的方法(原圖由Marc’Aurelio Ranzato提供)
給定原始輸入後,先要訓練模型的第一層,即圖中左側的黑色框。黑色框能夠看做是一個編碼器,將原始輸入編碼爲第一層的初級特徵,能夠將編碼器看做模型的一種「認知」。爲了驗證這些特徵確實是輸入的一種抽象表示,且沒有丟失太多信息,須要引入一個對應的解碼器,即圖中左側的灰色框,能夠看做模型的「生成」。爲了讓認知和生成達成一致,就要求原始輸入經過編碼再解碼,能夠大體還原爲原始輸入。所以將原始輸入與其編碼再解碼以後的偏差定義爲代價函數,同時訓練編碼器和解碼器。訓練收斂後,編碼器就是咱們要的第一層模型,而解碼器則再也不須要了。這時咱們獲得了原始數據的第一層抽象。固定第一層模型,原始輸入就映射成第一層抽象,將其看成輸入,如法炮製,能夠繼續訓練出第二層模型,再根據前兩層模型訓練出第三層模型,以此類推,直至訓練出最高層模型。
逐層初始化完成後,就能夠用有標籤的數據,採用反向傳播算法對模型進行總體有監督的訓練了。這一步可看做對多層模型總體的精細調整。因爲深層模型具備不少局部最優解,模型初始化的位置將很大程度上決定最終模型的質量。「逐層初始化」的步驟就是讓模型處於一個較爲接近全局最優的位置,從而得到更好的效果。
表2 淺層模型和深層模型的對比
淺層模型有一個重要的特色,須要依靠人工經驗來抽取樣本的特徵,模型的輸入是這些已經選取好的特徵,模型只用來負責分類和預測。在淺層模型中,最重要的每每不是模型的優劣,而是特徵的選取的優劣。所以大多數人力都投入到特徵的開發和篩選中來,不但須要對任務問題領域有深入的理解,還要花費大量時間反覆實驗摸索,這也限制了淺層模型的效果。
事實上,逐層初始化深層模型也能夠看做是特徵學習的過程,經過隱藏層對原始輸入的一步一步抽象表示,來學習原始輸入的數據結構,找到更有用的特徵,從而最終提升分類問題的準確性。在獲得有效特徵以後,模型總體訓練也能夠水到渠成。
深層模型是包含多個隱藏層的神經網絡,每一層的具體結構又是怎樣的呢?本節介紹一些常見的深層模型基本層次組件。
一種常見的深層模型是由自編碼器(Auto-Encoder)構造的[15]。自編碼器能夠利用一組無標籤的訓練數據{x(1), x(2), … }(其中x(i)是一個n維向量)進行無監督的模型訓練。它採用反向傳播算法,讓目標值接近輸入值。下圖是一個自編碼器的示例:
圖8 自編碼器
自編碼器嘗試訓練一個恆等函數,讓輸出接近等於輸入值,恆等函數看似沒有學習的意義,但考慮到隱藏層神經元的數目(本例中爲3個)小於輸入向量的維數(本例中爲6維),事實上隱藏層就變成了輸入數據的一種壓縮的表示,或說是抽象的簡化表示。若是網絡的輸入是徹底隨機的,將高維向量壓縮成低維向量會難以實現。但訓練數據每每隱含着特定的結構,自編碼器就會學到這些數據的相關性,從而獲得有效的壓縮表示。實際訓練後,若是代價函數越小,就說明輸入和輸出越接近,也就說明這個編碼器越靠譜。固然,自編碼器訓練完成後,實際使用時只須要它的前一層,即編碼部分,解碼部分就沒用了。
稀疏自編碼器(Sparse Auto-Encoder)是自編碼器的一個變體,它在自編碼器的基礎上加入正則化(Regularity)。正則化是在代價函數中加入抑制項,但願隱藏層節點的平均激活值接近於0,有了正則化的約束,輸入數據能夠用少數隱藏節點表達。之因此採用稀疏自編碼器,是由於稀疏的表達每每比稠密的表達更有效,人腦神經系統也是稀疏鏈接,每一個神經元只與少數神經元鏈接。
降噪自編碼器是另外一種自編碼器的變體。經過在訓練數據中加入噪聲,可訓練出對輸入信號更加魯棒的表達,從而提高模型的泛化能力,能夠更好地應對實際預測時夾雜在數據中的噪聲。
獲得自編碼器後,咱們還想進一步瞭解自編碼器到底學到了什麼。例如,在10×10的圖像上訓練一個稀疏自編碼器,而後對於每一個隱藏神經元,找到什麼樣的圖像可讓隱藏神經元得到最大程度的激勵,即這個隱藏神經元學習到了什麼樣的特徵。將100個隱藏神經元的特徵都找出來,獲得了以下100幅圖像:
圖9 自編碼器的隱藏神經元 [15]
能夠看出,這100幅圖像具有了從不一樣方向檢測物體邊緣的能力。顯然,這樣的能力對後續的圖像識別頗有幫助。
受限玻爾茲曼機(Restricted Boltzmann Machine, RBM)是一個二部圖,一層是輸入層(v),另外一層是隱藏層(h),假設全部節點都是隨機二值變量節點,只能取值0或1,同時假設全機率分佈p(v, h)知足Boltzmann分佈。
圖10受限玻爾茲曼機(RBM)
因爲同層節點之間沒有鏈接,所以已知輸入層的狀況下,隱藏層的各節點是條件獨立的;反之,已知隱藏層的狀況下,輸入層各節點也是條件獨立的。同時,能夠根據Boltzmann分佈,當輸入v時經過p(h|v)生成隱藏層,獲得隱藏層以後再經過p(v|h)生成輸入層。相信不少讀者已經猜到了,能夠按照訓練其餘網絡相似的思路,經過調整參數,但願經過輸入v生成的h,再生成的v’與v儘量接近,則說明隱藏層h是輸入層v的另一種表示。這樣就能夠做爲深層模型的基本層次組件了。所有用RBM造成的深層模型爲深度玻爾茲曼機(Deep Boltzmann Machine,DBM)。若是將靠近輸入層的部分替換爲貝葉斯信念網絡,即有向圖模型,而在遠離輸入層的部分仍然使用RBM,則稱爲深度信念網絡(Deep Belief Networks,DBN)。
以上介紹的編碼器都是全連通網絡,能夠完成10×10的圖像識別,如手寫體數字識別問題。然而對於更大的圖像,如100×100的圖像,若是要學習100個特徵,則須要1,000,000個參數,計算時間會大大增長。解決這種尺寸圖像識別的有效方法是利用圖像的局部性,構造一個部分聯通的網絡。一種最多見的網絡是卷積神經網絡(Convolutional Neural Networks,CNN)[19][20],它利用圖像固有的特性,即圖像局部的統計特性與其餘局部是同樣的。所以從某個局部學習來的特徵一樣適用於另外的局部,對於這個圖像上的全部位置,都能使用一樣的特徵。
具體地說,假設有一幅100×100的圖像,要從中學習一個10×10的局部圖像特徵的神經元,若是採用全鏈接的方式,100×100維的輸入到這個神經元須要有10000個鏈接權重參數。而採用卷積核的方式,只有10×10=100個參數權重,卷積核能夠看做一個10×10的小窗口,在圖像上上下左右移動,走遍圖像中每一個10×10的位置(共有91×91個位置)。每移動到一個位置,則將該位置的輸入與卷積覈對應位置的參數相乘再累加,獲得一個輸出值(輸出值是91×91的圖像)。卷積核的特色是鏈接數雖然不少,有91×91×10×10個鏈接,可是參數只有10×10=100個,參數數目大大減少,訓練也變得容易了,而且不容易產生過擬合。固然,一個神經元只能提取一個特徵,要提取多個特徵就要多個卷積核。
下圖揭示了對一幅8×8維圖像使用卷積方法提取特徵的示意過程。其中使用了3×3的卷積核,走遍圖像中每一個3×3的位置後,最終獲得6×6維的輸出圖像:
圖11 8×8圖像的卷積過程示意
圖12 用戶圖像分類的卷積神經網絡
如圖所示是Hinton的研究小組在ImageNet競賽中使用的卷積神經網絡[3],共有5個卷積層,每層分別有96,256,384,384和256個卷積核,每層卷積核的大小分別爲11×11,5×5,3×3,3×3和3×3。網絡的最後兩層是全鏈接層。
深層模型訓練須要各類技巧,例如網絡結構的選取,神經元個數的設定,權重參數的初始化,學習率的調整,Mini-batch的控制等等。即使對這些技巧十分精通,實踐中也要屢次訓練,反覆摸索嘗試。此外,深層模型參數多,計算量大,訓練數據的規模也更大,須要消耗不少計算資源。若是可讓訓練加速,就能夠在一樣的時間內多嘗試幾個新主意,多調試幾組參數,工做效率會明顯提高,對於大規模的訓練數據和模型來講,更能夠將難以完成的任務變成可能。這一節就談談深層模型的訓練加速方法。
矢量化編程是提升算法速度的一種有效方法。爲了提高特定數值運算操做(如矩陣相乘、矩陣相加、矩陣-向量乘法等)的速度,數值計算和並行計算的研究人員已經努力了幾十年。矢量化編程強調單一指令並行操做多條類似數據,造成單指令流多數據流(SIMD)的編程泛型。深層模型的算法,如BP,Auto-Encoder,CNN等,均可以寫成矢量化的形式。然而,在單個CPU上執行時,矢量運算會被展開成循環的形式,本質上仍是串行執行。
GPU(Graphic Process Units,圖形處理器)的衆核體繫結構包含幾千個流處理器,可將矢量運算並行化執行,大幅縮短計算時間。隨着NVIDIA、AMD等公司不斷推動其GPU的大規模並行架構支持,面向通用計算的GPU(General-Purposed GPU, GPGPU)已成爲加速可並行應用程序的重要手段。得益於GPU衆核(many-core)體系結構,程序在GPU系統上的運行速度相較於單核CPU每每提高几十倍乃至上千倍。目前GPU已經發展到了較爲成熟的階段,受益最大的是科學計算領域,典型的成功案例包括多體問題(N-Body Problem)、蛋白質分子建模、醫學成像分析、金融計算、密碼計算等。
利用GPU來訓練深度神經網絡,能夠充分發揮其數以千計計算核心的高效並行計算能力,在使用海量訓練數據的場景下,所耗費的時間大幅縮短,佔用的服務器也更少。若是對針對適當的深度神經網絡進行合理優化,一塊GPU卡可至關於數十甚至上百臺CPU服務器的計算能力,所以GPU已經成爲業界在深度學習模型訓練方面的首選解決方案。
數據並行是指對訓練數據作切分,同時採用多個模型實例,對多個分片的數據並行訓練。
圖13 數據並行的基本架構 [17]
要完成數據並行須要作參數交換,一般由一個參數服務器(Parameter Server)來幫助完成。在訓練的過程當中,多個訓練過程相互獨立,訓練的結果,即模型的變化量ΔW須要彙報給參數服務器,由參數服務器負責更新爲最新的模型W’ = W – η ∙ ΔW,而後再將最新的模型W’分發給訓練程序,以便重新的起點開始訓練。
數據並行有同步模式和異步模式之分。同步模式中,全部訓練程序同時訓練一個批次的訓練數據,完成後通過同步,再同時交換參數。參數交換完成後全部的訓練程序就有了共同的新模型做爲起點,再訓練下一個批次。而異步模式中,訓練程序完成一個批次的訓練數據,當即和參數服務器交換參數,不考慮其餘訓練程序的狀態。異步模式中一個訓練程序的最新結果不會馬上體如今其餘訓練程序中,直到他們進行下次參數交換。
參數服務器只是一個邏輯上的概念,不必定部署爲獨立的一臺服務器。有時候它會附屬在某一個訓練程序上,有時也會將參數服務器按照模型劃分爲不一樣的分片,分別部署。
模型並行將模型拆分紅幾個分片,由幾個訓練單元分別持有,共同協做完成訓練。當一個神經元的輸入來自另外一個訓練單元上的神經元的輸出時,產生通訊開銷。
圖14 模型並行的基本架構 [17]
多數狀況下,模型並行帶來的通訊開銷和同步消耗超過數據並行,所以加速比也不及數據並行。但對於單機內存沒法容納的大模型來講,模型並行是一個很好的選擇。使人遺憾的是,數據並行和模型並行都不能無限擴展。數據並行的訓練程序太多時,不得不減少學習率,以保證訓練過程的平穩;模型並行的分片太多時,神經元輸出值的交換量會急劇增長,效率大幅降低。所以,同時進行模型並行和數據並行也是一種常見的方案。以下圖所示,4個GPU分爲兩組,GPU0,1爲一組模型並行,GPU2,3爲另外一組,每組模型並行在計算過程當中交換輸出值和殘差。兩組GPU之間造成數據並行,Mini-batch結束後交換模型權重,考慮到模型的藍色部分由GPU0和GPU2持有,而黃色部分由GPU1和GPU3持有,所以只有同色的GPU之間須要交換權重。
圖15 4GPU卡的數據並行和模型並行混合架構
搭建CPU集羣用於深度神經網絡模型訓練也是業界經常使用的解決方案,其優點在於利用大規模分佈式計算集羣的強大計算能力,利用模型可分佈式存儲、參數可異步通訊的特色,達到快速訓練深層模型的目的。
CPU集羣方案的基本架構包含用於執行訓練任務的Worker、用於分佈式存儲分發模型的參數服務器(Parameter Server)和用於協調總體任務的主控程序(Master)。CPU集羣方案適合訓練GPU內存難以容納的大模型,以及稀疏鏈接神經網絡。Andrew Ng和Jeff Dean在Google用1000臺CPU服務器,完成了模型並行和Downpour SGD數據並行的深度神經網絡訓練[17]。
結合GPU計算和集羣計算技術,構建GPU集羣正在成爲加速大規模深度神經網絡訓練的有效解決方案。GPU集羣搭建在CPU-GPU系統之上,採用萬兆網卡或Infiniband等更加快速的網絡通訊設施,以及樹形拓撲等邏輯網絡拓撲結構。在發揮出單節點較高計算能力的基礎上,再充分挖掘集羣中多臺服務器的協同計算能力,進一步加速大規模訓練任務。
[1] Geoffery E. Hinton, Salakhutdinov RR. Reducing the dimensionality of data with neural networks. Science. 2006 Jul 28;313(5786):504-7.
[2] Geoffrey E. Hinton, Simon Osindero, Yee-Whye Teh, A fast learning algorithm for deep belief nets Neural Compute, 18(7), 1527-54 (2006)
[3] ImageNet Classification with Deep Convolutional Neural Networks, Alex Krizhevsky, Ilya Sutskever, Geoffrey E Hinton, NIPS 2012.
[4] Q.V. Le, M.A. Ranzato, R. Monga, M. Devin, K. Chen, G.S. Corrado, J. Dean, A.Y. Ng. Building high-level features using large scale unsupervised learning. ICML, 2012.
[5] Rick Rashid, Speech Recognition Breakthrough for the Spoken, Translated Wordhttp://http://www.youtube.com/watch?v=Nu-nlQqFCKg
[6] NYU 「Deep Learning」 Professor LeCun Will Lead Facebook’s New Artificial Intelligence Lab. http://techcrunch.com/2013/12/09/facebook-artificial-intelligence-lab-lecun/
[7] A Primer on Deep Learning
http://www.datarobot.com/blog/a-primer-on-deep-learning/
[8] Bruno A. Olshausen & David J. Field, Emergence of simple-cell receptive field properties by learning a sparse code for natural images. Nature. Vol 381. 13 June, 1996http://www.cs.ubc.ca/~little/cpsc425/olshausen_field_nature_1996.pdf
[9] Andrew Ng. Machine Learning and AI via Brain simulations,
https://forum.stanford.edu/events/2011slides/plenary/2011plenaryNg.pdf
[10] Deep Networks Overviewhttp://ufldl.stanford.edu/wiki/index.php/Deep_Networks:_Overview
[11] Back propagation algorithmhttp://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm
[12] Support Vector Machine http://en.wikipedia.org/wiki/Support_vector_machine
[13] Logistic Regression http://en.wikipedia.org/wiki/Logistic_regression
[14] The Nobel Prize in Physiology or Medicine 1981.http://www.nobelprize.org/nobel_prizes/medicine/laureates/1981/
[15] Stanford deep learning tutorial
http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial
[16] 餘凱,深度學習-機器學習的新浪潮,Technical News程序天下事http://blog.csdn.net/datoubo/article/details/8577366
[17] Dean, J., Corrado, G.S., Monga, R., et al, Ng, A. Y. Large Scale Distributed Deep Networks. In Proceedings of the Neural Information Processing Systems (NIPS’12) (Lake Tahoe, Nevada, United States, December 3–6, 2012). Curran Associates, Inc, 57 Morehouse Lane, Red Hook, NY, 2013, 1223-1232.
[18] Geoffrey Hinton:UCLTutorial on: Deep Belief Nets
[19] Y. LeCun and Y. Bengio. Convolutional networks for images, speech, and time-series. In M. A. Arbib, editor, The Handbook of Brain Theory and Neural Networks. MIT Press, 1995
[20] Introduction to Convolutional neural networkhttp://en.wikipedia.org/wiki/Convolutional_neural_network
[21] Krizhevsky, Alex. 「ImageNet Classification with Deep Convolutional Neural Networks」. Retrieved 17 November 2013.
[22] Kaldi project http://kaldi.sourceforge.net/
[23] Povey, D., Ghoshal, A. Boulianne, G., et al, Vesely, K. Kaldi. The Kaldi Speech Recognition Toolkit. in Proceedings of IEEE 2011 Workshop on Automatic Speech Recognition and Understanding(ASRU 2011) (Hilton Waikoloa Village, Big Island, Hawaii, US, December 11-15, 2011). IEEE Signal Processing Society. IEEE Catalog No.: CFP11SRW-USB.
[24] cuda-convent https://code.google.com/p/cuda-convnet/
[25] Krizhevsky, A., Sutskever, I., and Hinton, G.E. ImageNet Classification with Deep Convolutional Neural Networks. In Proceedings of the Neural Information Processing Systems (NIPS’12) (Lake Tahoe, Nevada, United States, December 3–6, 2012). Curran Associates, Inc, 57 Morehouse Lane, Red Hook, NY, 2013, 1097-1106.
[26] Krizhevsky, A. Parallelizing Convolutional Neural Networks. in tutorial of IEEE Conference on Computer Vision and Pattern Recognition (CVPR 2014). (Columbus, Ohio, USA, June 23-28, 2014). 2014.
[27] caffe http://caffe.berkeleyvision.org/
[28] Jia, Y. Q. Caffe: An Open Source Convolutional Architecture for Fast Feature Embedding. http://caffe.berkeleyvision.org (2013).
[29] Theano https://github.com/Theano/Theano
[30] J. Bergstra, O. Breuleux, F. Bastien, P. Lamblin, R. Pascanu, G. Desjardins, J. Turian, D. Warde-Farley and Y. Bengio. Theano: A CPU and GPU Math Expression Compiler. Proceedings of the Python for Scientific Computing Conference (SciPy) 2010. June 30 - July 3, Austin, TX.
[31] Overfeat http://cilvr.nyu.edu/doku.php?id=code:start
[32] Torch7 http://torch.ch
[33] Coates, A., Huval, B., Wang, T., Wu, D. J., Ng, A. Y. Deep learning with COTS HPC systems. In Proceedings of the 30th International Conference on Machine Learning (ICML’13) (Atlanta, Georgia, USA, June 16–21, 2013). JMLR: W&CP volume 28(3), 2013, 1337-1345.
[34] Yadan, O., Adams, K., Taigman, Y., Ranzato, M. A. Multi-GPU Training of ConvNets. arXiv:1312.5853v4 [cs.LG] (February 2014)
[35] Kaiyu, Large-scale Deep Learning at Baidu, ACM International Conference on Information and Knowledge Management (CIKM 2013)
[36] aaronzou, Mariana深度學習在騰訊的平臺化和應用實踐
[37] 「Convolutional Neural Networks (LeNet) - DeepLearning 0.1 documentation」. DeepLearning 0.1. LISA Lab. Retrieved 31 August 2013.
[38] Bengio, Learning Deep Architectures for AI,http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf;
[39] Deep Learning http://deeplearning.net/
[40] Deep Learning http://www.cs.nyu.edu/~yann/research/deep/
[41] Introduction to Deep Learning. http://en.wikipedia.org/wiki/Deep_learning
[42] Google的貓臉識別:人工智能的新突破http://www.36kr.com/p/122132.html
[43] Andrew Ng’s talk video: http://techtalks.tv/talks/machine-learning-and-ai-via-brain-simulations/57862/
[44] Invited talk 「A Tutorial on Deep Learning」 by Dr. Kai Yu
http://vipl.ict.ac.cn/News/academic-report-tutorial-deep-learning-dr-kai-yu