神經網絡簡介--激活函數、網絡架構、生物模型解釋

目錄

概述

無需類比大腦的機制我們也能介紹神經網絡。本節我們通過線性分類器,通過公式s=Wx (其中W 是一個矩陣,x 是輸入的列向量,包含圖片的所有像素。對於CIFAR-10數據來說,x 是一個[3072 * 1]的列向量,W 是[10 * 3072]的矩陣,因此s 是一個[10 *1]的列向量,代表十個類別的分數)對給定圖片可能屬於的不同類別進行打分。
計算分數時,採用s=W2max(0,W1x) 則是就是一個神經網絡。如前例所示,W1 若爲[100 * 3072]的矩陣,則可以將圖片轉換100維的列向量。函數max(0,) 是一個非線性函數,對矩陣或向量的每個元素都進行操作。除此之外我們還可以選擇其他的非線性函數(之後我們會學習到),但是這個函數是最常用的。此外,W2 的維度可以爲[10 * 100],最後得到的10個數字,我們將其解釋爲10個分類的分數。需要注意的是,這裏的非線性函數非常重要,如果我們不使用非線性函數,兩個矩陣運算就可以用一個矩陣表示,最終的預測分數就和採用用線性函數沒有區別了。非線性函數能夠改變這一情況。W1,W2 可以通過隨機梯度下降學習,它們的梯度通過鏈式法則求導得到。(反向傳播計算)
一個三層的神經網絡類似於s=W3max(0,W2max(0,W1x))W1,W2,W3 都是將要學習的參數,中間隱藏層的大小是神經網絡的超參數,之後我們會學習如何選取。我們現在來看看如何從神經元的角度解釋神經網絡。

神經元模型

與生物學的聯繫

神經網絡這個領域最初的主要靈感來源於如何爲生物神經系統建模。但此後神經網絡分支成爲工程問題,並在機器學習任務中取得了良好的結果。 所以,在我們開始討論前,對這個讓神經網絡領域產生很大啓發的生物系統,進行個非常簡短和宏觀的描述。
大腦的基本計算單位是一個神經元。人類神經系統中可發現大約860億個神經元,並且它們與大約10141015 個突觸相連。圖1表示生物神經元,圖2表示常見的數學模型。每個神經元接收來自其樹突的輸入信號並沿着其(單個)軸突產生輸出信號。軸突最終分出並通過突觸連接到其他神經元的樹突。在神經元的計算模型中,沿軸突傳播的信號(例如x0 )基於該突觸(例如w0 )處的突觸強度與另一神經元的樹突相乘(例如w0x0 )。這個想法是突觸強度(權重w)是可以學習的,並且控制一個神經元對另一個神經元的影響力(及其方向:興奮(權重爲正)或抑制(權重爲負))。在基本模型中,樹突將信號傳送到細胞體,在那裏它們都被求和。如果最終總和超過一定的閾值,神經元可以激活,沿軸突發出尖峯。在數學計算模型中,我們假設尖峯的準確時間不重要,只有激活的頻率傳達信息。基於這種速率編碼解釋,我們用激活函數f來模擬神經元的放電速率,該函數表示沿着軸突的尖峯頻率。從歷史上看,sigmoid函數是激活函數的一個常見選擇,因爲它需要一個實值輸入(求和後的信號強度),並將其壓縮至0和1之間。稍後我們將看到這些激活函數的細節。


圖1 神經元模型

圖2 數學模型

單個神經元的前向傳播代碼如下所示:

class Neuron(object):
  # ... 
  def forward(self, inputs):
    """ assume inputs and weights are 1-D numpy arrays and bias is a number """
    cell_body_sum = np.sum(inputs * self.weights) + self.bias
    firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
    return firing_rate

換句話說,每個神經元對輸入和權重進行點積操作,加上偏差後並採用非線性函數(或者叫激活函數)轉換數據,上面代碼採用的是sigmoidσx=1/1+ex 。 我們將在本節末尾詳細介紹不同的激活函數。

粗糙模型 需要強調的是,這種生物神經元模型非常粗糙:例如,有許多不同類型的神經元,每種神經元都具有不同的屬性。 生物神經元中的樹突執行復雜的非線性計算。 突觸不僅僅有一個單一的權重,他們是一個複雜的非線性動力系統。 已知許多系統中輸出尖峯的確切時間非常重要,這表明速率編碼近似可能不成立。 由於採用了很多簡化,因此當您在神經網絡和真正的大腦之間進行類比,請準備好聽取來自具有神經科學背景的任何人的不屑。

