反向傳播之我見
一、前言
這是一場以誤差(Error)為主導的反向傳播(Back Propagation)運動,旨在得到最優的全局參數矩陣,進而將多層神經網路應用到分類或者回歸任務中去。
前向傳遞輸入信號直至輸出產生誤差,反向傳播誤差信息更新權重矩陣。這兩句話很好的形容了信息的流動方向,權重得以在信息雙向流動中得到優化,這讓我想到了北京城的夜景,車輛川流不息,車水馬龍,你來我往(* ?? ?* )?*。
至於為什麼會提出反向傳播演算法,我直接應用梯度下降(Gradient Descent)不行嗎?想必大家肯定有過這樣的疑問。答案肯定是不行的,縱然梯度下降神通廣大,但卻不是萬能的。梯度下降可以應對帶有明確求導函數的情況,或者說可以應對那些可以求出誤差的情況,比如邏輯回歸(Logistic Regression),我們可以把它看做沒有隱層的網路;但對於多隱層的神經網路,輸出層可以直接求出誤差來更新參數,但其中隱層的誤差是不存在的,因此不能對它直接應用梯度下降,而是先將誤差反向傳播至隱層,然後再應用梯度下降,其中將誤差從末層往前傳遞的過程需要鏈式法則(Chain Rule)的幫助,因此反向傳播演算法可以說是梯度下降在鏈式法則中的應用。
二、舉個栗子
為了幫助較好的理解反向傳播概念,對它有一個直觀的理解,接下來就拿猜數字遊戲舉個栗子。
2.1 兩人猜數字
這一過程類比沒有隱層的神經網路,比如邏輯回歸,其中小黃帽代表輸出層節點,左側接受輸入信號,右側產生輸出結果,小藍貓則代表了誤差,指導參數往更優的方向調整。由於小藍貓可以直接將誤差反饋給小黃帽,同時只有一個參數矩陣和小黃帽直接相連,所以可以直接通過誤差進行參數優化(實縱線),迭代幾輪,誤差會降低到最小。
2.2 三人猜數字
這一過程類比帶有一個隱層的三層神經網路,其中小女孩代表隱藏層節點,小黃帽依然代表輸出層節點,小女孩左側接受輸入信號,經過隱層節點產生輸出結果,小藍貓代表了誤差,指導參數往更優的方向調整。由於小藍貓可以直接將誤差反饋給小黃帽,所以與小黃帽直接相連的左側參數矩陣可以直接通過誤差進行參數優化(實縱線);而與小女孩直接相連的左側參數矩陣由於不能得到小藍貓的直接反饋而不能直接被優化(虛棕線)。但由於反向傳播演算法使得小藍貓的反饋可以被傳遞到小女孩那進而產生間接誤差,所以與小女孩直接相連的左側權重矩陣可以通過間接誤差得到權重更新,迭代幾輪,誤差會降低到最小。
三、完整流程
上邊的栗子從直觀角度了解了反向傳播,接下來就詳細的介紹其中兩個流程前向傳播與反向傳播,在介紹之前先統一一下標記。
3.1 數學標記
3.2 前向傳播
如何將輸入層的信號傳輸至隱藏層呢,以隱藏層節點c為例,站在節點c上往後看(輸入層的方向),可以看到有兩個箭頭指向節點c,因此a,b節點的信息將傳遞給c,同時每個箭頭有一定的權重,因此對於c節點來說,輸入信號為:
同理,節點d的輸入信號為:
由於計算機善於做帶有循環的任務,因此我們可以用矩陣相乘來表示:
所以,隱藏層節點經過非線性變換後的輸出表示如下:
同理,輸出層的輸入信號表示為權重矩陣乘以上一層的輸出:
同樣,輸出層節點經過非線性映射後的最終輸出表示為:
輸入信號在權重矩陣們的幫助下,得到每一層的輸出,最終到達輸出層。可見,權重矩陣在前向傳播信號的過程中扮演著運輸兵的作用,起到承上啟下的功能。
3.3 反向傳播
既然梯度下降需要每一層都有明確的誤差才能更新參數,所以接下來的重點是如何將輸出層的誤差反向傳播給隱藏層。
其中輸出層、隱藏層節點的誤差如圖所示,輸出層誤差已知,接下來對隱藏層第一個節點c作誤差分析。還是站在節點c上,不同的是這次是往前看(輸出層的方向),可以看到指向c節點的兩個藍色粗箭頭是從節點e和節點f開始的,因此對於節點c的誤差肯定是和輸出層的節點e和f有關。
不難發現,輸出層的節點e有箭頭分別指向了隱藏層的節點c和d,因此對於隱藏節點e的誤差不能被隱藏節點c霸為己有,而是要服從按勞分配的原則(按權重分配),同理節點f的誤差也需服從這樣的原則,因此對於隱藏層節點c的誤差為:
同理,對於隱藏層節點d的誤差為:
為了減少工作量,我們還是樂意寫成矩陣相乘的形式:
你會發現這個矩陣比較繁瑣,如果能夠簡化到前向傳播那樣的形式就更好了。實際上我們可以這麼來做,只要不破壞它們的比例就好,因此我們可以忽略掉分母部分,所以重新成矩陣形式為:
仔細觀察,你會發現這個權重矩陣,其實是前向傳播時權重矩陣w的轉置,因此簡寫形式如下:
不難發現,輸出層誤差在轉置權重矩陣的幫助下,傳遞到了隱藏層,這樣我們就可以利用間接誤差來更新與隱藏層相連的權重矩陣。可見,權重矩陣在反向傳播的過程中同樣扮演著運輸兵的作用,只不過這次是搬運的輸出誤差,而不是輸入信號(我們不生產誤差,只是誤差的搬運工(っ? -?))。
四、鏈式求導
第三部分大致介紹了輸入信息的前向傳播與輸出誤差的後向傳播,接下來就根據求得的誤差來更新參數。
首先對隱藏層的w11進行參數更新,更新之前讓我們從後往前推導,直到預見w11為止:
因此誤差對w11求偏導如下:
求導得如下公式(所有值已知):
同理,誤差對於w12的偏導如下:
同樣,求導得w12的求值公式:
同理,誤差對於偏置求偏導如下:
帶入上述公式為:
接著對輸入層的w11進行參數更新,更新之前我們依然從後往前推導,直到預見第一層的w11為止(只不過這次需要往前推的更久一些):
因此誤差對輸入層的w11求偏導如下:
求導得如下公式(有點長(*?????*)):
同理,輸入層的其他三個參數按照同樣的方法即可求出各自的偏導,在這不再贅述。
在每個參數偏導數明確的情況下,帶入梯度下降公式即可(不在重點介紹):
至此,利用鏈式法則來對每層參數進行更新的任務已經完成。
五、引入delta
利用鏈式法則來更新權重你會發現其實這個方法簡單,但過於冗長。由於更新的過程可以看做是從網路的輸入層到輸出層從前往後更新,每次更新的時候都需要重新計算節點的誤差,因此會存在一些不必要的重複計算。其實對於已經計算完畢的節點我們完全可以直接拿來用,因此我們可以重新看待這個問題,從後往前更新。先更新後邊的權重,之後再在此基礎上利用更新後邊的權重產生的中間值來更新較靠前的參數。這個中間變數就是下文要介紹的delta變數,一來簡化公式,二來減少計算量,有點動態規劃的趕腳。
接下來用事實說話,大家仔細觀察一下在第四部分鏈式求導部分誤差對於輸出層的w11以及隱藏層的w11求偏導以及偏置的求偏導的過程,你會發現,三個公式存在相同的部分,同時隱藏層參數求偏導的過程會用到輸出層參數求偏導的部分公式,這正是引入了中間變數delta的原因(其實紅框的公式就是delta的定義)。
大家看一下經典書籍《神經網路與深度學習》中對於delta的描述為在第l層第j個神經元上的誤差,定義為誤差對於當前帶權輸入求偏導,數學公式如下:
因此輸出層的誤差可以表示為(上圖紅色框公式):
隱藏層的誤差可以表示為(上圖藍色框公式):
同時對於權重更新的表示為(上圖綠色框公式):
其實對於偏置的更新表示為(上圖紅色框):
上述4個公式其實就是《神經網路與深度學習》書中傳說的反向傳播4大公式(詳細推導證明可移步此書):
仔細觀察,你會發現BP1與BP2相結合就能發揮出最大功效,可以計算出任意層的誤差,只要首先利用BP1公式計算出輸出層誤差,然後利用BP2層層傳遞,就無敵了,這也正是誤差反向傳播演算法的緣由吧。同時對於權重w以及偏置b我們就可以通過BP3和BP4公式來計算了。
至此,我們介紹了反向傳播的相關知識,一開始看反向傳播資料的時候總覺得相對獨立,這個教材這麼講,另一篇博客又換一個講法,始終不能很好的理解其中的含義,到目前為止,思路相對清晰。我們先從大致流程上介紹了反向傳播的來龍去脈,接著用鏈式求導法則來計算權重以及偏置的偏導,進而我們推出了跟經典著作一樣樣兒的結論,因此本人覺得較為詳細,應該對初學者有一定的借鑒意義,希望對大家有所幫助。
我的GitHub hongleizhang (張小磊)
========這是一條求贊的分割線======
碼字作圖插公式不易,收藏表忘點贊 ?(?σ??σ?)?
Nielsen M A. Neural networks and deep learning[M]. 2015.
Rashid T. Make your own neural network[M]. CreateSpace Independent
Publishing Platform, 2016.推薦閱讀:
※機器學習、大數據與經濟學研究
※集成學習概述
※常見機器學習效果調優思路整理
※系列教程:如何將代碼遷移至 TensorFlow 1.0
※『啤酒與尿不濕』之關聯規則
TAG:深度学习DeepLearning | 机器学习 | 人工智能 |