卷積神經網絡(Convolutional Neural Networl, CNN)的兩大核心思想:
- 局部連接(Local Connectivity)
- 參數共享(Parameter Sharing)
兩者共同的一個關鍵作用就是減少模型的參數量,使運算更加簡潔、高效,能夠運行在超大規模數據集上。
局部連接與卷積
圖像的局部相關性
對於一張輸入圖片,大小為$W \times H$,如果使用全連接網絡,生成一張$X \times Y$的特征圖,需要$W \times H \times X \times Y$個參數,如果原圖長寬分別是$10^2$級別的,而且XY大小和WH差不多的話,那么這樣一層網絡需要的參數個數是$10^8\~10^{12}$級別。
下圖展示了全連接網絡中一個神經元的參數量。不進行局部連接,每個神經元和每一個輸入像素連接,參數量動輒千萬級別,網絡很難訓練:
這么多參數肯定是不行的,我們就想辦法減少參數的個數。一般而言,圖像信息都是局部相關的,如果輸入層的每一個像素只和輸入層圖片的一個局部相連,那么需要的參數個數就可以大大減少。假設輸出層每個像素只與輸入圖片上$F \times F$的一個方塊區域有連接,也就是說輸入層的這個像素值,只是通過原圖的這個$F \times F$的小方形區域中的像素值計算而來,那么對於輸出層的每個像素,需要的參數個數就從原來的$W \times H$減少到了$F \times F$。如果對於原圖片的每一個$F \times F$的方塊都需要計算這樣一個輸出值,那么需要的參數只是$X \times Y \times F \times F$,如果原圖長寬是$10^2$級別,且$F$在$10$以內的話,那么需要的參數個數只有$10^5\~10^6$級別,相比於原來的$10^8\~10^{12}$小了很多很多。
由此,CNN中的局部連接通過卷積操作來實現,避免了全連接中參數過多而造成無法計算的情況。那么,卷積具體是如何運算的呢?
什么是卷積?
卷積運算的本質是卷積核(也可稱為濾波器,filter)和輸入數據(圖像)的局部區域間的點積運算,可以用相應的矩陣乘法來實現。
下圖很好地演示了CNN中一個卷積核在單張圖像數據上的卷積操作,可以簡要地概括為:一個$3 \times 3$大小的卷積核在一張$6 \times 6$大小的輸入圖像上從左到右、從上到下依次掃描,進行矩陣的點積運算,得到相應位置的運算結果並輸出(圖中的$x$為輸入像素值,$a$為卷積核參數,$F$為輸出的運算結果)。
以上是輸入為單通道(即二維矩陣)時的情況,當輸入是多通道(即三維張量)時,卷積核也相應地“升級”為三維。下圖的輸入為三通道R(red)G(green)B(blue)圖像,分別用不同的三維卷積核(Filter w0,w1)來進行卷積操作:
不同的卷積核(filter)
為什么要設置不同的filter呢?因為不同的filter會得到不同的輸出數據,對應圖像的不同特征信息,比如顏色深淺、輪廓等等。如下圖,中間是圖像輸入,四角分別對應四個filter(帶着一組固定權重的神經元)的輸出:
下圖的卷積層有兩個filter,輸出兩個特征圖:
其中輸入圖像為$32*32*3$,$32$表示圖像尺寸,$3$表示它的深度(即RGB三個channel)。卷積層的兩個filter均為$5*5*3$(filter的深度必須和輸入圖像的深度相同),輸出的兩個特征圖均為$28*28*1$。
CNN中的參數共享
卷積核的參數實際上也可以叫做權重,它描述了局部連接中該位置的輸入對於相應輸出的影響力(重要性)。
圖像底層特征的位置無關性
通過卷積操作,我們實現了輸入圖像的局部連接,從而大大減少了網絡模型中的參數量。但這還不夠,利用圖像的另一特性,參數量可以進一步降低。
卷積中不做參數共享,則每一個輸出對應一組參數值,參數量仍然龐大:
我們知道,圖像的底層特征是跟具體位置無關的,比如邊緣。無論是在圖像中間的邊緣特征,還是圖像四角的邊緣特征,都可以用類似於微分的特征提取器提取。那么,對於主要用於提取底層特征的前幾層網絡,把上述局部全連接層中每一個$F \times F$方形區域對應的參數(權值)共享,就可以進一步減少網絡中的參數個數了。也就是說,輸出層的每一個像素,是由輸入層對應位置的$F \times F$的局部圖片,與相同的一組$F \times F$的參數(權值)做內積(點積),再經過非線性單元計算而來的。這樣的話,無論圖片原大小如何,只用$F \times F$個參數就夠了,也就是幾個幾十個的樣子。當然,一組$F \times F$的參數只能得到一張輸出特征圖,一般會有多組參數,分別經過卷積后可以有好幾層特征圖。
需要注意的是,高層特征一般是與位置有關的(全局特征),比如 一張人臉圖片,眼睛和嘴的位置不同,那么處理到高層,不同位置就需要不同的神經網絡權重(參數),這時候卷積層就不能勝任了,就需要用局部全連接層和全連接層。
示例(一維向量)
共享,即使用同一組參數(權重)來做卷積,如上圖。
輸入層:$x = [x_1, x_2, x_3, x_4, x_5. x_6, x_7]$
隱藏層:$h = [h_1, h_2, h_3]$
權重向量:$w = [w_1, w_2, w_3] = [1, 0, -1]$
權重值$w$被$h_1, h_2, h_3$共享:$$\begin{align} h_1 &= w \cdot x[1 : 3] \\ h_2 &= w \cdot x[3 : 5] \\ h_3 &= w \cdot x[5 : 7]\end{align}$$
關於卷積神經網絡的發展史等更全面介紹推薦這篇:CNN(卷積神經網絡)入門,簡潔清晰。
(整理自網絡)
參考資料
https://blog.csdn.net/qq_40962368/article/details/82864606
https://www.zhihu.com/question/47158818