1. 程式人生 > >深度學習 --- 卷積神經網路CNN(LeNet-5網路學習演算法詳解)

深度學習 --- 卷積神經網路CNN(LeNet-5網路學習演算法詳解)

上一節我們詳細探討了LeNet-5網路的架構,但是還沒有解釋該網路是如何進行學習的,如何更新權值的,本節將接著上一節進一步CNN的學習機制和權值更新過程,這裡請大家一定要對CNN網路有一個清晰的認識,知道每一層是做什麼的,為什麼這樣設定。原因在哪等。大家在學習的過程中需要多問自己幾個為什麼,這樣才能快速進步的,好,廢話不多說,開始今天的內容:

        我們知道了CNN其實主要組成部分為卷積層、池化層(下采樣層)、BP層、輸出層(徑向基層),雖然叫卷積神經網路但是他的學習演算法依然是基於BP的,只是和純BP的演算法有所不同的是,這裡的權值存在權值共享和啟用函式有所不同,但是大體思路還是BP的,因此大家理解時要時刻想到BP的學習原理和權值更新過程。本節將主要參考一個學習筆記即《Notes on Convolutional Neural Networks》,裡面的公式肯能和前面的公式不一樣,但是意義都是一樣的,這裡大家需要適應符號的變化。

下面先給出BP的權值調整流程,不懂的建議看我的這篇文章

誤差訊號和權值更新如下:

權值更新:

 這裡大家需要結合上圖和公式深入理解BP的反向傳播的原理,尤其是誤差訊號和權值更新是如何進行的。

 

通過那篇學習筆記我們總體回顧一下BP,因為主要參考的是那篇筆記,因此需要好好的看懂文章裡的公式符號:

BP網路回顧:

                                             

上式就是誤差函數了,其中N代表樣本個數,c代表分類個數,t_k^n表示是目標值第n個樣本的類別為k,y_k^n表示網路的輸出的值第n個樣本的類別為k,E^N就是代表N個樣本的總誤差函數了。為了方便,這裡我們取一個樣本進行講解,因此上式就可以寫成:

                                             

 對於普通的全連線層的輸入和輸出通過啟用函式可表示為;

                                              

其中\mathbf{u}^l表示l層的神經元權值和,f(\cdot )為啟用函式,\mathbf{x}^l表示l層輸出

因為前面已經詳細講解了BP的過程,這裡只給出結果,下面是對偏置值求偏導:

                                            

其中\frac{\partial u}{\partial b} =1,由此可知對偏置值的偏導數就等於誤差對權值求和的偏導,所以有下式:

                                             

上式就是往前傳播的誤差訊號,其中\bigcirc是向量的對應位相乘(100維和100維向量圓乘還是100維),下面看一下最後一層的表示:

                                               

輸出層有多少維,那麼\large \mathbf{\delta }就是多少維,是向量,這裡大家需要理解。

通過上面的兩個式子,一旦我們知道最後一層的誤差訊號就可以通過迭代反向傳播誤差訊號了,那麼權值如何更新呢?

                                            

其實這些和我們前面的BP分析是一樣的,只是符號不同罷了,不理解的建議停下參考我的這篇文章好好自己把BP推一遍。

上面就是BP的簡單過程,如果深入理解BP的話,這裡看起來還是很容易的。下面就開始我們今天的主題,這裡先把LeNet-5網路的在拿過來如下:

 

大家結合這兩個圖來看,這裡都是一樣的,我們下面今開始今天的主題,先從卷積層的學習規則開始;

 卷積層:

     這裡需要和大家好好解釋這個公式和公式中代表的符號,首先需要明確的是這是針對卷積層的, l代表層,這裡是卷積層,那麼卷積層的上一層和下一層就使用\large l-1和   \large l+1表示,至於上下兩層分別是什麼,都有可能如C3的上一層就是池化層S2,下一次為S4也是池化層。而C1的上一層就是輸入了,下一層就是S2池化層,請結合下圖理解。

