CNN中減少網絡的參數的三個思想:
1) 局部連接(Local Connectivity)
2) 權值共享(Shared Weights)
3) 池化(Pooling)
局部連接
局部連接是相對於全連接來說的。全連接示意圖如下:
比如說,輸入圖像為1000*1000大小,即輸入層有1000*1000=10^6維,若隱含層與輸入層的數目一樣,也有10^6個,則輸入層到隱含層的全連接參數個數為10^6 * 10^6=10^12,數目非常之大,基本很難訓練。
一般認為人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。網絡部分連通的思想,也是受啟發於生物學里面的視覺系統結構。視覺皮層的神經元就是局部接受信息的(即這些神經元只響應某些特定區域的刺激)。如下圖所示:左圖為全連接,右圖為局部連接。
在上右圖中,假如每個神經元只和10*10個像素值相連,那么權值數據為10^6*100=10^8個參數(在有padding=same,stride=1,即輸出輸出尺寸相同,相鄰兩個卷積核距離1個像素的情況下計算得到),減少為原來的千分之一。而那10*10個像素值對應的10*10個參數,其實就相當於卷積操作。
注:感受野(receptive field),其大小等同於卷積核的大小(比如說5×5)。
權值共享
通過局部連接處理后,神經元之間的連接個數已經有所減少。可是實際上並沒有減少很多,參數數量還是很大。而權值共享就是來解決這個問題的,它能顯著降低參數的數量。該如何理解權值共享呢?首先從生物學意義上來看,相鄰神經元的活性相似,從而它們可以共享相同的連接權值。其次單從數據特征上來看,我們可以把每個卷積核當作一種特征提取方式,而這種方式與圖像等數據的位置無關。這就意味着,對於同一個卷積核,它在一個區域提取到的特征,也能適用於於其他區域。
在上面的局部連接中,每個神經元都對應100個參數,一共10^6個神經元,如果這10^6個神經元的100個參數都是相等的,那么參數數目就變為100了。由此可見,權值共享可以大大減少網絡的參數。
注:上面說明均是在一個卷積核的情況下。
池化
池化一般分為max pooling和average pooling。我們定義池化窗口的大小為sizeX,即下圖中紅色正方形的邊長,定義兩個相鄰池化窗口的水平位移/豎直位移為stride。一般池化由於每一池化窗口都是不重復的,所以sizeX=stride。最大池化為取窗口中最大的那個值,平均池化為取窗口中所有數的平均值。
如上圖所示,為最大池化,其中sizeX=stride=2。
經過池化層之后,模型參數會減少很多。
附:
摘自:https://zhuanlan.zhihu.com/p/25005808
CNN最成功的應用是在CV,那為什么NLP和Speech的很多問題也可以用CNN解出來?為什么AlphaGo里也用了CNN?這幾個不相關的問題的相似性在哪里?CNN通過什么手段抓住了這個共性?
以上幾個不相關問題的相關性在於,都存在局部與整體的關系,由低層次的特征經過組合,組成高層次的特征,並且得到不同特征之間的空間相關性。如下圖:低層次的直線/曲線等特征,組合成為不同的形狀,最后得到汽車的表示。
CNN抓住此共性的手段主要有四個:局部連接/權值共享/池化操作/多層次結構。
局部連接使網絡可以提取數據的局部特征;權值共享大大降低了網絡的訓練難度,一個Filter只提取一個特征,在整個圖片(或者語音/文本) 中進行卷積;池化操作與多層次結構一起,實現了數據的降維,將低層次的局部特征組合成為較高層次的特征,從而對整個圖片進行表示。如下圖:
上圖中,如果每一個點的處理使用相同的Filter,則為全卷積,如果使用不同的Filter,則為Local-Conv。
參考文獻:
https://yq.aliyun.com/articles/161164
http://www.cnblogs.com/zf-blog/p/6075286.html
一文讀懂卷積神經網絡CNN