本文首發(fā)于:人工智能A7論壇
轉(zhuǎn)載請注明出處
1什么是卷積神經(jīng)網(wǎng)絡(luò)(CNN)
1.1 什么是卷積操作
CNN中的卷積和數(shù)字信號處理中的卷積其實不是一回事,但有點類似。這里說的只是CNN中的卷積操作。
對圖像(或者可以表示為同樣結(jié)構(gòu)的其他數(shù)據(jù),如文本、語音等)和濾波矩陣(一組固定的權(quán)重:因為每個神經(jīng)元的多個權(quán)重固定,所以又可以看做一個恒定的濾波器filter)做內(nèi)積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經(jīng)網(wǎng)絡(luò)的名字來源。

(gif動圖見附件)
備注:
http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution
一個很自然的想法,是filter的各個權(quán)重應該是多少?filter的size怎么???
1.2 卷積神經(jīng)網(wǎng)絡(luò)的概念
CNN的概念最早來自于對“感受野”的研究??茖W家對貓的視覺細胞研究發(fā)現(xiàn),每一個視覺神經(jīng)元只處理一小塊區(qū)域的視覺圖像。即感受野(receptive field)。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks)是一種在空間上共享參數(shù)的神經(jīng)網(wǎng)絡(luò)。通過共享參數(shù),減少了參數(shù)的個數(shù)。卷積的圖示

備注:上圖是以“圖片”舉例,所以depth是RGB三個維度。后面我們會說到CNN也可以處理文本。用卷積來處理文本分類的要點在于怎么把文本數(shù)據(jù)準備成CNN所需要的這種固定width和height的形式。
卷積神經(jīng)網(wǎng)絡(luò)簡單講就是把一個圖片的數(shù)據(jù)傳遞給CNN,原涂層是由RGB組成,然后CNN把它的厚度加厚,長寬變小,每做一層都這樣被拉長,最后形成一個分類器:

CNN是首個成功進行多層訓練的網(wǎng)絡(luò)結(jié)構(gòu)(Lecun的LeNet5),之所以CNN能夠成為“第一個吃螃蟹”的網(wǎng)絡(luò),除了因為LeCun作為深度學習三巨頭之一,“天生神力”,有一個不可忽視的因素或許是,CNN利用空間結(jié)構(gòu)大大減少了參數(shù)量,提高了訓練效率,避免了全連接網(wǎng)絡(luò)(FCN, full connection Network)的參數(shù)過多不好訓練、以及梯度彌散(gradient vanishment)的問題。
2CNN中的一些基本概念
卷積核
卷積核,英文名kernels,有時候也叫濾波器(filters )。卷積核是CNN的核心。從信號處理的角度而言,濾波器是對信號做頻率篩選,這里主要是空間-頻率的轉(zhuǎn)換,cnn的訓練就是找到最好的濾波器使得濾波后的信號更容易分類,還可以從模版匹配的角度看卷積,每個卷積核都可以看成一個特征模版,訓練就是為了找到最適合分類的特征模版。
問題:卷積核的大小和初始值怎么?。?/p>
feature map
每一個卷積核濾波得到的圖像就是一類特征的映射,也就是一個feature map

LeNet5
每個卷積核作用于input可以得到一個feature map。
我們知道圖片有RGB三個維度,這三個維度的處理是怎么樣的?
Stride
Stride就是“移動切片的步長”,影響取樣的數(shù)量。也就是表示做卷積時對input進行每次移動多少步。每一塊抽取一部分信息,長寬就縮減,但是厚度(depth)增加。抽取的各個小塊兒,再把它們合并起來,就變成一個壓縮后的立方體。
厚度為什么增加?一定增加嗎?
一般來說,后面的卷積層feature map數(shù)要比前面的feature map數(shù)多些
Padding
填充的方式有兩種,“有效填充”和“相同填充”。在相同填充中,超出邊界的部分使用補充0的辦法,使得輸入輸出的尺寸相同。而在有效填充中,則不使用補充0的方法,不能超出邊界。
以一維的填充為例:

在圖像的padding任務中,

如圖中紫色方框所示,左邊是有效填充,右邊是相同填充。在相同填充中,超出邊界的部分使用補充0的辦法,使得輸入輸出的圖像尺寸相同。而在有效填充中,則不使用補充0的方法,不能超出邊界,
思考問題:在一個CNN網(wǎng)絡(luò)中,input層Layer A做了卷積以后變成Layer B,再做卷積變成Layer C。為了達到圖中所示的A、B、C三個layer寬和高都一樣大的效果,需要怎么設(shè)置padding和stride 兩個參數(shù)。



[很顯然,需要stride=1, padding設(shè)置成
Pooling(池化層)
就是當跨步比較大的時候,它會漏掉一些重要的信息,為了解決這樣的問題,就加上一層叫pooling,事先把這些必要的信息存儲起來,然后再變成壓縮后的層。最常見的就是mean-pooling和max-pooling。
Pooling層可以理解為一種特殊的卷積層。
Pooling層的作用:
1). invariance(不變性),這種不變性包括translation(平移),rotation(旋轉(zhuǎn)),scale(尺度)[詳見附錄“POOLing的三個不變性的形象化解釋”
2. 保留主要的特征同時減少參數(shù)(降維,效果類似PCA)和計算量,防止過擬合,提高模型泛化能力
3).獲得定長輸出。(文本分類的時候輸入是不定長的,可以通過池化獲得定長輸出)
4).防止過擬合或有可能會帶來欠擬合。
patch
一個局部切片。
參考:
http://xrds.acm.org/blog/2016/06/convolutional-neural-networks-cnns-illustrated-explanation/

感受野的理解
輸出feature map某個節(jié)點的響應對應的輸入圖像的區(qū)域就是感受野
拿一個例子來算算

pool3的一個輸出對應pool3的輸入大小為2*2??如果padding=valid
pool3: 2*2 conv4: 4*4 conv3: 6*6 pool2:12*12 conv2:14*14 pool1:28*28 conv1:30*30
因此 pool3的感受野大小就是30*30
3 CNN處理圖像分類問題的網(wǎng)絡(luò)結(jié)構(gòu)
在 RGB 這個層,每一次把一塊核心抽出來,然后厚度加厚,長寬變小,形成分類器:


如果想要分成十類的話,那么就會有0到9這十個位置,這個數(shù)據(jù)屬于哪一類就在哪個位置上是1,而在其它位置上為零。
CNN的結(jié)構(gòu),分析一張圖片時,先放一個CNN的圖層,再把這個圖層進行一個pooling。這樣可以比較好的保持信息,之后再加第二層的CNN和pooling。
導入一個圖片之后,先是有它的RGB三個圖層,然后把像素塊縮小變厚。本來有三個厚度,然后把它變成八個厚度,它的長寬在不斷的減小,最后把它們連接在一起。
下圖是一個經(jīng)典的CNN做圖像分類的網(wǎng)絡(luò)結(jié)構(gòu)