\large j表示卷積的第\large j個特徵平面(例如C3就有6個特徵平面,C5有120個特徵平面) 

\large i表示上一層的第 \large i個平面,因為卷積層的第\large j個平面的神經元對應上一層的平面不止一個如C3對應上一層是3個、4個、6個,此時使用\large i\in M_j表示,卷積層第\large j平面需要上一層多個平面。

\large \mathbf{x}_i^{l-1}表示卷積層上一層的第\large i個輸出,在卷積層就是輸入了,是矩陣

\large \mathbf{k}_{ij}^l表示上一層\large i平面和本層的第\large j特徵平面的權值向量   ,是矩陣

\large b_j^l是本層的第\large j個特徵平面的偏置

求和的原因就是可能是上一層的多個平面對應本層一個平面的意思

上面簡單來說就是卷積層的輸入和輸出的表示。這裡大家結合圖應該可以很好的理解卷積層是如何表示的。

卷積梯度

這裡介紹卷積層的訊號如何往回傳播,公式如下:

                                                  

這裡我們知道的是\large \delta\large f'(\cdot ),但是不知道\large \beta ^{l+1}_j和up,其實\large \beta ^{l+1}_j是卷積層的下一層即取樣層(池化層)的係數,那UP是什麼呢?我們知道卷積層下一層是取樣層又稱下采樣層即down表示,那麼up就表示從取樣層到卷積層的操作即上取樣,下采樣後一般不可逆,但是可以近似,這裡通過 Kronecker函式進行反向生成,為什麼要進行這一步操作呢?因為在CNN的卷積層到取樣層是資料壓縮,權值共享,同時卷積層的誤差訊號和下一次的誤差訊號有關,因此需要下一層即取樣層反向傳給卷積層,但是此時的維度不一樣,即權值維度是不同的,如何解決呢?這裡就是同過 下面的公式進行生成,生成公式如下:

大家不要理解太麻煩其實很簡單,如下,

 

我們取樣過程是把維度降低了,他的反向過程就是增加維度,因此就按照上面的進行就可以了,很簡單吧。

我們在分析上面的式子,會發現卷積層的第\large j個特徵平面的誤差訊號等於本層通過啟用函式求導圓乘(對應位相乘)上取樣矩陣,然後在乘上一個常數\large \beta ^{l+1}_j。這裡大家要時刻和上面的BP進行比較理解

此時我們看看學習訊號:      和上面的BP類似,對偏置值求偏導就是學習梯度了

                                                                

這一句是什麼意思呢?就是把\large \delta _j^l矩陣的所有元素求和就可以了。就這麼簡單。   

再看看權值是如何更新的:

                                                               

這個函式不好理解,那篇文章也沒有說清楚,挺複雜的,為了解釋這個式子他給出了MATLAB的實現程式碼:

                                                               

這句程式碼也不好理解,這裡先看rot180裡面的式子,其中conv是2維卷積計算,輸入為  \mathbf{x}_i^{l-1}是上一層的第i個平面的輸出,rot180(\large \delta _j^l)  意思是把\large \delta _j^l旋轉180°角,然後和\mathbf{x}_i^{l-1}做卷積,Valid是什麼意思呢?這裡為了讓大家明白,我再次細緻分析,上面是按照論文過來的,基礎不好的可能頭大,主要難點是在於1.本層是卷積層,下一層是取樣層,在知道取樣層誤差的情況下計算卷積層的誤差,和更新權值。2本層是取樣層,下一層是卷積層,在知道卷積層的誤差訊號時,計算取樣層的誤差訊號和權值更新。下面按照我的理解進行深入解釋:

輸出層的殘差:

                            

這個很簡單,不解釋了 。

下一層為取樣層(subsampling)的卷積層的殘差:

