1. 爲什麼要用反向傳播——梯度下降
上一篇中我們構建了神經網絡模型,並推導出其代價函數(見 2.3代價函數),那麼可以像邏輯迴歸那樣利用梯度下降來優化參數嗎?
跟之前一樣,梯度下降法也是通過求 J(θ) 的偏導數來更新參數,對於某個 θij,給它加上減去一個很小的量 ϵ 來計算梯度:
∂θj∂J(θ)≈2ϵJ(θ1,⋯,θj+ϵ,⋯,θn)−J(θ1,⋯,θj−ϵ,⋯,θn)但稍微分析一下算法的複雜度就能知道,這樣的方法計算速度十分緩慢。對於每一組數據,我們需要計算所有權值的梯度:總的計算次數=訓練樣本個數∗網絡權值個數∗前向傳播計算次數在通常情況下這樣的計算複雜度是無法接受的,因此我們需要引入反向傳播算法來簡化計算。
2. 反向傳播的基礎補充——鏈式法則
爲了能夠理解之後對於 反向傳播 公式的推導,我們首先要了解一個關於 多元複合函數求導的 鏈式法則。下圖中,x,y 是自變量,u,v 是 x,y 的函數,p,q 又是 u,v 的函數,最後 z 是 p,q 的函數:
當我們要求z對x,y的偏導數,有以下公式:
∂x∂z=∂p∂z∂u∂p∂x∂u+∂p∂z∂v∂p∂x∂v+∂q∂z∂u∂q∂x∂u+∂q∂z∂v∂q∂x∂v ∂y∂z=∂p∂z∂u∂p∂y∂u+∂p∂z∂v∂p∂y∂v+∂q∂z∂u∂q∂y∂u+∂q∂z∂v∂q∂y∂v和上圖類似,神經網絡就是一個有很多層次的多元函數。
3. 反向傳播是什麼——直觀展示
注:下圖均是以一個樣本爲例計算,並不是整個訓練集
3.1 前向傳播過程回顧
首先以一個兩輸入、一輸出的四層神經網絡爲例回顧下 前向傳播(Forward Propagation)的過程:(圖源)
注意:其中f(e)爲激活函數,w表示權重參數,爲保持符號統一,後續還是用θ表示
- 第一層爲輸入層,輸入信號爲 x1,x2,
- 第二三層爲隱藏層:
最後一層是輸出層:
到這裏爲止,神經網絡的一輪前向傳播已經完成,最後輸出的 y 就是本次前向傳播神經網絡計算出來的結果(預測結果),但這個預測結果不一定是正確的,和真實的標籤 z 相比較,預測結果存在誤差 δ,如下:
我們知道,優化一個神經網絡就是優化它的權重(參數),最開始已經解釋了用普通方法計算的複雜度,因此就有了反向傳播的基本思路:
3.2 反向傳播過程展示
輸出層神經元有其對應的真實標籤,可以想象內部的隱藏層神經元也有其對應的真實標籤,只是我們看不到也無法計算,但我們可以用反向傳播誤差的思想來計算內部神經元與其真實值之間的誤差。
- 改變數據流的方向,通過層與層之間的權重,可以得到每個神經元的誤差 δi:
- 計算得到每個神經元的誤差後,就可以通過求偏導來逐層更新每個神經元的輸入權重,即完成優化神經網絡的目的。(注:η就是學習率,後續還是用α表示)
到此爲止,整個神經網絡反向傳播的一輪權重更新已經完成。
3.3 小結
由上述過程,我們可以明確兩點:
- 正向傳播——求損失,即代價函數
- 反向傳播——回傳誤差,得到梯度,更新權重
4. 公式推導
在之前的邏輯迴歸和線性迴歸中,梯度下降法可以表示爲:
θ:=θ−α∂θ∂J(θ)而在神經網絡中,我們使用反向傳播得到的誤差 δ 來獲取梯度∂θ∂J(θ)
4.1 誤差計算 —— δ
以下面4層神經網絡爲例:
定義 第 l 層第 j 個神經元的誤差 爲(其中z是上圖中的中間變量):δj(l)=∂zj(l)∂J(θ)可以簡化爲 第 l 層神經元的誤差 是:δ(l)=∂z(l)∂J(θ) , z(l)=θ(l−1)a(l−1)對誤差公式的解釋如下(參考: 如何理解反向傳播的誤差公式):
分析網絡的內部,稍微把 z(l) 改一下,就會影響到神經網絡 hθ(x) 的值,從而影響到J(θ)。
因此∂z(l)∂J(θ)表示神經元的加權輸入z(l)的變化給損失函數J(θ)帶來的變化梯度。
如果神經網絡符合數據,根據最小值條件(函數取得最小值的必要條件,導數爲0),變化率應該爲0。那就是說,可以認爲δ(l)表示與神經網絡符合數據的理想狀態的偏差。這個偏差表示爲“誤差”。
下面我們就來算一下各層的誤差 δ:
- Layer4:δ(4)=a(4)−y
- Layer3(鏈式求導):δ(3)=∂z(3)∂J=∂a(4)∂J ⋅ ∂z(4)∂a(4) ⋅ ∂a(3)∂z(4) ⋅ ∂z(3)∂a(3)=(a(4)−y+1−a(4)1−y) ⋅ [a(4)(1−a(4))] ⋅ θ(3) ⋅ [a(3)(1−a(3))]=(a(4)−y) ⋅ θ(3) ⋅ g′(z(3))=(θ(3))T ⋅ δ(4) ⋅ g′(z(3)) (吳恩達給出的順序,具體應用以實際維度爲準)
將代價函數簡化表示爲:J(θ)=−ylogh(x)−(1−y)log(1−h(x))=−yloga(4)−(1−y)log(1−a(4)),所以:
∂a(4)∂J=(a(4)−y+1−a(4)1−y)
Sigmoid函數的導數爲:g′(z)=g(z)(1−g(z)),所以:
∂z(4)∂a(4)=∂z(4)∂g(z(4))=a(4)(1−a(4))∂z(3)∂a(3)=∂z(3)∂g(z(3))=a(3)(1−a(3))
- Layer2(推導同上):δ(2)=∂z(2)∂J=(θ(2))T ⋅ δ(3) ⋅ g′(z(2))
4.2 梯度計算——誤差矩陣 Δ
在上一步計算得到每一層神經元的誤差後,就可以計算每層 θ 的梯度,用誤差矩陣 Δ 表示(注:以下的J(θ)無正則化):Δ(3)=∂θ(3)∂J=∂z(4)∂J ⋅ ∂θ(3)∂z(4)=δ(4)(a(3))TΔ(2)=∂θ(2)∂J=∂z(3)∂J ⋅ ∂θ(2)∂z(3)=δ(3)(a(2))TΔ(1)=∂θ(1)∂J=∂z(2)∂J ⋅ ∂θ(1)∂z(2)=δ(2)(a(1))T一般化爲:
Δ(l)=∂θ(l)∂J=δ(l+1)(a(l))T
加上下標:
Δij(l)=∂θij(l)∂J=aj(l)δi(l+1)
- l :代表目前所計算的是第幾層
- j :代表目前計算層中的激活單元的下標
- i :代表下一層中誤差單元的下標
4.3 梯度矩陣—— D
加上正則化項和係數m1,用 D(l) 來表示每層權值 θ(l) 的更新過程:θ(l):=θ(l)+αD(l)其中Dij(l)=⎩⎪⎪⎪⎨⎪⎪⎪⎧m1Δij(l)+mλθij(l) m1Δij(l)if j=0if j=0
5. 反向傳播計算過程總結
- 初始化所有神經元的誤差,即對於所有的l,i,j,初始化Δij(l)=0
- 對於 m 個樣本中的每一個樣本:
- 獲取輸入變量 a(1)=x(k),k=1,2⋅⋅⋅,m
- 前向傳播,計算各層激活向量 a(l)
- 計算輸出層誤差 δ(L)
- 計算其他層誤差 δ(L−1),δ(L−2),...,δ(2)
- 計算誤差矩陣 Δij(l):=Δij(l)+aj(l)δi(l+1)
- 計算梯度矩陣:Dij(l)=⎩⎪⎪⎪⎨⎪⎪⎪⎧m1Δij(l)+mλθij(l) m1Δij(l)if j=0if j=0
- 更新權值:θ(l):=θ(l)+αD(l)
6. 補充:權值隨機初始化
對於邏輯迴歸,通常將參數初始化爲0。對於神經網絡,初始化爲0不可行。
如果我們令所有的初始參數都爲0或者一個非0的數,這會導致每層的 激活單元 都相同,每一層都在計算相同特徵,那麼是無法進行非線性的擬合的。換句話說,本來我們希望不同的神經元學習到不同的特徵,但是由於參數相同以及輸出值都一樣,不同的結點根本無法學到不同的特徵!這樣就失去了網絡學習特徵的意義了。
因此我們使用隨機化的初始化方法,通常將參數初始化爲(−ε,ε)之間的隨機值。
參考:
1.反向傳播過程
2.帶下標的公式推導
3.不帶下標的公式推導
4.吳恩達機器學習筆記week5