卷積神經網路:Convolutional Neural Networks(CNN)
卷積神經網路是一種多層神經網路,擅長處理影象特別是大影象的相關機器學習問題。
卷積網路通過一系列方法,成功將資料量龐大的影象識別問題不斷降維,最終使其能夠被訓練。CNN最早由Yann LeCun提出並應用在手寫字型識別上(MINST)。LeCun提出的網路稱為LeNet,其網路結構如下:
這是一個最典型的卷積網路,由卷積層、池化層、全連線層組成。其中卷積層與池化層配合,組成多個卷積組,逐層提取特徵,最終通過若干個全連線層完成分類。
卷積層完成的操作,可以認為是受區域性感受野概念的啟發,而池化層,主要是為了降低資料維度。
綜合起來說,CNN通過卷積來模擬特徵區分,並且通過卷積的權值共享及池化,來降低網路引數的數量級,最後通過傳統神經網路完成分類等任務。
卷積(Convolution)
卷積運算的定義如下圖所示:
如圖所示,我們有一個5x5的影象,我們用一個3x3的卷積核:
1 0 1
0 1 0
1 0 1
來對影象進行卷積操作(可以理解為有一個滑動視窗,把卷積核與對應的影象畫素做乘積然後求和),得到了3x3的卷積結果。
這個過程我們可以理解為我們使用一個過濾器(卷積核)來過濾影象的各個小區域,從而得到這些小區域的特徵值。
在實際訓練過程中,卷積核的值是在學習過程中學到的。
在具體應用中,往往有多個卷積核,可以認為,每個卷積核代表了一種影象模式,如果某個影象塊與此卷積核卷積出的值大,則認為此影象塊十分接近於此卷積核。如果我們設計了6個卷積核,可以理解:我們認為這個影象上有6種底層紋理模式,也就是我們用6中基礎模式就能描繪出一副影象。以下就是24種不同的卷積核的示例:
池化(Pooling)
池化聽起來很高深,其實簡單的說就是下采樣。池化的過程如下圖所示:
上圖中,我們可以看到,原始圖片是20x20的,我們對其進行下采樣,取樣視窗為10x10,最終將其下采樣成為一個2x2大小的特徵圖。
之所以這麼做的原因,是因為即使做完了卷積,影象仍然很大(因為卷積核比較小),所以為了降低資料維度,就進行下采樣。
之所以能這麼做,是因為即使減少了許多資料,特徵的統計屬性仍能夠描述影象,而且由於降低了資料維度,有效地避免了過擬合。
在實際應用中,池化根據下采樣的方法,分為最大值下采樣(Max-Pooling)與平均值下采樣(Mean-Pooling)。
LeNet介紹
下面再回到LeNet網路結構:
這回我們就比較好理解了,原始影象進來以後,先進入一個卷積層C1,由6個5x5的卷積核組成,卷積出28x28的影象,然後下采樣到14x14(S2)。
接下來,再進一個卷積層C3,由16個5x5的卷積核組成,之後再下采樣到5x5(S4)。
注意,這裡S2與C3的連線方式並不是全連線,而是部分連線,如下圖所示:
其中行代表S2層的某個節點,列代表C3層的某個節點。
我們可以看出,C3-0跟S2-0,1,2連線,C3-1跟S2-1,2,3連線,後面依次類推,仔細觀察可以發現,其實就是排列組合:
0 0 0 1 1 1
0 0 1 1 1 0
0 1 1 1 0 0
...
1 1 1 1 1 1
我們可以領悟作者的意圖,即用不同特徵的底層組合,可以得到進一步的高階特徵,例如:/ + \ = ^ (比較抽象O(∩_∩)O~),再比如好多個斜線段連成一個圓等等。
最後,通過全連線層C5、F6得到10個輸出,對應10個數字的概率。
最後說一點個人的想法哈,我認為第一個卷積層選6個卷積核是有原因的,大概也許可能是因為0~9其實能用以下6個邊緣來代表:
是不是有點道理呢,哈哈
然後C3層的數量選擇上面也說了,是從選3個開始的排列組合,所以也是可以理解的。
其實這些都是針對特定問題的trick,現在更加通用的網路的結構都會複雜得多,至於這些網路的引數如何選擇,那就需要我們好好學習了。
訓練過程
卷積神經網路的訓練過程與傳統神經網路類似,也是參照了反向傳播演算法。
第一階段,向前傳播階段:
a)從樣本集中取一個樣本(X,Yp),將X輸入網路;
b)計算相應的實際輸出Op。
在此階段,資訊從輸入層經過逐級的變換,傳送到輸出層。這個過程也是網路在完成訓練後正常執行時執行的過程。在此過程中,網路執行的是計算(實際上就是輸入與每層的權值矩陣相點乘,得到最後的輸出結果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
第二階段,向後傳播階段
a)算實際輸出Op與相應的理想輸出Yp的差;
b)按極小化誤差的方法反向傳播調整權矩陣。