在前面我們講述了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)$。在卷積層後面是池化層(Pooling layer),這個也是CNN特有的,我們後面也會專門來講。需要注意的是,池化層沒有啟用函式。
卷積層+池化層的組合可以在隱藏層出現很多次,上圖中出現兩次。而實際上這個次數是根據模型的需要而來的。當然我們也可以靈活使用使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構建模型的時候沒有限制。但是最常見的CNN都是若干卷積層+池化層的組合,如上圖中的CNN結構。
在若干卷積層+池化層後面是全連線層(Fully Connected Layer, 簡稱FC),全連線層其實就是我們前面講的DNN結構,只是輸出層使用了Softmax啟用函式來做影象識別的分類,這點我們在DNN中也有講述。
從上面CNN的模型描述可以看出,CNN相對於DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那麼搞清楚CNN就容易很多了。
2. 初識卷積
首先,我們去學習卷積層的模型原理,在學習卷積層的模型原理前,我們需要了解什麼是卷積,以及CNN中的卷積是什麼樣子的。
大家學習數學時都有學過卷積的知識,微積分中卷積的表示式為:$$S(t) = \int x(t-a)w(a) da$$
離散形式是:$$s(t) = \sum\limits_ax(t-a)w(a)$$
這個式子如果用矩陣表示可以為:$$s(t)=(X*W)(t)$$
其中星號表示卷積。
如果是二維的卷積,則表示式為:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i-m,j-n) w(m,n)$$
在CNN中,雖然我們也是說卷積,但是我們的卷積公式和嚴格意義數學中的定義稍有不同,比如對於二維的卷積,定義為:$$s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i+m,j+n) w(m,n)$$
這個式子雖然從數學上講不是嚴格意義上的卷積,但是大牛們都這麼叫了,那麼我們也跟著這麼叫了。後面講的CNN的卷積都是指的上面的最後一個式子。
其中,我們叫W為我們的卷積核,而X則為我們的輸入。如果X是一個二維輸入的矩陣,而W也是一個二維的矩陣。但是如果X是多維張量,那麼W也是一個多維的張量。
3. CNN中的卷積層
有了卷積的基本知識,我們現在來看看CNN中的卷積,假如是對影象卷積,回想我們的上一節的卷積公式,其實就是對輸入的影象的不同區域性的矩陣和卷積核矩陣各個位置的元素相乘,然後相加得到。
舉個例子如下,圖中的輸入是一個二維的3x4的矩陣,而卷積核是一個2x2的矩陣。這裡我們假設卷積是一次移動一個畫素來卷積的,那麼首先我們對輸入的左上角2x2區域性和卷積核卷積,即各個位置的元素相乘再相加,得到的輸出矩陣S的$S_{00}$的元素,值為$aw+bx+ey+fz$。接著我們將輸入的區域性向右平移一個畫素,現在是(b,c,f,g)四個元素構成的矩陣和卷積核來卷積,這樣我們得到了輸出矩陣S的$S_{01}$的元素,同樣的方法,我們可以得到輸出矩陣S的$S_{02},S_{10},S_{11}, S_{12}$的元素。
最終我們得到卷積輸出的矩陣為一個2x3的矩陣S。
再舉一個動態的卷積過程的例子如下:
我們有下面這個綠色的5x5輸入矩陣,卷積核是一個下面這個黃色的3x3的矩陣。卷積的步幅是一個畫素。則卷積的過程如下面的動圖。卷積的結果是一個3x3的矩陣。
上面舉的例子都是二維的輸入,卷積的過程比較簡單,那麼如果輸入是多維的呢?比如在前面一組卷積層+池化層的輸出是3個矩陣,這3個矩陣作為輸入呢,那麼我們怎麼去卷積呢?又比如輸入的是對應RGB的彩色影象,即是三個分佈對應R,G和B的矩陣呢?
在史丹佛大學的cs231n的課程上,有一個動態的例子,連結在這。建議大家對照著例子中的動圖看下面的講解。
4. CNN中的池化層
5. CNN模型結構小結
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.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