卷積神經網絡(CNN)
在前面我們講述了DNN的模型與前向反向傳播算法。而在DNN大類中,卷積神經網絡(Convolutional Neural Networks,以下簡稱CNN)是最為成功的DNN特例之一。CNN廣泛的應用於圖像識別,當然現在也應用於NLP等其他領域,本文我們就對CNN的模型結構做一個總結。
在學習CNN前,推薦大家先學習DNN的知識。如果不熟悉DNN而去直接學習CNN,難度會比較的大。這是我寫的DNN的教程:
1. CNN的基本結構
首先我們來看看CNN的基本結構。一個常見的CNN例子如下圖:
圖中是一個圖形識別的CNN模型。可以看出最左邊的船的圖像就是我們的輸入層,計算機理解為輸入若干個矩陣,這點和DNN基本相同。
接着是卷積層(Convolution Layer),這個是CNN特有的,我們后面專門來講。卷積層的激活函數使用的是ReLU。我們在DNN中介紹過ReLU的激活函數,它其實很簡單,就是ReLU(x)=max(0,x)ReLU(x)=max(0,x)。在卷積層后面是池化層(Pooling layer),這個也是CNN特有的,我們后面也會專門來講。需要注意的是,池化層沒有激活函數。
卷積層+池化層的組合可以在隱藏層出現很多次,上圖中出現兩次。而實際上這個次數是根據模型的需要而來的。當然我們也可以靈活使用使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構建模型的時候沒有限制。但是最常見的CNN都是若干卷積層+池化層的組合,如上圖中的CNN結構。
在若干卷積層+池化層后面是全連接層(Fully Connected Layer, 簡稱FC),全連接層其實就是我們前面講的DNN結構,只是輸出層使用了Softmax激活函數來做圖像識別的分類,這點我們在DNN中也有講述。
從上面CNN的模型描述可以看出,CNN相對於DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那么搞清楚CNN就容易很多了。
2. 初識卷積
首先,我們去學習卷積層的模型原理,在學習卷積層的模型原理前,我們需要了解什么是卷積,以及CNN中的卷積是什么樣子的。
大家學習數學時都有學過卷積的知識,微積分中卷積的表達式為:
離散形式是:
這個式子如果用矩陣表示可以為:
其中星號表示卷積。
如果是二維的卷積,則表示式為:
在CNN中,雖然我們也是說卷積,但是我們的卷積公式和嚴格意義數學中的定義稍有不同,比如對於二維的卷積,定義為:
這個式子雖然從數學上講不是嚴格意義上的卷積,但是大牛們都這么叫了,那么我們也跟着這么叫了。后面講的CNN的卷積都是指的上面的最后一個式子。
其中,我們叫W為我們的卷積核,而X則為我們的輸入。如果X是一個二維輸入的矩陣,而W也是一個二維的矩陣。但是如果X是多維張量,那么W也是一個多維的張量。
3. CNN中的卷積層
有了卷積的基本知識,我們現在來看看CNN中的卷積,假如是對圖像卷積,回想我們的上一節的卷積公式,其實就是對輸出的圖像的不同局部的矩陣和卷積核矩陣各個位置的元素相乘,然后相加得到。
舉個例子如下,圖中的輸入是一個二維的3x4的矩陣,而卷積核是一個2x2的矩陣。這里我們假設卷積是一次移動一個像素來卷積的,那么首先我們對輸入的左上角2x2局部和卷積核卷積,即各個位置的元素相乘再相加,得到的輸出矩陣S的S00S00的元素,值為aw+bx+ey+fzaw+bx+ey+fz。接着我們將輸入的局部向右平移一個像素,現在是(b,c,f,g)四個元素構成的矩陣和卷積核來卷積,這樣我們得到了輸出矩陣S的S01S01的元素,同樣的方法,我們可以得到輸出矩陣S的S02,S10,S11,S12S02,S10,S11,S12的元素。
最終我們得到卷積輸出的矩陣為一個2x3的矩陣S。
再舉一個動態的卷積過程的例子如下:
我們有下面這個綠色的5x5輸入矩陣,卷積核是一個下面這個黃色的3x3的矩陣。卷積的步幅是一個像素。則卷積的過程如下面的動圖。卷積的結果是一個3x3的矩陣。
上面舉的例子都是二維的輸入,卷積的過程比較簡單,那么如果輸入是多維的呢?比如在前面一組卷積層+池化層的輸出是3個矩陣,這3個矩陣作為輸入呢,那么我們怎么去卷積呢?又比如輸入的是對應RGB的彩色圖像,即是三個分布對應R,G和B的矩陣呢?
在斯坦福大學的cs231n的課程上,有一個動態的例子,鏈接在這。建議大家對照着例子中的動圖看下面的講解。
4. CNN中的池化層

5. CNN模型結構小結
(歡迎轉載,轉載請注明出處。歡迎溝通交流: pinard.liu@ericsson.com)
參考資料:
1) Neural Networks and Deep Learning by By Michael Nielsen
2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
4)CS231n Convolutional Neural Networks for Visual Recognition, Stanford