我們為什麼需要「機器學習」?
機器學習對於那些我們直接程式設計太過複雜的任務來說是必需的。有些任務很複雜,以至於人類不可能解決任務中所有的細節並精確地程式設計。所以,我們向機器學習演算法提供大量的資料,讓演算法透過探索資料並找到一個可以實現程式設計師目的的模型來解決這個問題。
我們來看兩個例子:
寫一個程式去識別複雜場景中照明條件下新視角的三維物體是很困難的。我們不知道編寫什麼程式,因為我們並不瞭解它在我們大腦中運作的機制,即便知道如何實現,寫出來的程式也可能會非常複雜。
寫一個程式去計算信用卡詐騙的機率是很困難的。因為可能沒有任何既簡單又可靠的規則,我們需要結合大量的弱規則去判別。欺騙是可以轉移目標的,程式需要不斷更改。
接著出現了機器學習方法:我們不需為每個特定的任務手動程式設計,只要收集大量的樣本,為給定的輸入指定正確的輸出。機器學習演算法利用這些樣本去生成完成指定工作的程式。學習演算法產生的程式可能與典型的手寫程式非常不同,它可能包含數百萬個數字。如果我們做得正確,這個程式將像處理訓練集上的樣本一樣來處理新樣本。如果資料改變,程式也可以透過訓練新資料改變。你應該注意到,目前大量的計算比支付給程式設計師編寫一個特定任務的程式便宜。
鑑於此,機器學習最適用任務的例子包括:
模式識別:真實場景中的物體,面部識別或面部表情,口語。
異常識別:不尋常的信用卡交易序列,核電站感測器讀數的異常模式。
預測:未來股票價格或貨幣匯率,一個人喜歡什麼電影。
什麼是神經網路?
神經網路是機器學習文獻中的一類模型。例如,如果你參加了 Coursera 的機器學習課程,很可能會學到神經網路。神經網路是一套特定的演算法,它徹底改變了機器學習領域。他們受到生物神經網路的啟發,目前深度神經網路已經被證實效果很好。神經網路本身是一般的函式逼近,這就是為什麼它們幾乎可以應用於任何從輸入到輸出空間複雜對映的機器學習問題。
以下是說服你學習神經計算的三個理由:
瞭解大腦是如何工作的:它非常大且很複雜,一旦破壞就會腦死亡,所以我們需要使用計算機模擬。
瞭解受神經元及其適應性連線啟發的平行計算風格:這種風格與序列計算截然不同。
使用受大腦啟發的新穎學習演算法來解決實際問題:即使不是大腦的實際工作方式,學習演算法也非常有用。
在完成吳恩達的 Coursera 機器學習課程後,我開始對神經網路和深度學習產生興趣,因此尋找最好的網上資源來了解這個主題,並找到了 Geoffrey Hinton 的機器學習神經網路課程。如果你正在做深度學習的工程或想要踏入深度學習/機器學習的領域,你應該參加這個課程。Geoffrey Hinton 毫無疑問是深度學習領域的教父,在課程中給出了非凡的見解。在這篇部落格文章中,我想分享我認為任何機器學習研究人員都應該熟悉的八個神經網路架構,以促進他們的工作。
一般來說,這些架構可分為三類:
1. 前饋神經網路
這是實際應用中最常見的神經網路型別。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函式。
2. 迴圈網路
迴圈網路在他們的連線圖中定向了迴圈,這意味著你可以按照箭頭回到你開始的地方。他們可以有複雜的動態,使其很難訓練。他們更具有生物真實性。
目前如何高效地訓練迴圈網路正在受到廣泛關注。迴圈神經網路是模擬連續資料的一種非常自然的方式。它們相當於每個時間片段具有一個隱藏層的深度網路;除此之外,它們在每個時間片段上使用相同的權重並且在每個時間片段上輸入。它們可以長時間記住隱藏狀態的資訊,但很難訓練其使用這個潛能。
3. 對稱連線網路
對稱連線網路有點像迴圈網路,但是單元之間的連線是對稱的(它們在兩個方向上權重相同)。比起迴圈網路,對稱連線網路更容易分析。這個網路中有更多的限制,因為它們遵守能量函式定律。沒有隱藏單元的對稱連線網路被稱為「Hopfield 網路」。有隱藏單元的對稱連線的網路被稱為玻爾茲曼機。
下面介紹研究者需要熟知的 8 個神經網路架構。
1. 感知器
第一代神經網路出現時,感知機(perceptron)僅僅是單個神經元的計算模型,其在二十世紀六十年代初被美國電腦科學家 Frank Rosenblatt 推廣。其學習演算法非常強大,並且宣稱可以學習很多事情。1969 年,Minsky 與 Papert 出版了一本名為《感知機》的書,這本書分析了這些演算法可以做什麼,並闡釋了其侷限性。許多人就將這個侷限性放大到所有的 NN 模型。然而,感知機學習過程仍廣泛用於具有包含數百萬特徵的大特徵向量的任務。
在統計模式識別的標準範例中,我們首先將原始輸入向量轉換為特徵啟用向量。然後,基於大家的共識手動程式設計來定義特徵。接下來,我們學習如何對每個特徵啟用進行加權以獲得單一的標量。如果這個標量超過了某個閾值,我們認為輸入向量是目標集中的一個正樣本。
標準的感知機架構遵循前饋模型,輸入被髮送到神經元中,經處理後輸出。在下圖中,表示為網路自下而上讀取:底部輸入,頂部輸出。
但是,感知機確實存在侷限性:如果您使用手動設定特徵,並且使用了足夠多的特徵,那麼你幾乎可以做任何事情。對於二進位制輸入向量,我們可以為指數級多的二進位制向量分別設定一個特徵單元,因此我們可以對二進位制輸入向量進行任何可能的區分。但是,一旦確定了手動程式設計的特徵,感知器可以學習的東西就非常有限。
這個結果對於感知機是毀滅性的,因為模式識別是去識別在變換情況下的模式。Minsky 和 Papert 的「組不變性定理」認為感知機的學習部分無法去學習當轉換來自於一個組的情況。為了識別上述那種情況,需要更多的特徵單元去識別那些模式中包含的子資訊。所以模式識別的技巧部分必須由手動編碼的特徵檢測器來解決,而不是學習過程。
沒有隱藏單元的網路在其可以學習建模的輸入輸出對映中是非常有限的。簡單地增加一些線性單元無濟於事,因為結果還是線性的。固定的輸出非線性也不夠,因此,我們需要多層自適應非線性隱藏單元。問題是怎樣對這樣的網路進行訓練。我們需要一種適應所有權重的有效方式,而不僅僅是最後一層,所以這很難。學習進入隱藏層的權重等同於學習特徵,這是非常困難的,因為沒有人直接告訴我們隱藏層應該怎麼做。
2. 卷積神經網路
機器學習研究已經廣泛地集中在物體檢測問題上。有各種各樣的事情使識別物體變得困難:
影像分割:真實場景中總是摻雜著其它物體。很難判斷哪些部分屬於同一個物件。物件的某些部分可以隱藏在其他物件的後面。
物體光照:畫素的強度被光照強烈影響。
影像變形:物體可以以各種非仿射方式變形。例如,手寫也可以有一個大的圓圈或只是一個尖頭。
情景支援:物體所屬類別通常由它們的使用方式來定義。例如,椅子是為了讓人們坐在上面而設計的,因此它們具有各種各樣的物理形狀。
視角:標準學習方法無法應對的視點變化導致的影像變化,得到的資訊隨輸入維度(即畫素)的變化而變化。
維度跳變:設想一個醫療資料庫,通常用來學習體重的神經元,現在忽然用來學習病人的年齡!要應用機器學習,我們首先要消除這個維度跳躍。
複製特徵方法是目前神經網路解決目標檢測問題的主要方法。在不同的位置使用相同的特徵提取器。它也可以在尺寸和方向上覆制,這很需技巧並且很貴。複製大大減少了要學習的自由引數的數量。它使用幾種不同的特徵型別,每種都有自己的複製檢測器影像。它也允許以各種方式表示每個影像塊。
那麼複製特徵檢測器是如何實現的呢?
啟用值等變化量:複製特徵的方法並不能使神經元啟用值不變,但是能夠使啟用值改變數相同。
知識不變數:如果在訓練中一個特徵在某些位置有效,則在測試過程中,特徵檢測器在各個位置有效。
1998 年,Yann LeCun 和他的合作者開發了 LeNet 的手寫數字識別器。它在前饋網中使用反向傳播,這個前饋網路不僅僅是一個識別器,它有許多隱藏層,每個層有許多複製單元的對映,彙集附近複製單元的輸出,有一個即使重疊也能夠同時處理幾個字元的寬網,以及訓練一套完整的系統的巧妙方式。後來正式命名為卷積神經網路。一個有趣的事實是:這個網路被用來讀取北美地區約 10%的支票。
卷積神經網路可用於從手寫數字到 3D 物體的與物體識別有關的所有工作。但是,從網下載的彩色照片中識別真實物體要比識別手寫數字複雜得多。它百倍於手寫數字的類別(1000:10),數百倍於手寫數字的畫素(256×256 色:28×28 灰度),是三維場景的二維影像,需要分割混亂場景,而且每個圖片有多個物件。這樣的情況下,相同型別的卷積神經網路會起作用嗎?
之後在 ImageNet 2012 年的 ILSVRC 競賽(這個比賽被譽為計算機視覺的年度奧林匹克競賽)中,題目是一個包含大約 120 萬張高解析度訓練影像的資料集。測試影像不顯示初始註釋(沒有分割或標籤),演算法要產生指定影像中存在什麼物件的標籤。來自 Oxford、INRIA、XRCE 等機構的先進計算機視覺小組用已有的最好計算機視覺方法應用於這個資料集。通常計算機視覺系統是複雜的多級系統,往往需要在早期階段透過手動調參來最佳化。
比賽獲勝者 Alex Krizhevsky(NIPS 2012)開發了由 Yann LeCun 開創的深度卷積神經網路型別。其架構包括 7 個隱藏層(不包括池化層)。前五層是卷積層,後面兩層是全連線層。啟用函式在每個隱藏層中被修正為線性單元。這些訓練比 Logistic 單元更快,更有表現力。除此之外,當附近的單元有更強的活動時,它還使用競爭規範化來壓制隱藏的活動,這有助於強度的變化。
有一些技術手段可以顯著提高神經網路的泛化能力:
從 256×256 影像中隨機挑選 224×224 塊影像以獲取更多資料,並使用影像的左右反射。在測試時,結合 10 個不同的影像:四個角落加上中間,再加上它們水平翻轉的五個。
使用「dropout」來調整全域性連線層(包含大部分引數)的權重。Dropout 指的是隨機移除每個訓練樣本一層中的一半隱藏單元,使其不再過多地依賴其它隱藏單元。
就硬體要求而言,Alex 在 2 個英偉達的 GTX 580 GPU(超過 1000 個快速小核心)上使用了非常高效的卷積網路實現。GPU 非常適合矩陣乘法,並且具有非常高的記憶體頻寬。這讓它在一週內訓練了網路,並在測試時快速結合了 10 個影像塊的結果。如果我們可以足夠快地交換狀態,我們可以在很多核心上傳播一個網路。隨著核心越來越便宜,資料集越來越大,大型神經網路將比老式計算機視覺系統發展得更快。
3. 迴圈神經網路
為了理解迴圈神經網路,我們需要對序列建模進行簡要概述。當機器學習應用於序列時,我們經常希望將輸入序列轉換為不同域中的輸出序列;例如,將一系列的聲壓轉換成單詞序列。當沒有單獨的目標序列時,我們可以透過嘗試預測輸入序列中的下一項作為網路的學習目標。目標輸出序列是輸入序列的下一步。比起試圖根據一個圖片的其他畫素來預測一個畫素或根據影像的其餘部分來預測一個部分,這樣似乎更自然。預測序列中的下一項模糊了有監督學習和無監督學習之間的區別。它使用專為監督學習而設計的方法,但它不需要單獨的目標資料。
無記憶模型是這個任務的標準方法。具體而言,自迴歸模型可以透過使用「延遲抽頭」從固定數量的前幾項預測下一項,而且前饋神經網路是使用一層或多層非線性隱藏單元的廣義自迴歸模型。但是,如果我們給生成模型一些隱藏的狀態,使這個隱藏的狀態內部是動態的,我們就會得到一個更有趣的模型:它可以長時間地將資訊儲存在隱藏狀態。如果隱狀態的動態從隱狀態中生成輸出是有噪聲的,我們將永遠無法知道它確切的隱藏狀態。我們所能做的是推斷隱狀態向量空間的機率分佈。這種推斷只適用於 2 種隱藏狀態模型。
迴圈神經網路是非常強大的,因為它們結合了兩個屬性:1)分散式隱狀態,允許其有效地儲存大量有關過去的資訊; 2)非線性動態,使他們能夠以複雜的方式更新隱狀態。有了足夠的神經元和時間,RNN 可以計算任何計算機可以計算出來的東西。那麼 RNN 可以表現什麼樣的行為呢?它們可以振動,可以穩定在點吸引子,從而表現地很混亂。還可以透過使用隱狀態的不同子集執行許多不同的小程式,每個小程式捕獲一塊知識,而且所有的這些都能並行執行並以更復雜的方式互動。
然而,RNN 的計算能力使它們很難訓練。由於梯度爆發和梯度消失,訓練一個 RNN 是相當困難的。當我們進行多層反向傳播時,梯度的大小會發生什麼變化?如果權重很小,則梯度將指數縮小。如果權重很大,梯度將成指數增長。典型的前饋神經網路可以應付這些指數效應,因為它們只有很少的隱藏層。然而,在訓練長序列的 RNN 中,梯度很容易爆炸或消失。即使初始權重選的很好,也很難檢測到依賴於多個時間步長前的輸入的當前目標輸出,所以 RNN 難以處理序列中的長程依賴。
基本上有 4 種有效的方法來學習 RNN:
長短期記憶:將 RNN 用於長期記憶值的小模組。
Hessian Free 最佳化:透過使用酷炫的最佳化器來處理梯度消失問題,該最佳化器可以檢測具有更小曲率的微小梯度。
回聲狀態網路:透過謹慎地初始化層之間的連線(輸入 ->隱層、隱層 ->隱層、輸出 -> 隱層),確保隱藏狀態有巨大的弱耦合震盪儲存,可以透過輸入選擇性地驅動這些振盪器。
利用動量進行良好的初始化:像回聲狀態網路一樣進行初始化,然後使用動量學習所有連線。
4. 長短期記憶網路
Hochreiter 和 Schmidhuber(1997)透過構建長短期記憶網路,解決了獲取 RNN 長時間記憶(如數以百計的時間步長)的問題。他們使用具有乘法相互作用的邏輯和線性單元來設計儲存器單元。每當「寫入」門開啟時,資訊就會進入單元。當「保持」門開啟,資訊將在單元中保持。資訊可以透過開啟「讀取」門而從單元中讀取。
手寫草書識別是一個特別適合 RNN 的任務。輸入是筆尖的(x,y,p)座標序列,其中 p 表示筆是向上還是向下。輸出是一個字元序列。Graves 和 Schmidhuber(2009)表明,帶有 LSTM 的 RNN 是目前草書識別的最佳系統。簡而言之,其使用一系列小影像代替筆座標作為輸入。
5. Hopfield 網路
迴圈網路的非線性單元通常很難分析。它們可以表現為不同的方式:穩定到穩定的狀態,振盪,或遵循不可預測的混沌軌跡。一個 Hopfield 網路由二元門限單元組成,它們之間有連續的連線。1982 年,John Hopfield 認識到,如果連線是對稱的,就有一個全域性能量函式。整個網路的每個二進位制「結構」都有能量,而二進位制閾值的決策規則使網路可以得到能量函式的最小值。利用這類計算的一種簡潔方法是使用記憶作為神經網路的能量最小值。使用能量最小值來表示記憶從而記憶體可定址。可以只知道一個專案的部分內容來訪問這個專案。這對硬體損壞是極大的。
每當記憶一次配置,我們希望創造一個新的能量最小值。但是,如果在中間位置附近有兩個最小值怎麼辦呢?這限制了 Hopfield 網路的容量。那麼如何增加 Hopfield 網路的容量呢?物理學家認為他們已知的數學知識可以解釋大腦的工作機制。物理學期刊上發表了許多關於 Hopfield 網路及其儲存容量的論文。最終,Elizabeth Gardner 認為,有一個更好的儲存規則——使出權重的「渾身解數」。這不是一次性儲存向量,而是多次迴圈訓練集,並利用感知機收斂過程來訓練每個單元,使其具有正確的狀態,給定該向量中所有其他單元的狀態。統計學家稱這種技術為「偽可能性」。
Hopfield 網路還有另一個計算功能。我們不再用網路來儲存記憶,而是用它來構建感官輸入的資訊。用可見單元表示輸入,用隱藏節點的狀態來表達輸入節點的資訊,用能量表示資訊的不好(低的能量狀態來表達一個好的 interpretation)。
6. 玻爾茲曼機網路
玻爾茲曼機是一種隨機遞迴神經網路。它可以被看作是 Hopfield 網路隨機生成的對應物。它是第一個能夠學習內部表示的神經網路之一,能夠表示並解決難的組合問題。
玻爾茲曼機學習演算法的學習目標是最大化玻爾茲曼機分配給訓練集中二進位制向量機率的乘積。這等同於最大化玻爾茲曼分配給訓練向量的對數機率之和。也就是說,如果我們做了如下的事情,最大化我們得到 N 個訓練案例的機率:1)讓網路在沒有外部輸入的情況下在不同時間穩定分佈; 2)每次取樣一次可見向量。
2012 年,Salakhutdinov 和 Hinton 提出了玻爾茲曼機的高效小批次學習程式。
對於正相位,首先將隱藏機率初始化為 0.5,將可見單元上的資料向量進行鉗位,然後並行更新所有隱藏單元,使用平均場方法並行更新隱藏單元直到收斂。在網路收斂之後,記錄每個連線的單元對 Pi Pj,並在最小批次中對所有資料取平均。
對於負相位:首先保留一組「幻想粒子」(就是一對 (Si,Sj) 形成的系統?)。每個粒子都有全域性配置中的一個值。然後序列更新幾次每個幻想粒子中的所有單元。對於每一個連線的單元,對所有的幻想粒子的 SiSj 取平均。
在普通玻爾茲曼機中,單元的隨機更新需要連續。有一個特殊的體系結構允許更有效的交替並行更新(層內沒有連線,沒有跳層連線)。這個小批次程式使玻爾茲曼機的更新更加並行。這就是所說的深度玻爾茲曼機(DBM),一個缺失很多連線的普通玻爾茲曼機。
2014 年,Salakhutdinov 和 Hinton 為他們的模型提出了一個升級版,稱之為受限玻爾茲曼機(RBM)。他們透過限制連通性使推理和學習變得更容易(隱藏單元只有一層,隱藏單元之間沒有連線)。在 RBM 中,當可見單元被鉗位時只需要一步就能達到熱平衡。
另一個有效的小批次 RBM 學習程式是這樣的:
對於正相位,首先將可見單元的資料向量鉗位。然後計算所有可見和隱藏單元對的<ViHj>的確切值。對於每個連線的單元對,對小批次中的所有資料<ViHj>求平均。
對於負相位,也保留一組「幻想粒子」(就是一對 (Vi,Hj) 形成的系統?)。然後交替並行更新幾次每個幻想粒子中的所有單元。對於每一個連線的單位對,所有幻想粒子 ViHj 求平均。
7. 深度信念網路
反向傳播被認為是人工神經網路中的標準方法,用於在處理一批資料之後計算每個神經元的誤差貢獻。但是,使用反向傳播存在一些重要的問題。首先,它需要有標籤的訓練資料;而幾乎所有的資料都沒有標籤。其次,學習時間不夠理想,這意味著隱藏層數多的網路很慢。第三,它可能會陷入區域性最小的局面,所以對於深度網路來說,它們還差得很遠。
為了克服反向傳播的限制,研究人員已經考慮使用無監督的學習方法。這有助於保持使用梯度方法來調整權重的效率和簡單性,還可以用它來對感測輸入的結構進行建模。特別是,他們調整權重使生成模型產生感官輸入的機率最大化。問題是我們應該學習什麼樣的生成模型?可以是像玻爾茲曼機這樣的能量模型嗎?還是由理想化的神經元組成的因果模型?或是兩者的混合?
信念網是由隨機變數組成的有向無環圖。使用信念網我們可以觀察到一些變數。我們想要解決 2 個問題:1)推理問題:推斷未觀測變數的狀態; 2)學習問題:調整變數之間的互動作用,使網路更有可能產生訓練資料。
早期的圖形模型的圖形結構和條件機率是專家定義的。那時,這些圖形連線稀疏,所以研究人員一開始把重點放在做正確的推論,而不是學習上。對於神經網路來說,學習是關鍵,手寫知識並不酷,因為知識來自於學習訓練資料。神經網路的目的不在於可解釋性或透過稀疏連線性使其便於推理。不過,還有神經網路版本的信念網路。
由隨機二元神經元組成的生成神經網路有兩種型別:1)基於能量利用對稱連線來連線二元隨機神經元得到玻爾茲曼機; 2)我們透過因果關係在一個有向無環圖中連線二元隨機神經元獲得 SBN。這兩種型別的描述超出了本文的範圍。
8. 深度自動編碼器
最後,我們來討論深度自動編碼器。深度自動編碼器是非線性降維的非常好的方法,原因如下:它們提供了兩種靈活的對映方式。訓練事例的學習時間是線性的(或更好的),最終的編碼模型相當緊湊和快速。然而,使用反向傳播來最佳化深度自動編碼器很難。在初始權重較小的情況下,反向傳播梯度消失。現在我們有了更好的方法來最佳化它們,要麼使用無監督的逐層預訓練,要麼像回聲狀態網路那樣謹慎地初始化權重。
對於預訓練任務,實際上有三種不同型別的淺自動編碼器:
受限玻爾茲曼機作為自動編碼器:當我們用一步對比散度訓練受限玻爾茲曼機時,它試圖使重建看起來像資料。它就像一個自動編碼器,但是透過使用隱藏層中的二進位制活動來強化正則化。經過最大可能性訓練後,受限玻爾茲曼機不像自動編碼器。我們可以用淺自動編碼器堆疊來代替用於預訓練的 RBM 堆疊;然而,如果淺自動編碼器透過懲罰平方權重而被正規化,那麼預訓練就不是有效的(對於隨後的辨別)。
去噪自動編碼器:透過將其許多分量設定為 0(例如輸入的資料丟失的情況),將噪聲新增到輸入向量。他們仍然需要重建這些分量,因此他們必須提取捕獲輸入之間相關性的特徵。如果我們使用表示自動編碼器的堆疊,那麼預訓練是非常有效的。與 RBM 預訓練一樣好或者更好。由於我們可以很容易地計算目標函式的值,所以評估預訓練也更簡單。它缺乏我們用 RBM 獲得的良好的變分邊界,但這只是理論上的問題。
壓縮自動編碼器:使自動編碼器正規化的另一種方法是儘可能使隱藏單元的活動對輸入不敏感,但是他們不能忽視這些輸入,因為他們必須重建這些輸入。我們透過懲罰每個隱藏活動相對於輸入的平方梯度來達到這個目的。壓縮自動編碼器預訓練時工作得很好。程式碼傾向於使一小部分隱藏單元對輸入變化敏感。
簡而言之,現在有很多不同的方法來進行功能的逐層預訓練。對於沒有大量標籤化的事例的資料集來說,預訓練有助於後續的判別式學習。對於非常大的有標籤的資料集,使用無監督預訓練初始化監督學習中使用的權重進行並不必要,即使對於深度網路也是如此。預訓練是初始化深度網路權重的第一個不錯的方法,但現在還有其他方法。但是,如果我們讓網路很大,我們將再次離不開預訓練!
最後的福利
神經網路是有史以來最美麗的程式設計範例之一。在傳統的程式設計方法中,我們告訴計算機做什麼,將大問題分解成計算機可輕鬆執行的許多精確定義的小任務。相比之下,在神經網路中,我們不需要告訴計算機如何解決我們的問題,而是讓它透過觀測資料學習,找出解決手頭問題的辦法。
如今,深度神經網路和深度學習在計算機視覺、語音識別和自然語言處理等許多重要問題上有著出色的表現。它們正在被谷歌、微軟和 Facebook 等公司大規模部署。
我希望這篇文章能幫助你學習神經網路的核心概念,包括深度學習的現代技術。你可以從我的 GitHub 庫(https://github.com/khanhnamle1994/neural-nets)中獲取 Hinton 的 Coursera 課程所有課程幻燈片,研究論文和程式設計作業。祝你好運!