當我們在談論 Deep Learning:CNN 其常見架構(上)

本系列意在長期連載分享,內容上可能也會有所增刪改減;

因此如果轉載,請務必保留源地址,非常感謝!

知乎專欄:當我們在談論數據挖掘

引言

CNN(Convolution Neural Network,卷積神經網路)作為一種經典的 DNN 結構,上世紀90年代就已經被提出了,卻沉寂近20年。有趣的是,在2012年 AlexNet 大放異彩後,CNN 在隨後幾年近乎卷席了整個圖像處理領域,很有點戲劇性。近些年,CNN 在語音處理、NLP 領域也發展迅速。本文會介紹 CNN 的相關概念,並具體介紹一些有趣的 CNN 架構。

CNN

CNN 其實可以看作 DNN 的一種特殊形式。它跟傳統 DNN 標誌性的區別在於兩點,Convolution Kernel 以及 Pooling。

Convolution Kernel

卷積

說起 Convolution Kernel,首先要解釋一下 Convolution(卷積)。一般我們接觸過的都是一維信號的卷積,也就是

y[n]=x[n]ast h[n]=sum_k x[k]h[n-k]

在信號處理中,x[n]是輸入信號,h[n]是單位響應。於是輸出信號y[n]就是輸入信號x[n]響應的延遲疊加。這也就是一維卷積本質:加權疊加/積分。

那麼對於二維信號,比如圖像,卷積的公式就成了

y[m,n]=x[m,n]ast h[m,n]=sum_j sum_i x[i,j]h[m-i,n-j]

假設現在 Convolution Kernel 大小是3times 3,我們就可以化簡上式為

看公式很繁瑣,我們畫個圖看看,假如 Convolution Kernel 如下圖

那麼,從 Input Image 到 Output Image 的變化如下

可以看出,其實二維卷積一樣也是加權疊加/積分。需要注意的是,其中 Convolution Kernel 進行了水平和豎直方向的翻轉。

ConvolutionnKernel 的意義

Convolution Kernel 其實在圖像處理中並不是新事物,Sobel 運算元等濾波運算元,一直都在被用於邊緣檢測等工作中,只是以前被稱為 Filter。圖像處理的同學應該有印象。

Convolution Kernel 的一個屬性就是局部性。即它只關注局部特徵,局部的程度取決於 ConvolutionnKernel 的大小。比如用 Sobel 運算元進行邊緣檢測,本質就是比較圖像鄰近像素的相似性。

也可以從另外一個角度理解 ConvolutionnKernel 的意義。學過信號處理的同學應該記得,時域卷積對應頻域相乘。所以原圖像與 ConvolutionnKernel 的卷積,其實對應頻域中對圖像頻段進行選擇。比如,圖像中的邊緣和輪廓屬於是高頻信息,圖像中區域強度的綜合考量屬於低頻信息。在傳統圖像處理里,這些物理意義是指導設計 ConvolutionnKernel 的一個重要方面。

CNN 的 Convolution Kernel

CNN 中的 Convolution Kernel 跟傳統的 Convolution Kernel 本質沒有什麼不同。仍然以圖像為例,Convolution Kerneln依次與 Input 不同位置的圖像塊做卷積,得到 Output,如下圖。

同時,CNN 有一些它獨特的地方,比如各種定義,以及它屬於 DNN 的那些屬性:

  1. CNN 可以看作是 DNN 的一種簡化形式,Input 和 Output 是 DNN 中的 Layer,Convolution Kernel 則是這兩層連線對應的w,且與 DNN 一樣,會加一個參數 Bias b

  2. 一個 Convolution Kernel 在與 Input 不同區域做卷積時,它的參數是固定不變的。放在 DNN 的框架中理解,就是對 Output Layer 中的神經元而言,它們的wb是相同的,只是與 Input Layer 中連接的節點在改變。在 CNN 里,這叫做 Shared Weights and Biases

  3. 在 CNN 中,Convolution Kerneln可能是高維的。假如輸入是m times n times k維的,那麼一般 Convolution Kernel 就會選擇為d times d times k維,也就是與輸入的 Depth 一致

  4. 最重要的一點,在 CNN 中,Convolution Kernel 的權值其實就是w,因此不需要提前設計,而是跟 DNN 一樣利用 GD 來優化

  5. 如上面所說,Convolution Kernel 卷積後得到的會是原圖的某些特徵(如邊緣信息),所以在 CNN 中,ConvolutionnKernel 卷積得到的 Layer 稱作 Feature Map

  6. 一般 CNN 中一層會含有多個 Convolution Kernel,目的是學習出 Input 的不同特徵,對應得到多個 Feature Map。又由於 Convolution Kernel 中的參數是通過 GD 優化得到而非設定的,於是w的初始化就顯得格外重要了

以上內容中關於 CNN 的 GD 推導,我並沒有細講。有興趣的同學自行 Google 即可。

(由於有同學感興趣,CNN 的 GD 推導已補充在「當我們在談論 Deep Learning:CNN 其常見架構(下)」)

Pooling

Pooling 的本質,其實是採樣。Pooling 對於輸入的 Feature Map,選擇某種方式對其進行壓縮。如下圖,表示的就是對 Feature Map 2 times 2鄰域內的值,選擇最大值輸出到下一層,這叫做 Max-Pooling。於是一個2N times 2N的 Feature Map 被壓縮到了N times N

除此之外,還有Mean-Pooling,Stochastic-Poolingn等。它們的具體實現如名稱所示,具體選擇哪一個則取決於具體的任務。

Pooling 的意義,主要有兩點:

第一個顯而易見,就是減少參數。通過對 Feature Map 降維,有效減少後續層需要的參數

