【DW 11月-西瓜書學習筆記】Task04:第五章 神經網絡

第五章 神經網絡

所謂神經網絡,目前用得最廣泛的一個定義是“神經網絡是由具有適應性的簡單單元組成的廣泛并行互連的網絡,它的組織能夠模擬生物神經系統對真實世界物體所做出的交互反應”。

5.1? 神經元模型

神經網絡中最基本的單元是神經元模型(neuron)。在生物神經網絡的原始機制中,每個神經元通常都有多個樹突(dendrite),一個軸突(axon)和一個細胞體(cell body),樹突短而多分支,軸突長而只有一個;在功能上,樹突用于傳入其它神經元傳遞的神經沖動,而軸突用于將神經沖動傳出到其它神經元,當樹突或細胞體傳入的神經沖動使得神經元興奮時,該神經元就會通過軸突向其它神經元傳遞興奮。


一直沿用至今的“M-P神經元模型”正是對這一結構進行了抽象,也稱“閾值邏輯單元“,其中樹突對應于輸入部分,每個神經元收到n個其他神經元傳遞過來的輸入信號,這些信號通過帶權重的連接傳遞給細胞體,這些權重又稱為連接權(connection weight)。細胞體分為兩部分,前一部分計算總輸入值(即輸入信號的加權和,或者說累積電平),后一部分先計算總輸入值與該神經元閾值的差值,然后通過激活函數(activation function)的處理,產生輸出從軸突傳送給其它神經元。M-P神經元模型如下圖所示:

與線性分類十分相似,神經元模型最理想的激活函數也是階躍函數,即將神經元輸入值與閾值的差值映射為輸出值1或0,若差值大于零輸出1,對應興奮;若差值小于零則輸出0,對應抑制。但階躍函數不連續,不光滑,故在M-P神經元模型中,也采用Sigmoid函數來近似, Sigmoid函數將較大范圍內變化的輸入值擠壓到 (0,1) 輸出值范圍內,所以也稱為擠壓函數(squashing function)。

將多個神經元按一定的層次結構連接起來,就得到了神經網絡。它是一種包含多個參數的模型,比方說10個神經元兩兩連接,則有100個參數需要學習(每個神經元有9個連接權以及1個閾值),若將每個神經元都看作一個函數,則整個神經網絡就是由這些函數相互嵌套而成。

5.2 感知機和多層網絡

感知機(Perceptron)是由兩層神經元組成的一個簡單模型,但只有輸出層是M-P神經元,即只有輸出層神經元進行激活函數處理,也稱為功能神經元(functional neuron);輸入層只是接受外界信號(樣本屬性)并傳遞給輸出層(輸入層的神經元個數等于樣本的屬性數目),而沒有激活函數。這樣一來,感知機與之前線性模型中的對數幾率回歸的思想基本是一樣的,都是通過對屬性加權與另一個常數求和,再使用sigmoid函數將這個輸出值壓縮到0-1之間,從而解決分類問題。不同的是感知機的輸出層應該可以有多個神經元,從而可以實現多分類問題,同時兩個模型所用的參數估計方法十分不同。

給定訓練集,則感知機的n+1個參數(n個權重+1個閾值)都可以通過學習得到。閾值Θ可以看作一個輸入值固定為-1的啞結點的權重ωn+1,即假設有一個固定輸入xn+1=-1的輸入層神經元,其對應的權重為ωn+1,這樣就把權重和閾值統一為權重的學習了。簡單感知機的結構如下圖所示:

感知機權重的學習規則如下:對于訓練樣本(x,y),當該樣本進入感知機學習后,會產生一個輸出值,若該輸出值與樣本的真實標記不一致,則感知機會對權重進行調整,若激活函數為階躍函數,則調整的方法為(基于梯度下降法):

其中 η∈(0,1)稱為學習率,可以看出感知機是通過逐個樣本輸入來更新權重,首先設定好初始權重(一般為隨機),逐個地輸入樣本數據,若輸出值與真實標記相同則繼續輸入下一個樣本,若不一致則更新權重,然后再重新逐個檢驗,直到每個樣本數據的輸出值都與真實標記相同。容易看出:感知機模型總是能將訓練數據的每一個樣本都預測正確,和決策樹模型總是能將所有訓練數據都分開一樣,感知機模型很容易產生過擬合問題。

