一文徹底搞懂BP演算法:原理推導+資料演示+專案實戰(上篇)
反向傳播演算法(BackpropagationAlgorithm,簡稱BP演算法)是深度學習的重要思想基礎,對於初學者來說也是必須要掌握的基礎知識!本文希望以一個清晰的脈絡和詳細的說明,來讓讀者徹底明白BP演算法的原理和計算過程。
全文分為上下兩篇,上篇主要介紹BP演算法的原理(即公式的推導),介紹完原理之後,我們會將一些具體的資料帶入一個簡單的三層神經網路中,去完整的體驗一遍BP演算法的計算過程;下篇是一個專案實戰,我們將帶著讀者一起親手實現一個BP神經網路(不適用任何第三方的深度學習框架)來解決一個具體的問題。
讀者在學習的過程中,有任何的疑問,可以新增我們的公眾號或是公眾號中的交流群,和大家一起交流討論!
1.BP演算法的推導
圖1一個簡單的三層神經網路
圖1所示是一個簡單的三層(兩個隱藏層,一個輸出層)神經網路結構,假設我們使用這個神經網路來解決二分類問題,我們給這個網路一個輸入樣本,透過前向運算得到輸出。輸出值的值域為,例如的值越接近0,代表該樣本是“0”類的可能性越大,反之是“1”類的可能性大。
1.1前向傳播的計算
為了便於理解後續的內容,我們需要先搞清楚前向傳播的計算過程,以圖1所示的內容為例:
輸入的樣本為:
第一層網路的引數為:
第二層網路的引數為:
第三層網路的引數為:
1.1.1第一層隱藏層的計算
圖2計算第一層隱藏層
第一層隱藏層有三個神經元:、和。該層的輸入為:
以神經元為例,則其輸入為:
同理有:
假設我們選擇函式作為該層的啟用函式(圖1中的啟用函式都標了一個下標,一般情況下,同一層的啟用函式都是一樣的,不同層可以選擇不同的啟用函式),那麼該層的輸出為:、和。
1.1.2第二層隱藏層的計算
圖3計算第二層隱藏層
第二層隱藏層有兩個神經元:和。該層的輸入為:
即第二層的輸入是第一層的輸出乘以第二層的權重,再加上第二層的偏置。因此得到和的輸入分別為:
該層的輸出分別為:和。
1.1.3輸出層的計算
圖4計算輸出層
輸出層只有一個神經元:。該層的輸入為:
即:
因為該網路要解決的是一個二分類問題,所以輸出層的啟用函式也可以使用一個Sigmoid型函式,神經網路最後的輸出為:。
1.2反向傳播的計算
在1.1節裡,我們已經瞭解了資料沿著神經網路前向傳播的過程,這一節我們來介紹更重要的反向傳播的計算過程。假設我們使用隨機梯度下降的方式來學習神經網路的引數,損失函式定義為,其中是該樣本的真實類標。使用梯度下降進行引數的學習,我們必須計算出損失函式關於神經網路中各層引數(權重w和偏置b)的偏導數。
假設我們要對第層隱藏層的引數和求偏導數,即求和。假設代表第層神經元的輸入,即,其中為前一層神經元的輸出,則根據鏈式法則有:
因此,我們只需要計算偏導數、和。
1.2.1計算偏導數
前面說過,第k層神經元的輸入為:,因此可以得到:計算偏導數
上式中,代表第k層神經元的權重矩陣的第m行,代表第k層神經元的權重矩陣的第m行中的第n列。
我們以1.1節中的簡單神經網路為例,假設我們要計算第一層隱藏層的神經元關於權重矩陣的導數,則有:
1.2.2計算偏導數
因為偏置b是一個常數項,因此偏導數的計算也很簡單:
依然以第一層隱藏層的神經元為例,則有:
1.2.3計算偏導數
偏導數又稱為誤差項(errorterm,也稱為“靈敏度”),一般用表示,例如是第一層神經元的誤差項,其值的大小代表了第一層神經元對於最終總誤差的影響大小。
根據第一節的前向計算,我們知道第層的輸入與第k層的輸出之間的關係為:計算偏導數
又因為,根據鏈式法則,我們可以得到為:
由上式我們可以看到,第k層神經元的誤差項是由第層的誤差項乘以第層的權重,再乘以第k層啟用函式的導數(梯度)得到的。這就是誤差的反向傳播。
現在我們已經計算出了偏導數、和,則和可分別表示為:
單純的公式推導看起來有些枯燥,下面我們將實際的資料帶入圖1所示的神經網路中,完整的計算一遍。
2.圖解BP演算法
圖5圖解BP演算法
我們依然使用如圖5所示的簡單的神經網路,其中所有引數的初始值如下:輸入的樣本為(假設其真實類標為“1”):
第一層網路的引數為:
第二層網路的引數為:
第三層網路的引數為:
假設所有的啟用函式均為Logistic函式:。使用均方誤差函式作為損失函式:為了方便求導,我們將損失函式簡為:。
2.1前向傳播
我們首先初始化神經網路的引數,計算第一層神經元:
上圖中我們計算出了第一層隱藏層的第一個神經元的輸入和輸出,同理可以計算第二個和第三個神經元的輸入和輸出:
接下來是第二層隱藏層的計算,首先我們計算第二層的第一個神經元的輸入和輸出:
同樣方法可以計算該層的第二個神經元的輸入和輸出:
最後計算輸出層的輸入和輸出:
2.2誤差反向傳播
首先計算輸出層的誤差項,我們的誤差函式為,由於該樣本的類標為“1”,而預測值為0.997520293823002,因此誤差為0.002479706176998,輸出層的誤差項為:
接著計算第二層隱藏層的誤差項,根據誤差項的計算公式有:
最後是計算第一層隱藏層的誤差項:
2.3更新引數
上一小節中我們已經計算出了每一層的誤差項,現在我們要利用每一層的誤差項和梯度來更新每一層的引數,權重W和偏置b的更新公式如下:
通常權重W的更新會加上一個正則化項來避免過擬合,這裡為了簡化計算,我們省去了正則化項。上式中的是學習率,我們設其值為0.1。引數更新的計算相對簡單,每一層的計算方式都相同,因此本文僅演示第一層隱藏層的引數更新:
3.小結
至此,我們已經完整介紹了BP演算法的原理,並使用具體的數值做了計算。在下篇中,我們將帶著讀者一起親手實現一個BP神經網路(不適用任何第三方的深度學習框架),敬請期待!有任何疑問,歡迎加入我們一起交流!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2217354/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從原理到實戰,徹底搞懂NginxNginx
- 徹底搞懂 Channel 實現原理
- 從原理到實戰,徹底搞懂Nginx(高階篇)Nginx
- 徹底搞懂https原理HTTP
- 將近2萬字的 Dubbo 原理解析,徹底搞懂 dubbo (上篇)
- 看完讓你徹底搞懂Websocket原理Web
- 一文徹底搞懂Raft演算法,看這篇就夠了!!!Raft演算法
- 一文徹底搞懂ZAB演算法,看這篇就夠了!!!演算法
- 徹底搞懂徹底搞懂事件驅動模型 - Reactor事件模型React
- 徹底搞懂 RxJavaRxJava
- 兩張圖徹底搞懂MyBatis的Mapper原理!MyBatisAPP
- 徹底搞懂Composer自動載入原理
- 一文徹底搞懂 Javascript 的 this(含 ES6+)JavaScript
- [原始碼解讀]一文徹底搞懂Events模組原始碼
- 一文徹底理解邏輯迴歸:從公式推導到程式碼實現邏輯迴歸公式
- 一文徹底搞懂面試中常問的各種“鎖”面試
- 徹底搞懂JavaScript作用域JavaScript
- 徹底搞懂Bean載入Bean
- 徹底搞懂 Git-RebaseGit
- [萬字長文]一文教你徹底搞懂flex佈局Flex
- 一文徹底搞懂js垃圾回收和記憶體洩露JS記憶體洩露
- 深入JavaScript系列(四):徹底搞懂thisJavaScript
- 徹底搞懂 RxJava — 基礎篇RxJava
- 徹底搞懂 RxJava — 中級篇RxJava
- 徹底搞懂 RxJava — 高階篇RxJava
- 【一文秒懂】帶你徹底搞懂正規化與反正規化資料庫設計資料庫
- 徹底搞懂Spring狀態機原理,實現訂單與物流解耦Spring解耦
- 用es5實現es6的promise,徹底搞懂promise的原理Promise
- 來吧,一文徹底搞懂Java中的Comparable和ComparatorJava
- 一文徹底搞定Redis與MySQL的資料同步RedisMySql
- oracle徹底刪除資料檔案Oracle
- 徹底理解閉包實現原理
- PC微信機器人介面api之徹底搞懂hook原理及手動實現機器人APIHook
- 徹底搞懂JavaScript中的繼承JavaScript繼承
- 徹底搞懂Python中的類Python
- 兩萬字長文,徹底搞懂Kafka!Kafka
- 徹底搞懂JavaScript原型和原型鏈JavaScript原型
- CRC演算法原理、推導及實現演算法