Ref: 從LeNet-5看卷積神經網絡CNNs
關於這篇論文的一些博文的QAC:
1. 基本原理
MLP(Multilayer Perceptron,多層感知器)是一種前向神經網絡(如下圖所示),相鄰兩層網絡之間全連接。
sigmoid通常使用tanh函數和logistic函數。
1998年Yann LeCun在論文“Gradient-Based Learning Applied to Document Recognition”中提出了LeNet-5,並在字母識別中取得了很好的效果。LeNet-5的結構如下圖所示:

- input:輸入圖片,32*32像素;
- C1:5*5卷積核,生成6個feature maps,共需要(6*5*5 + 6)=156個參數;
- S2:2*2個像素相加,然后乘以一個參數,加上一個偏置,共計2*6=12個參數;
- C3:5*5卷積核,生成16個feature maps,每個feature map由S2中若干個feature maps卷積得到,如圖Table1所示;
- S4:和S2相同的操作,共計16*2 = 32個參數;
- C5:與S4全連接,共計(5*5*16*120+120)=48120個參數;
- F6:與C5全連接,共計(120*84+84) = 10164 個參數;
- output: 與F6全連接。

下面開始對各層進行具體分析。
卷積:
C1/C3/C5這三層都用了卷積操作,學過數字圖像處理的同學一定對這種圖像上的卷積很熟悉,本質上是用一塊權重模板在圖像上的各個區域做加權求和,如下圖所示:

圖中黃色的3*3 卷積核從圖像的左上角開始向右或向下移動,對移動過程中覆蓋的區域求加權和。最后得到(5-3+1)*(5-3+1)大小的卷積結果,稱為一個feature map。
C1: LeNet-5的C1層用6個 5*5卷積核對輸入的32*32圖像進行卷積,每個卷積核對應生成一個(32-5+1)*(32-5+1)的feature map,共計6個feature map。
C3: C3的過程稍為復雜,C3總共生成了16個feature map,每個feature map按照Table1選擇輸入。例如C3編號為0的feature map是由S2中編號為0、1、2的feature map 生成的。先由3個卷積核分別在S2的0、1、2 feature map上生成3個臨時feature map,然后把這三個臨時feature map相加得到C3的feature map 0。這樣構造C3 有兩個好處:一是相比於全連接,可以減少參數的數量;二是每個feature map的輸入都不相同,可以達到互補的效果。
C5: C5層用全連接的方式,每個feature map都是由S4中所有的feature map卷積結果求和得到的。由於S4的feature map大小是5*5,卷積核大小也是5*5,所以卷積后得到的是一個1*1的矩陣。
另外,C1/C3/C5每個feature map計算結果都會在計算結尾加上一個偏置。
池化pooling:
池化的作用主要有兩個:一是減少參數數量;二是在使模型具有較好的平移不變性。
和卷積很類似,不同之處在於卷積核覆蓋的區域是重疊的,而池化的各個區域是沒有重疊的。所以當S2/S4用2*2的池化模板后,feature map的寬和高都減小為原來的一半。
再借用一下UFLDL Tutorial關於池化的示意圖:

輸出層:
output層/F6層都是與前一層全連接,C5-F6-output整體結構可以看成一個多層感知器。
所以LeNet-5其實是由三種不同的結構組成的:卷積、池化、多層感知器。而使用這三種結構也就可以構成大部分卷積神經網絡了。
卷積:
目前幾乎所有公開發表的卷積模型都使用全連接結構,即某一層(第m層)的feature map是由上一層(第m-1層)的所有feature map卷積后求和得到的。但是在實際使用中需要注意模型的參數個數,參數個數的增加對計算量的影響很大。
池化:
目前常用的是平均池化或者最大池化,即把上一層feature map的各個池化區域內的單元值求平均值或最大值。
輸出層:
可以把最后一層的結果輸出到某個分類器(如Logistic Regression等)進行分類。
參考資料:
[1]Yann LeCun, Gradient-Based Learning Applied to Document Recognition, 1998
[2]Theano Deeplearning Tutorial
[3]Stanford UFLDL Tutorial: http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B
2. 邊邊角角問題
(1) 卷積核是學習得來,還是預定義好的?
整個網絡的訓練,主要就是為了學那個卷積核啊。
(2) 有哪些參數?
自定義的其實有卷積核的 kernel_size,也就是kernel_width和kernel_height,
總的來說,決定卷積層里面卷積核的參數數量的數字總共有4個: num_output, num_channel, kernel_height, kernel_width。
原理是這樣的,通常所說的2D卷積其實是3D的(卷積核的維度應該是kernel_height * kernel_height * input_channel),只不過第三個維度恰好等於輸入通道的個數,所以卷了以后在第三個維度上就沒了,變成了扁平的二維feature map,所以叫2D卷積。
另一種理解方式是,一個卷積核的形狀是 kernel_height * kernel_height,並且有input_channel層,把它和輸入圖像做卷積的過程是這樣的:
卷積層的參數共享
卷積核的參數就是神經網絡的輸入層。
Next: [CNN] Understanding Convolution
補充:第九章 - 卷積網絡
卷積運算通過三個重要的思想來幫助改進機器學習系統:
稀疏交互(sparse interactions)、 參數共享(parameter sharing)、 等變表示(equivariant representations)。
最大池化:引入了不變性。
無限強的先驗:方差越大,信息越大;在決定參數最終取值時起着更加積極的作用。
也就是限制比較多,例如權重共享這樣的例子,相鄰關系一定強等等。
卷積邊緣填充方式
零填充(有效卷積):m-k+1
必要零填充(相同卷積)
全填充:m+k-1