CNN中卷積層 池化層反向傳播


參考:https://blog.csdn.net/kyang624823/article/details/78633897

卷積層 池化層反向傳播:

1,CNN的前向傳播

a)對於卷積層,卷積核與輸入矩陣對應位置求積再求和,作為輸出矩陣對應位置的值。如果輸入矩陣inputX為M*N大小,卷積核為a*b大小,那么輸出Y為(M-a+1)*(N-b+1)大小。 
這里寫圖片描述 

b)對於池化層,按照池化標准把輸入張量縮小。 
c)對於全連接層,按照普通網絡的前向傳播計算。

2,CNN反向傳播的不同之處:

首先要注意的是,一般神經網絡中每一層輸入輸出a,z都只是一個向量,而CNN中的a,z是一個三維張量,即由若干個輸入的子矩陣組成。其次:

  1. 池化層沒有激活函數。這個問題倒比較好解決,我們可以令池化層的激活函數為σ(z)=z,即激活后就是自己本身。這樣池化層激活函數的導數為1。
  2. 池化層在前向傳播的時候,對輸入進行了壓縮,那么我們向前反向推導上一層的誤差時,需要做upsample處理。
  3. 卷積層是通過張量卷積,或者說若干個矩陣卷積求和而得到當前層的輸出,這和一般的網絡直接進行矩陣乘法得到當前層的輸出不同。這樣在卷積層反向傳播的時候,上一層誤差的遞推計算方法肯定有所不同。
  4. 對於卷積層,由於W使用的運算是卷積,那么由該層誤差推導出該層的所有卷積核的W,b的方式也不同。

由於卷積層可以有多個卷積核,各個卷積核的處理方法是完全相同且獨立的,為了簡化算法公式的復雜度,我們下面提到卷積核都是卷積層中若干卷積核中的一個。接下來看具體的CNN反向傳播步驟。

3,已知池化層的誤差,反向推導上一隱藏層的誤差

在前向傳播時,池化層我們會用MAX或者Average對輸入進行池化,池化的區域大小已知。現在我們反過來,要從縮小后區域的誤差,還原前一層較大區域的誤差。這個過程叫做upsample。假設我們的池化區域大小是2x2。第l層誤差的第k個子矩陣為: 

如果池化區域表示為a*a大小,那么我們把上述矩陣上下左右各擴展a-1行和列進行還原: 
這里寫圖片描述 

Pooling層反向傳播需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的。

MAX POOLING:

如果是MAX,假設我們之前在前向傳播時記錄的最大值位置分別是左上,右下,右上,左下,則轉換后的矩陣為: 
這里寫圖片描述 

舉個例子:

max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給后一層,而其他像素的值直接被舍棄掉。那么反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變量就是記錄最大值所在位置的,因為在反向傳播中要用到,那么假設前向傳播和反向傳播的過程就如下圖所示 :

 

Average POOLING
如果是Average,則進行平均,轉換后的矩陣為: 
這里寫圖片描述 

舉個例子:

mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那么反向傳播的過程也就是把某個元素的梯度等分為n份分配給前一層,這樣就保證池化前后的梯度(殘差)之和保持不變

 

上邊這個矩陣就是誤差矩陣經過upsample之后的矩陣,那么,由后一層誤差推導出前一層誤差的公式為: 
這里寫圖片描述 
上式和普通網絡的反向推導誤差很類似: 
這里寫圖片描述 
可以看到,只有第一項不同。

 

4,已知卷積層的誤差,反向推導上一隱藏層的誤差、

推導鏈接:https://blog.csdn.net/legend_hua/article/details/81590979

公式如下: 
這里寫圖片描述 
我們再看一次普通網絡的反向推導誤差的公式: 
這里寫圖片描述 
可以看到區別在於,下一層的權重w的轉置操作,變成了旋轉180度的操作,也就是上下翻轉一次,左右再翻轉一次,這其實就是“卷積”一詞的意義(我們可簡單理解為數學上的trick),可參考下圖,Q是下一層的誤差,周圍補0方便計算,W是180度翻轉后的卷積核,P是W和Q做卷積的結果: 
這里寫圖片描述

5,已知卷積層的誤差,推導該層的W,b的梯度

經過以上各步驟,我們已經算出每一層的誤差了,那么: 
a)對於全連接層,可以按照普通網絡的反向傳播算法求該層W,b的梯度。 
b)對於池化層,它並沒有W,b,也不用求W,b的梯度。 
c)只有卷積層的W,b需要求出,先看w: 
這里寫圖片描述 
再對比一下普通網絡的求w梯度的公式,發現區別在於,對前一層的輸出做翻轉180度的操作: 
這里寫圖片描述 
而對於b,則稍微有些特殊,因為在CNN中,誤差δ是三維張量,而b只是一個向量,不能像普通網絡中那樣直接和誤差δ相等。通常的做法是將誤差δ的各個子矩陣的項分別求和,得到一個誤差向量,即為b的梯度: 

這里寫圖片描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM