天天看點

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

本文内容來自:Michael Nielsen的《Neural Networks and Deep Learning》中文翻譯

神經網絡基礎

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

神經元是一個類似感覺器的東西,有多個輸入。每個輸入有權重w,最後有一個總的偏置b。輸出不再是感覺器那樣的0或1,而是經過激活函數計算後的值。常用激活函數比如sigmoid函數,也叫logistic函數,如下所示,其中z=wx+b:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播
關于激活函數:它其實就是一個非線性函數. 比如說relu, sigmoid, tanh.強行把原有的線性結果給扭曲了. 使得輸出結果 y 也有了非線性的特征. 你甚至可以創造自己的激勵函數來處理自己的問題, 不過要確定的是這些激勵函數必須是可以微分的,因為在誤差反向傳遞的時候, 隻有這些可微分的激勵函數才能把誤差傳遞回去.

使用sigmoid激活函數的神經元和感覺器有何相似呢?先看sigmoid函數的樣子:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

假設z=wx+b是一個很大的正數,那麼e^-z約等于0,sigmoid函數值約等于1;同樣,假設z是很小的負數,函數值約等于0,這時可以說是一個平滑的感覺器。sigmoid函數也有别的替代,比如雙曲正切函數:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

它是sigmoid函數的變體,取值範圍是[-1,1],而不是[0,1]。

如果激活函數是階躍函數:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

這時神經元輸出完全等于感覺器。

正因為激活函數這種特性,權重和偏置的微小變化(用偏導數表示)都會使神經元産生微小的輸出變化:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

實際上,△output是一個反映權重和偏置變化(對應偏導數)的線性函數,是以很容易計算出如何變化權重和偏置來使輸出變化。

神經網絡一般由多個神經元組成,如下:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

雖然不是由感覺器構成,但這種多層網絡被稱為多層感覺器MLP。目前我們所說的網絡,都是以上一層的輸出作為下一層的輸入,這稱為前饋神經網絡,意味着網絡中沒有回路,資訊總是向前傳播,如果确實有回路,我們最終會有這樣的情況: 激活函數的輸入依賴于輸出,這将難于了解,是以我們不允許這樣的環路。

然而還有一種遞歸神經網絡,其中有回報環路,這種模型的設計思想,是具有休眠前會在一段有限的時間内保持激活狀态的神經元。這種激活狀态可以刺激其它神經元,使其随後被激活并同樣保持一段有限的時間。這樣會導緻更多的神經元被激活,随着時間的推移,我們得到一個級聯的神經元激活系統。因為一個神經元的輸出隻在一段時間後而不是即刻影響它的輸入,在這個模型中回路并不會引起問題。

反向傳播

我們希望有一個算法能找到權重和偏置,使網絡的輸出y能拟合訓練輸入x,是以我們定義一個代價函數來量化這個目标:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

其中w表示所有權重的集合, b 是所有的偏置, n 是訓練輸入資料的個數, a 是表示當輸入為 x 時的輸出向量,求和則是在總的輸入x上進行的。當然,輸出 a 取決于 x, w和 b,但是為了保持符号的簡潔性,我沒有明确地指出這種依賴關系。符号||v||是指向量 v 的模。我們把 這個函數C 稱為二次代價函數,有時也被稱為均方誤差(MSE)。我們需要用梯度下降算法找到使代價函數最小的權重和偏置的值。

為什麼要用二次代價呢?這麼做是因為在神經網絡中,被正确分類的樣本數所關于權重和偏置的函數并不是個平滑的函數。多數情況下,對權重和偏置做出的微小變動完全不會影響被正确分類的樣本數,是以通過改變權重和偏置來改進性能會變得很困難。類似這種二次代價的平滑代價函數則能更好地去解決如何用權重和偏置中的微小改變來取得更好的效果。

我們用梯度下降去更新參數w和b,是以需要計算代價函數C 的梯度,反向傳播是計算代價函數梯度的快速算法。反向傳播的核心是代價函數C關于任何權重w(或者偏置b)的偏導數的表達式,這個表達式告訴我們在改變權重和偏置時,代價函數變化的快慢。實際上它讓我們細緻領悟如何通過改變權重和偏置來改變整個網絡的行為。

反向傳播步驟:

(1) 随機初始化權重和偏置為一個接近0的值(一般用正态分布),然後“前向傳播”計算每層每個單元的激活值,包括輸出層。激活值a=f(z),其中神經元輸入z=wx+b。

(2) 計算輸出層L每個單元的誤差,第L層第j個單元的誤差的定義:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

根據鍊式求導得:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

因為在上式右邊第二項裡,激活值a=f(z),是以誤差最終寫為:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

上式右邊第一個項代表代價函數C随着第j個單元輸出激活值的變化而變化的速度,假如C不太依賴某個輸出單元,那麼這個單元對應的誤差δ就會很小。第二項代表激活函數f在z處的變化速度。如果給定了二次代價函數:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

我們可以用矩陣方式重寫誤差方程:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

中間這個運算符叫做哈達瑪(Hadamard)乘積,用于矩陣或向量之間點對點的乘法運算:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

向量也可以進行函數運算:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

(3) 算完輸出層開始往回算之前層的誤差,目前層l的誤差用下一層l+1的誤差來表示:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

我們可以用鍊式法則對誤差的定義進行推導,來證明上式:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

其中j是目前層的某個神經元,它和下一層的若幹個神經元(由k表示)相連。注意上式交換右邊兩項,并用誤差δ的定義代入,同時注意到:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

求微分後得到:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

是以:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

這正是原式矩陣表達的分量形式,證明完畢。

(4) 計算代價函數關于權重和偏置的偏導數:

偏置:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

權重:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

其中偏置等價于誤差,權重等價于誤差乘以上一層神經元的輸出,而上述式子的右邊的項我們之前都已經算出來了。至于為什麼等價可以用鍊式法則證明:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

反向傳播小結:

神經網絡基礎和反向傳播推導神經網絡基礎反向傳播

反向傳播相關資料:

https://zhuanlan.zhihu.com/p/23270674 算法執行個體推倒

https://www.zhihu.com/question/27239198?rf=24827633 胡逸夫的回答(反向傳播其實是動态規劃的展現)

http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C UFLDL

繼續閱讀