1. 程式人生 > >Deep Learning 讀書筆記(四):關於卷積神經網路的各種

Deep Learning 讀書筆記(四):關於卷積神經網路的各種

        可能前面的幾篇部落格太偏理論了,班上同學都說看不懂,因此還是決定寫寫偏應用的東西。因為只看過影象處理和NLP相關的內容,因此就讓班上同學選擇下想看哪一個。最後服從大流選擇寫有關Deep Learning在影象處理方面的一些內容。在此也特別謝謝電子科技大學10級信安一班各位的支援,真的是特別想你們,同樣也謝謝計算智慧實驗室的各位基友們。好,現在就開始之後的幾篇關於影象處理的內容。因為現在Deep Learning關於影象處理的應用主要是通過卷積神經網路(Convolutional Neural Networks,CNN)來實現的,當然根據不同的問題需要對模型做出一些不同的改變。但萬變不離其宗,只要將基本的CNN原理搞懂了,那麼理解起其他的模型來就很快了。因此,我們先來討論下基本的CNN模型,之後再結合具體的問題來介紹不同的變體,可能就會與試驗結合的比較緊密了。

        首先,我們來對CNN的整體結構有個大致的印象。

        其中,C表示的是卷積層的意思,其主要作用是提取出圖片中的特徵,對圖片能夠起到一定的降維作用。S表示的是下采樣層,其主要作用是對圖片進行降維,同樣能夠使得模型針對圖片具有較好的旋轉、平移、放縮的不變性。這一點在影象處理中還是十分重要的。一般情況下,我們主要使用的下采樣方法是池化方法,所以之後我們會主要針對池化方法進行討論。從上圖中,我們可以看到,卷積操作和池化操作是交替進行的,這只是在基本的CNN中是這樣的,針對不同的問題,可能會需要對兩種操作的順序進行一定的調整。仔細觀察上圖,可能有些人會問為什麼會有多列的神經網路?我們可以這樣來理解,對於一個卷積操作,它只會提取圖片中的一種特徵,當我們的資料量很大時,一種特徵肯定是遠遠不夠的。因此,我們需要藉助不同的卷積操作(不同的卷及操作就是使用不同的引數而已)來提取影象中的不同的特徵,所以就會有多列的神經網路產生。最後綜合這些不同的特徵來得到最後的分類器。根據我們對於CNN的大體上的介紹,其主要有兩個關鍵的操作,卷積和池化,因此之後就對這兩種操作進行詳細的介紹。

        首先是對於卷積的概念,這是我認為是在CNN中最重要的概念,沒有之一,CNN的成功我覺得還是主要是卷積的功勞。卷積的核心就是區域性感受野的概念。試想,對於一個100X100的影象,如果一個神經元要對其進行全連線,則會有10^4個引數,這還只是一個神經元的引數,深度模型神經元個數那麼多,引數的個數是不能接受的。如果引入區域性感受野的概念之後呢,如果我們定義區域性感受野的大小為10X10。這裡我們還要引入卷積的另一個重要概念,就是引數共享。其含義是,對於一張圖片進行卷積操作,每個感受野所使用的引數都是相同的。這樣,在引入區域性感受野後,模型的引數就降為了10^2,有效降低了模型引數的個數。引入一張圖來說明下該過程:

        接下來就介紹下卷積的數學定義,對於每一個卷積層都是針對其前一層的個輸出影象對其應用一個大小的filter(就相當於上面提到的感受野的概念)進行卷積,其結果是由以下公式得到的:。其中n表示層數,Y表示一個大小為的影象,表示一個大小為的filter連線輸入影象i與輸出影象j,就是輸出影象的偏置。對於大小為的輸入影象,一個大小為的filter W,輸出影象的大小為。具體過程如下:

        這裡的啟用函式是scaled雙曲正切函式:

        在一張圖片上,對於filter的使用,有點像滑動視窗的概念,會產生重疊。一般情況下只會移動一個畫素,但根據不同的問題,移動的長度也會有所不同。還有比較重要的一點是,如果兩個相鄰的卷積層之間的feature map(就相當於是卷積)數目並不相同(池化層是不會對feature map的數目進行任何更改的),則可以認為是之後一層的feature map是由之前一層的feature map組合而成。至於是如何進行組合的,在具體的模型中會有不同的做法。我感覺已經無數次提到了具體問題具體的做法了,但實際上確實如此,Deep Learning太過於龐大,導致裡面小的trick太多了,或許每一個對於模型的提升也許並不明顯,但將它們結合起來,或許會取得不錯的效果。我覺得,這也是為什麼,總是那幾個大牛才能發出質量特別高的文章,因為這些小的trick並不會在他們的文章中被提及,即使採用相同的模型也不能達到他們相同的效果。

       卷積的概念就差不多介紹完了,接下來就是池化的內容,這個就比較簡單了。 池化層的輸出結果是一個大小為的不重疊的矩形區域的最大啟用值。具體過程如下:

                   

        注意到,之前我們說的是取最大的啟用值,對於池化操作來說,其實有平均池化和最大池化兩種方式可以選擇。平均池化,顧名思義,就是取矩形區域中啟用值的平均值來代表這個區域。試驗證明,最大池化方法可以導致更快的收斂、能夠選擇到更好的具有不變性的特徵,以及能夠更好的提高模型的泛化能力。因此,最大池化是用的很頻繁的,還有很多關於最大池化的擴充套件。還有一點,前面我們提到池化區域一般來說是不重疊的,這與感受野是不同的。但在某些情況下,也可以使它重疊,那麼就與感受野是一樣的了。說了這麼多,讓人感受到,任何事物並不是一成不變的。

        卷積層中感受野的大小以及池化層中池化區域的大小都需要被精心的選擇,以保證在最後一個卷積層每一個map在經歷池化過程之後都會被降到1個畫素點,或者是最後一個卷積層在經歷池化之後連線到一個全連線層以產生一個一維的特徵向量。整個模型的最後一層通常是全連線層,對於每一個分類來說都會有一個輸出。在輸出層中,通常會使用一個softmax啟用函式,這樣,對於每一個類別,都只會有一個神經元處於啟用狀態,這就表示了輸入就是屬於這個類別的。

        在介紹完卷積和池化這兩大操作後,其實已經可以對CNN模型有比較好的理解了。但還有很重要的一點沒有介紹就是,建立模型之後,又應該如何對模型進行學習呢? 主要還是利用BP演算法來對網路進行調參,下面就主要來講BP演算法調參的具體過程。

        對於輸出層,目標函式為,該項表示的是輸出結果與所期望結果的交叉熵。輸出層誤差敏感項的表示式為:。e(y)是我們所期望的輸出。這樣,權值與偏置的增量項為:。其中e(y)與f(x)是一個矩陣,已經把m個樣本全都考慮進去了。

        卷積層的下一層為池化層,求卷積層的誤差敏感項。假設卷積層的大小為4X4,池化區域的大小為2X2,那麼池化層的大小為2X2.假設池化層的誤差敏感值為:。假設我們使用的池化方法為最大池化,卷積層的誤差敏感值為:。這裡需要記錄向前傳播中,最大值所在的位置。

        池化層的下一層為卷積層,求池化層的誤差敏感項。假設第l層(池化層)有N個特徵,第l+1層(卷積層)有M個特徵,由第l+1層中第j個核對第l層中第i個核的誤差敏感項的計算方法為:,其中符號表示矩陣的卷積操作。假設池化層的大小為3X3,有2個核,卷積層的感受野區域大小為2x2,則卷積層的大小為2X2,。假設兩個核為:。卷積層的誤差敏感項為:。需要將l+1層進行填充:。可以採用matlab中的conv2()函式進行矩陣的卷及操作。

         

         

         

        在計算時,需要對核函式進行旋轉180度這一關鍵操作,在matlab中,在函式內部已經預設執行了這一操作,我們就不需要再做了。

        計算各層之間權值與偏置的增量:。其中,符號表示矩陣的卷及操作。這裡需要用到conv2(…,‘valid’)函式實現。

        對CNN的介紹就到此為止了,之後呢,會針對不同的問題,討論下CNN的一些變形,包括如何將其使用在時序性資料中。這周,更了兩篇,下週回家,國慶放假就算了,剛好。