卷积神经网络(CNN)介绍
簡單介紹和總結卷積神經網絡(Convolutional Neural Networks)的基本組成網絡層和常用的網絡結構。
參考文章/書籍:
簡介
CNN可以應用在場景分類,圖像分類,現在還可以應用到自然語言處理(NLP)方面的很多問題,比如句子分類等。
LeNet是最早的CNN結構之一,它是由大神Yann LeCun所創造的,主要是用在字符分類問題。
下面是一個簡單的CNN結構,圖來自參考文章1。這個網絡結構是用于一個四類分類的問題,分別是狗、貓、船和鳥,圖中的輸入圖片是屬于船一類。
該結構展示了四種運算,也可以說是由四種不同的層,分別是卷積層,非線性層(也就是使用了ReLU函數),Pooling層,全連接層,下面將一一介紹這幾種網絡層。
卷積層
卷積簡介
CNN的名字由來就是因為其使用了卷積運算的緣故。卷積的目的主要是為了提取圖片的特征。卷積運算可以保持像素之間的空間關系。
每張圖片可以當做是一個包含每個像素值的矩陣,像素值的范圍是0~255,0表示黑色,255是白色。下面是一個5×55 \times 55×5大小的矩陣例子,它的值是0或者1。
接下來是另一個3×33\times 33×3矩陣:
上述兩個矩陣通過卷積,可以得到如下圖右側粉色的矩陣結果。
黃色的矩陣在綠色的矩陣上從左到右,從上到下,每次滑動的步進值是1個像素,所以得到一個3×33\times 33×3的矩陣。
在CNN中,黃色的矩陣被叫做濾波器(filter)或者核(kernel)或者是特征提取器,而通過卷積得到的矩陣則是稱為**“特征圖(Feature Map)”或者“Activation Map”**。
另外,使用不同的濾波器矩陣是可以得到不同的 Feature Map ,例子如下圖所示:
上圖通過濾波器矩陣,實現了不同的操作,比如邊緣檢測,銳化以及模糊操作等。
在實際應用中,CNN是可以在其訓練過程中學習到這些濾波器的值,不過我們需要首先指定好濾波器的大小,數量以及網絡的結構。使用越多的濾波器,可以提取到更多的圖像特征,網絡也就能夠有更好的性能。
Feature Map的尺寸是由以下三個參數來決定的:
- 深度(Depth): 深度等于濾波器的數量。
- 步進(Stride): 步進值是在使用濾波器在輸入矩陣上滑動的時候,每次滑動的距離。步進值越大,得到的Feature Map的尺寸越小。
- Zero-padding: 有時候可以在輸入矩陣的邊界填補0,這樣就可以將濾波器應用到邊緣的像素點上,一個好的Zero-padding是能讓我們可以控制好特征圖的尺寸的。使用該方法的卷積稱為wide convolution,沒有使用的則是narrow convolution。
卷積公式和參數量
上一小節簡單介紹了卷積的操作和其實現的效果,接下來將介紹卷積運算的公式,以及CNN中卷積層的參數數量。
卷積是大自然中最常見的運算,一切信號觀測、采集、傳輸和處理都可以用卷積過程實現,其用公式表達如下:
KaTeX parse error: No such environment: align at position 8: \begin{?a?l?i?g?n?}? Y(m,n) & =X(m,…
上述公式中H(m,n)H(m,n)H(m,n)表示卷積核。
在CNN中的卷積層的計算步驟與上述公式定義的二維卷積有點差異,首先是維度升至三維、四維卷積,跟二維卷積相比多了一個**“通道”(channel)**,每個通道還是按照二維卷積方式計算,而多個通道與多個卷積核分別進行二維卷積,得到多通道輸出,需要“合并”為一個通道;其次是卷積核在卷積計算時沒有“翻轉”,而是與輸入圖片做滑動窗口“相關”計算。用公式重新表達如下:
Yl(m,n)=Xk(m,n)?Hkl(m,n)=∑k=0K?1∑i=0I?1∑j=0J?1Xk(m+i,n+j)Hkl(i,j)Y^l(m,n) =X^k(m,n)*H^{kl}(m,n) = \sum_{k=0}^{K-1}\sum_{i=0}^{I-1}\sum_{j=0}^{J-1}X^k(m+i,n+j)H^{kl}(i,j) Yl(m,n)=Xk(m,n)?Hkl(m,n)=k=0∑K?1?i=0∑I?1?j=0∑J?1?Xk(m+i,n+j)Hkl(i,j)
這里假定卷積層有LLL個輸出通道和KKK個輸入通道,于是需要有KLKLKL個卷積核實現通道數目的轉換。其中XkX^kXk表示第kkk個輸入通道的二維特征圖,YlY^lYl表示第lll個輸出通道的二維特征圖,HklH^{kl}Hkl表示第kkk行、第lll列二維卷積核。假定卷積核大小是I?JI*JI?J,每個輸出通道的特征圖大小是M?NM*NM?N,則該層每個樣本做一次前向傳播時卷積層的計算量是Calculations(MAC)=I?J?M?N?K?LCalculations(MAC)=I*J*M*N*K*LCalculations(MAC)=I?J?M?N?K?L。
卷積層的學習參數,也就是卷積核數目乘以卷積核的尺寸–Params=I?J?K?LParams = I*J*K*LParams=I?J?K?L。
這里定義計算量-參數量之比是CPR=Calculations/Params=M?NCalculations/Params=M*NCalculations/Params=M?N。
因此可以得出結論:卷積層的輸出特征圖尺寸越大,CPR越大,參數重復利用率越高。若輸入一批大小為B的樣本,則CPR值可提高B倍。
優點
卷積神經網絡通過**『參數減少』與『權值共享』**大大減少了連接的個數,也即需要訓練的參數的個數。
假設我們的圖像是1000*1000的,則有106個隱層神經元,那么它們全連接的話,也就是每個隱層神經元都連接圖像的每個像素點,就有1012個連接,也即1012個權值參數需要訓練,這顯然是不值得的。但是對于一個只識別特定feature的卷積核,需要大到覆蓋整個圖像的所有像素點嗎?通常是不需要的,**一個特定feature,尤其是第一層需要提取的feature,通常都相當基礎,只占圖像很小的一部分。所以我們設置一個較小的局部感受區域,比如`10*10`,也即每個神經元只需要和這`10*10`的局部圖像相連接,所以106個神經元也就有10^8個連接。這就叫參數減少。**
那什么叫權值共享呢?在上面的局部連接中,106個神經元,每個神經元都對應100個參數,所以是108個參數,那如果每個神經元所對應的參數都是相同的,那需要訓練的參數就只有100個了。
這后面隱含的道理在于,這100個參數就是一個卷積核,而卷積核是提取feature的方式,與其在圖像上的位置無關,圖像一個局部的統計特征與其他局部的統計特征是一樣的,我們用在這個局部抽取feature的卷積核也可以用在圖像上的其它任何地方。
而且這100個參數只是一種卷積核,只能提取一種feature,我們完全可以采用100個卷積核,提取100種feature,而所需要訓練的參數也不過104,最開始我們訓練1012個參數,還只能提取一種特征。選取100個卷積核,我們就能得到100張FM,每張FM可以看做是一張圖像的不同通道。
CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN特征檢測層通過訓練數據進行學習,在使用CNN時,避免了顯式的特征抽取,而隱式地從訓練數據中進行學習;再者,由于同一FM上的神經元權值相同,所以網絡可以并行學習,這也是卷積網絡相對于神經元彼此相連網絡的一大優勢。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有著獨特的優越性,其布局更接近于實際的生物神經網絡,權值共享降低了網絡的復雜性,避免了特征提取和分類過程中數據重建的復雜度。
非線性層(ReLU)
非線性修正函數**ReLU(Rectified Linear Unit)**如下圖所示:
這是一個對每個像素點實現點乘運算,并用0來替換負值像素點。其目的是在CNN中加入非線性,因為使用CNN來解決的現實世界的問題都是非線性的,而卷積運算是線性運算,所以必須使用一個如ReLU的非線性函數來加入非線性的性質。
其他非線性函數還包括tanh和Sigmoid,但是ReLU函數已經被證明在大部分情況下性能最好。
Pooling層
**空間合并(Spatial Pooling)**也可以叫做子采樣或者下采樣,可以在保持最重要的信息的同時降低特征圖的維度。它有不同的類型,如最大化,平均,求和等等。
對于Max Pooling操作,首先定義一個空間上的鄰居,比如一個2×22\times 22×2的窗口,對該窗口內的經過ReLU的特征圖提取最大的元素。除了提取最大的元素,還可以使用窗口內元素的平均值或者是求和的值。不過,Max Pooling的性能是最好的。例子可以如下圖所示:
上圖中使用的步進值是2。
根據相關理論,特征提取的誤差主要來自兩個方面:
一般來說,mean-pooling能減小第一種誤差,更多的保留圖像的背景信息,max-pooling能減小第二種誤差,更多的保留紋理信息。
使用Pooling的原因有如下幾點:
- 不變性,更關注是否存在某些特征而不是特征具體的位置。可以看作加了一個很強的先驗,讓學到的特征要能容忍一些的變化。
- 減小下一層輸入大小,減小計算量和參數個數。
- 獲得定長輸出。(文本分類的時候輸入是不定長的,可以通過池化獲得定長輸出)
- 防止過擬合或有可能會帶來欠擬合
全連接層
全連接層就是一個傳統的多層感知器,它在輸出層使用一個softmax激活函數。其主要作用就是將前面卷積層提取到的特征結合在一起然后進行分類。Softmax函數可以將輸入是一個任意實數分數的向量變成一個值的范圍是0~1的向量,但所有值的總和是1。
在CNN出現之前,最早的深度學習網絡計算類型都是全連接形式的。
全連接層的主要計算類型是**矩陣-向量乘(GEMV)。**假設輸入節點組成的向量是xxx,維度是DDD,輸出節點組成的向量是yyy,維度是VVV,則全連接層計算可以表示為y=Wxy=Wxy=Wx。
其中WWW是V?DV*DV?D的權值矩陣。
全連接層的參數量為Params=V?DParams=V*DParams=V?D,其單個樣本前向傳播的計算量也是Calculations(MAC)=V?DCalculations(MAC)=V*DCalculations(MAC)=V?D,也就是CPR=Calculations/Params=1CPR=Calculations/Params=1CPR=Calculations/Params=1。也就是其權值利用率很低。
可以將一批大小為BBB的樣本xix_ixi?逐列拼接成矩陣XXX,一次性通過全連接層,得到一批輸出向量構成的矩陣YYY,相應地前面的矩陣-向量乘運算升為矩陣-矩陣乘計算(GEMM):Y=WXY=WXY=WX。
這樣全連接層前向計算量提高了BBB倍,CPR相應提高了BBB倍,權重矩陣在多個樣本之間實現了共享,可提高計算速度。
比較卷積層和全連接層,卷積層在輸出特征圖維度實現了權值共享,這是降低參數量的重要舉措,同時,卷積層局部連接特性(相比全連接)也大幅減少了參數量。因此卷積層參數量占比小,但計算量占比大,而全連接層是參數量占比大,計算量占比小。所以在進行計算加速優化時,重點放在卷積層;在進行參數優化、權值剪裁時,重點放在全連接層。
激活函數
激活函數是給網絡提供非線性的特性,在每個網絡層中對輸入數據進行非線性變換的作用,這有兩個好處。
- 對數據實現歸一化操作
激活函數都有各自的取值范圍,比如Sigmoid函數取值范圍是[0,1],Tanh函數取值范圍是[-1,1],這種好處對網絡的正反向訓練都有好處:
(1)正向計算網絡的時候,由于輸入數值的大小沒有限制,其數值差距會非常大,第一個壞處是大數值會更被重視,而小數值的重要性會被忽視,其次,隨著層數加深,這種大數值會不斷累積到后面的網絡層,最終可能導致數值爆炸溢出的情況;
(2)反向計算網絡的時候,每層數值大小范圍不同,有的在[0,1],有的在[0,10000],這在模型優化時會對設定反向求導的優化步長增加難度,設置過大會讓梯度較大的維度因為過量更新而造成無法預期的結果;設置過小,梯度較小的維度會得不到充分的更新,就無法有所提升。
- 打破之前的線性映射關系。
如果網絡只有線性部分,那么疊加多個網絡層是沒有意義的,因為多層神經網絡可以退化為一層神經網絡。
反向傳播Backpropagation
CNN的整個訓練過程如下所示:
網絡結構
這里簡單介紹比較有名的網絡結構。
1.LeNet(1990s)
在開頭介紹了,這是最早使用的CNN網絡結構之一,主要是用于字符分類;
特點如下:
- 卷積神經網絡使用3層架構:卷積、下采樣、非線性激活函數
- 使用卷積提取圖像空間特征
- 下采樣使用了圖像平均稀疏性
- 激活函數采用了tanh或者sigmoid函數
- 多層神經網絡(MLP)作為最后的分類器
- 層之間使用稀疏連接矩陣,以避免大的計算成本
2. AlexNet(2012)
這是在2012年的ImageNet視覺挑戰比賽上獲得第一名所使用的網絡結構,這也是使得許多視覺問題取得重大突破,讓CNN變得非常熱門的原因。總結下其改進地方:
- 使用ReLU函數作為激活函數,降低了Sigmoid類函數的計算量
- 利用dropout技術在訓練期間選擇性地剪掉某些神經元,避免模型過度擬合
- 引入max-pooling技術
- 利用雙GPU NVIDIA GTX 580顯著減少訓練時間
3. ZF Net(2013)
這是2013年ImageNet比賽的勝者,對AlexNet的結構超參數做出了調整。
####4. GoogleNet(2014)
2014年ImageNet比賽的勝者,其主要貢獻是使用了一個Inception Module,可以大幅度減少網絡的參數數量,其參數數量是4M,而AlexNet的則有60M。
5.VGGNet(2014)
這是一個更深的網絡,使用了16層的結構。**它是對原始圖像進行3×3卷積,然后再進行3×3卷積,連續使用小的卷積核對圖像進行多次卷積。**VGG一開始提出的時候剛好與LeNet的設計原則相違背,**因為LeNet相信大的卷積核能夠捕獲圖像當中相似的特征(權值共享)。**AlexNet在淺層網絡開始的時候也是使用9×9、11×11卷積核,并且盡量在淺層網絡的時候避免使用1×1的卷積核。但是VGG的神奇之處就是在于使用多個3×3卷積核可以模仿較大卷積核那樣對圖像進行局部感知。后來多個小的卷積核串聯這一思想被GoogleNet和ResNet等吸收。
VGG相信如果使用大的卷積核將會造成很大的時間浪費,減少的卷積核能夠減少參數,節省運算開銷。雖然訓練的時間變長了,但是總體來說預測的時間和參數都是減少的了。
6.ResNets(2015)
隨著網絡的加深,出現了訓練集準確率下降的現象,我們可以確定這不是由于Overfit過擬合造成的(過擬合的情況訓練集應該準確率很高);所以作者針對這個問題提出了一種全新的網絡,叫深度殘差網絡,它允許網絡盡可能的加深,其中引入了全新的結構如下圖;
殘差指的是什么?
其中ResNet提出了兩種mapping:一種是identity mapping,指的就是上圖中”彎彎的曲線”,另一種residual mapping,指的就是除了”彎彎的曲線“那部分,所以最后的輸出是 y=F(x)+x
identity mapping顧名思義,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y?x,所以殘差指的就是F(x)部分。
為什么ResNet可以解決“隨著網絡加深,準確率不下降”的問題?
理論上,對于“隨著網絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網絡已經到達最優,繼續加深網絡,residual mapping將被push為0,只剩下identity mapping,這樣理論上網絡一直處于最優狀態了,網絡的性能也就不會隨著深度增加而降低了。
?
總結
以上是生活随笔為你收集整理的卷积神经网络(CNN)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机硬件:固态硬盘选购的技巧
- 下一篇: 读源码,对程序员重要吗?