理解卷積神經網絡——CNN(Convolutional Neural Networks)

1 卷積神經網絡(CNN)模型結構

在DNN大類中,卷積神經網絡(Convolutional Neural Networks,以下簡稱CNN)是最爲成功的DNN特例之一。

CNN廣泛的應用於圖像識別,當然現在也應用於NLP等其他領域,本文我們就對CNN的模型結構做一個總結。

1.1 CNN基本結構

首先我們來看看CNN的基本結構。一個常見的CNN例子如下圖:

圖中是一個圖形識別的CNN模型。可以看出最左邊的船的圖像就是我們的輸入層,計算機理解爲輸入若干個矩陣,這點和DNN基本相同。

卷積層,池化層這些概念以及作用意義暫時不用太糾結。

卷積層+池化層的組合可以在隱藏層出現很多次,上圖中出現兩次。而實際上這個次數是根據模型的需要而來的。當然我們也可以靈活使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構建模型的時候沒有限制。但是最常見的CNN都是若干卷積層+池化層的組合,如上圖中的CNN結構。

在若干卷積層+池化層後面是全連接層(Fully Connected Layer, 簡稱FC),全連接層其實就是我們前面講的DNN結構,只是輸出層使用了Softmax激活函數來做圖像識別的分類。

從上面CNN的模型描述可以看出,CNN相對於DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那麼搞清楚CNN就容易很多了。

1.2 初識卷積

首先,我們去學習卷積層的模型原理,在學習卷積層的模型原理前,我們需要了解什麼是卷積,以及CNN中的卷積是什麼樣子的。

微積分中卷積的表達式爲:

離散形式是:

這個式子如果用矩陣表示可以爲:

其中星號表示卷積。

如果是二維的卷積,則表示式爲:

在CNN中,雖然我們也是說卷積,但是我們的卷積公式和嚴格意義數學中的定義稍有不同,比如對於二維的卷積,定義爲:

其中,我們叫W爲我們的卷積核,而X則爲我們的輸入。如果X是一個二維輸入的矩陣,而W也是一個二維的矩陣。但是如果X是多維張量,那麼W也是一個多維的張量。

1.3 CNN中的卷積層

有了卷積的基本知識,我們現在來看看CNN中的卷積,假如是對圖像卷積,回想我們的上一節的卷積公式,其實就是對輸出的圖像的不同局部的矩陣和卷積核矩陣各個位置的元素相乘,然後相加得到。

最終我們得到卷積輸出的矩陣爲一個2x3的矩陣S。

再舉一個動態的卷積過程的例子如下:

我們有下面這個綠色的5x5輸入矩陣,卷積核是一個下面這個黃色的3x3的矩陣。卷積的步幅是一個像素。則卷積的過程如下面的動圖。卷積的結果是一個3x3的矩陣。

上面舉的例子都是二維的輸入,卷積的過程比較簡單,那麼如果輸入是多維的呢?比如在前面一組卷積層+池化層的輸出是3個矩陣,這3個矩陣作爲輸入呢,那麼我們怎麼去卷積呢?又比如輸入的是對應RGB的彩色圖像,即是三個分佈對應R,G和B的矩陣呢?

在斯坦福大學的cs231n的課程上,有一個動態的例子,大家打開這個例子可以看到,這裏面輸入是3個7x7的矩陣。實際上原輸入是3個5x5的矩陣。只是在原來的輸入周圍加上了1的padding,即將周圍都填充一圈的0,變成了3個7x7的矩陣。

例子裏面使用了兩個卷積核,我們先關注於卷積核W0。和上面的例子相比,由於輸入是3個7x7的矩陣,或者說是7x7x3的張量,則我們對應的卷積核W0也必須最後一維是3的張量,這裏卷積核W0的單個子矩陣維度爲3x3。那麼卷積核W0實際上是一個3x3x3的張量。同時和上面的例子比,這裏的步幅爲2,也就是每次卷積後會移動2個像素的位置。

最終的卷積過程和上面的2維矩陣類似,上面是矩陣的卷積,即兩個矩陣對應位置的元素相乘後相加。這裏是張量的卷積,即兩個張量的3個子矩陣卷積後,再把卷積的結果相加後再加上偏倚b。

7x7x3的張量和3x3x3的卷積核張量W0卷積的結果是一個3x3的矩陣。由於我們有兩個卷積核W0和W1,因此最後卷積的結果是兩個3x3的矩陣。或者說卷積的結果是一個3x3x2的張量。