由于感知機模型只有一層功能神經元,因此其功能十分有限,只能處理線性可分的問題,對于這類問題,感知機的學習過程一定會收斂(converge),因此總是可以求出適當的權值。但是對于像書上提到的異或問題,只通過一層功能神經元往往不能解決,因此要解決非線性可分問題,需要考慮使用多層功能神經元,即神經網絡。多層神經網絡的拓撲結構如下圖所示:

在神經網絡中,輸入層與輸出層之間的層稱為隱含層或隱層(hidden layer),隱層和輸出層的神經元都是具有激活函數的功能神經元。只需包含一個隱層便可以稱為多層神經網絡,常用的神經網絡稱為“多層前饋神經網絡”(multi-layer feedforward neural network),該結構滿足以下幾個特點:

* 每層神經元與下一層神經元之間完全互連?

* 神經元之間不存在同層連接?

* 神經元之間不存在跨層連接?

根據上面的特點可以得知:這里的“前饋”指的是網絡拓撲結構中不存在環或回路,而不是指該網絡只能向前傳播而不能向后傳播(下節中的BP神經網絡正是基于前饋神經網絡而增加了反饋調節機制)。神經網絡的學習過程就是根據訓練數據來調整神經元之間的“連接權”以及每個神經元的閾值,換句話說:神經網絡所學習到的東西都蘊含在網絡的連接權與閾值中。

5.3 BP神經網絡算法

由上面可以得知:神經網絡的學習主要蘊含在權重和閾值中,多層網絡使用上面簡單感知機的權重調整規則顯然不夠用了,BP神經網絡算法即誤差逆傳播算法(error BackPropagation)正是為學習多層前饋神經網絡而設計,BP神經網絡算法是迄今為止最成功的的神經網絡學習算法。

一般而言,只需包含一個足夠多神經元的隱層,就能以任意精度逼近任意復雜度的連續函數[Hornik et al.,1989],故下面以訓練單隱層的前饋神經網絡為例,介紹BP神經網絡的算法思想。


上圖為一個單隱層前饋神經網絡的拓撲結構,BP神經網絡算法也使用梯度下降法(gradient descent),以單個樣本的均方誤差的負梯度方向對權重進行調節。可以看出:BP算法首先將誤差反向傳播給隱層神經元,調節隱層到輸出層的連接權重與輸出層神經元的閾值;接著根據隱含層神經元的均方誤差,來調節輸入層到隱含層的連接權值與隱含層神經元的閾值。BP算法基本的推導過程與感知機的推導過程原理是相同的,下面給出調整隱含層到輸出層的權重調整規則的推導過程:

學習率η∈(0,1)控制著沿反梯度方向下降的步長,若步長太大則下降太快容易產生震蕩,若步長太小則收斂速度太慢,一般地常把η設置為0.1,有時更新權重時會將輸出層與隱含層設置為不同的學習率。BP算法的基本流程如下所示:

BP算法的更新規則是基于每個樣本的預測值與真實類標的均方誤差來進行權值調節,即BP算法每次更新只針對于單個樣例。需要注意的是:BP算法的最終目標是要最小化整個訓練集D上的累積誤差,即:

如果基于累積誤差最小化的更新規則,則得到了累積誤差逆傳播算法(accumulated error backpropagation),即每次讀取全部的數據集一遍,進行一輪學習,從而基于當前的累積誤差進行權值調整,因此參數更新的頻率相比標準BP算法低了很多,但在很多任務中,尤其是在數據量很大的時候,往往標準BP算法會獲得較好的結果。另外對于如何設置隱層神經元個數的問題,至今仍然沒有好的解決方案,常使用“試錯法”進行調整。

前面提到,BP神經網絡強大的學習能力常常容易造成過擬合問題,有以下兩種策略來緩解BP網絡的過擬合問題:

早停:將數據分為訓練集與測試集,訓練集用于學習,測試集用于評估性能,若在訓練過程中,訓練集的累積誤差降低,而測試集的累積誤差升高,則停止訓練。

引入正則化(regularization):基本思想是在累積誤差函數中增加一個用于描述網絡復雜度的部分,例如所有權值與閾值的平方和,其中λ∈(0,1)用于對累積經驗誤差與網絡復雜度這兩項進行折中,常通過交叉驗證法來估計。


5.4 全局最小和局部極小

