1. 前向傳播演算法

所謂的前向傳播演算法就是:將上一層的輸出作為下一層的輸入,並計算下一層的輸出,一直到運算到輸出層為止。

對於Layer 2的輸出 a_{1}^{(2)}a_{2}^{(2)}a_{3}^{(2)}

a_{1}^{(2)}=sigma(z_{1}^{(2)})=sigma(w_{11}^{(2)}x_{1}+w_{12}^{(2)}x_{2}+w_{13}^{(2)}x_{3}+b_{1}^{(2)})

a_{2}^{(2)}=sigma(z_{2}^{(2)})=sigma(w_{21}^{(2)}x_{1}+w_{22}^{(2)}x_{2}+w_{23}^{(2)}x_{3}+b_{2}^{(2)})

a_{3}^{(2)}=sigma(z_{3}^{(2)})=sigma(w_{31}^{(2)}x_{1}+w_{32}^{(2)}x_{2}+w_{33}^{(2)}x_{3}+b_{3}^{(2)})

對於Layer 3的輸出a_{1}^{(3)}

a_{1}^{(3)}=sigma(z_{1}^{(3)})=sigma(w_{11}^{(3)}a_{1}^{(2)}+w_{12}^{(3)}a_{2}^{(2)}+w_{13}^{(3)}a_{3}^{(2)}+b_{1}^{(3)})

a_{2}^{(3)}=sigma(z_{2}^{(3)})=sigma(w_{21}^{(3)}a_{1}^{(2)}+w_{22}^{(3)}a_{2}^{(2)}+w_{23}^{(3)}a_{3}^{(2)}+b_{2}^{(3)})

從上面可以看出,使用代數法一個個的表示輸出比較複雜,而如果使用矩陣法則比較的簡潔。將上面的例子一般化,並寫成矩陣乘法的形式,

z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}

a^{(l)}=sigma(z^{(l)})

其中 sigma 為 sigmoid 函數。

這個表示方法就很簡潔、很漂亮,後面我們的討論都會基於上面的這個矩陣法表示來。所以,應該牢牢記住我們符號的含義,否則在後面推導反向傳播公式時會比較懵。


2. 反向傳播演算法(BP演算法)

反向傳播(back propagation, BP)演算法是 "誤差反向傳播" 的簡稱,也稱為backprop,允許來自代價函數的信息通過網路向後流動,以便計算梯度。

反向傳播是一種與最優化方法(如梯度下降法)結合使用的,用來訓練人工神經網路的常見方法。該方法對網路中所有權重計算損失函數的梯度。這個梯度會反饋給最優化方法,用來更新權值以最小化損失函數。

反向傳播這個術語經常被誤解為用於多層神經網路的整個學習演算法。實際上,反向傳播僅指用於計算梯度的方法。而另一種演算法,例如隨機梯度下載法,纔是使用該梯度來進行學習。另外,反向傳播還經常被誤解為僅適用於多層神經網路,但是原則上它可以計算任何函數的到導數(對於一些函數,正確的響應是報告函數的導數是未定義的)。


簡單介紹一下鏈式法則:

微積分中的鏈式法則(為了不與概率中的鏈式法則相混淆)用於計複合函數的導數。反向傳播是一種計算鏈式法則的演算法,使用高效的特定運輸順序。

x 是實數, fg 是從實數映射到實數的函數。假設 y=g(x) 並且 z=f(g(x))=f(y) 。那麼鏈式法則就是: frac{dz}{dx}=frac{dz}{dy}frac{dy}{dx}


推導BP演算法 ( get一下重點內容 )

在進行反向傳播演算法前,我們需要選擇一個損失函數,來度量訓練樣本計算出的輸出和真實的訓練樣本輸出之間的損失。我們使用最常見的均方誤差(MSE)來作為損失函數,

其中 a^{(l)} 為訓練樣本計算出的輸出,y為訓練樣本的真實值。加入係數 frac{1}{2} 是為了抵消微分出來的指數。

(1) 輸出層的梯度

其中 odot 表示Hadamard積,即兩個維度相同的矩陣對應元素的乘積。

我們注意到在求解輸出層梯度的時候有公共的部分,記為

(2) 隱藏層的梯度

我們把輸出層 l 的梯度算出來了 ,那麼如何計算 l-1 層的梯度, l-2 層的梯度呢?

因為上面已經求出了輸出層的誤差,根據誤差反向傳播的原理,當前層的誤差可理解為上一層所有神經元誤差的複合函數,即使用上一層的誤差來表示當前層誤差,並依次遞推。

這裡我們用數學歸納法,假設第 l+1 層的 delta^{(l+1)} 已經求出,那麼我們如何求出第 l 層的delta^{(l)}呢?

z^{(l+1)}z^{(l)}的關係如下:

z^{(l+1)}=W^{(l+1)}a^{(l)}+b^{(l+1)}=W^{(l+1)}sigma(z^{(l)})+b^{(l+1)}

這樣很容易求出,

所以,

現在我們得到了 delta^{(l)} 的遞推關係式,只要求出了某一層的delta^{(l)},求解w^{(l)}b^{(l)}的對應梯度就很簡單:


對反向傳播演算法的過程進行一下總結:

輸入:總層數L,以及各隱藏層與輸出層的神經元個數,激活函數,損失函數,迭代步長 alpha ,最大迭代次數MAX與停止迭代閾值 epsilon ,輸入的m個訓練樣本 ((x_{1},y_{1}),(x_{2},y_{2}),...(x_{m},y_{m}))

1. 初始化參數W,b

2. 進行前向傳播演算法計算,for l=2 to L

z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}

a^{(l)}=sigma(z^{(l)})

3. 通過損失函數計算輸出層的梯度

4. 進行反向傳播演算法計算,for l=L-1 to 2

5. 更新W,b

通過梯度下降演算法更新權重w和偏置b的值,alpha為學習率其中alphain(0,1]

6. 如果所有W,b的變化值都小於停止迭代閾值?,則跳出迭代循環

7. 輸出各隱藏層與輸出層的線性關係係數矩陣W和偏置b


推薦閱讀:
相關文章