單神經元作爲線性分類器

神經元前向計算的數學形式看起來很熟悉。 正如我們用線性分類器所看到的那樣,神經元可以在輸入空間的某些線性區域“喜歡”(激活值接近1)或“不喜歡”(激活值接近0)。因此,通過對神經元的輸出採用適當的損失函數,我們可以將單個神經元變成線性分類器:
二元Softmax分類器。 例如,我們可以將σΣiwixi+b 解釋爲將輸入分類成某個類的概率Pyi=1|xi;w 。 對於二分類問題,另一個類的概率是P(yi = 0xi; w)= 1-P(yi = 1xi; w),因爲它們必須和爲1。 通過這種解釋,我們可以定義其交叉熵損失(cross-entropy)。並且優化它將其作爲一個二元Softmax分類器(也稱爲邏輯迴歸)。 由於S形函數被限制在0-1之間,因此該分類器通過判斷神經元的輸出是否大於0.5來預測結果。
二元SVM分類器。 我們可以在神經元的輸出上附加一個max-margin hinge loss,並將其訓練成二元支持向量機。
正則化。 從在這個生物學的角度看,SVM/Softmax 下的正則化損失可以解釋爲逐漸遺忘,因爲突觸權重w 會在每次更新參數後趨向於清零w

常用的激活函數

每個激活函數(或非線性函數)都輸入一個數字並對其執行某種固定的數學運算。 在實際中可能會遇到幾種激活函數:



圖3 sigmoid函數,將輸入壓縮到(0,1)範圍內



圖4 tanh函數,將輸入壓縮到(-1,1)範圍內

sigmoid(圖3所示)。 S型函數具有數學形式σ(x)=1/(1+ex) 。如前所述,它取一個實數值並將其“壓扁”到0到1之間的範圍內。大的負數變爲0,大的正數變爲1。歷史上經常使用Sigmoid函數,因爲它很好地被解釋爲一個神經元的激活率:從完全不激活(取值爲0)到完全飽和激活(取值爲1)。實際中,S形非線性近已經不受歡迎,現在很少使用它。 主要是因爲它有兩個缺點:

  • Sigmoid函數飽和時會”殺死”梯度。 S形神經元非常不好的特性是,當神經元的激活在0或1的尾部飽和時,這些區域的梯度幾乎爲零。 回想一下,在反向傳播過程中,這個(局部)梯度將乘以該神經元的輸出對於整個目標的梯度。 因此,如果局部梯度非常小,它將有效地“殺死”梯度,幾乎沒有信號會通過神經元流向其權重並遞歸到其數據。因此,在初始化S形神經元的權重時,爲防止飽和時,必須格外小心。例如,如果初始權重太大,那麼大多數神經元會變得飽和,網絡幾乎不能進行學習。
  • Sigmoid輸出不是以零爲中心的。 這是我們不希望的特性,因爲在神經網絡的後續層中的神經元將接收不是以零爲中心的數據。 這對梯度下降過程中的動力有影響,因爲如果進入神經元的數據總是正的(例如,在f=wTx+b 中所有x>0 )),則反向傳播期間權重w 的梯度將全部爲正或全部負(取決於整個表達式f的梯度)。 這會在權重的梯度更新中引入不希望的鋸齒形動態更新。但是,請注意,處理完一批數據後(batch data),權重最終的更新可能會有可變的符號,這略微緩解了這個問題。因此,這是一個不便之處,但與上面的飽和激活問題相比,其後果不那麼嚴重。

tanh(圖4)。 它將實值數字壓縮到範圍[-1,1]。 像S形神經元一樣,它有激活飽和的問題,但與S形神經元不同,它的輸出是零中心的。 因此,在實踐中tanh非線性始終優於S形非線性。 還要注意tanh神經元只是一個縮放的S形神經元,可以表示爲:tanhx=2σ2x1

RELU(圖5所示)。RELU(The Rectified Linear Unit)在過去幾年中變得非常流行。它計算函數fx=max0x 。使用ReLUs有以下幾個優點和缺點:

  • (優點)與S形tanh函數相比,隨機梯度下降的收斂速度顯着加快(Krizhevsky等人文獻中提到爲6倍,圖6顯示爲其對比)。有人認爲,這是因爲其線性非飽和形式的原因。
  • (優點)與涉及複雜操作(指數等)的tanh / sigmoid神經元相比,ReLU可以通過將激活矩陣簡單地設置閾值爲零來實現。
  • (缺點)不幸的是,在訓練過程中,ReLU單元可能會變得脆弱,並可能“死亡”。例如,流經ReLU神經元的大梯度可能導致權重更新,使得神經元不會再在任何數據上激活。如果發生這種情況,那麼從該點開始流經該單元的梯度將永遠爲零。也就是說,ReLU單元在訓練期間可能會不可逆轉地死亡。例如,如果學習率設置得太高,您可能會發現多達40%的網絡可能“死亡”(即從未在整個訓練數據集中激活的神經元)。通過設置合適的學習率,可以緩解這個問題。

    圖5 RELU函數
    圖6 ReLU收斂速度大約爲tanh的6倍

