1. 程式人生 > >卷積神經網路CNN_綜述一

卷積神經網路CNN_綜述一

CNN卷積神經網路架構綜述

2016-12-13

深度學習演算法最近變得越來越流行和越來越有用的演算法,然而深度學習或者深度神經網路的成功得益於層出不窮的神經網路模型架構。這篇文章當中作者回顧了從1998年開始,近18年來深度神經網路的架構發展情況。



圖中的座標軸我們可以看出橫座標是操作的複雜度,縱座標是精度。模型設計一開始的時候模型權重越多模型越大,其精度越高,後來出現了resNet、GoogleNet、Inception等網路架構之後,在取得相同或者更高精度之下,其權重引數不斷下降。值得注意的是,並不是意味著橫座標越往右,它的運算時間越大。在這裡並沒有對時間進行統計,而是對模型引數和網路的精度進行了縱橫對比。

其中有幾個網路作者覺得是必學非常值得學習和經典的:AlexNet、LeNet、GoogLeNet、VGG-16、NiN。

網路架構

LeNet5

1998年。LeCun樂春大神釋出了LeNet網路架構,從而揭開了深度學習的神祕面紗。從1998年開始,深度學習這一領域就開始不斷地被人們所熟知,也是因為這個網路架構,不斷地推動著深度學習這一領域。當然啦,為什麼不叫LeNet而叫LeNet5呢,因為Yann LeCun經過了很多次反覆的試驗之後的結果,同時也因為有5個卷基層因此以lenet5命名!

lenet5架構是一個開創性的工作,因為影象的特徵是分佈在整個影象當中的,並且學習引數利用卷積在相同引數的多個位置中提取相似特性的一種有效方法。迴歸到1998年當時沒有GPU來幫助訓練,甚至CPU速度都非常慢。因此,對比使用每個畫素作為一個單獨的輸入的多層神經網路,Lenet5能夠節省引數和計算是一個關鍵的優勢。lenet5論文中提到,全卷積不應該被放在第一層,因為影象中有著高度的空間相關性,並利用影象各個畫素作為單獨的輸入特徵不會利用這些相關性。因此有了CNN的三個特性了:1.區域性感知、2.下采樣、3.權值共享。


LeNet5小結:

  • 卷積神經網路使用3層架構:卷積、下采樣、非線性啟用函式
  • 使用卷積提取影象空間特徵
  • 下采樣使用了影象平均稀疏性
  • 啟用函式採用了tanh或者sigmoid函式
  • 多層神經網路(MLP)作為最後的分類器
  • 層之間使用稀疏連線矩陣,以避免大的計算成本

總的來說LeNet5架構把人們帶入深度學習領域,值得致敬。從2010年開始近幾年的神經網路架構大多數都是基於LeNet的三大特性。

GAP

從1998年2010年這10年當中,神經網路的發展卻變得非常緩慢,就連人工智慧領域的大牛吳恩達教授在2003年的公開課花了2節課的時間講解SVM的推導,而對於神經網路只用了不到20分鐘帶過。在2012年coresea新的人工智慧公開課上面反而SVM用了不到一節課的時間講解,神經網路卻用了2節課的時間進行演算法介紹,可見科學家們對神經網路越來越重視。並且隨著CPU和GPU的速度不斷提升之下,帶來了效能上的飛躍、也帶來儲存上的飛躍,讓深度神經網路變得更加可算,於是從2010年開啟了深度學習的大門。

Dan Ciresan Net

2010年Dan Claudiu Ciresan和Jurgen Schmidhuber發表了一個GPU神經網路。論文裡面證明了使用 NVIDIA GTX 280 GPU之後能夠處理高達9層的神經網路。

從此之後,Nvidia公司的股價開始不斷攀升,深度學習也越來越為人們所熟知。

AlexNet

2012年,Alex Krizhevsky發表了AlexNet,相對比LeNet它的網路層次更加深,從LeNet的5層到AlexNet的7層,更重要的是AlexNet還贏得了2012年的ImageNet競賽的第一。AlexNet不僅比LeNet的神經網路層數更多更深,並且可以學習更復雜的影象高維特徵。

