首先什么是人工神經網絡?簡單來說就是將單個感知器作為一個神經網絡節點,然后用此類節點組成一個層次網絡結構,我們稱此網絡即為人工神經網絡(本人自己的理解)。當網絡的層次大於等於3層(輸入層+隱藏層(大於等於1)+輸出層)時,我們稱之為多層人工神經網絡。
1、神經單元的選擇
那么我們應該使用什么樣的感知器來作為神經網絡節點呢?在上一篇文章我們介紹過感知器算法,但是直接使用的話會存在以下問題:
1)感知器訓練法則中的輸出
由於sign函數時非連續函數,這使得它不可微,因而不能使用上面的梯度下降算法來最小化損失函數。
2)增量法則中的輸出為;
每個輸出都是輸入的線性組合,這樣當多個線性單元連接在一起后最終也只能得到輸入的線性組合,這和只有一個感知器單元節點沒有很大不同。
為了解決上面存在的問題,一方面,我們不能直接使用線性組合的方式直接輸出,需要在輸出的時候添加一個處理函數;另一方面,添加的處理函數一定要是可微的,這樣我們才能使用梯度下降算法。
滿足上面條件的函數非常的多,但是最經典的莫過於sigmoid函數,又稱Logistic函數,此函數能夠將內的任意數壓縮到(0,1)之間,因此這個函數又稱為擠壓函數。為了將此函數的輸入更加規范化,我們在輸入的線性組合中添加一個閥值,使得輸入的線性組合以0為分界點。
sigmoid函數:
其函數曲線如圖1.1所示。
圖1.1 sigmoid函數曲線[2]
此函數有個重要特性就是他的導數:
有了此特性在計算它的梯度下降時就簡便了很多。
另外還有雙曲函數tanh也可以用來替代sigmoid函數,二者的曲線圖比較類似。
2、反向傳播算法又稱BP算法(Back Propagation)
現在,我們可以用上面介紹的使用sigmoid函數的感知器來搭建一個多層神經網絡,為簡單起見,此處我們使用三層網絡來分析。假設網絡拓補如圖2.1所示。
圖2.1 BP網絡拓補結構[3]
網絡的運行流程為:當輸入一個樣例后,獲得該樣例的特征向量,再根據權向量得到感知器的輸入值,然后使用sigmoid函數計算出每個感知器的輸出,再將此輸出作為下一層感知器的輸入,依次類推,直到輸出層。
那么如何確定每個感知器的權向量呢?這時我們需要使用反向傳播算法來逐步進行優化。在正式介紹反向傳播算法之前,我們先繼續進行分析。
在上一篇介紹感知器的文章中,為了得到權向量,我們通過最小化損失函數來不斷調整權向量。此方法也適用於此處求解權向量,首先我們需要定義損失函數,由於網絡的輸出層有多個輸出結點,我們需要將輸出層每個輸出結點的差值平方求和。於是得到每一個訓練樣例的損失函數為:(前面加個0.5方便后面求導使用)
在多層的神經網絡中,誤差曲面可能有多個局部極小值,這意味着使用梯度下降算法找到的可能是局部極小值,而不是全局最小值。
現在我們有了損失函數,這時可以根據損失函數來調整輸出結點中的輸入權向量,這類似感知器中的隨機梯度下降算法,然后從后向前逐層調整權重,這就是反向傳播算法的思想。
具有兩層sigmoid單元的前饋網絡的反向傳播算法:
1)將網絡中的所有權值隨機初始化。
2)對每一個訓練樣例,執行如下操作:
A)根據實例的輸入,從前向后依次計算,得到輸出層每個單元的輸出。然后從輸出層開始反向計算每一層的每個單元的誤差項。
B)對於輸出層的每個單元k,計算它的誤差項:
C)對於網絡中每個隱藏單元h,計算它的誤差項:
D)更新每個權值:
符號說明:
xji:結點i到結點j的輸入,wji表示對應的權值。
outputs:表示輸出層結點集合。
整個算法與delta法則的隨機梯度下降算法類似,算法分析如下:
1)權值的更新方面,和delta法則類似,主要依靠學習速率,該權值對應的輸入,以及單元的誤差項。
2)對輸出層單元,它的誤差項是(t-o)乘以sigmoid函數的導數ok(1-ok),這與delta法則的誤差項有所不同,delta法則的誤差項為(t-o)。
3)對於隱藏層單元,因為缺少直接的目標值來計算隱藏單元的誤差,因此需要以間接的方式來計算隱藏層的誤差項對受隱藏單元h影響的每一個單元的誤差
進行加權求和,每個誤差
權值為wkh, wkh就是隱藏單元h到輸出單元k的權值。
3、反向傳播算法的推導
算法的推導過程主要是利用梯度下降算法最小化損失函數的過程,現在損失函數為:
對於網絡中的每個權值wji,計算其導數:
1)若j是網絡的輸出層單元
對netj的求導:
其中:
所以有:
為了使表達式簡潔,我們使用:
權值的改變朝着損失函數的負梯度方向,於是有權值改變量:
2)若j是網絡中的隱藏單元
由於隱藏單元中w的值通過下一層來間接影響輸入,故使用逐層剝離的方式來進行求導:
因為:
所以:
同樣,我們使用:
所以權值變化量:
4、算法的改進
反向傳播算法的應用非常的廣泛,為了滿足各種不同的需求,產生了很多不同的變體,下面介紹兩種變體:
1)增加沖量項
此方法主要是修改權值更新法則。他的主要思想在於讓第n次迭代時的權值的更新部分依賴於第n-1次的權值。
其中0<=a<1:稱為沖量的系數。加入沖量項在一定程度上起到加大搜索步長的效果,從而能更快的進行收斂。另一方面,由於多層網絡易導致損失函數收斂到局部極小值,但通過沖量項在某種程度上可以越過某些狹窄的局部極小值,達到更小的地方。
2)學習任意的深度的無環網絡
在上述介紹的反向傳播算法實際只有三層,即只有一層隱藏層的情況,要是有很多隱藏層應當如何進行處理?
現假設神經網絡共有m+2層,即有m層的隱藏層。這時,只需要變化一個地方即可得到具有m個隱藏層的反向傳播算法。第k層的單元r的誤差 的值由更深的第k+1層的誤差項計算得到:
5、總結
對於反向傳播算法主要從以下幾個方面進行總結:
1)局部極小值
對於多層網絡,誤差曲面可能含有多個不同的局部極小值,梯度下降可能導致陷入局部極小值。緩解局部極小值的方法主要有增加沖量項,使用隨機梯度下降,多次使用不同的初始權值訓練網絡等。
2)權值過多
當隱藏節點越多,層數越多時,權值成倍的增長。權值的增長意味着對應的空間的維數越高,過高的維數易導致訓練后期的過擬合。
4)算法終止策略
當迭代次數達到設定的閥值時,或者損失函數小於設定的閥值時,或
3)過擬合
當網絡的訓練次數過多時,可能會出現過擬合的情況。解決過擬合主要兩種方法:一種是使用權值衰減的方式,即每次迭代過程中以某個較小的因子降低每個權值;另一種方法就是使用驗證集的方式來找出使得驗證集誤差最小的權值,對訓練集較小時可以使用交叉驗證等。
另外,神經網絡中還有非常多的問題可以討論,比如隱藏節點數量的多少,步長是否固定等,在此不展開討論。
展望:
關於神經網絡現在已有較多的研究,也產生了很多新的擴展算法,比如卷積神經網絡,深度神經網絡,脈沖神經網絡等。尤其是脈沖神經網絡被稱為第三代神經網絡,這些神經網絡算法在未來將會有越來越多的應用,比如深度神經網絡在圖像識別,語音識別等領域已經取得了非常好的效果。
最后,此文主要參考Mitchell的機器學習課本撰寫而成,如有錯誤歡迎指正!
參考文獻:
[1] Tom M. Mitchell, 機器學習。
[2] Keep Going, http://www.cnblogs.com/startover/p/3143763.html
[3] HaHack, http://hahack.com/reading/ann2/