最近在看神經網絡中的前向傳播算法(FP)和反向傳播算法(BP),特地進行總結一下,方便以後理解。
1.基本概念
上圖是一張自己畫的神經網絡的圖。假設每一層都添加了偏度單元(即值爲1的神經元),用來表示閥值(因爲閥值通常是一個常數)。
上圖中{x1,x2,x3} 表示輸入(假設其中添加了偏度單元,後面不再重複),wij(k) 表示聯結權重,其中i 表示每次輸入中的第i 個元素,j 表示經過聯結權重處理之後的輸出中的第j 個元素,k 指明是第k 層到第(k+1) 層之間的聯結權重。aij 表示經過聯結權重處理後的輸出,其中i 表示第i 層,j表示第j 個輸出;H(x) 表示激活函數,Zij 表示aij 經過激活函數處理之後的輸出,即Zij=H(aij) 。{y1,y2,y3} 表示經過神經網絡處理之後最終的輸出。
其中
aij=∑k=1Nwkj(i−1)z(i−1)k
其中
i 表示第
i 層,
j 表示第
j 個元素,
N 表示總輸入個數,
z 表示輸入,對於輸入層
{x1,x2,x3} 可以表示爲
{z11,z12,z13} 。例如上圖中有:
a31=w11(2)∗z21+w21(2)∗z22+w31(2)∗z23
2.前向傳播算法
前向傳播算法,顧名思義,是由前往後進行的一個算法。最開始,我們會初始化一組w 的取值,並且選定一個激活函數,爲了後面的方便,我們假設選定sigmoid 函數作爲函數,其函數形式爲:
H(x)=ginmoid(x)=11+e−x
並且它的導數爲
H′(x)=H(x)(1−H(x)) 。
有了聯結權重w 和激活函數H(x) 之後,就可以由前往後計算,依次算出所有的a 值,z 值,最終算出輸出層的y 值。這就是前向傳播算法。
3.反向傳播算法
前面用初始化的聯結權重計算的輸出層值和實際值肯定會有很大的偏差,我們需要對連接權重進行優化,此時就需要使用反向傳播算法。
現在假設經過前向傳播算法計算的某個輸出值爲yk ,表示輸出層的第k 個輸出,而其實際的值爲tk (訓練樣本的標籤值是已知的,不然怎麼訓練)。那麼誤差函數定義如下:
E=12∑k(yk−tk)2
後向傳播算法是通過梯度下降的方法對聯結權重進行優化,所以需要計算誤差函數對聯結權重的偏導數。
對於和輸出層直接關聯的連接權重,即上圖中的wij(3) ,簡稱爲w(3) ,對其求偏導有:
∂E∂w(3)=∂E∂yk∗∂yk∂a4d∗∂a4d∂w(3)=(yk−tk)∗H′(a4d)∗z3
例如圖中,假設僅僅計算
y1 的輸出偏差對
w11(3) 的偏導數:
∂E∂w11(3)=∂E∂y1∗∂y1∂a41∗∂a41∂w11(3)=(y1−t1)∗H′(a41)∗z31
其中因爲
a41=w11(3)∗z31+w21(3)∗z32+w31(3)∗z33 ,當
a 對
w 求偏導數時,僅僅有一項
z 和對應的
w 相乘得到
a ,所以求導結果便是某個
z ,請結合上面例子理解。
1.對於和輸出層直連的wij(k)有:
∂E∂wij(k)=∂E∂a(k+1)j∗∂a(k+1)j∂wij(k)
我們假設
∂E∂a(k+1)j≡δk+1 ,並且有
∂a(k+1)j∂wij(k)=zkj ,那麼有:
∂E∂wij(k)=δk+1∗zkj(公式3.1)
由於
zkj 在前向傳播算法中就已經可以求得,所以重點是求解各層的
δ ,以便獲得對
w 的偏導,用於梯度下降過程中
w 的更新。
2.對於隱藏層的wij(k) ,我們無法直接知道該層該層的損失爲多少,需要由後面傳播過來,這就是反向傳播的原理。這裏假設輸出層(第k+1層)共有j 個神經元,第k層有i 個神經元,第(k-1)層有l 個神經元;與輸出層相連的w 爲wij(k) ,和輸出層最近的隱藏層的w 爲wli(k−1) ,表示該層(k−1 層)共有l 個神經元。則輸出誤差對該層w 的偏導數爲:
∂E∂wli(k−1)=∂E∂aki∗∂aki∂wli(k−1)=δk∗z(k−1)i(公式3.2)
又:
∂E∂wli(k−1)=∑j∂E∂a(k+1)j∗∂a(k+1)j∂zki∗∂zki∂aki∗∂aki∂wli(k−1)
即=:
∂E∂wli(k−1)=∑jδk+1∗wij(k)∗H′(a(k+1)j)∗z(k−1)i(公式3.3)
將公式3.2和公式3.3進行對比,可以發現:
δk=H′(a(k+1)j)∗∑jδk+1∗wij(k)(公式3.4)
所以就可以由後面的
δ 推出前面的
δ ,即用
δk+1 推出
δk ,依次類推,就可以求出每一層對應的
δ ,又根據公式3.1,就可以求解出誤差對每一層聯結權重
w(k) 的偏導數,再利用如下公式利用梯度下降法更新權重:
wm+1=wm+α∂E∂w
其中m表示第m輪迭代,(m+1)表示第(m+1)輪迭代。
所以反向傳播算法就是,先根據輸出層的誤差,計算出輸出層對應的δ ,然後再依次反向往前推出隱藏層的δ 。看公式3.4你會發現,其實第k 層的某個δk ,相當於從第k+1層的δk+1 中分配了一部分誤差過來,而這個分配的權重,就是前向傳播算法中使用的連接權重w ,所以這類似於一個反覆的過程。以下圖中的w11(2) 爲例,誤差對它的偏導數爲:
∂E∂w11(2)=∂E∂a31∗∂a31∂w11(2)=δk1∗z21
又:
δk1=H′(a31)∗∑j=13δk+1j∗w1j(k)
可以看出
w11(2) 影響了
a31 ,進而影響了
z31 ,而
z31 對後面的輸出
{a41,a42,a43} 都有影響,並且是通過連接權重
w1j(3) 來實現的;所以當有錯誤發生時,誤差也是通過相應的聯結權重
w1j(3) 反向回去,分配錯誤。
所以反向傳播算法的完整過程如下:
1.初始化聯結權重wij .
2.對於輸入的訓練樣本,求取每個節點輸出和最終輸出層的輸出值.
3.對輸出層求取δk=(yk−tk)∗H′(ak)
4.對於隱藏層求取δj=H′(ak)∗∑kδk∗wjk
5.求取輸出誤差對於每個權重的梯度:∂En∂wji=δj∗zi
6.更新權重:wm+1=wm+α∂E∂w