前面咱們分享過如何簡單形象的理解神經網絡是什麼。git
今天咱們接着學習 8 個重要的神經網絡架構,並簡單解讀它們的原理和適用範圍。github
關於機器學習方面的學習資源,Geoffrey Hinton 的《機器學習中的神經網絡》是不少人必看的內容。Geoffrey Hinton 是深度學習理論無可爭議的教父級人物,而他在這門課裏也確實講了不少實實在在的知識。程序猿 James Le 小夥就認真學習了這門課程,並分享了他的學習筆記,將 Hinton 在課程中講解的 8 種神經網絡架構進行了總結,正在學習或即將入坑機器學習的小夥伴千萬不要錯過這篇乾貨,若是喜歡這類學習筆記的話別忘了收藏和點贊,咱們會增長這類文章的發佈。算法
總的來講,神經網絡架構能夠具體分紅 3 類:數據庫
前饋神經網絡是實際應用中神經網絡最爲常見的一種。其第一層是輸入層,最後一層爲輸出層,中間爲隱藏層。若是隱藏層有不少個,咱們就稱之爲「深度」神經網絡。它們會進行一系列的轉換運算,改變兩個案例的類似之處。每一層中神經元的活動都是下面一層神經元活動的一個非線性函數。編程
循環網絡表如今鏈接圖上時,包含一些定向循環,也是就說,有時你沿着箭頭前進會回到開始的地方。循環網絡還有不少複雜的動態變化,這讓它們很難訓練。它們更接近人腦的神經網絡。網絡
目前,尋找訓練神經網絡的有效方法有不少有趣的研究。循環神經網絡是爲序列數據建模的一種很是天然的方式。它們至關於一種很是深的深度網絡,每一個時隙都有一個隱藏層;只是它們在每一個時隙使用相同的權重值,也在每一個時隙得到輸入信息。循環神經網絡可以在隱藏狀態下長時間記住信息,當要想訓練它們使用這種潛力是很是困難的。架構
這種網絡和循環神經網絡有些類似,但單元之間的鏈接是對稱的(它們在兩個方向上有相同的權重)。對稱網絡分析起來,比循環神經網絡要容易的多。它們的用途也有更多的限制,由於它們按照能量函數運行。沒有隱藏單元的對稱鏈接網絡稱爲「Hopfield 網絡」,有隱藏單元的則稱爲「玻爾茲曼機」(Boltzmann machine)。機器學習
下面咱們具體看看都有哪 8 種神經網絡架構:分佈式
第一代神經網絡感知機只是僅有一個神經元的簡單計算模型。上世紀60年代,Frank Rosenblatt 讓感知機開始流行。這種神經網絡有很是強大的學習算法。1969 年,Minsky 和Papers 出版了一本書叫《感知機》,分析了感知機能作什麼及其侷限性。不少人認爲全部的神經網絡都有這些侷限性。然而,感知機的學習程序直到今天仍然普遍應用於不少任務中,其數量衆多的特徵向量包含幾百萬個特徵。函數
在統計模型識別的標準範式中,咱們首先將原始輸入向量轉換爲特徵激活的向量,而後用依據常識的手寫程序去定義這些特徵。接着,咱們學習怎樣爲每一個特徵激活賦予權重,得到一個單個數量(scalar quantity)。若是這個數量大於某個闕值,咱們就決定該輸入向量爲目標類的正例。
標準的感知機架構屬於一種簡單的前饋網絡,也就是說輸入信息被傳入神經元中,通過處理後,生成一個輸出結果。在下方圖表中,意味着神經網絡自下而上讀值:輸入信息來自底部,輸出值從頂部輸出。
然而,感知機也有些侷限性:若是你選擇手動選擇特徵,並且使用足夠多的特徵,你幾乎能夠作任何事情。對於二進制輸入向量,每一個指數級二進制向量都會有單獨的特徵單元, 這樣以來,咱們能夠對二進制輸入向量作出任何可能的判別。可是一旦手動編寫的特徵肯定之後,感知機能學什麼內容就有了很強的侷限性。
對於感知機來講這種結果是災難性的,由於模式識別的關鍵就是無論轉換情況如何都能識別模式。Minsky 等人的「羣體不變性理論」指出,若是轉換造成一個羣組,進行學習的感知機的一部分就沒法學習識別模式。要處理這種轉換形式,感知機須要使用多個特徵單元識別提供信息的子模式的轉換。所以,模式識別中比較棘手的部分必須由手動編寫的特徵檢測器完成,而不是學習。
沒有隱藏單元的神經網絡在它們爲輸入輸出映射建模方面頗有侷限性。線性單元的層再多也沒有做用,它依然是線性的。光解決輸出的非線性是不夠的。這樣以來,咱們須要自適應非線性隱藏單元的多個層。但咱們怎樣訓練這種神經網絡呢?咱們須要一種有效的方法來適應全部層而不只僅是最後一層的權重。這很難作到。學習傳入隱藏單元的權重,至關於學習特徵。這比較難作到,由於沒有人能直接告訴咱們隱藏單元該怎麼作。
機器學習研究一直都比較關注對象檢測問題,我站也曾發過這麼一篇如何用卷積神經網絡提取圖像特徵。
識別對象存在困難有以下幾個因素:
分割:真實場景經常都混滿了其它對象。很難分辨哪些碎片應該組到一塊兒,是同一對象的一部分。一個對象的某個部分會隱藏在其它對象後面。
光線:光線和對象同樣能決定像素的強度。
變形:對象可能會以多種非仿射的方式變形,例如手寫字體會有很大的迴路或者僅僅一個尖點。
可供性:對象分類經常由它們的使用方式決定。例如,椅子是用來坐的,所以它們有不少種物理形狀。
視角:視角的改變會致使圖像出現變更,標準的學習方法就沒法應付這種狀況。信息會在輸入維度(例如像素)之間出現跳躍。
你能想象有一個醫療數據庫,其中一個患者的名字有時跳躍至一般爲權重提供代碼的輸入維度中麼!要想應用機器學習,咱們首先得消除這種維度跳躍問題。
神經網絡目前解決對象檢測問題的主流方式就是複製特徵法。這種方法利用有不一樣位置的同一特徵檢測器的多個不一樣副本。它也能在縮放和取向中複製,但比較棘手,成本較高。複製能大幅減小神經網絡須要學習的自由參數的數量。其利用幾個不一樣的特徵類型,每一個類型都有對複製檢測器的映射。它一樣也能讓每批圖像以不一樣的方式表示。
那麼,複製特徵檢測器能獲得什麼?
對等活動:複製的特徵並不會讓神經活動對轉移保持不變,活動是對等的。
不變性:若是訓練期間一個特徵在許多位置有用,那麼該特徵的檢測器訓練期間適用於全部位置。
1998年,Yann LeCun 及其同事研發出了一個能很好地識別手寫字體的網絡,叫作 LeNet。該神經網絡是一種前饋網絡,利用「反向傳播法」,有不少隱藏層,每一層的複製單元有不少映射,鄰近複製單元的輸出進行了池化。若是幾個特徵重疊,這種網絡能每次處理多個特徵,是訓練一個完整系統的一種很聰明的方法,而非僅僅是個識別器。後來,LeNet 通過優化後更名爲卷積神經網絡。有個有趣的事情:現在北美大約10%的支票都是由這種網絡檢查。
卷積神經網絡能夠用於關於對象識別的全部工做,從識別手寫體到 3D 物體等。然而,識別從網上下載的彩色照片中的真正對象要比識別手寫字體複雜的多:類別增長了幾百倍,像素也增長了幾百倍,各類場景混在一塊兒須要進行分割,2 維照片和 3 維照片的場景混在一塊兒,每張圖像中存在多個對象等。那麼使用同一種卷積神經網絡會有效果嗎?
接着是著名的 ImageNet 圖像識別大賽,ImageNet 是個龐大的圖像數據集,包含了大約 120 萬張高分辨率的訓練圖像。參加比賽的測試圖像會表示爲沒有原始註釋(即沒有分割或標籤)的形式,算法也必須生成具體的標籤,代表圖像中是什麼對象。來自哈佛等多家頂尖機構的計算機視覺研究團隊前後在 ImageNet 上測試了現今最厲害的計算機視覺方法。一般,計算機視覺系統使用複雜的多級系統,初級的層級一般要進行手動調整,優化一些參數。
2012 年 ImageNet 大賽的獲勝者 Alex Krizhevsky 研發出一種很是深層的卷積神經網絡 AlexNet 。其架構包括7個隱藏層,還有數不清的最大池化層。初級層都是卷積層,最後兩個層是全鏈接層。每一個隱藏層中的激活函數都是修正線性單元。這些函數讓訓練速度大幅提高,也比邏輯函數更有表現力。此外,當鄰近單元有較強的活動時,這種神經網絡還使用有競爭性的標準化方法壓縮隱藏活動,這有助於改變強度。
有一些技巧,大幅改善了該神經網絡的過擬合問題:
從 256 X 256 圖像中選取 224 X 224 patch隨機訓練,以獲取更多訓練數據,並將這些圖像水平翻轉。在測試中,將 10 個不一樣 patch 的狀況進行組合:4角+中間,再翻轉。
使用 Dropout 將全鏈接層(其包含了大部分參數)的權重正則化。Dropout 意思是針對每一個訓練樣本,將一個層級中一半的隱藏單元隨機移除。這能阻止隱藏單元不過分依賴其餘隱藏單元。
至於所需的硬件,Alex 在英偉達 GTX 580 GPU 上部署了卷積神經網絡。GPU 很是適合矩陣相乘,同時也有很高的存儲帶寬。這讓 Alex 一週內就訓練完了這個網絡,在測試中能迅速融合來自 10 個 patch 的結果。隨着芯片愈來愈便宜,數據集愈來愈大,大型的神經網絡會比老式的計算機視覺系統更快的優化。
要想理解循環神經網絡,咱們須要簡要概述一下序列建模。當在序列中應用機器學習時,咱們經常想將一個輸入序列變成一個不一樣域中的輸出序列,例如,將聲壓的一個序列變成詞彙特性的一個序列。沒有單獨的目標序列時,咱們能夠經過嘗試預測輸入序列中的下一個項來獲取一個教學信號。目標輸出序列是前一步的輸入序列。這比從其它像素中預測一個像素,或者從其他照片中預測一張照片的一個 patch 要天然多了。預測序列中的下一個項時,監督式學習和非監督式學習之間的差異就比較模糊了。它使用用於監督式學習的方法,卻不須要一個單獨的教學信號。
完成這項任務的標準方法是使用無記憶模型。具體來講,自迴歸模型能從固定數量的先前的項中預測序列中的下一個項。前饋神經網絡就是一種廣義的自迴歸模型,使用一個或多個非線性隱藏單元的層。然而,若是咱們給生成模型一些隱含狀態,且隱含狀態有本身的內部動力,那麼咱們會獲得一個更有趣的模型: 它可以在其隱含狀態中長時間存儲信息。若是這些內部動力有噪音,由隱含狀態產生輸出的方式也有噪音,那麼咱們會永遠沒法得知隱含狀態的具體狀況。最好的方式就是推斷全部可能的隱含狀態向量所在的空間的機率分佈,但這種方法僅易於處理兩種類型的隱含狀態模型。循環神經網絡很是強大,由於它們包含 2 個屬性:
分佈式的隱含狀態讓它們能有效存儲過去的大量信息
非線性動力能讓它們以複雜的方式更新自身隱含狀態。
若是有足夠的神經元和時間,循環神經網絡能計算任何能被你的電腦計算的東西。那麼循環神經網絡會表現哪些行爲呢?它們會來回擺動,會指出「吸引子」(attractors),運行會比較混亂。循環神經網絡也能潛在學習應用不少小型程序,它們並行運行,相互協做產生很是複雜的效應。
然而,循環神經網絡的複雜性也讓它們很難訓練。由於梯度會迅速大幅增加或消失的問題,要想訓練一個循環神經網絡至關困難。當咱們經過不少層反向傳播時,梯度的幅度會發生什麼情況呢?若是權重很小,梯度會呈指數級收縮;若是權重很大,梯度會呈指數級增大。
典型的前饋神經網絡能應付這些指數級的效應,由於它們只有不多的隱藏層。然而,在用長序列訓練的循環神經網絡中,梯度很容易急速增大或消失。即使是有很好的初始權重,根據幾個時步以前的輸入,也很難檢測到當前的目標輸出,所以用循環神經網絡處理長期依賴性問題存在不少困難。
學習循環神經網絡有 4 個有效的方式:
長短時間記憶:用循環神經網絡創造出用來長時間記住值的小型模塊。
Hessian Free優化:使用一個很好的優化器處理梯度急速消失的問題,該優化器能檢測到梯度很小但曲率更小的方向。
回聲狀態網絡(ESN):優化輸入 -> 隱藏層及隱藏層 -> 隱藏層和輸出層 -> 隱藏層這些過程之間鏈接的很是緊密,所以隱含狀態有個很大的弱耦合振子(coupled oscillators)的「蓄水池」(reservoir),弱耦合振子可由輸入分別驅動。
用動量法進行很好的初始化:和回聲狀態網絡中的優化方法相似,可是接着會用動量法學習全部的鏈接。
1997 年,Hochreiter 和 Schmidhuber 構建了後人熟知的長短時間記憶網絡,解決了用循環神經網絡實現長期記憶的問題。他們用有相乘交互做用的邏輯和線性單元設計了一種記憶細胞。每當細胞的「寫入」(write)門限開啓時,信息就輸入細胞中,而後一直待在細胞裏,直到細胞的「保留」(keep)門限開啓。細胞經過開啓其「讀取」(read)門限來讀取信息。
讀取彎彎曲曲的手寫字體是循環神經網絡的自然任務。它一般以筆尖的座標序列(x,y,p),做爲輸入,其中 p 表示筆是向上仍是向下,輸出爲一個特徵序列。Grave 和 Schmidhuber 在 2009 年的研究表示用長短時間記憶模型搭配循環神經網絡是當前讀取彎曲手寫體的最佳體系。簡言之,他們使用了一系列的小型照片而非筆尖的座標做爲輸入。
非線性單元構成的循環神經網絡通常很難分析,它們會以不少不一樣的方式表現:處於穩定狀態,震盪,或沿着沒法預測的混亂軌跡運轉。一個 Hopfield 網絡由二元闕值單元循環鏈接構成。1982 年,John Hopfield 意識到,若是鏈接是對稱的,那麼就存在一個全局能量函數。整個網絡的每一個二元「配置」都對應一個能量,而二元闕值決策規則會讓神經網絡接受該能量函數的最小值。利用這種計算類型的一個有效方式就是將記憶用做該神經網絡的能量最小值。使用能量最小值表示記憶提供了一個內容可尋址存儲器,這樣只需知道某個項的部份內容,就能訪問該項,可有效抵抗硬件損壞的問題。
咱們每次記憶一個配置,都但願建立一個新的能量最小值。可是若是兩個接近的最小值在中間位置呢?這種狀況就限制了 Hopfield 的性能。所以咱們怎樣才能提高 Hopfield 的性能呢?很多物理學家對這個問題很感興趣,他們已掌握的數學知識或許能解釋大腦的工做原理。不少物理期刊上發表了很多論文,探究 Hopfield 網絡及其存儲能力。最終 Elizabeth Gardner 發現充分利用權重的能力會讓神經網絡有更好的存儲性能。她沒有嘗試將向量一次性存儲完畢,而是在訓練集中屢次循環,根據向量中全部剩餘單元的狀態用感知機的收斂程序訓練每一個單元,以得到正確的狀態。統計學家將這種方法稱爲「僞似然」(pseudo-likelihood)。
在 Hopfield 網絡中還有另外一種計算方法。這種方法沒有利用該神經網絡存儲記憶,而是構造感受輸入的演繹。感受輸入由可見的單元表示,演繹則由隱藏單元的狀態表示,演繹的好壞由能量表示。
玻爾茲曼機是一種隨機循環神經網絡,它能夠看做 Hopfield 網絡的一種隨機、生成對應網絡。它是首批能學習內部表示以及能表示和解決困難的組合問題的神經網絡之一。
玻爾茲曼機器學習算法的學習目標是,將玻爾茲曼機賦給訓練集中二元向量的機率乘積進行最大化,這至關於將玻爾茲曼機賦給訓練向量的對數機率之和最大化。
2012 年,Salakhutdinov 和 Hinton 提出了針對玻爾茲曼機的小批量學習流程:
對於正相(positive phase),首先以0.5的機率優化隱藏機率,而後在可見單元上固定一個數據向量,而後並行更新全部隱藏單元,直到用平均場(mean-field)更新開始收斂。神經網絡收斂後,對每一個鏈接的單元對記錄PiPj值,並小批量對全部數據求平均值。
對於負相(negative phase),首先選一組「假想粒子」(fantasy particles),每一個粒子都有一個值,它是個全局配置。而後按順序將每一個假想粒子中的全部單元更新幾回。對於每對鏈接的單元,對全部假想粒子中的SiSj求平均值。
在通常玻爾茲曼機中,單元的隨機更新須要按照順序。有個特殊的架構能實現交替並行更新,可大幅提升效率,這種小批量流程讓玻爾茲曼機的更新更加並行化。這種架構就叫作深度玻爾茲曼機(DBM),它其實是一個帶有缺失鏈接的普通玻爾茲曼機。
2014 年,Salakhutdinov 和 Hinton 又提出了他們所創模型的更新版,稱爲「受限玻爾茲曼機」(RBM)。他們將網絡中的鏈接情況加以限制,讓推斷和學習更容易些(只有一個隱藏單元的層,隱藏單元之間沒有鏈接)。在受限玻爾茲曼機中。當可見單元被固定時,只需一步就能達到熱平衡。
對於受限玻爾茲曼機,另外一個有效的小批量學習過程是:
對於正相:首先在可見單元上固定一個數據向量,而後爲全部成對的可見隱藏單元計算出 的值。對於每對鏈接的單元,在全部小批量中的數據上求 平均值。
對於負相:也是選擇一組「假想粒子」,而後用交替並行更新的方式把每一個假想粒子更新幾回。對於每對鏈接的單元,在全部假想粒子上求ViHj平均值。
反向傳播被視爲人工神經網絡中處理批量數據後,計算每一個神經元偏差分佈的標準方法。然而,使用反向傳播也存在幾個主要問題:
它須要標記好的訓練數據,但幾乎全部的數據都是未標記狀態。
學習時間不能很好的規模化,這意味着當神經網絡有多個隱藏層時,學習會很是慢。
當局部選優問題嚴重時,反向傳播會陷入僵局,所以對於深度網絡來講,它仍是不夠理想。
爲了解決反向傳播的侷限性,研究者們還考慮了非監督式學習的方法。這有助於在用梯度方法調整權重時仍能保持效率和簡易性,並且還能用它爲感受輸入的結構建模。具體來講,他們調整了權重,將生成模型生成感受輸入的機率最大化。問題是,咱們應該學習哪一種生成模型?能夠是像玻爾茲曼機這樣的能量模型嗎?或者由理想化的神經元組成的因果模型?或者這兩種模型的混合類型?
深度信念網絡是一種由隨機變量組成的有向非循環圖。用信念網絡時,咱們須要觀察其中一些變量,解決兩個問題:1)推斷問題:推斷未觀察到的變量的狀態;2)學習問題:調整變量之間的交互情況,讓神經網絡更能生成訓練數據。
早期的圖解模型要由專人去定義圖表結構和條件機率。當時,圖表之間都是鬆散地鏈接,因此研究人員最初重點放在了進行正確的推斷上,而不是學習上。對於神經網絡來講,學習纔是中心任務。可是即便如此,仍是有兩個神經網絡版的信念網絡。
這兩種由隨機二進制神經元組成的生成神經網絡是:1)能量模型:在這種模型中,咱們用對稱鏈接的方式將二進制隨機神經元進行鏈接,以獲得一個玻爾茲曼機;2)因果模型:在這種模型中,咱們在一個有向非循環圖中將二進制隨機神經元進行鏈接,以獲得一個 Sigmoid 信念網絡。本文再也不詳談這兩種類型的網絡。
最後,咱們談談深度自動編碼器。它們很適合解決非線性降維問題,有如下幾個緣由:能在兩方面提供靈活的映射;學習時間在訓練案例的數量中是線性的;最終編碼模型很是簡潔迅速。可是使用反向傳播優化深度自動編碼器時,會變得很是困難。若是初始權重很小,反向傳播的梯度就歇菜了。對於優化深度自動編碼器,咱們如今有了更好的方法:使用非監督式的逐層預訓練方法或者就像回聲狀態網絡(ESN)中那樣,只是當心地將權重初始化。
對於預訓練任務,有三種 Shallow 自動編碼器:
用做自動編碼器的RBM:它很像一個自動編碼器,可是被隱藏層中的二元活動強烈的正則化了。當用極大似然率訓練RBM時,它就不像自動編碼器了。在預訓練任務中,咱們能夠用Shallow自動編碼器代替RBM。
去噪自動編碼器(Denoising auto encoders):它經過將輸入向量的一些成分設爲0給該向量添加噪音。但仍然須要將這些成分重構,因此去燥自動編碼器必須抽取得到輸入之間相關性的特徵。若是使用不少去噪自動編碼器,預訓練任務會頗有效果。
收縮自動編碼器(Contractive auto encoders):將一個自動編碼器正則化的方法就是試着讓隱藏單元的活動儘量對輸入不敏感,可是又不能忽視輸入,由於它們必須重構輸入。經過對與輸入相對的每一個隱藏活動的平方梯度進行懲罰,咱們能夠實現這種目標。收縮自動編碼器很是適合預訓練任務,只有一小部分隱藏單元的子集對輸入中的變化比較敏感。
簡單地說,如今有許多不一樣的方法來對特徵進行逐層預訓練。對於沒有大量標記案例的數據集,預訓練有助於後續的鑑別學習。對於很是大的、已標記的數據集,初始化在監督學習中使用無監督預訓練的權值是沒必要要的,即便對於深度網絡也是如此。因此預訓練是初始化深度網絡權重的最優先方法,固然如今還有其餘方法。可是若是咱們讓網絡變得更大,咱們還將須要再次訓練!
很抱歉,一會兒說了這麼多,但還得再囉嗦一下·······
神經網絡是有史以來最美麗的編程範例之一。在傳統的編程方法中,咱們告訴計算機要作什麼,將大問題分解成許多小的、精肯定義的任務,計算機就能夠輕鬆地執行這些任務。與此不一樣,在神經網絡中,咱們不會告訴計算機如何解決咱們的問題。相反,它從觀察數據中學習,找出本身解決問題的方法。
現在,深度神經網絡和深度學習在計算機視覺、語音識別、天然語言處理等許多重要問題上都取得了使人矚目的成績。它們普遍應用在了 Google、微軟和 Facebook 等公司的部署中。
對於 Hinton 在 Coursera 上開設的課程的全部講義、研究論文和編程做業,本文做者也都彙總在了 GitHub 上,能夠點擊獲取。
但願本文對你學習神經網絡的核心概念能有所幫助!