1. 程式人生 > 實用技巧 >反向傳播演算法”過程及公式推導

反向傳播演算法”過程及公式推導

考研人資訊庫

考研對資訊的獲取至關重要,此公眾號會發表計算機考研(初複試資訊)、夏令營等資料,方便考研人對資訊的獲取,節約自身查詢資料的時間

目錄

前言(扯犢子)

定義

演算法講解(耐心看)

CASE 1(圖示講解,看不太懂沒關係,看第二組圖)

CASE 2(具體計算舉例,嫌麻煩的可直接看這個,強烈推薦!!!!!)

References


前言(扯犢子)

這是一場以誤差(Error)為主導的反向傳播(Back Propagation)運動,旨在得到最優的全域性引數矩陣,進而將多層神經網路應用到分類或者回歸任務中去。

前向傳遞輸入訊號直至輸出產生誤差,反向傳播誤差資訊更新權重矩陣。這兩句話很好的形容了資訊的流動方向,權重得以在資訊雙向流動中得到優化。

至於為什麼會提出反向傳播演算法,我直接應用梯度下降(Gradient Descent)不行嗎?想必大家肯定有過這樣的疑問。答案肯定是不行的,縱然梯度下降神通廣大,但卻不是萬能的。梯度下降可以應對帶有明確求導函式的情況,或者說可以應對那些可以求出誤差的情況,比如邏輯迴歸(Logistic Regression),我們可以把它看做沒有隱層的網路;但對於多隱層的神經網路,輸出層可以直接求出誤差來更新引數,但其中隱層的誤差是不存在的,因此不能對它直接應用梯度下降,而是先將誤差反向傳播至隱層,然後再應用梯度下降,其中將誤差從末層往前傳遞的過程需要鏈式法則(Chain Rule)的幫助,因此反向傳播演算法可以說是梯度下降在鏈式法則中的應用。

定義

首先來一個反向傳播演算法的定義(轉自維基百科):反向傳播(英語:Backpropagation,縮寫為BP)是“誤差反向傳播”的簡稱,是一種與最優化方法(如梯度下降法)結合使用的,用來訓練人工神經網路的常見方法。 該方法對網路中所有權重計算損失函式的梯度。 這個梯度會反饋給最優化方法,用來更新權值以最小化損失函式。(誤差的反向傳播)

演算法講解(耐心看)

如果去問一下了解BP演算法的人“BP演算法怎推導?”,大概率得到的回答是“不就是鏈式求導法則嘛”,我覺得這種答案對於提問題的人來說沒有任何幫助。BP的推導需要鏈式求導不錯,但提問者往往想得到的是直觀的回答,畢竟理解才是王道。直觀的答案,非圖解

莫屬了。
注:下圖的確是反向傳播演算法,但不是深度學習中的backprop,不過backward的大體思想是一樣的,畢竟誤差沒法從前往後計算啊。(在深度學習中操作的是計算圖—Computational graph),如果暫時不理解上面那句話,你可以當我沒說過,不要緊~(手動?)

下面通過兩組圖來進行神經網路前向傳播反向傳播演算法的講解,第一組圖來自國外某網站,配圖生動形象。如果對你來說,單純的講解理解起來比較費勁,那麼可以參考第二組圖——一個具體的前向傳播和反向傳播演算法的例子。通過本篇部落格,相信就算是剛剛入門的小白(只要有一點點高等數學基礎知識),也一定可以理解反向傳播演算法!

CASE 1(圖示講解,看不太懂沒關係,看第二組圖)

首先拿一個簡單的三層神經網路來舉例,如下:
在這裡插入圖片描述

每個神經元由兩部分組成,第一部分(e)是輸入值權重係數乘積的,第二部分(f(e))是一個啟用函式(非線性函式)的輸出, y=f(e)即為某個神經元的輸出,如下:
在這裡插入圖片描述

下面是前向傳播過程:
在這裡插入圖片描述
-----------手動分割-----------
在這裡插入圖片描述
-----------手動分割-----------
在這裡插入圖片描述

到這裡為止,神經網路的前向傳播已經完成,最後輸出的y就是本次前向傳播神經網路計算出來的結果(預測結果),但這個預測結果不一定是正確的,要和真實的標籤(z)相比較,計算預測結果和真實標籤的誤差( δ \delta δ),如下:
在這裡插入圖片描述

