CNN那麼多的網路有什麼區別嗎?如何對CNN網路進行修改?
為了解釋這個問題,我覺得很有必要去了解一下CNN架構模型的發展,從CNN模型架構的發展去看待不同的網路之間的區別,去學習CNN模型的定義。
-------------------深度學習演算法最近變得越來越流行和越來越有用的演算法,然而深度學習或者深度神經網路的成功得益於層出不窮的神經網路模型架構。這篇文章當中作者回顧了從1998年開始,近18年來深度神經網路的架構發展情況。
圖中的坐標軸我們可以看出橫坐標是操作的複雜度,縱坐標是精度。模型設計一開始的時候模型權重越多模型越大,其精度越高,後來出現了resNet、GoogleNet、Inception等網路架構之後,在取得相同或者更高精度之下,其權重參數不斷下降。值得注意的是,並不是意味著橫坐標越往右,它的運算時間越大。在這裡並沒有對時間進行統計,而是對模型參數和網路的精度進行了縱橫對比。
其中有幾個網路作者覺得是必學非常值得學習和經典的:AlexNet、LeNet、GoogLeNet、VGG-16、NiN。
如果你想了解更多關於深度神經網路的架構及其對應的應用,不妨看一下這篇綜述 An Analysis of Deep Neural Network Models for Practical Applications。
轉載自ZOMI的博客 [chenzomi12.github.io]
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 Net2010年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-network2013年年尾,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中用到。
VGG2014年是個綻放年,出了兩篇重要的論文: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 V3Christian的團隊確實很厲害,2015年2月他們又發表了新的文章關於在googleNet中加入一個Batch-normalized層。Batch-normalized層歸一化計算圖層輸出處所有特徵圖的平均值和標準差,並使用這些值對其響應進行歸一化。這對應於「白化」數據非常有效,並且使得所有神經層具有相同範圍並且具有零均值的響應。這有助於訓練,因為下一層不必學習輸入數據中的偏移,並且可以專註於如何最好地組合特徵。
2015年12月,他們發布了一個新版本的GoogLeNet(Inception V3)模塊和相應的架構,並且更好地解釋了原來的GoogLeNet架構,GoogLeNet原始思想:
- 通過構建平衡深度和寬度的網路,最大化網路的信息流。在進入pooling層之前增加feature maps
- 當網路層數深度增加時,特徵的數量或層的寬度也相對應地增加
- 在每一層使用寬度增加以增加下一層之前的特徵的組合
- 只使用3x3卷積
因此最後的模型就變成這樣了:
網路架構最後還是跟GoogleNet一樣使用pooling層+softmax層作為最後的分類器。
ResNet2015年12月ResNet發表了,時間上大概與Inception v3網路一起發表的。其中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
2016年11月才發表的文章,一看論文的標題可以被鎮住:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and &< 0.5MB model size。文章直接說SqueezeNet有著跟AlexNet一樣的精度,但是參數卻比Alex少了接近50倍並且參數只需要佔用很小的內存空間。這裡的設計就沒有SegNet或者GoogleNet那樣的設計架構驚艷了,但SqueezeNet卻是能夠保證同樣的精度下使用更少的參數。
Xception
Xception模型使用與ResNet和Inception V4一樣簡單且優雅的架構,並且改進了Inception模型。
從Xception模型我們可以看出來Xception模型的架構具有36個卷積層,與ResNet-34非常相似。但是模型的代碼與ResNet一樣簡單,並且比Inception V4更容易理解。
從 here 或者 here 可以找到Xception的實現代碼。
總結
我們再來回顧開篇的對比圖。從圖中我們可以看出來,AlexNet一類的模型沒有考慮太多權重參數的問題,因此圓圈比較大。一開始AlexNet只是希望用深度網路能夠找到更多圖像當中的高維特徵,後來發現當網路越深的時候需要的參數越多,硬體總是跟不上軟體的發展,這個時候如果加深網路的話GPU的顯存塞不下更多的參數,因此硬體限制了深度網路的發展。為了能夠提高網路的深度和精度,於是大神們不斷地研究,嘗試使用小的卷積核代替大的卷積核能夠帶來精度上的提升,並且大面積地減少參數,於是網路的深度不再受硬體而制約。
可是另外一方面,隨著網路的深度越深,運算的時間就越慢,這也是個很蛋疼的事情,不能兩全其美。作者相信在未來2-3年我們能夠親眼目睹比現有網路更深、精度更高、運算時間更少的網路出現。因為硬體也在快速地發展,特斯拉使用的NVIDIA Driver PX 2的運算速率已經比現在Titan X要快7倍。
後話其實作者覺得神經網路的架構體系對於了解「深度學習」和對於了解深度學習的發展是非常重要的,因此強烈推薦大家去深入研讀一下上面提到的網路架構對應的文章。
總是有一些人會問為什麼我們需要那麼多時間去了解這些深度網路的架構體系呢,而不是去研究數據然後了解數據背後的意義和如何對數據進行預處理呢?對於如何研究數據可以搜一下另外一篇文章《人工智慧的特徵工程問題》。對,數據很重要,同時模型也很重要。簡單的舉一個例子,如果你對某種圖像數據很了解,但是不懂CNN如何對這些圖像進行提取高維特徵,那麼最後可能還是會使用HOG或者傳統的SIFT特徵檢測演算法。
還要注意的是,在這裡我們主要談論計算機視覺的深度學習架構。類似的神經網路架構在其他領域還在不斷地發展,如果你有精力和時間,那麼可以去研究更多不一樣的架構進化歷。
引用轉載自ZOMI的博客 [chenzomi12.github.io]
-----------------------------------------------------------------------------------------------為什麼不支持markdown!!!!!
- chenzomi12.github.io
- LeNet
- Dan Ciresan Net
- AlexNet
- Network-in-network
- VGG
- GoogleNet
- Inception V3
- Batch-normalized Layer
- ResNet
- SqueezeNet
- Xception
- Neural Network Architectures
推薦閱讀:
※深度學習 ( Deep Learning ) 的 Python 包哪家強?
※如何看待顧險峰《看穿機器學習(W-GAN模型)的黑箱》這篇文章?
※分散式深度學習系統與傳統的分散式系統的區別?
※求台大林軒田的learning from data (yaser)這本書後面的problem的答案?
※最近看到udacity的納米學位很火,號稱學完可以找到工作了,這是真的嗎?
TAG:機器學習 | 深度學習DeepLearning |