AlexNet小結:

  • 使用ReLU函式作為啟用函式,降低了Sigmoid類函式的計算量
  • 利用dropout技術在訓練期間選擇性地剪掉某些神經元,避免模型過度擬合
  • 引入max-pooling技術
  • 利用雙GPU NVIDIA GTX 580顯著減少訓練時間


隨著GPU提供越來越強悍的效能,同時允許超過10x倍數的訓練增長時間,於是可以處理越來越大的圖片和越來越龐大的資料集。暴風雨來臨了,AlexNet的成功開始了一場小革命,卷積神經網路CNN現在是深度學習的主力,於是有人稱“網路越複雜處理的任務越厲害”。

Network-in-network

2013年年尾,Min Lin提出了在卷積後面再跟一個1x1的卷積核對影象進行卷積,這就是Network-in-network的核心思想了。NiN在每次卷積完之後使用,目的是為了在進入下一層的時候合併更多的特徵引數。同樣NiN層也是違背LeNet的設計原則(淺層網路使用大的卷積核),但卻有效地合併卷積特徵,減少網路引數、同樣的記憶體可以儲存更大的網路。

根據Min Lin的NiN論文,他們說這個“網路的網路”(NIN)能夠提高CNN的區域性感知區域。例如沒有NiN的當前卷積是這樣的:3x3 256 [conv] -> [maxpooling],當增加了NiN之後的卷積是這樣的:3x3 256 [conv] -> 1x1 256 [conv] -> [maxpooling]。

MLP多層感知的厲害之處就在於它把卷積特徵結合起來成為一個更復雜的組合,這個思想將會在後面ResNet和Inception中用到。

VGG

2014年是個綻放年,出了兩篇重要的論文:VGG、GoogLeNet。

來自牛津大學的VGG網路是第一個在每個卷積層使用更小的3×3卷積核對影象進行卷積,並把這些小的卷積核排列起來作為一個卷積序列。通俗點來講就是對原始影象進行3×3卷積,然後再進行3×3卷積,連續使用小的卷積核對影象進行多次卷積。

或許很多人看到這裡也很困惑為什麼使用那麼小的卷積核對影象進行卷積,並且還是使用連續的小卷積核?VGG一開始提出的時候剛好與LeNet的設計原則相違背,因為LeNet相信大的卷積核能夠捕獲影象當中相似的特徵(權值共享)。AlexNet在淺層網路開始的時候也是使用9×9、11×11卷積核,並且儘量在淺層網路的時候避免使用1×1的卷積核。但是VGG的神奇之處就是在於使用多個3×3卷積核可以模仿較大卷積核那樣對影象進行區域性感知。後來多個小的卷積核串聯這一思想被GoogleNet和ResNet等吸收。

從下圖我們可以看出來,VGG使用多個3x3卷積來對高維特徵進行提取。因為如果使用較大的卷積核,引數就會大量地增加、運算時間也會成倍的提升。例如3x3的卷積核只有9個權值引數,使用7*7的卷積核權值引數就會增加到49個。因為缺乏一個模型去對大量的引數進行歸一化、約減,或者說是限制大規模的引數出現,因此訓練核數更大的卷積網路就變得非常困難了。

VGG相信如果使用大的卷積核將會造成很大的時間浪費,減少的卷積核能夠減少引數,節省運算開銷。雖然訓練的時間變長了,但是總體來說預測的時間和引數都是減少的了。


GoogLeNet

2014年,在google工作的Christian Szegedy為了找到一個深度神經網路結構能夠有效地減少計算資源,於是有了這個GoogleNet了(也叫做Inception V1)。

從2014年尾到現在,深度學習模型在影象內容分類方面和視訊分類方面有了極大的應用。在這之前,很多一開始對深度學習和神經網路都保持懷疑態度的人,現在都湧入深度學習的這個領域,理由很簡單,因為深度學習不再是海市蜃樓,而是變得越來越接地氣。就連google等網際網路巨頭都已經在深度學習領域佈局,成立了各種各樣的額人工智慧實驗室。