leak ReLU。leak ReLUs是解決ReLU 單元”死亡”問題的一種嘗試。當x <0時,leak ReLU將具有小的負斜率(大約爲0.01左右)。也就是說,函數計算fx=?x<0αx+?x>=0x 其中α是一個小常數。有些人用這種形式的激活函數取得成功,但結果並不總是一致的。負向區域的斜率也可以作爲每個神經元的參數,正如2015年Kaiming He等人在Delving Deep into Rectifiers中介紹的PReLU神經元中所看到的那樣。然而,針對不同任務,leak ReLU的效果並不是完全一致,具體原因也沒有研究清楚。

MAXOUT。也有一些函數形式不是fwTx+b 的單元。 Maxout神經元(最近由Goodfellow等人提出)是一種相對流行的選擇,它概括了ReLU及其leak版本。 Maxout神經元計算函數maxwT1x+b1wT2x+b2 。請注意,ReLU和Leak ReLU都是這種形式的特例(例如,對於ReLU,我們有w1,b1 = 0)。 因此Maxout神經元有ReLU單元的所有優點(線性操作狀態,沒有飽和),並且沒有缺點(ReLU的死亡單元)。然而,與ReLU神經元不同,它使每個神經元的參數數量加倍,從而導致參數總數很高。

這就結束了我們對最常見類型的神經元及其激活函數的討論。 作爲最後的評論,在同一網絡中混合使用不同類型的神經元是非常罕見的,儘管這樣做沒有根本性的問題。

如果文:“我應該使用哪種神經元類型?”那麼答案是:使用ReLU非線性,小心你的學習速率,並儘可能監測網絡中“死亡”單元的比例。 如果出現了問題,請嘗試使用Leaky ReLU或Maxout。 切勿使用sigmoid。 試試tanh,但一般情況下它比ReLU / Maxout更糟糕。

神經網絡架構

分層組織

神經網絡是作神經元組成的圖。 神經網絡模型是一個非循環圖中連接的神經元集合。 換句話說,一些神經元的輸出可以成爲其他神經元的輸入。 環是不允許的,因爲這意味着在網絡的正向傳遞中有無限循環。 神經網絡模型通常組織成不同層次的神經元,而不是無組織的連接。 對於規則的神經網絡,最常見的層類型是完全連接層,其中兩個相鄰層之間的神經元完全成對連接,但是單個層內的神經元不共享連接。 圖7和圖8是兩個使用完全連接層的示例神經網絡拓撲:



圖7 2層神經網絡(4個神經元的隱藏層和2個神經元的輸出層)和三個輸入。



圖8 具有三個輸入的三層神經網絡,兩個四個神經元的隱藏層和一個輸出層。 請注意,在這兩種情況下,跨層的神經元之間都存在連接(突觸),但層內沒有連接。

命名約定。請注意,當我們說N層神經網絡時,我們不計入輸入層。因此,單層神經網絡描述了一個沒有隱藏層的網絡(輸入直接映射到輸出)。從這個意義上講,你有時會聽到人們說邏輯迴歸或支持向量機只是單層神經網絡的特例。 您也可能會聽到這些網絡也會被稱爲“人工神經網絡”(ANN)或“多層感知器”(MLP)。許多人不喜歡神經網絡和真實大腦之間的類比,而更喜歡將神經元作爲單元。
輸出層。與神經網絡中的其他層不同,輸出層神經元通常不具有激活函數(或者可以將它們視爲有線性激活函數)。這是因爲最後的輸出層通常被用來表示類別分數(例如在分類中),可能是任意的實數值,或者某種類型的實值目標(例如在迴歸中)。

衡量神經網絡的大小。人們通常用來衡量神經網絡大小的兩個指標是神經元的數量,或者更常見的是參數的數量。在前文中使用兩個示例網絡:

