1. 程式人生 > >乾貨 | 深度學習之CNN反向傳播演算法詳解

乾貨 | 深度學習之CNN反向傳播演算法詳解

微信公眾號

關鍵字全網搜尋最新排名

【機器學習演算法】:排名第一

【機器學習】:排名第一

【Python】:排名第三

【演算法】:排名第四

前言

在卷積神經網路(CNN)前向傳播演算法(乾貨 | 深度學習之卷積神經網路(CNN)的前向傳播演算法詳解)中對CNN的前向傳播演算法做了總結,基於CNN前向傳播演算法的基礎,下面就對CNN的反向傳播演算法做一個總結。在閱讀本文前,建議先研究DNN的反向傳播演算法:深度神經網路(DNN)反向傳播演算法(BP)(深度學習之DNN與反向傳播演算法

DNN反向傳播

首先回顧DNN的反向傳播演算法。在DNN中,首先計算出輸出層的δL:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

利用數學歸納法,用δl+1的值一步步的向前求出第l層的δl,表示式為:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

有了δl的表示式,從而求出W,b的梯度表示式:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

有了W,b梯度表示式,就可以用梯度下降法來優化W,b,求出最終的所有W,b的值。現在想把同樣的思想用到CNN中,很明顯,CNN有些不同的地方,不能直接去套用DNN的反向傳播演算法的公式。

CNN反向傳播思想

要套用DNN的反向傳播演算法到CNN,有幾個問題需要解決:

1)池化層沒有啟用函式,這個問題倒比較好解決,我們可以令池化層的啟用函式為σ(z)=z,即啟用後就是自己本身。這樣池化層啟用函式的導數為1.

2)池化層在前向傳播的時候,對輸入進行了壓縮,那麼我們現在需要向前反向推導δl−1,這個推導方法和DNN完全不同。

3)  卷積層是通過張量卷積,或者說若干個矩陣卷積求和而得的當前層的輸出,這和DNN很不相同

,DNN的全連線層是直接進行矩陣乘法得到當前層的輸出。這樣在卷積層反向傳播的時候,上一層的δl−1遞推計算方法肯定有所不同。

4)對於卷積層,由於W使用的運算是卷積,那麼從δl推匯出該層的所有卷積核的W,b的方式也不同。

從上面可以看出,問題1比較好解決,而問題2,3,4也是解決CNN反向傳播演算法的關鍵所在。另外要注意到的是DNN中的al,zl都只是一個向量,而我們CNN中的al,zl都是一個三維的張量,即由若干個輸入的子矩陣組成。

下面我們就針對問題2,3,4來一步步研究CNN的反向傳播演算法。在研究過程中,需要注意的是,由於卷積層可以有多個卷積核,各個卷積核的處理方法是完全相同且獨立的,為了簡化演算法公式的複雜度,我們下面提到卷積核都是卷積層中若干卷積核中的一個。

已知池化層δl,求上一隱藏層δl−1

首先解決上面的問題2,如果已知池化層的δl,推匯出上一隱藏層的δl−1。在前向傳播演算法時,池化層一般我們會用MAX或者Average對輸入進行池化,池化的區域大小已知。現在我們反過來,要從縮小後的誤差δl,還原前一次較大區域對應的誤差。

在反向傳播時,首先會把δl的所有子矩陣矩陣大小還原成池化之前的大小,然後如果是MAX,則把δl的所有子矩陣的各個池化局域的值放在之前做前向傳播演算法得到最大值的位置。如果是Average,則把δl的所有子矩陣的各個池化局域的值取平均後放在還原後的子矩陣位置。這個過程一般叫做upsample。

用一個例子可以很方便的表示

假設池化區域大小是2x2。δl的第k個子矩陣為:

0?wx_fmt=png

由於池化區域為2x2,我們先講δkl做還原,即變成:

0?wx_fmt=png

如果是MAX,假設之前在前向傳播時記錄的最大值位置分別是左上,右下,右上,左下,則轉換後的矩陣為:

0?wx_fmt=png

