一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

磐創AI發表於2018-10-24

反向傳播演算法(BackpropagationAlgorithm,簡稱BP演算法)是深度學習的重要思想基礎,對於初學者來說也是必須要掌握的基礎知識!本文希望以一個清晰的脈絡和詳細的說明,來讓讀者徹底明白BP演算法的原理和計算過程。

全文分為上下兩篇,上篇主要介紹BP演算法的原理(即公式的推導),介紹完原理之後,我們會將一些具體的資料帶入一個簡單的三層神經網路中,去完整的體驗一遍BP演算法的計算過程;下篇是一個專案實戰,我們將帶著讀者一起親手實現一個BP神經網路(不適用任何第三方的深度學習框架)來解決一個具體的問題。

讀者在學習的過程中,有任何的疑問,可以新增我們的公眾號或是公眾號中的交流群,和大家一起交流討論!


1.BP演算法的推導

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1一個簡單的三層神經網路

1所示是一個簡單的三層(兩個隱藏層,一個輸出層)神經網路結構,假設我們使用這個神經網路來解決二分類問題,我們給這個網路一個輸入樣本一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),透過前向運算得到輸出一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。輸出值一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)的值域為一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),例如一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)的值越接近0,代表該樣本是“0”類的可能性越大,反之是“1”類的可能性大。

1.1前向傳播的計算

為了便於理解後續的內容,我們需要先搞清楚前向傳播的計算過程,以圖1所示的內容為例:

輸入的樣本為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第一層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第二層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第三層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.1.1第一層隱藏層的計算

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

2計算第一層隱藏層

第一層隱藏層有三個神經元:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。該層的輸入為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

  以一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)神經元為例,則其輸入為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

同理有:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

假設我們選擇函式一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)作為該層的啟用函式(圖1中的啟用函式都標了一個下標,一般情況下,同一層的啟用函式都是一樣的,不同層可以選擇不同的啟用函式),那麼該層的輸出為:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.1.2第二層隱藏層的計算

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

3計算第二層隱藏層

第二層隱藏層有兩個神經元:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。該層的輸入為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

即第二層的輸入是第一層的輸出乘以第二層的權重,再加上第二層的偏置。因此得到一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)的輸入分別為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

該層的輸出分別為:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.1.3輸出層的計算

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

4計算輸出層

輸出層只有一個神經元:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。該層的輸入為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

即:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

因為該網路要解決的是一個二分類問題,所以輸出層的啟用函式也可以使用一個Sigmoid型函式,神經網路最後的輸出為:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.2反向傳播的計算

1.1節裡,我們已經瞭解了資料沿著神經網路前向傳播的過程,這一節我們來介紹更重要的反向傳播的計算過程。假設我們使用隨機梯度下降的方式來學習神經網路的引數,損失函式定義為一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),其中一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)是該樣本的真實類標。使用梯度下降進行引數的學習,我們必須計算出損失函式關於神經網路中各層引數(權重w和偏置b)的偏導數。

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

假設我們要對第一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)層隱藏層的引數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)求偏導數,即求一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。假設一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)代表第一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)層神經元的輸入,即一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),其中一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)為前一層神經元的輸出,則根據鏈式法則有:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

因此,我們只需要計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.2.1計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

前面說過,第k層神經元的輸入為:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),因此可以得到:計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

上式中,一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)代表第k層神經元的權重矩陣一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)的第m行,一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)代表第k層神經元的權重矩陣一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)的第m行中的第n列。

我們以1.1節中的簡單神經網路為例,假設我們要計算第一層隱藏層的神經元關於權重矩陣的導數,則有:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.2.2計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

因為偏置b是一個常數項,因此偏導數的計算也很簡單:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

依然以第一層隱藏層的神經元為例,則有:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

1.2.3計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)又稱為誤差項(errorterm,也稱為“靈敏度”),一般用一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)表示,例如一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)是第一層神經元的誤差項,其值的大小代表了第一層神經元對於最終總誤差的影響大小。

根據第一節的前向計算,我們知道第一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)層的輸入與第k層的輸出之間的關係為:計算偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

又因為一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),根據鏈式法則,我們可以得到一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

由上式我們可以看到,第k層神經元的誤差項一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)是由第一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)層的誤差項乘以第一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)層的權重,再乘以第k層啟用函式的導數(梯度)得到的。這就是誤差的反向傳播。

現在我們已經計算出了偏導數一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),則一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)可分別表示為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

單純的公式推導看起來有些枯燥,下面我們將實際的資料帶入圖1所示的神經網路中,完整的計算一遍。


2.圖解BP演算法

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

5圖解BP演算法

我們依然使用如圖5所示的簡單的神經網路,其中所有引數的初始值如下:輸入的樣本為(假設其真實類標為“1”):

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第一層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第二層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

第三層網路的引數為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

假設所有的啟用函式均為Logistic函式:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)。使用均方誤差函式作為損失函式:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)為了方便求導,我們將損失函式簡為:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)


2.1前向傳播

我們首先初始化神經網路的引數,計算第一層神經元:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

上圖中我們計算出了第一層隱藏層的第一個神經元的輸入一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)和輸出一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),同理可以計算第二個和第三個神經元的輸入和輸出:一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

接下來是第二層隱藏層的計算,首先我們計算第二層的第一個神經元的輸入一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)和輸出一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

同樣方法可以計算該層的第二個神經元的輸入一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)和輸出一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

最後計算輸出層的輸入一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)和輸出一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

2.2誤差反向傳播

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

首先計算輸出層的誤差項一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),我們的誤差函式為一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇),由於該樣本的類標為“1”,而預測值為0.997520293823002,因此誤差為0.002479706176998,輸出層的誤差項為:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

接著計算第二層隱藏層的誤差項,根據誤差項的計算公式有:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

最後是計算第一層隱藏層的誤差項:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

2.3更新引數

上一小節中我們已經計算出了每一層的誤差項,現在我們要利用每一層的誤差項和梯度來更新每一層的引數,權重W和偏置b的更新公式如下:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)

通常權重W的更新會加上一個正則化項來避免過擬合,這裡為了簡化計算,我們省去了正則化項。上式中的一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)是學習率,我們設其值為0.1。引數更新的計算相對簡單,每一層的計算方式都相同,因此本文僅演示第一層隱藏層的引數更新:

一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)


3.小結

至此,我們已經完整介紹了BP演算法的原理,並使用具體的數值做了計算。在下篇中,我們將帶著讀者一起親手實現一個BP神經網路(不適用任何第三方的深度學習框架),敬請期待!有任何疑問,歡迎加入我們一起交流!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2217354/,如需轉載,請註明出處,否則將追究法律責任。

相關文章