另一個則是 Translation Invariance。它表示對於 Input,當其中像素在鄰域發生微小位移時,Pooling Layer 的輸出是不變的。這就增強了網路的魯棒性,有一定抗擾動的作用。

小結

從上面我們可以看出來,CNN 里結構大都對應著傳統圖像處理某種操作。區別在於,以前是我們利用專家知識設計好每個操作的細節,而現在是利用訓練樣本+優化演算法學習出網路的參數。在實際工程中,我們也必須根據實際物理含義對 CNN 結構進行取捨。

但是,隨著 Convolution 的堆疊,Feature Map 變得越來越抽象,人類已經很難去理解了。為了攻克這個黑箱,現在大家也都在嘗試各種不同的方式來對 CNN 中的細節進行理解,因為如果沒有足夠深的理解,或許很難發揮出 CNN 更多的能力。不過,這就是另外一個很大的課題了。

接下來的部分,會介紹 CNN 一路發展以來,一些有趣架構。

CNN 架構發展八卦

nn

CNN 的架構發展可以參考劉昕博士總結的圖

這裡簡單八卦一下 CNN 架構的變遷史。

LeNet-5 是最經典的 CNN 架構,上面介紹的 Convolutional Kernel 和 Pooling 它都有了。它在1998年由 LeCun 提出,用於對「Mnist手寫數字數據集」進行分類。不過效果並不比當時手工設計的特徵有明顯提升,因此並沒有太大反響。

十來年後,Alex Krizhevsky 在2012年提出 AlexNet,憑藉它在 ILSVRC2012 的 ImageNet 圖像分類項目中獲得冠軍,且錯誤率比上一年冠軍下降十多個百分點。舉圈震驚。

隨後幾年,CNN 卷席整個圖像處理領域,ILSVRC 每年被刷榜,也就出現了我們常見的這張錯誤率下降趨勢的圖。當然,也伴隨著如圖所示的 Layer 數的激增。

下面,我們對一些有趣的架構進行詳細介紹。

LeNet-5

LeNet5 是 LeCun 在1998年「Gradient-Based Learning Applied to Document.nRecognition」中提出的網路架構。用於對「Mnist手寫數字數據集」進行分類。其具體的結構如下圖

  • Input 是一個手寫圖像。

  • C1 層由6個 Feature Map 組成,其中每個神經元與 Input 的5 times 5的鄰域相連。這些連接對應的w就是上面所說的 Convolution Kernel。當然,與 DNN 一樣,這裡還有一個參數 Bias b。所以,此層有(5*5+1)*6=156個參數。而如果不使用共享權重,則會需要(5x5+1)x(28x28)x6 = 122304個參數。

  • S2 層即下採樣層,對應著現在的 Pooling 操作後的層。其依然是6個 Channel,每個神經元與上一層2 times 2的鄰域相連。作者在此層進行的操作是加權平均,再加上 bias,並將結果輸入到激活函數 Sigmoid 函數中。因此,此層共有2*6=12個參數。

  • C3 層由16個 Feature Map 組成,其中每個神經元與 S2 的5 times 5的鄰域相連。不過,當時作者對連接進行了一些設計,讓每個 Feature Map 僅與上一層部分 Channel 相連。只是這種 trick 現在也很少用到,這裡就不細講了。

  • S4 層也是下採樣層,與 S2 是意義一樣。由於有16個 Channel,因此共2*16=32個參數。

  • C5 層由120個 Feature Map 組成,其中每個神經元與 S4 每個 Channel 的5 times 5的鄰域相連。恰巧,這裡 C3 的每一個 Feature Map 都是1 times 1,顯得好像跟 S4 是全連接,不過這僅僅是恰巧罷了。

  • F6 由84個神經元組成,與 C5 全連接。並將結果輸入到激活函數,得到每個神經元的狀態。這裡激活函數使用的是雙曲正切函數(tanh)。此層共(120+1)*84=10164個參數。而之所以使用84個神經元,是因為有人曾將 ASCII 碼繪製於12 times 7的 bit-map 上,如下圖,作者希望此層的輸出有類似的效果。

  • Output 是10個神經元,分別代表十個數字。作者還使用歐式徑向基函數(Euclidean RadialnBasis Function)對數據進行了一些變換,有興趣的同學可以自行參考原文。

網路結構設計好之後,選擇 Loss Function,並利用 GD 學習網路參數,這些都是套路了。最後,LeNet-5 每一層的輸出可以用以下這張圖來輔助理解。

尾巴

戲謔地說,CNN 最值得學習的地方應該是起名字的能力。原本平常的操作,在 CNN 都換上了高逼格的馬甲,令人感覺專業滿滿。比如你可以跟人介紹你的室友是「彼格-耶勒」,大家可能會以為是個什麼海外華僑,直到你牽出你家大黃。

拋開玩笑話,CNN 也已不止局限在傳統圖像和語音處理領域,正快速往其他領域擴散,如 NLP。現在藉助 Tensorflow 或者 Keras,搭建 CNN 已經是比較簡單的事情了,大家都可以試一試。

本系列其他文章:

Supervised Learning:

當我們在談論 Deep Learning:DNN 與 Backpropagation

當我們在談論 Deep Learning:DNN 與它的參數們(壹)

當我們在談論 Deep Learning:DNN 與它的參數們(貳)

當我們在談論 Deep Learning:DNN 與它的參數們(叄)

當我們在談論 Deep Learning:CNN 其常見架構(上)

Unsupervised Learning:

Reinforcement Learning:

推薦閱讀:

TAG:卷积神经网络CNN | 深度学习DeepLearning | 人工智能 |