卷積神經網路(CNN)的相關概念
傳統神經網路存在的問題
說卷積神經網路前,我們要先說一下傳統神經網路存在的一些問題,上圖是一個典型的傳統神經網路的示例圖。設想一個場景,假設我們要訓練的的樣本圖片是100x100(畫素)的,那麼整張圖片總共就是有10000個畫素,那麼在定義一個 傳統神經網路的時候,輸入層(input layer)就需要有1w個神經元,那麼如果我們的中間的隱藏層(hidden layer)也需要有1w個神經元,那麼總共需要的引數(權值)就高達1億個(1w*1w),試想一下,這還只是一張100x100的圖片就需要這麼多的引數,如果圖片更大之後呢,可想而知整個神經網路的計算量有多恐怖。當然,一旦權重多了之後,則必須要有足夠量的樣本進行訓練,否則就會出現
- 權值太多,計算量太大
- 權值太多,如果沒有大量樣本支撐則會出現過擬合現象
卷積神經網路
卷積
什麼是卷積?
在瞭解卷積神經網路之前我們需要知道什麼是卷積。對影象(不同的資料視窗資料)和濾波矩陣(一組固定的權重:因為每個神經元的多個權重固定,所以又可以看做一個恆定的濾波器filter)做內積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經網路的名字來源。非嚴格意義上來講,下圖中紅框框起來的部分便可以理解為一個濾波器(filter),即帶著一組固定權重的神經元。多個濾波器疊加便成了卷積層。
舉個具體的例子。比如下圖中,圖中左邊部分是原始輸入資料,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維資料。
分解下上圖
對應位置上是數字先相乘後相加 =
中間濾波器filter與資料視窗做內積,其具體計算過程則是:4x0 + 0x0 + 0x0 + 0x0 + 0x1 + 0x1 + 0x0 + 0x1 + -4x2 = -8
影象上的卷積
在下圖對應的計算過程中,輸入是一定區域大小(width*height)的資料,和濾波器filter(帶著一組固定權重的神經元)做內積後等到新的二維資料。
如下圖所示:
具體來說,左邊是影象輸入,中間部分就是濾波器filter(帶著一組固定權重的神經元),不同的濾波器filter會得到不同的輸出資料,比如顏色深淺、輪廓。相當於如果想提取影象的不同特徵,則用不同的濾波器filter,提取想要的關於影象的特定資訊:顏色深淺或輪廓。用一句話解釋不同濾波器之間的差異就是:一千個讀者就有一千個哈姆雷特
什麼是卷積神經網路?
**卷積神經網路(Convolutional Neural Network, CNN)**是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。卷積神經網路與普通神經網路非常相似,它們都由具有可學習的權重和偏置常量(biases)的神經元組成。每個神經元都接收一些輸入,並做一些點積計算,輸出是每個分類的分數,普通神經網路裡的一些計算技巧到這裡依舊適用。但是卷積神經網路預設輸入是影象,可以讓我們把特定的性質編碼入網路結構,使是我們的前饋函式更加有效率,並減少了大量引數。
**具有三維體積的神經元(3D volumes of neurons) **
卷積神經網路利用輸入是圖片的特點,把神經元設計成三個維度 : width, height, depth(注意這個depth不是神經網路的深度,而是用來描述神經元的) 。比如輸入的圖片大小是 32 × 32 × 3 (rgb),那麼輸入神經元就也具有 32×32×3 的維度。下面是圖解:
一個卷積神經網路各層應用例項
上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什麼車也未知,現在需要模型判斷這張圖片裡具體是一個什麼東西,總之輸出一個結果:如果是車 那是什麼車。
我們按照從左到右的方向來理一下:
左邊:
- 最左邊是資料輸入層,對資料做一些處理,比如去均值(把輸入資料各個維度都中心化為0,避免資料過多偏差,影響訓練效果)、歸一化(把所有的資料都歸一到同樣的範圍)、PCA/白化等等。CNN只對訓練集做“去均值”這一步。
中間:
- CONV:卷積計算層,線性乘積求和。
- RELU:激勵層,ReLU是啟用函式的一種。
- POOL:池化層,簡言之,即取區域平均或最大。
右邊:
- FC:全連線層
卷積神經網路(CNN)中的區域性感知和權重共享
CNN中的區域性感知
在CNN中,濾波器filter(帶著一組固定權重的神經元)對區域性輸入資料進行卷積計算。每計算完一個數據視窗內的區域性資料後,資料視窗不斷平移滑動,直到計算完所有資料。這個過程中,有這麼幾個引數:
- 深度depth:神經元個數,決定輸出的depth厚度。同時代表濾波器個數。
- 步長stride:決定滑動多少步可以到邊緣。
- 填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除。
上圖就是一個典型的區域性感知的示例圖。其中黃色部分的矩陣為濾波器,深度為1,步長為1,填充值為0。很明顯我們可以看出,每次濾波器都是針對某一區域性的資料視窗進行卷積,這就是所謂的CNN中的區域性感知機制。
那為什麼要區域性感知呢?
打個比方,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的區域性。如果一眼就看到全世界,你會累死,而且一下子接受全世界所有資訊,你大腦接收不過來。當然,即便是看區域性,針對區域性裡的資訊人類雙眼也是有偏重、偏好的。比如看美女,對臉、胸、腿是重點關注,所以這3個輸入的權重相對較大。
CNN中的權重共享
那麼權重共享又是什麼呢?還是拿上圖舉例,濾波器在滑動的過程中,輸入在變化,但中間濾波器(filter)的權重(即每個神經元連線資料視窗的權重)是固定不變的,這個權重不變即所謂的CNN中的權重(引數)共享機制。
再打個比方,某人環遊全世界,所看到的資訊在變,但採集資訊的雙眼不變。btw,不同人的雙眼看同一個區域性資訊所感受到的不同,即一千個讀者有一千個哈姆雷特,所以不同的濾波器就像不同的雙眼,不同的人有著不同的反饋結果。
用一張動圖詮釋區域性感知和權重共享
我在蒐集資料的過程中發現了這張圖,第一感覺非常的酷,如果理解了區域性感知和權重共享那這張圖就不難看懂了。
相信你也會有一個疑問,上圖中的輸出結果1具體是怎麼計算得到的呢?接下來我們來分解下上述動圖,詳細解釋下計算過程。
首先是第一張:
其實,計算過程類似wx + b,w對應濾波器Filter w0,x對應不同的資料視窗,b對應Bias b0,相當於濾波器Filter w0與一個個資料視窗相乘再求和後,最後加上Bias b0得到輸出結果1,如下過程所示:
1x0 + 1x0 + -1x0 + -1x0 + 0x0 + 1x1+-1x0 + -1x0 + 0x1
-1x0 + 0x0 + -1x0 + 0x0 + 0x1 + -1x1 + 1x0 + -1x0 + 0x2
0x0 + 1x0 + 0x0 + 1x0 + 0x2 + 1x0 + 0x0 + -1x0 + 1x0
1(這裡的1就是Bias b0)
=
1
然後濾波器Filter w0固定不變,資料視窗向右移動2步,繼續做內積計算,得到0的輸出結果
最後,換做另外一個不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的資料視窗做卷積,可得到另外一個不同的輸出。
池化
池化,簡言之,即取區域平均或最大,其目的是為了減少特徵圖。池化操作對每個深度切片獨立,規模一般為 2*2,相對於卷積層進行卷積運算,池化層進行的運算一般有以下幾種:
- 最大池化(Max Pooling)。取4個點的最大值。這是最常用的池化方法。
- 均值池化(Mean Pooling)。取4個點的均值。
- 高斯池化。借鑑高斯模糊的方法。不常用。
- 可訓練池化。訓練函式 ff ,接受4個點為輸入,出入1個點。不常用。
最常見的池化層是規模為2*2, 步幅為2,對輸入的每個深度切片進行下采樣。每個MAX操作對四個數進行,如下圖所示:
上圖所展示的是取區域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,所以得到上圖右邊部分的結果:6 8 3 4。均值池化類似。-
池化操作將儲存深度大小不變。
-
如果池化層的輸入單元大小不是二的整數倍,一般採取邊緣補零(zero-padding)的方式補成2的倍數,然後再池化。
全連線層(Fully-connected layer)
全連線層和卷積層可以相互轉換:
- 對於任意一個卷積層,要把它變成全連線層只需要把權重變成一個巨大的矩陣,其中大部分都是0 除了一些特定區塊(因為區域性感知),而且好多區塊的權值還相同(由於權重共享)。
- 相反地,對於任何一個全連線層也可以變為卷積層。比如,一個 的全連線層,輸入層大小為 ,它可以等效為一個的卷積層。換言之,我們把 filter size 正好設定為整個輸入層大小。