深度學習之二:CNN推導

前面看過了CNN的基本結構,經典的模式如下圖:



 

上圖經典的CNN模型主要可以概括爲三個部分:

convolution層:convolution是將原來的輸入向量映射成多個feature map,每個feature map的權重和偏移量都是一樣的

sub-sampling層:sub-sampling 層將feature map進一步縮小,可以選擇down-sampling的方法有很多,如max-pooling是選取所選區域的最大值,也有是選取所選區域的每個像素的輸出值的平均                 值,當然也有是將所選區域的每個像素的輸出值進行求和,但是目的只有一個,那就是進一步將feature map壓縮

全連接層:CNN中卷積層和sub-sampling層可以多個組合使用,在最後面的sub-sampling層後面加入幾個全連接層,最後連接到輸出層中去

 

瞭解完這一點後,根據一般的神經網絡BP算法,我們構造完損失函數L,然後在訓練過程中就使用BP算法進行梯度下降求導了,本文就是介紹關於CNN求導過程。

整篇文章參考的論文爲【1】Notes on Convolutional Neural Networks ,作者Jake Bourvie比較詳細的介紹了CNN 的求導方法。

 

文章假設已經掌握了經典的BP算法,同時對於損失函數也有一定的瞭解,常用的平方損失函數或者cross-entropy函數等,所以下文不會給出從頭到尾的推導公式,只是着重介紹在卷積層和sub-sampling層的求導過程。

 

一,首先來看卷積層的求導(求誤差敏感項以及權重和偏置值):

 

從輸入層到卷積層的feature map,我們使用的是如下計算公式:

 

 其中Mj表示的是輸入層的選中區域,而Kij核函數表示的是權重參數,也就是w參數,f(.)表示的是激勵函數,一般使用sigmoid,也有資料【2】表示使用ReLU函數能夠更好的訓練深度神經網絡,總之這個式子表示的是從上一輸入層到卷積層的計算過程,feature map共享相同的Kernel和biase也就是w和b參數,不同的feature map 的w和b參數不一樣

 

現在來計算一下卷積層的梯度下降公式:

 

目的:計算卷積層的各個參數的梯度,也就是計算上面式子的Kij和b的導數值

假設每個卷積層後面都跟着sub-sampling層,BP算法告訴我們,要想求得本層的參數,那麼就需要求出損失函數對本層輸出結果的導數,這裏就出現了一個問題,卷積層的大小和sub-sampling層的大小不一樣,這就對求導產生的難度。

爲了求導,我們可以將sub-sampling層按照之前的卷積層到sub-sampling層的映射規則,將sub-sampling層展開成和卷積層一樣的大小,我們看一下是如歌展開的:

 

假設卷積層爲4*4大小,然後sub-sampling層爲2*2大小,我們假設現在使用BP算法求得的sub-sampling敏感項大小是:

 

 

  •  假設在從卷積層到sub-sample層是使用均值的方法,那麼可以將sub-sampling 的敏感項"up-sampling"到如下圖:

 

 

 

  •  如假設使用的是max-pooling方法,那麼可以選擇其他區域爲0,其up-sampling的結果可能是下圖:

 

 之所以是使用“可能”兩個字,是因爲0的位置需要根據卷積層到sub-sampling層的最大值在卷積層的位置決定,因此還需要記住從convolution層到sub-sampling層的映射位置。

 

在得到卷積層output敏感項之後,就可以進行對卷積層的參數進行求導了:

 

 
(1)
 
(2)
 
(3)
 

其中(1)式中的up(.)指的就是講suB-sampling層按照之前說的規則“展開”,βl+1 表示的是sub-sampling“展開後”卷積層的output敏感項,f0(u` j)則是對卷積層的激勵函數求導,這和BP算法是一致的

(2)式表示對卷積層參數b的求導,(3)式表示的是對卷積層參數Kij的求導,其實也就是對權重w進行求導,Pi表示的是卷積層上一層輸入值塊,也就是卷積區域的輸入值矩陣,和BP算法保持一致。

在【1】這篇文章中,有一種新的方法計算這部分求導,其實是爲了方便MATLAB編程,我們以求 L-1層的敏感項(δl-1)舉例說明:

 

假設卷積層前面是一個3*3大小的通道,卷積核大小爲2*2,那麼在卷積層應該有2*2大小,我們假設現在已經求出的卷積層的敏感項爲:

 

 卷積核爲:



我們先將卷積層L的敏感項“FULL”化:(稍後解釋爲什麼)

 

 

 

那麼對卷積層的Xij(也就是前一層的敏感項)求導的結果就是

 

 

   
 
   *  =
 

注意這裏*表示的離散卷積也就是先要將卷積核旋轉180度然後進行卷積相乘。其實這裏也是根據BP算法進行推導的,比如最中間的2.3是由矩陣[1,1,2,3]的 1的右下角,1的左下角,2的右上角,3的左上角的四個因子相乘所得,所以2.3=1*0.6+1*0.5+2*0.3+3*0.2得來

 

當然如果有多個feature map,只需要將所得到的3維矩陣相加即可

 

二,前面部分從convolution層到sub-sampling層沒有考慮使用線性變換,也就是說可能從卷積層到sample層還可能有參數Biase和w參數,下面就這一點做個說明

 

計算公式:


 其中down表示的是從卷積層到sub-sampling層使用的函數,例如max-pooling使用的是最大值,在論文【1】裏面,作者使用的求和,也就是將卷基層的輸出直接相加得到dowm(.)注意到這裏使用的 βj `和(1) 式中使用的是一樣的參數,之所以是這樣,是因爲如果從卷積層到sub-sampling層使用的是求和的話,那麼卷積層的敏感項“展開項”都是一樣的 βj ` ,所以(1)式中的 βj ` 就是這麼來的

 

好了現在按照下面式子求出各個項的參數:



 
(4)
 
(5)

這個和一般的BP算法是一樣的,這裏求上一層的敏感項的時候,可以將down(.)當做一個整體求導,然後按照之前所說明的方式“展開”成和convolution層一樣大小的去求卷積層各個參數導數

 

 

三,拓展

【1】還介紹了一下優化CNN的方法,如給不同的map不一樣的比例參數ai,也說明了一些關於規範化(regulation)方面的內容,其求導過程大同小異,就不一一提及

 

 

參考文獻:

【1】Notes on Convolutional Neural Networks,Jake Bouvrie

【2】Deep Sparse Rectifier Neural Network,Xavier Glorot..

【3】Deep learning:五十一(CNN的反向求導及練習)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章