CNN公式推導
1 前言
在看此blog之前,請確保已經看懂我的前兩篇blog【深度學習筆記1(卷積神經網絡)】和【BP算法與公式推導】。並且已經看過文獻[1]的論文【Notes on Convolutional Neural Networks】。因為本文就是講解文獻[1]論文前部分公式的推導過程<這里有一個假設,或許公式是錯誤的,如有好的理解請留言>。
2 CNN公式推導
卷積神經網絡參數求解的過程與上次筆記【BP算法與公式推導】類似,但是在形式上還是有變化的。文獻[1]的論文直接給出了參數求解的公式,主要包括:卷積層和subsampling層的殘差以及對應的對權重參數和偏置參數的導數。
注意:這里的卷積核參數所放在的層與殘差放在了同一層,和上次筆記略有不同,但是沒有影響!
2.1 卷積層:
2.1.1 卷積計算
假設第l層為卷積層,第l+1層為subsampling層,則第l層第j個feature map的計算公式如下:
上面的*號實質是讓卷積核k在第l-1層所有關聯的feature maps上做卷積運算,然后求和,再加上一個偏置參數,取sigmoid得到最終激勵值的過程。
例子:假設第l-1層只有兩個feature map,大小為4*4像素。
一個卷積核K(二維卷積核K11和K12),大小為2*2。
則計算第l層的一個feature map結果如下,大小為3*3像素:
注意:在matlab中可以用convn函數來實現卷積,如:
image = convn(im, kernel, ‘valid’); 其中計算的過程會先將kernel反轉180度,再與im做卷積操作。
因此本文中我們舉例子用的卷積核2*2大小是已經旋轉180度后的,即
2.1.2 殘差計算
BP算法中殘差計算等於第l+1層與其連接的所有結點的權值和殘差的加權和再乘以該點對z的導數值。卷積層的下一層是subsampling層,采用的是一對一非重疊采樣,故殘差計算更為簡單。
第l層第j個feature map的殘差計算公式如下:
其中第l層為卷積層,第l+1層為subsampling層,subsampling層與卷積層是一一對應的。其中up(x)是將第l+1層的大小擴展為和第l層大小一樣。舉個簡單的例子,假如第l+1層為2*2的,subsampling的采樣大小為2*2,其中第l+1層的一個feature map所對應的殘差為:

那么擴展之后就變為了

直觀上的理解:由於是一對一采樣,故擴展之后第l層的每個節點只對應第l+1層唯一的一個結點,按照BP算法殘差計算公式可以得出:第l層某結點殘差就等於權值w乘以第l+1層對應節點殘差值再乘以f(z)的導數,公式僅僅是矢量化的形式。
2.1.3 梯度計算
(1) 論文中給出了偏置參數b的導數,公式為:
下面我們給出推導公式,(其中第2行到第3行用到了假設,因為這里的zjl和bjl都是矩陣,沒有矩陣對矩陣求導,這里給出了一個求和公式。我也解釋不了是否正確,有知道的可以留言!)其中njl為第l層第j個feature map中點的個數。
(2) 論文中給出了偏置參數k的導數,其中kijl表示第l層第j個feature map與第l-1層第i個feature map相連所對應的kernel,是一個矩陣:
公式推導如下:
這里我們給出例子:比如卷積層為3*3的大小,卷積核的大小為2*2上一層feature map大小為4*4
論文中給出其matlab代碼:
由於matlab中先要反轉180度,故代碼中先對殘差旋轉180度,得到的結果是, 要想得到最后的結果K, 故對其結果再旋轉180度。
2.2 subsampling層:
2.2.1卷積計算
設第l層為subsampling層,第l-1為卷積層,由於是一對一采樣,假設采樣大小為2*2,故計算公式為:
這里的down(x)是將x中2*2的大小中像素值進行求和。計算過程為對上一層卷積層2*2大小進行求和然后乘以權重w,再加上一個偏置,再求取sigmoid函數。
2.2.2 殘差計算
論文中給出了殘差的計算公式:
其中第l層為subsampling層,第l+1層為卷積層。
直觀上的理解:如下圖:左邊為subsampling層的一個featuremap,右邊是卷積層的一個feature map,


比如對於當前結點中的7號結點,其與下一層的連接方式為{k22, 2; k21,3; k12, 5; k11, 6}(這里可以用筆簡單畫下就計算出來了)。故根據bp算法中殘差計算方法等於第l+1層與其連接的所有結點的權值和殘差的加權和再乘以該點對z的導數值,就相當於用卷積核直接在下一層卷積層的殘差上做卷積運算,方式為full類型,也就得到公式中的形式,由於matlab自帶的卷積函數會先旋轉對K旋轉180度,故我們需要先對其旋轉180度,再計算卷積。(當然我認為這里的公式有點偏差,的下標不應該用j,而是用i,而且需要對第l+1層中所有的與該subsampling相連接的featuremap最后的結果求和—源碼中的確是這樣的。)
2.2.2 梯度計算
(1) 偏置b的導數,其公式的推導過程與卷積層是一樣的的。
(2) 權重w的導數,論文給出的公式如下:
公式推導如下:
這里我們給出一個例子:比如subsampling層feature map大小為2*2,則其上一層卷積層feature map的大小為4*4,如下所示,計算過程為對上一層卷積層2*2大小進行求和然后乘以權重w,再加上一個偏置,再求取sigmoid函數。(其中1,2,3,4只是一個標號,不是具體的值)


則計算過程為:
wjl = d11*{1+2+3+4} +d12*{5+6+7+8} + d21*{9+10+11+12} + d22*{13+14+15+16}。與公式相符。
注意:公式推導中有一個不那么正確的假設,但有了這個假設,一切結論都是成立的,這個結論或許超出了我數學的海拔高度,有正確解法的可以留言,謝謝!
參考文獻:
1:原始論文:Notes onConvolutional Neural Networks http://cogprints.org/5869/1/cnn_tutorial.pdf
2: 論文翻譯參看:http://blog.csdn.net/zouxy09/article/details/9993371
3:如何正確使用論文中公式(附帶小例子)見:http://www.cnblogs.com/tornadomeet/p/3468450.html