參考: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是一個三維張量,即由若干個輸入的子矩陣組成。其次:
- 池化層沒有激活函數。這個問題倒比較好解決,我們可以令池化層的激活函數為σ(z)=z,即激活后就是自己本身。這樣池化層激活函數的導數為1。
- 池化層在前向傳播的時候,對輸入進行了壓縮,那么我們向前反向推導上一層的誤差時,需要做upsample處理。
- 卷積層是通過張量卷積,或者說若干個矩陣卷積求和而得到當前層的輸出,這和一般的網絡直接進行矩陣乘法得到當前層的輸出不同。這樣在卷積層反向傳播的時候,上一層誤差的遞推計算方法肯定有所不同。
- 對於卷積層,由於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的梯度: