1. 程式人生 > >神經網路模型之CNN網路架構

神經網路模型之CNN網路架構

CNN網路架構

神經網路架構發展縱覽

從1998年開始,近18年來深度神經網路的架構發展情況如下:

上圖,橫座標是操作的複雜度,縱座標是精度。

模型設計一開始的時候模型權重越多模型越大,其精度越高,後來出現了ResNetGoogleNetInception等網路架構之後,在取得相同或者更高精度之下,其權重引數不斷下降。

值得注意的是,並不是意味著橫座標越往右,它的運算時間越大。在這裡並沒有對時間進行統計,而是對模型引數和網路的精度進行了縱橫對比。

根據模組功能、深度等,CNN網路發展情況如下圖所示:


LeNet5

1998年,LeCun

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

lenet5架構是一個開創性的工作,因為影象的特徵是分佈在整個影象當中的,並且學習引數利用卷積在相同引數的多個位置中提取相似特性的一種有效方法。迴歸到1998年當時沒有GPU來幫助訓練,甚至CPU速度都非常慢。因此,對比使用每個畫素作為一個單獨的輸入的多層神經網路,Lenet5

能夠節省引數和計算是一個關鍵的優勢。

lenet5論文中提到,全卷積不應該被放在第一層,因為影象中有著高度的空間相關性,並利用影象各個畫素作為單獨的輸入特徵不會利用這些相關性。因此有了CNN的三個特性了:1.區域性感知、2.下采樣、3.權值共享。


LeNet5小結


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

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

GAP

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


AlexNet

2012年,AlexKrizhevsky發表了AlexNet,相對比LeNet它的網路層次更加深,從LeNet5層到AlexNet7,更重要的是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 LinNiN論文,他們說這個網路的網路NIN)能夠提高CNN的區域性感知區域。例如沒有NiN的當前卷積是這樣的:3x3 256 [conv] -> [maxpooling],當增加了NiN之後的卷積是這樣的:3x3 256 [conv] -> 1x1 256 [conv] -> [maxpooling]


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


VGG

2014年是個綻放年,出了兩篇重要的論文:VGGGoogLeNet

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

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

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

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


GoogleNet

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

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

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


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


Inception-V3

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

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

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

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


網路架構最後還是跟GoogleNet一樣使用pooling+softmax層作為最後的分類器。


ResNet

201512月發表了,時間上大概與Inceptionv3網路一起發表的。其中ResNet的一個重要的思想是:輸出的是兩個連續的卷積層,並且輸入時繞到下一層去。這句話不太好理解可以看下圖。


但在這裡,他們繞過兩層,並且大規模地在網路中應用這中模型。在2層之後繞過是一個關鍵,因為繞過單層的話實踐上表明並沒有太多的幫助,然而繞過2層可以看做是在網路中的一個小分類器!看上去好像沒什麼感覺,但這是很致命的一種架構,因為通過這種架構最後實現了神經網路超過1000層。傻了吧,之前我們使用LeNet只是5層,AlexNet也最多不過7層。


該層首先使用1x1卷積然後輸出原來特徵數的1/4,然後使用3×3的卷積核,然後再次使用1x1的卷積核但是這次輸出的特徵數為原來輸入的大小。如果原來輸入的是256個特徵,輸出的也是256個特徵,但是這樣就像Bottleneck Layer那樣說的大量地減少了計算量,但是卻保留了豐富的高維特徵資訊。

ResNet一開始的時候是使用一個7x7大小的卷積核,然後跟一個pooling層。當然啦,最後的分類器跟GoogleNet一樣是一個pooling層加上一個softmax作為分類器。下圖左邊是VGG19擁有190萬個引數,右圖是34層的ResNet只需要36萬個引數:


ResNet網路特徵

  • ResNet可以被看作並行和序列多個模組的結合;
  • ResNet上部分的輸入和輸出一樣,所以看上去有點像RNN,因此可以看做是一個更好的生物神經網路的模型;

SqueezeNet

201611月才發表的文章,直接說SqueezeNet有著跟AlexNet一樣的精度,但是引數卻比Alex少了接近50倍並且引數只需要佔用很小的記憶體空間。這裡的設計就沒有SegNet或者GoogleNet那樣的設計架構驚豔了,但SqueezeNet卻是能夠保證同樣的精度下使用更少的引數。


Xception

模型使用與ResNetInception V4一樣簡單且優雅的架構,並且改進了Inception模型。

Xception模型我們可以看出來Xception模型的架構具有36個卷積層,與ResNet-34非常相似。但是模型的程式碼與ResNet一樣簡單,並且比Inception V4更容易理解。





總結

我們再來回顧開篇的對比圖,從圖中我們可以看出來,AlexNet一類的模型沒有考慮太多權重引數的問題,因此圓圈比較大。

一開始AlexNet只是希望用深度網路能夠找到更多影象當中的高維特徵,後來發現當網路越深的時候需要的引數越多,硬體總是跟不上軟體的發展,這個時候如果加深網路的話GPU的視訊記憶體塞不下更多的引數,因此硬體限制了深度網路的發展。為了能夠提高網路的深度和精度,於是大神們不斷地研究,嘗試使用小的卷積核代替大的卷積核能夠帶來精度上的提升,並且大面積地減少引數,於是網路的深度不再受硬體而制約。

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