下面開始計算每個神經元的誤差( δ \delta δ):
在這裡插入圖片描述
(If propagated errors came from few neurons they are added. The illustration is below: )

在這裡插入圖片描述

下面開始利用反向傳播的誤差,計算各個神經元(權重)的導數,開始反向傳播修改權重(When the error signal for each neuron is computed, the weights coefficients of each neuron input node may be modified. In formulas below d f ( e ) d e \dfrac {df\left( e\right) }{de} dedf(e)​ represents derivative of neuron activation function (which weights are modified). ):
在這裡插入圖片描述
在這裡插入圖片描述
-----------手動分割-----------
在這裡插入圖片描述
-----------手動分割-----------
在這裡插入圖片描述

Coefficient η \eta η affects network teaching speed.
到此為止,整個網路的前向,反向傳播和權重更新已經完成,推薦參考上面給出的本教程的連結,如果對純理論講解較難接受,沒關係,強烈推薦第二組圖的例子!!!

CASE 2(具體計算舉例,嫌麻煩的可直接看這個,強烈推薦!!!!!)

首先明確,“正向傳播”求損失,“反向傳播”回傳誤差。同時,神經網路每層的每個神經元都可以根據誤差訊號修正每層的權重,只要能明確上面兩點,那麼下面的例子,只要會一點鏈式求導規則,就一定能看懂!

BP演算法,也叫 δ \delta δ演算法,下面以3層的感知機為例進行舉例講解。
在這裡插入圖片描述

上圖的前向傳播(網路輸出計算)過程如下:(此處為網路的整個誤差的計算,誤差E計算方法為mse)

在這裡插入圖片描述

上面的計算過程並不難,只要耐心一步步的拆開式子,逐漸分解即可。現在還有兩個問題需要解決:

  1. 誤差E有了,怎麼調整權重讓誤差不斷減小?
  2. E是權重w的函式,何如找到使得函式值最小的w。

解決上面問題的方法是梯度下降演算法(簡單圖示如下),大家如有不太懂的可先行查閱別的資料,只要能達到理解線性迴歸梯度下降演算法的水平即可,這裡不再贅述。
在這裡插入圖片描述

劃重點,劃重點,劃重點!!!
BP演算法的具體例子來嘍!!

就算上面的所有東西你都看的迷迷糊糊,通過下面的例子,相信絕大多數人也能很輕鬆的理解BP演算法。如圖是一個簡單的神經網路用來舉例:
在這裡插入圖片描述

下面是前向(前饋)運算(啟用函式為sigmoid):
在這裡插入圖片描述

下面是反向傳播(求網路誤差對各個權重引數的梯度):

我們先來求最簡單的,求誤差E對w5的導數。首先明確這是一個“鏈式求導”過程,要求誤差E對w5的導數,需要先求誤差E對out o1的導數,再求out o1對net o1的導數,最後再求net o1對w5的導數,經過這個鏈式法則,我們就可以求出誤差E對w5的導數(偏導),如下圖所示:(下面第一個公式從右往左看)
在這裡插入圖片描述

導數(梯度)已經計算出來了,下面就是反向傳播與引數更新過程
在這裡插入圖片描述

上面的圖已經很顯然了,如果還看不懂真的得去閉門思過了(開玩笑~),耐心看一下上面的幾張圖,一定能看懂的。

如果要想求誤差E對w1的導數,誤差E對w1的求導路徑不止一條,這會稍微複雜一點,但換湯不換藥,計算過程如下所示:
在這裡插入圖片描述

至此,“反向傳播演算法”及公式推導的過程總算是講完了啦!個人感覺,尤其是第二組圖,還算是蠻通俗易懂的,希望能幫助到大家,共同進步!

感覺本篇講的有點囉嗦了,直接放第二組圖可能會更簡潔,以後爭取改進。

以上(麻煩大家 點贊 + 關注 一波啊)

References

http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
https://www.cnblogs.com/charlotte77/p/5629865.html
https://blog.csdn.net/han_xiaoyang

https://www.jianshu.com/p/964345dddb70