仔細回味下卷積的過程,輸入是7x7x3的張量,卷積核是兩個3x3x3的張量。卷積步幅爲2,最後得到了輸出是3x3x2的張量。如果把上面的卷積過程用數學公式表達出來就是:

通過上面的例子,相信大家對CNN的卷積層的卷積過程有了一定的瞭解。

對於卷積後的輸出,一般會通過ReLU激活函數,將輸出的張量中的小於0的位置對應的元素值都變爲0。

1.4 CNN中的池化層

相比卷積層的複雜,池化層則要簡單的多。

所謂的池化,個人理解就是對輸入張量的各個子矩陣進行壓縮。假如是2x2的池化,那麼就將子矩陣的每2x2個元素變成一個元素,如果是3x3的池化,那麼就將子矩陣的每3x3個元素變成一個元素,這樣輸入矩陣的維度就變小了。

要想將輸入子矩陣的每nxn個元素變成一個元素,那麼需要一個池化標準。

常見的池化標準有2個,MAX或者是Average。即取對應區域的最大值或者平均值作爲池化後的元素值。

下面這個例子採用取最大值的池化方法。同時採用的是2x2的池化。步幅爲2。

首先對紅色2x2區域進行池化,由於此2x2區域的最大值爲6.那麼對應的池化輸出位置的值爲6,由於步幅爲2,此時移動到綠色的位置去進行池化,輸出的最大值爲8.同樣的方法,可以得到黃色區域和藍色區域的輸出值。最終,我們的輸入4x4的矩陣在池化後變成了2x2的矩陣。進行了壓縮。

2 卷積神經網絡前向傳播算法

2.1 回顧CNN的結構

CNN的結構,包括輸入層,若干的卷積層+ReLU激活函數,若干的池化層,DNN全連接層,以及最後的用Softmax激活函數的輸出層。這裏我們用一個彩色的汽車樣本的圖像識別再從感官上回顧下CNN的結構。圖中的CONV即爲卷積層,POOL即爲池化層,而FC即爲DNN全連接層,包括了我們上面最後的用Softmax激活函數的輸出層。

從上圖可以看出,要理順CNN的前向傳播算法,重點是輸入層的前向傳播,卷積層的前向傳播以及池化層的前向傳播。而DNN全連接層和用Softmax激活函數的輸出層的前向傳播算法我們在講DNN時已經講到了。

2.2 CNN輸入層前向傳播到卷積層

輸入層的前向傳播是CNN前向傳播算法的第一步。

一般輸入層對應的都是卷積層,因此我們標題是輸入層前向傳播到卷積層。

我們這裏還是以圖像識別爲例。先考慮最簡單的,樣本都是二維的黑白圖片。這樣輸入層

X就是一個矩陣,矩陣的值等於圖片的各個像素位置的值。這時和卷積層相連的卷積核W就也是矩陣。如果樣本都是有RGB的彩色圖片,這樣輸入X就是3個矩陣,即分別對應R,G和B的矩陣,或者說是一個張量。這時和卷積層相連的卷積核W就也是張量,對應的最後一維的維度爲3.即每個卷積核都是3個子矩陣組成。同樣的方法,對於3D的彩色圖片之類的樣本,我們的輸入X可以是4維,5維的張量,那麼對應的卷積核W也是個高維的張量。

不管維度多高,對於我們的輸入,前向傳播的過程可以表示爲:

其中,上標代表層數,星號代表卷積,而b代表我們的偏倚, σ爲激活函數,這裏一般都是ReLU。

和DNN的前向傳播比較一下,其實形式非常的像,只是我們這兒是張量的卷積,而不是矩陣的乘法。同時由於W是張量,那麼同樣的位置,W參數的個數就比DNN多很多了。

爲了簡化我們的描述,本文後面如果沒有特殊說明,我們都默認輸入是3維的張量,即用RBG可以表示的彩色圖片。

這裏需要我們自己定義的CNN模型參數是:

1) 一般我們的卷積核不止一個,比如有K個,那麼我們輸入層的輸出,或者說第二層卷積層的對應的輸入就K個。

2) 卷積核中每個子矩陣的的大小,一般我們都用子矩陣爲方陣的卷積核,比如FxF的子矩陣。

3) 填充padding(以下簡稱P),我們卷積的時候,爲了可以更好的識別邊緣,一般都會在輸入矩陣在周圍加上若干圈的0再進行卷積,加多少圈則P爲多少。

4) 步幅stride(以下簡稱S),即在卷積過程中每次移動的像素距離大小。

2.3 隱藏層前向傳播到卷積層