第一個網絡(圖7)具有4 + 2 = 6個神經元(不包括輸入),[3×4] + [4×2] = 20個權重和4 + 2 = 6個偏差,總共26個可學習參數。
第二個網絡(圖8)具有4 + 4 + 1 = 9個神經元,[3×4] + [4×4] + [4×1] = 12 + 16 + 4 = 32個權重和4 + 4 + 1 = 9偏差,總共41個可學習參數。
爲了給你一些背景知識,現代卷積網絡包含大約1億個參數,通常由大約10-20層構成(因此深度學習)。但是,由於參數共享,我們將看到有效連接的數量顯着增加。更多內容我們會在卷積神經網絡章節中學習。

前饋計算示例

前饋計算實際上就是重複的矩陣乘法與激活函數的計算交織在一起。神經網絡爲層組織的主要原因之一就是這種結構進行矩陣向量操作計算神經網絡非常簡單高效。在上圖中使用示例三層神經網絡,輸入是[3x1]向量。一個層的所有連接權重都可以存儲在一個矩陣中。例如,第一個隱藏層的權重W1 的大小爲[4x3],所有單位的偏差都在矢量b1 中,大小爲[4x1]。在這裏,每一個神經元都有一個W1的權重,所以矩陣向量乘法np.dotW1x 計算該層所有神經元的激活。類似地,W2 將是一個[4x4]矩陣,用於存儲第二個隱藏層的連接,W3 爲最後一個(輸出)層的[1x4]矩陣。這個3層神經網絡的完整正向傳遞就是三個矩陣乘法,與激活函數的計算交織在一起,如下代碼所示:

# forward-pass of a 3-layer neural network:
f = lambda x: 1.0/(1.0 + np.exp(-x)) #activation function (use sigmoid)
x = np.random.randn(3, 1) # random input vector of three numbers (3x1)
h1 = f(np.dot(W1, x) + b1) # calculate first hidden layer activations (4x1)
h2 = f(np.dot(W2, h1) + b2) # calculate second hidden layer activations (4x1)
out = np.dot(W3, h2) + b3 # output neuron (1x1)

在上面的代碼中,W1,W2,W3,b1,b2,b3是網絡的可學習參數。 還要注意,變量x可以保存所有訓練數據(其中每個輸入樣本將是x的一列),而不是隻有單個輸入列向量,這樣所有樣本將並行地進行計算。 此外,最後的神經網絡層通常不具有激活功能(例如,它表示分類問題中的(實值)類分數)。

神經網絡的表示能力

全連接層的神經網絡實際上是定義了一系列由網絡權重參數化的函數。一個很自然的問題是:這個函數族能表示能力如何?是否有不能用神經網絡建模的函數?

事實證明,有一個以上隱藏層的神經網絡是通用逼近器。也就是說,它可以表示出來(參見1989年Sigmoidal函數疊加的逼近(pdf),或Michael Nielsen的這個直觀的解釋),給定任意連續函數fx ,當ε>0 時,存在一個神經網絡gx 帶有一個以上隱藏層(選取合理的非線性函數,例如sigmoid),使得x|fxgx| <ε。換句話說,神經網絡可以逼近任何連續函數。

如果一個隱藏層就足以近似任何函數,那爲什麼要使用更多的隱藏層呢?答案是,雙層神經網絡是一個通用逼近器,儘管在數學上很簡便,但在實踐中卻是相對較弱且無用的。在一個維度中,函數gx=Σici?ai<x<bi )其中a,b,c是參數向量也是一個通用逼近器,但沒有人會建議我們在機器學習中使用這個函數。神經網絡在實踐中運行良好,因爲它們簡潔地表達平滑的函數,這些函數非常好地擬合了我們在實踐中遇到的數據的統計特性,而且使用我們的優化算法(例如梯度下降)也很容易學習。類似地,儘管深層網絡和單隱層網絡的表示能力是相等的,但是根據經驗觀察發現,深層網絡比單隱層網絡效果更好。

順便說一下,在實踐中,3層神經網絡通常會比2層網絡性能好很多,但更深層(4,5,6層)的性能提高不明顯。這與卷積網絡形成鮮明對比,現在發現卷積神經網絡深度是良好識別系統(例如,按照10個可學習層的順序)是非常重要的組成部分。支撐這種現象的一個觀點是:圖像包含分層結構(例如,面部由眼睛組成,其由邊緣等組成),因此多層處理對於該數據域而言是直觀的。
當然,整個問題涉及更多知識,也是最近研究的主題。如果您對這些主題感興趣,我們建議您進一步閱讀:
Deep Learning ,尤其是第6.4節。
Do Deep Nets Really Need to be Deep?
FitNets: Hints for Thin Deep Nets

