卷積神經網絡的發展歷程(不定期更新)

CNN主要的經典結構包括:LeNet、AlexNet、ZFNet、VGG、NIN、GoogleNet、ResNet、SENet等,其發展過程如下圖所示。(下圖來自劉昕博士《CNN的近期進展與實用技巧》

 

1、LeNet-5

 LeNet是卷積神經網絡的祖師爺LeCun在1998年提出,用於解決手寫數字識別的視覺任務。自那時起,CNN的最基本的架構就定下來了:卷積層、池化層、全連接層。如今各大深度學習框架中所使用的LeNet都是簡化改進過的LeNet-5(-5表示具有5個層),和原始的LeNet有些許不同,比如把激活函數改爲了現在很常用的ReLu。1998年的LeNet5[4]標註着CNN的真正面世,但是這個模型在後來的一段時間並未能火起來,主要原因是費機器(計算跟不上),而且其他的算法(SVM)也能達到類似的效果甚至超過。但是LeNet最大的貢獻是:定義了CNN的基本結構,是CNN的鼻祖。

LeNet-5的結構:
 LeNet-5包含Input、卷積層1、池化層1、卷積層2、池化層2、全連接層、輸出層共7層。

卷積層(Convolutional layer):卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網絡能從低級特徵中迭代提取更復雜的特徵。

池化層(Pooling):它實際上一種形式的向下採樣。有多種不同形式的非線性池化函數,而其中最大池化(Max pooling)和平均(Avg Pooling)採樣是最爲常見的。

pooling層的作用:Pooling層相當於把一張分辨率較高的圖片轉化爲分辨率較低的圖片;pooling層可進一步縮小最後全連接層中節點的個數,從而達到減少整個神經網絡中參數的目的。

全連接層(Full connection):與普通神經網絡一樣的連接方式,一般都在最後幾層。

INPUT: [28x28x1]           weights: 0
CONV5-32: [28x28x32]       weights: (5*5*1+1)*32
POOL2: [14x14x32]          weights: 2*2*1
CONV5-64: [14x14x64]       weights: (5*5*32+1)*64
POOL2: [7x7x64]            weights: 2*2*1
FC: [1x1x1024]              weights: (7*7*64+1)*1024
FC: [1x1x10]              weights: (1*1*512+1)*10

LeNet-5的特點::

  •     每個卷積層包含三個部分:卷積、池化和非線性激活函數
  •     使用卷積提取空間特徵(起初被稱爲感受野,未提“卷積”二字)
  •     降採樣(Subsample)的平均池化層(Average Pooling)
  •     雙曲正切(Tanh)的激活函數
  •     MLP作爲最後的分類器
  •     層與層之間的稀疏連接減少計算複雜性

LeNet-5的侷限性:

CNN能夠得出原始圖像的有效表徵,這使得CNN能夠直接從原始像素中,經過極少的預處理,識別視覺上面的規律。然而,由於當時缺乏大規模訓練數據,計算機的計算能力也跟不上,LeNet-5 對於複雜問題的處理結果並不理想。

LeNet-5的具體實現,可戳:https://blog.csdn.net/u012679707/article/details/80365599(感謝大大!!!)

 

2  AlexNet

Alex在2012年提出的alexnet網絡結構模型引爆了神經網絡的應用熱潮,並贏得了2012屆圖像識別大賽的冠軍,使得CNN成爲在圖像分類上的核心算法模型。2012年,Hinton的學生Alex Krizhevsky在寢室用GPU死磕了一個Deep Learning模型,一舉摘下了視覺領域競賽ILSVRC 桂冠,在百萬量級的ImageNet數據集合上,效果大幅度超過傳統的方法,從傳統的70%多提升到80%多。這個Deep Learning模型就是後來大名鼎鼎的AlexNet模型。


AlexNet爲何能耐如此之大?有三個很重要的原因:

  • (1)大量數據,Deep Learning領域應該感謝李飛飛團隊搞出來如此大的標註數據集合ImageNet;
  • (2)GPU,這種高度並行的計算神器確實助了洪荒之力,沒有神器在手,Alex估計不敢搞太複雜的模型;
  • (3)算法的改進,包括網絡變深、數據增強、ReLU、Dropout等

AlexNet可以說是神經網絡在低谷期後的第一次發聲,確立了深度學習(深度卷積網絡)在計算機視覺的統治地位,同時也推動了深度學習在語音識別、自然語言處理、強化學習等領域的拓展。

AlexNet將LeNet的思想發揚光大,把CNN的基本原理應用到了很深很寬的網絡中。網絡架構如下圖:

總體概述下:

  •     AlexNet爲8層結構,其中前5層爲卷積層,後面3層爲全連接層,lexNet最後一層是有1000類輸出的Softmax層用作分類;學習參數有6千萬個,神經元有650,000個
  •     AlexNet在兩個GPU上運行;
  •     AlexNet在第2,4,5層均是前一層自己GPU內連接,第3層是與前面兩層全連接,全連接是2個GPU全連接;
  •     LRN層第1,2個卷積層後;
  •     Max pooling層在LRN層以及第5個卷積層後。
  •     ReLU在每個卷積層以及全連接層後。

AlexNet的特點:

  • (1)成功使用ReLU作爲CNN的激活函數,並驗證其效果在較深的網絡超過了Sigmoid,成功解決了Sigmoid在網絡較深時的梯度彌散問題,此外,加快了訓練速度,因爲訓練網絡使用梯度下降法,非飽和的非線性函數訓練速度快於飽和的非線性函數。。雖然ReLU激活函數在很久之前就被提出了,但是直到AlexNet的出現纔將其發揚光大。
  • (2)訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合。Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最後幾個全連接層使用了Dropout。
  • (3)在CNN中使用重疊的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。並且AlexNet中提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋,提升了特徵的豐富性。
  • (4)提出了LRN層,對局部神經元的活動創建競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。
  • (5)使用CUDA加速深度卷積網絡的訓練,利用GPU強大的並行計算能力,處理神經網絡訓練時大量的矩陣運算。AlexNet使用了兩塊GTX?580?GPU進行訓練,單個GTX?580只有3GB顯存,這限制了可訓練的網絡的最大規模。因此作者將AlexNet分佈在兩個GPU上,在每個GPU的顯存中儲存一半的神經元的參數。
  • (6)數據增強,隨機地從256*256的原始圖像中截取224*224大小的區域(以及水平翻轉的鏡像),相當於增加了(256-224)*(256-224)*2=2048倍的數據量。如果沒有數據增強,僅靠原始的數據量,參數衆多的CNN會陷入過擬閤中,使用了數據增強後可以大大減輕過擬合,提升泛化能力。進行預測時,則是取圖片的四個角加中間共5個位置,並進行左右翻轉,一共獲得10張圖片,對他們進行預測並對10次結果求均值。

AlexNet具體的tensorflow實現,可戳:https://blog.csdn.net/u012679707/article/details/80793916(感謝大大!!!)

 

3、VGG-Nets

VGG-Nets是由牛津大學VGG(Visual Geometry Group)提出,是2014年ImageNet競賽定位任務的第一名和分類任務的第二名中的基礎網絡。VGG可以看成是加深版本的AlexNet. 都是conv layer + pooling layer+ FC layer,在當時看來這是一個非常深的網絡了,因爲層數高達十多層,我們從其論文名字就知道了(《Very Deep Convolutional Networks for Large-Scale Visual Recognition》),當然以現在來看來VGG真的稱不上是一個very deep的網絡。

 VGG-Nets探索了CNN的深度及其性能之間的關係,通過反覆堆疊3*3的小型卷積核和2*2的最大池化層,VGGNet成功的構築了16-19層深的CNN。VGGNet不好的一點是它耗費更多計算資源,並且使用了更多的參數,導致更多的內存佔用(140M)。其中絕大多數的參數都是來自於第一個全連接層。後來發現這些全連接層即使被去除,對於性能也沒有什麼影響,這樣就顯著降低了參數數量。

VGGNet結構:

VGGNet有A-E七種結構,從A-E網絡逐步變深,但是參數量並沒有增長很多(圖6-7),原因爲:參數量主要消耗在最後3個全連接層,而前面的卷積層雖然層數多,但消耗的參數量不大。不過,卷積層的訓練比較耗時,因爲其計算量大。

                                             

其中,D和E是常說的VGGNet-16和VGGNet-19。C很有意思,相比於B多了幾個1*1的卷積層,1*1卷積的意義在於線性變換,而輸入的通道數和輸出的通道數不同,沒有發生降維(作用是在不影響輸入輸出維數的情況下,對輸入線進行線性形變,然後通過Relu進行非線性處理,增加網絡的非線性表達能力。)(降維或升維)。

                                                 

VGG的性能:

                                

VGGNet網絡特點:

  • 結構簡潔:VGG結構由5層卷積層、3層全連接層、softmax輸出層構成,層與層之間使用max-pooling(最大池化)分開,所有隱層的激活單元都採用ReLU函數。
  • 小卷積核和多卷積子層:VGG使用多個較小卷積核(3x3)的卷積層代替一個卷積核較大的卷積層,一方面可以減少參數,另一方面相當於進行了更多的非線性映射,可以增加網絡的擬合/表達能力。小卷積核是VGG的一個重要特點,雖然VGG是在模仿AlexNet的網絡結構,但沒有采用AlexNet中比較大的卷積核尺寸(如7x7),而是通過降低卷積核的大小(3x3),增加捲積子層數來達到同樣的性能(VGG:從1到4卷積子層,AlexNet:1子層)。VGG的作者認爲兩個3x3的卷積堆疊獲得的感受野大小,相當一個5x5的卷積;而3個3x3卷積的堆疊獲取到的感受野相當於一個7x7的卷積。這樣可以增加非線性映射(3個RELU),  也能很好地減少參數(例如7x7的參數爲49個,而3個3x3的參數爲27)。           
  • 小池化核 :相比AlexNet的3x3的池化核,VGG全部採用2x2的池化核。
  • 通道數多:VGG網絡第一層的通道數爲64,後面每層都進行了翻倍,最多到512個通道,通道數的增加,使得更多的信息可以被提取出來。每段內的卷積核數量一樣,越後邊的段內卷積核數量越多,依次爲:64-128-256-512-512
  • 層數更深、特徵圖更寬:由於卷積核專注於擴大通道數、池化專注於縮小寬和高,使得模型架構上更深更寬的同時,控制了計算量的增加規模。
  • 全連接轉卷積(測試階段):這也是VGG的一個特點,在網絡測試階段將訓練階段的三個全連接替換爲三個卷積,使得測試得到的全卷積網絡因爲沒有全連接的限制,因而可以接收任意寬或高爲的輸入,這在測試階段很重要。如輸入圖像是224x224x3,若後面三個層都是全連接,那麼在測試階段就只能將測試的圖像全部都要縮放大小到224x224x3,才能符合後面全連接層的輸入數量要求,這樣就不便於測試工作的開展。而“全連接轉卷積”,替換過程如下:                                                                 

         例如7x7x512的層要跟4096個神經元的層做全連接,則替換爲對7x7x512的層作通道數爲4096、卷積核爲1x1的卷積

  •     越深的網絡效果越好。(圖6-9)
  •     LRN層作用不大(作者結論)

VGGNet的貢獻:

突出貢獻在於證明使用很小的卷積(3*3),增加網絡深度可以有效提升模型的效果,而且VGG-Nets對其他數據集具有很好的泛化能力。到目前爲止,VGG-Nets依然經常被用來提取圖像特徵

VGG-Nets的tensorflow具體實現:https://blog.csdn.net/u012679707/article/details/80807406(感謝大大!!!)

4、GoogLeNet

 Google Inception Net首次出現在ILSVRC2014的比賽中(和VGGNet同年),以較大的優勢獲得冠軍。那一屆的GoogLeNet通常被稱爲Inception V1,Inception V1的特點是控制了計算量和參數量的同時,獲得了非常好的性能-top5錯誤率6.67%, 這主要歸功於GoogleNet中引入一個新的網絡結構Inception模塊,所以GoogleNet又被稱爲Inception V1(後面還有改進版V2、V3、V4)架構中有22層深,V1比VGGNet和AlexNet都深,但是它只有500萬的參數量,計算量也只有15億次浮點運算,在參數量和計算量下降的同時保證了準確率,可以說是非常優秀並且實用的模型。

googleNet系列介紹:Google Inception Net是一個大家族,包括:

  •     2014年9月的《Going deeper with convolutions》提出的Inception V1.這是GoogLeNet的最早版本,出現在2014年的《Going deeper with convolutions》。之所以名爲“GoogLeNet”而非“GoogleNet”,文章說是爲了向早期的LeNet致敬
  •     2015年2月的《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的Inception V2
  •     2015年12月的《Rethinking the Inception Architecture for Computer Vision》提出的Inception V3
  •     2016年2月的《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》提出的Inception V4

GoogLeNet被稱爲Inception-v1,加入batch normalization之後被稱爲Inception-v2,加入factorization的idea之後,改進爲Inception-v3。

GoogLeNet結構:

             

對上圖做如下說明: 

  • 顯然GoogLeNet採用了模塊化的結構,方便增添和修改; 
  • 網絡最後採用了average pooling來代替全連接層,想法來自NIN,事實證明可以將TOP1 accuracy提高0.6%。但是,實際在最後還是加了一個全連接層,主要是爲了方便以後大家finetune;
  • 雖然移除了全連接,但是網絡中依然使用了Dropout ; 
  • 爲了避免梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度。文章中說這兩個輔助的分類器的loss應該加一個衰減係數,但看caffe中的model也沒有加任何衰減。此外,實際測試的時候,這兩個額外的softmax會被去掉。

GoogleNet的特點: 

  • Inception V1中精心設計的Inception Module提高了參數的利用率;在先前的網絡中,全連接層佔據了網絡的大部分參數,很容易產生過擬合現象;Inception V1去除了模型最後的全連接層,用全局平均池化層代替(將圖片尺寸變爲1x1)。
  • 1x1卷積層:對特徵降維,一方面可以解決計算瓶頸,同時限制網絡的參數大小,可以將網絡做的更「寬」和更「深」。

  • 線性激活:整個GoogLeNet的卷積層和Inception單元內部,都是採用線性激活函數。

  • 單元結構:                                    

GoogLeNet Inception V1分享:

Inception 結構的主要思路是怎樣用密集成分來近似最優的局部稀疏結構。 作者首先提出下圖這樣的基本結構: 

                 

對上圖做以下說明: 

  • 採用不同大小的卷積核意味着不同大小的感受野,最後拼接意味着不同尺度特徵的融合; 
  •  之所以卷積核大小採用1、3和5,主要是爲了方便對齊。設定卷積步長stride=1之後,只要分別設定pad=0、1、2,那麼卷積之後便可以得到相同維度的特徵,然後這些特徵就可以直接拼接在一起了;
  • 文章說很多地方都表明pooling挺有效,所以Inception裏面也嵌入了。 
  • 網絡越到後面,特徵越抽象,而且每個特徵所涉及的感受野也更大了,因此隨着層數的增加,3x3和5x5卷積的比例也要增加。

但是,使用5x5的卷積核仍然會帶來巨大的計算量。 爲此,文章借鑑NIN2,採用1x1卷積核來進行降維
例如:上一層的輸出爲100x100x128,經過具有256個輸出的5x5卷積層之後(stride=1,pad=2),輸出數據爲100x100x256。其中,卷積層的參數爲128x5x5x256。假如上一層輸出先經過具有32個輸出的1x1卷積層,再經過具有256個輸出的5x5卷積層,那麼最終的輸出數據仍爲爲100x100x256,但卷積參數量已經減少爲128x1x1x32 + 32x5x5x256,大約減少了4倍。

具體改進後的Inception Module如下圖: 

                    

閃光點:

  •     引入Inception結構,這是一種網中網(Network In Network)的結構,即原來的結點也是一個網絡。
  •     中間層的輔助LOSS單元,GoogLeNet網絡結構中有3個LOSS單元,這樣的網絡設計是爲了幫助網絡的收斂。在中間層加入輔助計算的LOSS單元,目的是計算損失時讓低層的特徵也有很好的區分能力,從而讓網絡更好地被訓練。在論文中,這兩個輔助LOSS單元的計算被乘以0.3,然後和最後的LOSS相加作爲最終的損失函數來訓練網絡。
  •     後面的全連接層全部替換爲簡單的全局平均pooling,將後面的全連接層全部替換爲簡單的全局平均pooling,在最後參數會變的更少。而在AlexNet中最後3層的全連接層參數差不多佔總參數的90%,使用大網絡在寬度和深度上允許GoogleNet移除全連接層,但並不會影響到結果的精度,在ImageNet中實現93.3%的精度,而且要比VGG還要快。

GoogLeNet Inception V2:

V2提出了BN,http://blog.csdn.net/app_12062011/article/details/57083447有介紹,另外, BN的反向傳導:http://www.jianshu.com/p/4270f5acc066.softmax 梯度計算:http://blog.csdn.net/u014313009/article/details/51045303

GoogLeNet Inception V3:

GoogLeNet憑藉其優秀的表現,得到了很多研究人員的學習和使用,因此Google團隊又對其進行了進一步發掘改進,產生了升級版本的GoogLeNet。這一節介紹的版本記爲V3,文章爲:《Rethinking the Inception Architecture for Computer Vision》

14年以來,構建更深的網絡逐漸成爲主流,但是模型的變大也使計算效率越來越低。這裏,文章試圖找到一種方法在擴大網絡的同時又儘可能地發揮計算性能。GoogLeNet的表現很好,但是,如果想要通過簡單地放大Inception結構來構建更大的網絡,則會立即提高計算消耗。此外,在V1版本中,文章也沒給出有關構建Inception結構注意事項的清晰描述。因此,在文章中作者首先給出了一些已經被證明有效的用於放大網絡的通用準則和優化方法。這些準則和方法適用但不侷限於Inception結構。

  • General Design Principles

下面的準則來源於大量的實驗,因此包含一定的推測,但實際證明基本都是有效的。

1 . 避免表達瓶頸,特別是在網絡靠前的地方。 信息流前向傳播過程中顯然不能經過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,但是不能一下子就變得很小。比如你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。另外輸出的維度channel,一般來說會逐漸增多(每層的num_output),否則網絡會很難訓練。(特徵維度並不代表信息的多少,只是作爲一種估計的手段)這種情況一般發生在pooling層,字面意思是,pooling後特徵圖變小了,但有用信息不能丟,不能因爲網絡的漏斗形結構而產生表達瓶頸,解決辦法是作者提出了一種特徵圖縮小方法,更復雜的池化。

2 . 高維特徵更易處理。 高維特徵更易區分,會加快訓練。

3. 可以在低維嵌入上進行空間匯聚而無需擔心丟失很多信息。 比如在進行3x3卷積之前,可以對輸入先進行降維而不會產生嚴重的後果。假設信息可以被簡單壓縮,那麼訓練就會加快。

4 . 平衡網絡的寬度與深度。

上述的這些並不能直接用來提高網絡質量,而僅用來在大環境下作指導。

  • Factorizing Convolutions with Large Filter Size

大尺寸的卷積核可以帶來更大的感受野,但也意味着更多的參數,比如5x5卷積核參數是3x3卷積核的25/9=2.78倍。爲此,作者提出可以用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,(保持感受野範圍的同時又減少了參數量)如下圖(這個其實在VGG裏面提出過了)

然後就會有2個疑問:

1 . 這種替代會造成表達能力的下降嗎? 
後面有大量實驗可以表明不會造成表達缺失;

2 . 3x3卷積之後還要再加激活嗎? 
作者也做了對比試驗,表明添加非線性激活會提高性能

從上面來看,大卷積核完全可以由一系列的3x3卷積核來替代,那能不能分解的更小一點呢。文章考慮了 nx1 卷積核。 
如上右圖所示的取代3x3卷積:

於是,任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代。實際上,作者發現在網絡的前期使用這種分解效果並不好,還有在中度大小的feature map上使用效果纔會更好。(對於mxm大小的feature map,建議m在12到20之間)。

總結如下圖:

  •  圖4是GoogLeNet V1中使用的Inception結構;
  •  圖5是用3x3卷積序列來代替大卷積核;
  • 圖6是用nx1卷積來代替大卷積核,這裏設定n=7來應對17x17大小的feature map。該結構被正式用在GoogLeNet V2中。即非對稱個卷積核,其實類似於卷積運算中,二維分解爲1維計算,提高了計算速度。

 

  • 優化標籤

深度學習用的labels一般都是one hot向量,用來指示classifier的唯一結果,這樣的labels有點類似信號與系統裏的脈衝函數,或者叫“Dirac delta”,即只在某一位置取1,其它位置都是0。Labels的脈衝性質會引發兩個不良後果:一是over-fitting,另外一個是降低了網絡的適應性。我對Label smooth理解是這樣的,它把原來很突兀的one_hot_labels稍微的平滑了一點,槍打了出頭鳥,削了立於雞羣那隻鶴的腦袋,分了點身高給雞們,避免了網絡過度學習labels而產生的弊端。

googlenet具體tensorflow實現:https://blog.csdn.net/u012679707/article/details/80824889(感謝大大!!!)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章