現在我們再來看普通隱藏層前向傳播到卷積層時的前向傳播算法。

假設隱藏層的輸出是M個矩陣對應的三維張量,則輸出到卷積層的卷積核也是M個子矩陣對應的三維張量。這時表達式和輸入層的很像,也是

其中,上標代表層數,星號代表卷積,而b代表我們的偏倚, σ爲激活函數,這裏一般都是ReLU。

也可以寫成M個子矩陣子矩陣卷積後對應位置相加的形式,即:

和上一節唯一的區別僅僅在於,這裏的輸入是隱藏層來的,而不是我們輸入的原始圖片樣本形成的矩陣。

需要我們定義的CNN模型參數也和上一節一樣,這裏我們需要定義卷積核的個數K,卷積核子矩陣的維度F,填充大小P以及步幅S。

2.4 隱藏層前向傳播到池化層

池化層的處理邏輯是比較簡單的,我們的目的就是對輸入的矩陣進行縮小概括。比如輸入的若干矩陣是NxN維的,而我們的池化大小是kxk的區域,則輸出的矩陣都是N/k×N/k維的。

這裏需要需要我們定義的CNN模型參數是:

1)池化區域的大小k

2)池化的標準,一般是MAX或者Average。

2.5 隱藏層前向傳播到全連接層

由於全連接層就是普通的DNN模型結構,因此我們可以直接使用DNN的前向傳播算法邏輯,即:

這裏的激活函數一般是sigmoid或者tanh。

經過了若干全連接層之後,最後的一層爲Softmax輸出層。此時輸出層和普通的全連接層唯一的區別是,激活函數是softmax函數。

這裏需要需要我們定義的CNN模型參數是:

1)全連接層的激活函數

2)全連接層各層神經元的個數

2.6 CNN前向傳播算法小結

有了上面的基礎,我們現在總結下CNN的前向傳播算法。

輸入:1個圖片樣本,CNN模型的層數L和所有隱藏層的類型,對於卷積層,要定義卷積核的大小K,卷積核子矩陣的維度F,填充大小P,步幅S。對於池化層,要定義池化區域大小k和池化標準(MAX或Average),對於全連接層,要定義全連接層的激活函數(輸出層除外)和各層的神經元個數。

以上就是CNN前向傳播算法的過程總結。

3 卷積神經網絡反向傳播算法

3.1 回顧DNN的反向傳播算法

現在我們想把同樣的思想用到CNN中,很明顯,CNN有些不同的地方,不能直接去套用DNN的反向傳播算法的公式。

3.2 CNN的反向傳播算法思想

要套用DNN的反向傳播算法到CNN,有幾個問題需要解決:

下面我們就針對問題2,3,4來一步步研究CNN的反向傳播算法。

在研究過程中,需要注意的是,由於卷積層可以有多個卷積核,各個卷積核的處理方法是完全相同且獨立的,爲了簡化算法公式的複雜度,我們下面提到卷積核都是卷積層中若干卷積核中的一個。

這裏的式子其實和DNN的類似,區別在於對於含有卷積的式子求導時,卷積核被旋轉了180度。即式子中的rot180(),翻轉180度的意思是上下翻轉一次,接着左右翻轉一次。在DNN中這裏只是矩陣的轉置。那麼爲什麼呢?由於這裏都是張量,直接推演參數太多了。我們以一個簡單的例子說明爲啥這裏求導後卷積核要翻轉。

這上面9個式子其實可以用一個矩陣卷積的形式表示,即:

爲了符合梯度計算,我們在誤差矩陣周圍填充了一圈0,此時我們將卷積核翻轉後和反向傳播的梯度誤差進行卷積,就得到了前一次的梯度誤差。這個例子直觀的介紹了爲什麼對含有卷積的式子求導時,卷積核要翻轉180度的原因。

以上就是卷積層的誤差反向傳播過程。

3.6 CNN反向傳播算法總結

現在我們總結下CNN的反向傳播算法,以最基本的批量梯度下降法爲例來描述反向傳播算法。

輸入:m個圖片樣本,CNN模型的層數L和所有隱藏層的類型,對於卷積層,要定義卷積核的大小K,卷積核子矩陣的維度F,填充大小P,步幅S。對於池化層,要定義池化區域大小k和池化標準(MAX或Average),對於全連接層,要定義全連接層的激活函數(輸出層除外)和各層的神經元個數。梯度迭代參數迭代步長α,最大迭代次數MAX與停止迭代閾值ϵ

輸出:CNN模型各隱藏層與輸出層的 W,b

 

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