設置圖層數量及其大小

在實際問題中,我們如何選擇架構?我們應該使用隱藏層嗎?一個隱藏層?或兩個隱藏層?每層應該有多少單元?首先,隨着我們增加神經網絡中的層大小和數量,網絡的容量也會增大。也就是說,可表示函數的空間會增加,因爲神經元可以合作表達許多不同的函數。例如,假設我們在二維中存在二元分類問題。我們可以訓練三個獨立的神經網絡,每個神經網絡都有一個大小不等的隱藏層,並獲得以下分類器:



圖9 越大的神經網絡可以代表越複雜的函數。圓圈代表數據點,不同顏色代表不同類別。並且由訓練的神經網絡決定的區域顯示在下方。你可以在這個ConvNetsJS中演示這些例子。

在圖9中,我們可以看到具有更多神經元的網絡可以表達更復雜的函數。然而,這既有好處(因爲我們可以學習分類更復雜的數據)也有壞處(因爲它更容易過度訓練數據)。當具有高複雜度的模型擬合數據中的噪音而不是(假定的)數據之間的潛在關係時,過擬合就會發生。例如,具有20個隱藏神經元的模型擬合了所有訓練數據,但是它將空間分割成許多不相交的紅色和綠色決策區域。3個隱藏神經元的模型具有的表示能力只能將數據粗筆畫地分類。它將數據建模爲兩塊,並將綠色簇內的少數紅色點解釋爲異常值(噪聲)。在實踐中,這可能會使模型對測試集有更好的泛化能力。

基於我們上面的討論,如果數據不夠多,爲防止過擬合似乎較小的神經網絡是更優選的。然而,這是不正確的,有許多其他的方法可以防止過度擬合(例如L2正則化(regularization) ,丟失(DropOut),輸入噪聲(input noise))。在實踐中,使用這些方法來控制過度擬合比控制神經元數量的效果要好。

這背後的一個微妙的原因是,梯度下降等局部方法在較小的網絡中更難進行:很顯然,它們的損失函數具有相對較少的局部最小值,但事實證明,局部最小值越多越容易收斂,而且較小網絡的局部最小值是不好的(即高損失)。相反,更大的神經網絡包含更多的局部最小值,但是這些最小值在實際損失方面要比較小的網絡好得多。由於神經網絡是非凸的,所以很難從數學上研究這些性質,但是爲了理解這些目標函數研究者已經做了一些嘗試,例如,在最近的論文The Loss Surfaces of Multilayer Networks。在實踐中,你發現如果你訓練一個小型網絡,最終的損失可能會表現出很大的差異 - 在某些情況下,你很幸運收斂到一個低損失的局部最小值,但有時,你又會陷入一個高損失的局部最小值。另一方面,如果你訓練一個大型網絡,你會發現許多不同的解決方案,但最終實現的損失差異會小得多。換句話說,所有的解決方案都大致相同,並且不依賴於隨機初始化的運氣。

重申一下,正則化強度是控制神經網絡過度擬合的首選方法。我們可以看看三種不同正則化的結果:



圖10 正則化強度的影響:每個神經網絡有20個隱藏的神經元,提高正則化參數使其最終決策區域更平滑。你可以在這個ConvNetsJS中演示這個例子

結論是你不應該因爲害怕而使用較小的網絡。相反,您應該根據計算預算允許的限制來設置神經網絡的大小,並使用其他正則化手段來控制過擬合。

概要

綜上所述:

  • 我們介紹了一個非常粗糙的生物神經元模型
  • 我們討論了在實踐中使用的幾種類型的激活函數,其中ReLU是最常用的
  • 我們介紹了神經網絡,神經元與完全連接的層連接時,相鄰層中的神經元具有完全的成對連接,但層內的神經元沒有連接
  • 我們看到,這種分層架構能夠交織使用激活函數和矩陣乘法,對神經網絡進行高效評估
  • 我們看到,神經網絡是通用函數逼近器,但這個屬性與它們被廣泛使用無關。它們的使用是因爲它們對實踐中出現函數的形式做出了某些“正確”的假設
  • 大型網絡總是比小型網絡工作得更好,但是它們更大的複雜度必須通過更強的正則化(比如更大的權重衰減)來解決,否則它們可能會過擬合。在後面的章節中我們會看到更多的正則化形式(特別是Droout)。

引用

deeplearning.net tutorial with Theano
ConvNetJS直觀的演示
Michael Nielsen’s tutorials

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章