上一章的神經網絡實際上是前饋神經網絡(feedforward neural network),也叫多層感知機(multilayer perceptron,MLP)。具體來說,每層神經元與下一層神經元全互聯,神經元之間不存在同層或跨層連接;輸入層神經元僅接受外界輸入,不進行函數處理;隱藏層與輸出層包含功能神經元,對信號進行加工;最終結果由輸出層神經元輸出。“前饋”是說網絡拓補結構上不存在環路或回路,而不是指網絡信號不能向后傳遞。
前向傳播(FP)
所謂前向傳播,就是根據一些列包含偏置項的權重矩陣Θ和輸入層向量x,根據激活函數逐層計算,最終計算到輸出層,得到輸出結果的過程。
輸入:總層數L,所有隱藏層和輸出層對應的權重矩陣Θ,輸入向層量x
輸出:輸出層的向量y
學習策略
首先為下面的4層多分類神經網絡定義一些符號。
- 訓練樣本:{ (x(1), y(1)), (x(2), y(2)), ……, (x(m), y(m)) }
- 神經網絡層數: L
- 每一層的神經元數:Sl 下標l 表示神經元所在的層數,Sl 不包括偏置項
- 輸出層的維度:K,由於輸出層的神經元數=輸出層的維度,所以 SL = K。K=1表示二分類,K≥3表示多分類,K = 2沒有意義(K=1已經是二分類,沒有必要再添加一個輸出神經元)。
上圖中:
我們已經知道邏輯回歸的損失函數:
上面的損失函數加入了正則化。由於神經元使用了sigmoid函數作為損失函數,所以神經網絡的損失函數:
其中y(i)k 表示第i個樣本在輸出層第k個維度的值。例如:
每個輸出神經元的損失函數都和邏輯回歸的類似。如果是單個神經元,即K=1時,正是邏輯回歸的損失函數:
單個神經元
對於多分類,比如上面的4分類,邏輯回歸首先對訓練樣本的進行預處理,根據分類不同,得到4組相同輸入但標簽不同的訓練樣本;然后使用相同的損失函數對每組樣本進行訓練,得出4個不同的hθ;最后取置信度最高的hθ作為預測結果。而神經網絡只需要對訓練樣本進行一次預處理,訓練后得到唯一的hΘ。
神經網絡的正則化項是所有隱藏層和輸出層上所有神經元的正則化之和:
這里J(Θ)是一個實數。對於正則化項,L - 1是因為輸出層作為最末層,不再繼續向后傳播。正則化同樣不計算偏置項,所以Θ的下標從1開始。Sl 是第 l 層神經元的個數。以上面的4分類神經網絡為例,L = 4:
算法——反向傳播(BP)
神經網絡的學習過程就是根據訓練數據來調整神經元之間的權值,通過權值可以計算出該層神經元的閾值,換句話說,神經網絡學到的東西,蘊含在權值和閾值中。
我們的目的是找到最佳的Θ使得J(Θ)最小化,將求解Θ轉換為最優化問題,即:
依然可以使用梯度下降:
這里需要對Θ求導,然而實際推導時會發現,求導的過程遠比邏輯回歸困難。我們的求導目標:
以下圖為例,嘗試進行反向傳播的推導:
簡單起見,將J(Θ)的正則化項去掉,並令m = 1,即僅有一個訓練樣本,此時可以去掉上標並固化一些參數:
通過上一章的內容,我們知道,每一層的節點都依賴於上一層的節點和權重:
g是激活函數,這里是sigmoid函數。可以通過z和Θ之間的關聯使用鏈式法則,對Θi,j(l)求偏導:
現在來重新審視一下J(Θ)的意義,它代表神經網絡函數與實際結果的誤差,也就是輸出層與實際結果的誤差,輸出層的誤差又來源於上一層……就這樣從輸出層開始,層層追責,直到輸入層為止,這也是被稱為“反向傳播”的原因。
由於神經網絡每一層有多個神經元,所以每層的誤差又是由該層所有神經元的誤差組成。對某一神經元的輸入加以擾動就能獲得該神經元對最終結果的影響,因此定義第 l 層第 j 個神經元aj(l)的誤差是:
寫成向量形式:
因為定義了神經元的誤差項δ作為中間變量,所以:
l 層的所有權重的偏導可以表示為矩陣:
上式等於下面的簡化形式:
注意這里Θ(l)是Sl+1×Sl的矩陣,需要使用矩陣求導公式(y是標量,X是矩陣):
最后的結果是一個矩陣,矩陣中的每一個元素都對應神經網絡中的一個權重,算法的訓練目標正是求得最佳權重。a(l)可以通過輸入層和初始權重求得,現在的問題是如何求解誤差項δ。
輸出層誤差
輸出層的誤差可以直接用真實值和預測值的差值定義:
隱藏層的誤差
對於隱藏層 l 層來說,它的某一神經元節點與 l+1 層的所有神經元都存在關聯,如下圖所示:
目標是計算 l 層的某個輸入對最終結果的影響,即:
這里需要使用多變量微積分的鏈式求導法則,首先將zj(l)關聯的節點參數化:
其中等式右側的zi(l+1)是一個有唯一自變量zj(l)的函數,具體來說,是 l 層神經元的加權和。根據鏈式求導法則:
關於上式中多變量微積分的鏈式求導法則,可參考《多變量微積分筆記4——全微分與鏈式法則》。需要注意下標 i 和 j 的切換。是sigmoid函數,如果繼續計算g’:
推導過程可參見《ML(4)——邏輯回歸》。
用向量表示誤差:
⊙表示矩陣的對應元素兩兩相乘,相當於Octave中的“./”操作。以下面的四分類為例:
在寫這篇文章時,本來想直接從網上copy一些推導,但是仔細閱讀后,發現大多數網文直接將誤差的推導寫成下面的形式,最后莫名其妙地得出了結論:
實際上這是錯誤的,對於矩陣或向量的求導無法直接使用標量函數的鏈式求導法則,即使能夠像上面那樣使用,也不會得到最右側的結果。
正則化項
正則化項的求導較為簡單,可以直接得出結果:
最終結果
現在,困難的求解過程已經結束,最初的目標已經能夠求解:
注意這里的約束條件是 1 < l,因為輸出層沒有權重:
擴展到m個訓練樣本,上標 t 表示第 t 組數據:
如果加入正則化項:
最終的梯度下降公式:
計算過程
根據梯度下降算法,需要反復計算權重的偏導,這在邏輯回歸中很容易,但在神經網絡中就比較麻煩,下面是權重偏導的計算過程:
1.訓練數據:{(x(1),y(1)), (x(1),y(1)),…, (x(m),y(m))}
2.將所有權重初始化,設Δi,j(l)是m個訓練數據中所有相同位置的權重和,即:
3.開始訓練,t = 1 for t to m:
3.1. set a(1) = x(1)
3.2. 用前向傳播方法計算每一層的神經元輸出,即a(l)
3.3. 計算每一層的誤差,需要注意的是輸出層和隱藏層的區別:
3.4. 累加Δi,j(l):
4. 求得權重的偏導:
注意D(l)是一個包含 l 層所有權重偏導的Sl+1×Sl矩陣。
參考:
Ng視頻《Neural Networks》
《機器學習》周志華
《視覺機器學習20講》
作者:我是8位的
出處:http://www.cnblogs.com/bigmonkey
本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!
掃描二維碼關注公眾號“我是8位的”