MLer必知的8個神經網路架構
還記得我們之前曾分享如何簡單有趣地理解神經網路嗎?就是下面這個↓
如何簡單形象又有趣地講解神經網路是什麼?今天我們接著學習 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>的值。對於每對連接的單元,在所有小批量中的數據上求<ViHj> 平均值。
- 對於負相:也是選擇一組「假想粒子」,然後用交替並行更新的方式把每個假想粒子更新幾次。對於每對連接的單元,在所有假想粒子上求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 上,可以點擊獲取:
khanhnamle1994/neural-nets我站當然也有關於神經網路的系列專欄:
基於TensorFlow用卷積神經網路做文本分類 - 集智專欄一文讀懂CNN如何用於NLP - 集智專欄土法神經網路 Part I:計算圖 - 集智專欄希望本文對你學習神經網路的核心概念能有所幫助!
參考資料:https://medium.com/@james_aka_yale/the-8-neural-network-architectures-machine-learning-researchers-need-to-learn-2f5c4e61aeeb
推薦閱讀:
※製作假新聞?AI送你去喝茶!
※決策樹與隨機森林
※機器學習基礎與實踐(一)----數據清洗
※機器學習數學:拉格朗日對偶問題
※使用sklearn來進行驗證碼識別