原文:https://www.zybuluo.com/hanbingtao/note/485480 寫得非常好,可以細讀
全連接網絡 VS 卷積網絡
全連接神經網絡之所以不太適合圖像識別任務,主要有以下幾個方面的問題:
- 參數數量太多 考慮一個輸入1000*1000像素的圖片(一百萬像素,現在已經不能算大圖了),輸入層有1000*1000=100萬節點。假設第一個隱藏層有100個節點(這個數量並不多),那么僅這一層就有(1000*1000+1)*100=1億參數,這實在是太多了!我們看到圖像只擴大一點,參數數量就會多很多,因此它的擴展性很差。
- 沒有利用像素之間的位置信息 對於圖像識別任務來說,每個像素和其周圍像素的聯系是比較緊密的,和離得很遠的像素的聯系可能就很小了。如果一個神經元和上一層所有神經元相連,那么就相當於對於一個像素來說,把圖像的所有像素都等同看待,這不符合前面的假設。當我們完成每個連接權重的學習之后,最終可能會發現,有大量的權重,它們的值都是很小的(也就是這些連接其實無關緊要)。努力學習大量並不重要的權重,這樣的學習必將是非常低效的。
- 網絡層數限制 我們知道網絡層數越多其表達能力越強,但是通過梯度下降方法訓練深度全連接神經網絡很困難,因為全連接神經網絡的梯度很難傳遞超過3層。因此,我們不可能得到一個很深的全連接神經網絡,也就限制了它的能力。
那么,卷積神經網絡又是怎樣解決這個問題的呢?主要有三個思路:
- 局部連接 這個是最容易想到的,每個神經元不再和上一層的所有神經元相連,而只和一小部分神經元相連。這樣就減少了很多參數。
- 權值共享 一組連接可以共享同一個權重,而不是每個連接有一個不同的權重,這樣又減少了很多參數。
- 下采樣 可以使用Pooling來減少每層的樣本數,進一步減少參數數量,同時還可以提升模型的魯棒性。
對於圖像識別任務來說,卷積神經網絡通過盡可能保留重要的參數,去掉大量不重要的參數,來達到更好的學習效果。
接下來,我們將詳述卷積神經網絡到底是何方神聖。
卷積神經網絡是啥
首先,我們先獲取一個感性認識,下圖是一個卷積神經網絡的示意圖:

網絡架構
如圖1所示,一個卷積神經網絡由若干卷積層、Pooling層、全連接層組成。你可以構建各種不同的卷積神經網絡,它的常用架構模式為:
INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
也就是N個卷積層疊加,然后(可選)疊加一個Pooling層,重復這個結構M次,最后疊加K個全連接層。
對於圖1展示的卷積神經網絡:
INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC
卷積神經網絡輸出值的計算
卷積層輸出值的計算
我們用一個簡單的例子來講述如何計算卷積,然后,我們抽象出卷積層的一些重要概念和計算方法。
假設有一個5*5的圖像,使用一個3*3的filter進行卷積,想得到一個3*3的Feature Map,如下所示:

為了清楚的描述卷積計算過程,我們首先對圖像的每個像素進行編號,用表示圖像的第行第列元素;對filter的每個權重進行編號,用表示第行第列權重,用表示filter的偏置項;對Feature Map的每個元素進行編號,用表示Feature Map的第行第列元素;用表示激活函數(這個例子選擇relu函數作為激活函數)。
例如,對於Feature Map左上角元素來說,其卷積計算方法為:
計算結果如下圖所示:

下面的動畫顯示了整個Feature Map的計算過程:

上面的計算過程中,步幅(stride)為1。步幅可以設為大於1的數。例如,當步幅為2時,Feature Map計算如下:




Pooling層輸出值的計算
Pooling層主要的作用是下采樣,通過去掉Feature Map中不重要的樣本,進一步減少參數數量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling實際上就是在n*n的樣本中取最大值,作為采樣后的樣本值。下圖是2*2 max pooling:

除了Max Pooing之外,常用的還有Mean Pooling——取各樣本的平均值。
全連接層
全連接層輸出值的計算和上一篇文章零基礎入門深度學習(3) - 神經網絡和反向傳播算法講過的全連接神經網絡是一樣的,這里就不再贅述了。
卷積神經網絡的訓練
和全連接神經網絡相比,卷積神經網絡的訓練要復雜一些。但訓練的原理是一樣的:利用鏈式求導計算損失函數對每個權重的偏導數(梯度),然后根據梯度下降公式更新權重。訓練算法依然是反向傳播算法。