如果是Average,則進行平均:轉換後的矩陣為:

0?wx_fmt=png

進而

0?wx_fmt=png

其中,upsample函式完成了池化誤差矩陣放大與誤差重新分配的邏輯。

已知卷積層δl,求上一隱藏層δl−1

對於卷積層的反向傳播,首先回憶下卷積層的前向傳播公式:

0?wx_fmt=png

在DNN中,我們知道δl−1和δl的遞推關係為:

0?wx_fmt=png0?wx_fmt=png

這裡的式子其實和DNN的類似,區別在於對於含有卷積的式子求導時,卷積核被旋轉了180度。即式子中的rot180(),翻轉180度的意思是上下翻轉一次,接著左右翻轉一次。在DNN中這裡只是矩陣的轉置。那麼為什麼呢?由於這裡都是張量,直接推演引數太多了。以一個簡單的例子說明這裡求導後卷積核要翻轉。

假設l−1層的輸出al−1是一個3x3矩陣,第l層的卷積核Wl是一個2x2矩陣,採用1畫素的步幅,則輸出zl是一個2x2的矩陣。我們簡化都是bl都是0,則有

0?wx_fmt=png

列出a,W,z的矩陣表示式如下:

0?wx_fmt=png

利用卷積的定義,很容易得出:

0?wx_fmt=png

接著我們模擬反向求導:

0?wx_fmt=png0?wx_fmt=png

為了符合梯度計算,在誤差矩陣周圍填充了一圈0,此時將卷積核翻轉後和反向傳播的梯度誤差進行卷積,就得到了前一次的梯度誤差。這個例子直觀的介紹了為什麼對含有卷積的式子求導時,卷積核要翻轉180度的原因。

已知卷積層δl,推導該層W,b梯度

現在已經可以遞推出每一層的梯度誤差δl了,對於全連線層,可以按DNN的反向傳播演算法求該層W,b的梯度,而池化層並沒有W,b,也不用求W,b的梯度。只有卷積層的W,b需要求出。注意到卷積層z和W,b的關係為:

0?wx_fmt=png

因此有:

0?wx_fmt=png

由於有上一節的基礎,大家應該清楚為什麼這裡求導後要旋轉180度了。而對於b,則稍微有些特殊,因為δl是三維張量,而b只是一個向量,不能像DNN那樣直接和δl相等。通常的做法是將δl的各個子矩陣的項分別求和,得到一個誤差向量,即為b的梯度:

0?wx_fmt=png

CNN反向傳播總結

現在總結下CNN的反向傳播演算法,以最基本的批量梯度下降法為例來描述反向傳播演算法。

輸入:m個圖片樣本,CNN模型的層數L和所有隱藏層的型別,對於卷積層,要定義卷積核的大小K,卷積核子矩陣的維度F,填充大小P,步幅S。對於池化層,要定義池化區域大小k和池化標準(MAX或Average),對於全連線層,要定義全連線層的啟用函式(輸出層除外)和各層的神經元個數。梯度迭代引數迭代步長α,最大迭代次數MAX與停止迭代閾值ϵ

輸出:CNN模型各隱藏層與輸出層的W,b

0?wx_fmt=png

歡迎分享給他人讓更多的人受益

0?wx_fmt=png

參考:

  1. 周志華《機器學習》

  2. Neural Networks and Deep Learning by By Michael Nielsen

  3. 部落格園

    http://www.cnblogs.com/pinard/p/6244265.html

  4. 李航《統計學習方法》

  5. Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville

近期熱文

0?wx_fmt=png

加我微信:guodongwe1991,備註姓名-單位-研究方向(加入微信機器學習交流1群)

廣告、商業合作

請加微信:guodongwe1991

51CTO官微

ID:weixin51cto

0?wx_fmt=jpeg

51CTO官方公眾號——聚焦最新最前沿最有料的IT技術資訊、IT行業精華內容、產品交流心得。本訂閱號為大家提供各種技術資訊和乾貨,還會不定期舉辦有獎活動,敬請關注。