當一個卷積層L的下一層(L+1)為取樣層,並假設我們已經計算得到了取樣層的殘差,現在計算該卷積層的殘差。從CNN網路可以看出取樣層(L+1)的map大小是卷積層L的1/(2x2),但這兩層的map個數是一樣的,如C1和S2,其中C1是28x28的,取樣視窗為2x2的,結果取樣層為14x14,但是層數都是6。也就是說卷積層的某個平面的四個神經元對應取樣層的某個平面的一個神經元。因此此時知道取樣層的殘差訊號為14x14的,但是卷積層的輸出維度為28x28的,如果想要把取樣層的殘差訊號傳給卷積層,則需要對取樣層的殘差維度進行擴容,使其和卷積層的輸出map一致,怎麼辦呢?使用克羅內克積進行擴充:如下圖

通過這樣的方式就 可以是其維度一致了,然後和卷積層的輸出向量進行按位相乘,如下(這裡加入殘差為2x2的,卷積層的輸出為4x4的):

這樣就得到卷積層的殘差訊號了,這一層的地推公式就是下式了:

那麼我們下面討論如果這一層為取樣層,下一層為卷積層,殘差是如何計算的。

下一層為卷積層(subsampling)的取樣層的殘差

當某個取樣層L的下一層是卷積層(L+1),並假設我們已經計算出L+1層的殘差,現在計算L層的殘差。取樣層到卷積層直接的連線是有權重和偏置引數的,因此不像卷積層到取樣層那樣簡單。現再假設L層第j個map Mj與L+1層的M2j關聯,按照BP的原理,L層的殘差Dj是L+1層殘差D2j的加權和,但是這裡的困難在於,我們很難理清M2j的那些單元通過哪些權重與Mj的哪些單元關聯,也是上面的那個說不清的式子即:

                                           

論文裡通過MATLAB進行解釋,如下:

                                              

這裡我們也按照MATLAB進行解釋吧:

rot180表示對矩陣進行180度旋轉(可通過行對稱交換和列對稱交換完成),為什麼這裡要對卷積核進行旋轉,答案是:通過這個旋轉,'full'模式下得卷積的正好抓住了前向傳輸計算上層map單元與卷積和及當期層map的關聯關係,需要注意的是matlab的內建函式convn在計算卷積前,會對卷積核進行一次旋轉,因此我們之前的所有卷積的計算都對卷積核進行了旋轉:

a =
    1     1
    1     1
    1     1
k =
    2     3
    5     6
    8     9

>> convn(a,k,'full')
ans =
    3     6     5     3
   12    21    16     9
   27    45    33    18
   24    39    28    15
   15    24    17     9

convn在計算前還會對待卷積矩陣進行0擴充套件,如果卷積核為k*k,待卷積矩陣為n*n,需要以n*n原矩陣為中心擴充套件到(n+2(k-1))*(n+2(k-1)),所有上面convn(a,k,'full')的計算過程如下:

實際上convn內部是否旋轉對網路訓練沒有影響,只要內部保持一致(即都要麼旋轉,要麼都不旋轉),所有我的卷積實現裡面沒有對卷積核旋轉。如果在convn計算前,先對卷積核旋轉180度,然後convn內部又對其旋轉180度,相當於卷積核沒有變。

為了描述清楚對卷積核旋轉180與卷積層的殘差的卷積所關聯的權重與單元,正是前向計算所關聯的權重與單元,我們選一個稍微大一點的卷積核,即假設卷積層採用用3*3的卷積核,其上一層取樣層的輸出map的大小是5*5,那麼前向傳輸由取樣層得到卷積層的過程如下:

 

大家把這兩個點理解清楚了,基本CNN的網路權值更新就基本搞懂了。下面我按照論文把其他層更新也簡要介紹一下。

取樣層: 

 這個不解釋了,在上面詳細介紹了,這裡直接把公式複製過來。

其它層基本上是全連線的,和BP是一樣的了。這裡就不詳細說了。到這裡本節結束。下一節介紹另外一種網路 深度卷積神經網路。