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