機器學習入坑指南(十一):如何理解卷積神經網絡(CNN)

上一篇文章中,我們準備好了深度學習所需的數據。爲了實現分辨貓狗的目的,我們決定使用卷積神經網絡(Convolutional Neural Networks,CNN),目前它在圖像識別方面十分受歡迎,那麼到底什麼是卷積神經網絡呢?我們應該怎麼去理解它?

1 CNN 基本結構

一個基本的 CNN 結構爲:輸入層 -> 卷積層 -> 池化層 -> 卷積層 -> 池化層 -> 全連接層 -> 輸出層

2 卷積

什麼是卷積

話不多說,先上張圖。
在這裏插入圖片描述
左圖中 333*3 的黃色區域即 “卷積核”(Kernel),或者稱之爲卷積模板。其中右下角的數字可以理解爲權值,卷積核每移動一步,就會計算權值和當前重疊區域的對應像素值的乘積之和,來作爲下一層中的新值。由於卷積被認爲是提取局部特徵的過程,所以卷積後的輸出又叫特徵圖。

“卷積”,是對英文的直譯,對於上面這種操作,我覺得叫 “加權疊加” 更好理解一點,不過叫卷有叫卷的道理,不必糾結這些。

想要深入理解的話需要從數學和物理(信號學)兩個方面着手,對於以深度學習應用爲目的的我們,目前瞭解到這個程度就可以了。

爲什麼要卷積?

在講這個問題之前,我們需要認識到機器學習更偏向於“工程”,有時候我們並不需要太嚴密的論證,就可以使用一些“感覺上”有效的工具。卷積和池化均屬於這種工具,雖然目前還沒有徹底搞清楚爲什麼使用這兩種工具會得到不錯的結果,但事實是確實這樣做結果不錯。

提取圖像特徵

上面已經說過了,卷積可以提取圖像的局部特徵。通常人眼識別圖像也不是以孤立的像素爲單位的,所以卷積被認爲是合理的。然鵝,通過卷積提取出的特徵好像跟我們理解的特徵不太一樣,或者人根本不認爲那是特徵,但事實證明,讓機器自己去做往往比我們使用特徵工程的結果要好。這正是卷積神經網絡能夠逆襲 SVM 的重要原因之一。

降低計算量

相較全連接層,卷積層只需要跟與卷積核相同大小的輸入層神經元連接。

比如我們有一個 100100100*100 的圖像,中間一個隱含層有 100100 個神經元,如果爲全連接層,則需要計算 (100100+1)100(100*100+1)*100 個權值,共 1000100 個(+1 爲 bias),而如果使用大小爲 555*5 ,步長爲 1 的卷積層,則需要計算的權值個數爲:

55[(1005+1)(1005+1)+1]=2304255*5*[(100-5+1)*(100-5+1)+1]=230425

計算量已經大大減少了。而如果我們只使用一種卷積核,那麼實際上卷積層每個神經元連接的 555*5 的區域的權值都是相同的,也就是我們最終只需要得到 55+1=265*5+1=26 個權值即可。

P.S. 由於圖像的特徵有很多種類,使用一種卷積核只能提取一部分的特徵,所以我們通常使用多個卷積核,也就是會得到多種特徵圖。注意這些卷積核正是神經網絡學習得到的成果,我們只是簡單地設定了卷積核的個數。

3 池化

什麼是池化

看圖。
在這裏插入圖片描述
池化是一種下采樣,也就是在原圖上開窗,並把整個窗口作爲一個新的像素,可以採用原圖窗口中的最大值作爲新像素的值(稱爲最大池化策略),或是其它的採樣方法(如均值池化策略)。

爲什麼要池化?

降低計算量與防止過擬合

經過池化層後下一層需要計算的參數明顯變少了。但其實多加了這麼一層,總的計算量不一定就減小了,這只是相較全連接層而言。更重要的作用是卷積層輸出的特徵經過池化之後維度降低了,可以防止過擬合(即防止少量像素就會影響識別結果)。

使模型對小的變化不敏感

由於池化可以看作是提取區域的特徵,這個區域發生一些微小的平移和變形並不會太影響池化的結果,所以有人認爲交叉使用池化層可以降低模型對這些微小變化的敏感性。當然這只是一種“看上去合理”的說法。

4 全連接層

在經過重複的卷積、池化過程後,我們又加入了一個全連接層。至於爲什麼要加,仍然是解釋不清楚的,大概是和一般的神經網絡類比,像是一種經驗上的遷移。當然也有很多正兒八經的解釋,可以在知乎上搜一搜。

關於卷積神經網絡,要說的就是這麼多,深度學習是一個不斷髮展的知識體系,我們要做的就是在合理推測與大膽嘗試中不斷向前。

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