Christian在思考如何才能夠減少深度神經網路的計算量,同時獲得比較好的效能的框架。即使不能兩全其美,退而求其次能夠保持在相同的計算成本下,能夠有更好的效能提升這樣的框架也行。於是後面Christian和他的team在google想出了這個模型:


其乍一看基本上是1×1,3×3和5×5卷積核的並行合併。但是,最重要的是使用了1×1卷積核(NiN)來減少後續並行操作的特徵數量。這個思想現在叫做“bottleneck layer”。

Bottleneck layer

受NiN的啟發,googleNet的Bottleneck layer減少了特徵的數量,從而減少了每一層的操作複雜度,因此可以加快推理時間。在將資料傳遞到下一層卷積之前,特徵的數量減少了4左右。因此這種設計架構因為大量節省計算成本而名聲大噪。

讓我們詳細研究一下這個Bottleneck layer。假設輸入時256個feature map進來,256個feature map輸出,假設Inception層只執行3x3的卷積,那麼這就需要這行 (256x256) x (3x3) 次卷積左右(大約589,000次計算操作)。再假設這次589,000次計算操作在google的伺服器上面用了0.5ms的時間,計算開銷還是很大的。現在Bottleneck layer的思想是先來減少特徵的數量,我們首先執行256 -> 64 1×1卷積,然後在所有Bottleneck layer的分支上對64大小的feature map進行卷積,最後再64 -> 256 1x1卷積。 操作量是:

  • 256×64 × 1×1 = 16,000s
  • 64×64 × 3×3 = 36,000s
  • 64×256 × 1×1 = 16,000s

總共約70,000,而我們以前有近600,000。幾乎減少10倍的操作!

雖然我們做的操作較少,但我們並沒有失去這一層特徵。實際上,Bottleneck layer已經在ImageNet資料集上表現非常出色,並且也將在稍後的架構例如ResNet中使用到。

成功的原因是輸入特徵是相關的,因此可以通過適當地與1x1卷積組合來去除冗餘。然後,在卷積具有較少數目的特徵之後,它們可以再次擴充套件並作用於下一層輸入。

Inception V3

Christian的團隊確實很厲害,2015年2月他們又發表了新的文章關於在googleNet中加入一個Batch-normalized層。Batch-normalized層歸一化計算圖層輸出處所有特徵圖的平均值和標準差,並使用這些值對其響應進行歸一化。這對應於“白化”資料非常有效,並且使得所有神經層具有相同範圍並且具有零均值的響應。這有助於訓練,因為下一層不必學習輸入資料中的偏移,並且可以專注於如何最好地組合特徵。

2015年12月,他們釋出了一個新版本的GoogLeNet(Inception V3)模組和相應的架構,並且更好地解釋了原來的GoogLeNet架構,GoogLeNet原始思想:

  • 通過構建平衡深度和寬度的網路,最大化網路的資訊流。在進入pooling層之前增加feature maps
  • 當網路層數深度增加時,特徵的數量或層的寬度也相對應地增加
  • 在每一層使用寬度增加以增加下一層之前的特徵的組合
  • 只使用3x3卷積

因此最後的模型就變成這樣了:




總結

我們再來回顧開篇的對比圖。從圖中我們可以看出來,AlexNet一類的模型沒有考慮太多權重引數的問題,因此圓圈比較大。一開始AlexNet只是希望用深度網路能夠找到更多影象當中的高維特徵,後來發現當網路越深的時候需要的引數越多,硬體總是跟不上軟體的發展,這個時候如果加深網路的話GPU的視訊記憶體塞不下更多的引數,因此硬體限制了深度網路的發展。為了能夠提高網路的深度和精度,於是大神們不斷地研究,嘗試使用小的卷積核代替大的卷積核能夠帶來精度上的提升,並且大面積地減少引數,於是網路的深度不再受硬體而制約。

可是另外一方面,隨著網路的深度越深,運算的時間就越慢,這也是個很蛋疼的事情,不能兩全其美。作者相信在未來2-3年我們能夠親眼目睹比現有網路更深、精度更高、運算時間更少的網路出現。因為硬體也在快速地發展,特斯拉使用的NVIDIA Driver PX 2的運算速率已經比現在Titan X要快7倍。