模型學習的過程實質上就是一個尋找最優參數的過程,例如BP算法試圖通過最速下降來尋找使得累積經驗誤差最小的權值與閾值,在談到最優時,一般會提到局部極小(local minimum)和全局最小(global minimum)。

* 局部極小解:參數空間中的某個點,其鄰域點的誤差函數值均不小于該點的誤差函數值。?

* 全局最小解:參數空間中的某個點,所有其他點的誤差函數值均不小于該點的誤差函數值。?


要成為局部極小點,只要滿足該點在參數空間中的梯度為零。局部極小可以有多個,而全局最小只有一個。全局最小一定是局部極小,但局部最小卻不一定是全局最小。顯然在很多機器學習算法中,都試圖找到目標函數的全局最小。梯度下降法的主要思想就是沿著負梯度方向去搜索最優解,負梯度方向是函數值下降最快的方向,若迭代到某處的梯度為0,則表示達到一個局部最小,參數更新停止。因此在現實任務中,通常使用以下策略盡可能地去接近全局最小。

* 以多組不同參數值初始化多個神經網絡,按標準方法訓練,迭代停止后,取其中誤差最小的解作為最終參數。?

* 使用“模擬退火”技術,這里不做具體介紹。?

* 使用隨機梯度下降,即在計算梯度時加入了隨機因素,使得在局部最小時,計算的梯度仍可能不為0,從而迭代可以繼續進行。

5.5 深度學習

理論上,參數越多,模型復雜度就越高,容量(capability)就越大,從而能完成更復雜的學習任務。深度學習(deep learning)正是一種極其復雜而強大的模型。

怎么增大模型復雜度呢?兩個辦法,一是增加隱層的數目,二是增加隱層神經元的數目。前者更有效一些,因為它不僅增加了功能神經元的數量,還增加了激活函數嵌套的層數。但是對于多隱層神經網絡,經典算法如標準BP算法往往會在誤差逆傳播時發散(diverge),無法收斂達到穩定狀態。

那要怎么有效地訓練多隱層神經網絡呢?一般來說有以下兩種方法:

無監督逐層訓練(unsupervised layer-wise training):每次訓練一層隱節點,把上一層隱節點的輸出當作輸入來訓練,本層隱結點訓練好后,輸出再作為下一層的輸入來訓練,這稱為預訓練(pre-training)。全部預訓練完成后,再對整個網絡進行微調(fine-tuning)訓練。一個典型例子就是深度信念網絡(deep belief network,簡稱DBN)。這種做法其實可以視為把大量的參數進行分組,先找出每組較好的設置,再基于這些局部最優的結果來訓練全局最優。

權共享(weight sharing):令同一層神經元使用完全相同的連接權,典型的例子是卷積神經網絡(Convolutional Neural Network,簡稱CNN)。這樣做可以大大減少需要訓練的參數數目。

深度學習中訓練多隱層神經網絡這兩種方法,一種是無監督逐層訓練,即逐層預訓練,現在這種方法用得少了。現在常說的預訓練其實專指遷移學習(migration?learning)了 。

基于監督學習的深度學習技術,通過Dropout或批標準化來正則化,能夠在很多任務上達到人類級別的性能,但僅僅是在極大的標注數據集上。

在中等大小的數據集(例如:CIFAR-10 和 MNIST,每個類大約有5,000個標注樣本)上,這些技術的效果比無監督預訓練更好。

在極小的數據集,例如:選擇性剪接數據集,貝葉斯方法要優于基于無監督預訓練的方法。[1]


另一種是權共享(weight sharing),典型的例子是卷積神經網絡(CNN)?,可以大大減少需要訓練的參數數目。


深度學習可以理解為一種特征學習(feature learning)或者表示學習(representation learning),無論是DBN還是CNN,都是通過多個隱層來把與輸出目標聯系不大的初始輸入轉化為與輸出目標更加密切的表示,使原來只通過單層映射難以完成的任務變為可能。即通過多層處理,逐漸將初始的“低層”特征表示轉化為“高層”特征表示,從而使得最后可以用簡單的模型來完成復雜的學習任務。

傳統任務中,樣本的特征需要人類專家來設計,這稱為特征工程(feature engineering)。特征好壞對泛化性能有至關重要的影響。而深度學習為全自動數據分析帶來了可能,可以自動產生更好的特征。

參考鏈接:

[1]版權聲明:本文為CSDN博主「沒人不認識我」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_42555985/article/details/105063387

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容