GoogLeNet的個人理解

  先附上著名的網絡結構GoogLeNet及其延伸版本,以便自己日後的學習。
1. Inception[V1]: Going Deeper with Convolutions
2. Inception[V2]: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
3. Inception[V3]: Rethinking the Inception Architecture for Computer Vision
4. Inception[V4]: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

  在學習了Andrew Ng 的deeplearning.ai中的CNN課程時,順着Ng的思路去了解了GoogLeNet這篇經典論文。GoogleNet提出了一個全新的深度CNN架構——Inception,無全連接層,可以節省運算的同時,減少了很多參數,參數數量是AlexNet的1/12,數量只有5 million,而且在ImageNet競賽中取得了很好的成績。
  文章在引文中提到了提高深度神經網絡性能最直接的方式,那就是增加網絡的規模:深度和寬度。但是這樣做的話肯定存在很多問題,問題是什麼呢?
  問題一:網絡規模更大通常意味着需要更多的參數,這會使增大的網絡更容易過擬合,尤其是在訓練集的標註樣本有限的情況下。
  問題二:使用計算資源的顯著增加。
  緊接着,文章就這兩個問題開展一系列的引用與討論,提出論文的追求,那就是設計一個好的網絡拓撲,最後引出了Inception架構,並且將Inception架構的設計初衷與思想詮釋的比較到位。首先,肯定卷積神經網絡的重要性,以及池化對於卷積效果的重要性,所以Inception架構的基礎是CNN卷積操作。而就減小網絡規模這一點來說,新的模型需要考慮一個新的網絡架構,從如何近似卷積視覺網絡的最優稀疏結構出發,進行探索與討論。

Inception架構

  我們來具體看Inception的架構(圖1)。在這篇文章的Inception版本1中,創新點在於一層網絡中存在多個不同尺度的卷積核,摒棄了AlexNet、VGG等傳統著名網絡的“一條線”架構。升級版的Inception,也就是這篇文章提到的Inception架構中,加入多個1×1的“瓶頸”層,來保留空間維度, 降低深度,在池化之後採用1×1卷積核來減少池化後的深度,從而主要達到減小規模的目的。
  我簡單的進行了兩個版本Inception的操作數運算,步驟如下:




  如果採用(a)的架構,假設在這一個Inception架構中,上一層輸入的尺寸大小是28×28×256,採用1×1,3×3,5×5三種不同尺度的卷積核和3×3的max池化來進行該層的計算輸出,那麼在該層中卷積操作的ops次數計算如下:
[1×1 conv,128] 28×28×128×1×1×256
[3×3 conv,192] 28×28×192×3×3×256
[5×5 conv,192] 28×28×96×5×5×256
  Total:854M ops。對於[1×1 conv,128],28×28×128×1×1×256的計算是怎麼來的呢?首先對於輸入尺寸爲28×28×256的矩陣來說,1×1卷積覈實際大小是:1×1×256,每進行一次卷積,就進行了×1×256次運算,那麼一個卷積核需要進行28×28次卷積,而一共有128個不同的1×1卷積核,所以總的運算次數爲28×28×1×1×256×128。



  如果採用(b)的架構,同樣假設在這一個Inception架構中,上一層輸入的尺寸大小是28×28×256,採用1×1,3×3,5×5三種不同尺度的卷積核和3×3的max池化來進行該層的計算輸出,但是在進行以上卷積之前,在3×3和5×5卷積操作的前一步,加入1×1的“瓶頸”層,來保留空間維度, 降低深度;在池化之後採用1×1卷積核來減少池化後的深度。那麼在該層中卷積操作的ops次數計算如下:
[1×1 conv,64] 28×28×64×1×1×256
[3×3 conv,64] 28×28×64×1×1×256
[5×5 conv,128] 28×28×128×1×1×256
[1×1 conv,192] 28×28×192×3×3×64
[3×3 conv,96] 28×28×96×5×5×64
[5×5 conv,64] 28×28×64×1×1×256
  Total:358M ops。可以看到,雖然網絡的複雜程度加大了,但是總的運算次數減小到之前的1/3。
  Inception網絡是一個由上述類型的模塊互相堆疊組成的網絡,從而形成了GoogLeNet。GoogLeNet是一個具有22層網絡的深度學習架構,當然這22層指的是擁有權重的層,如圖所示GoogLeNet的整體架構。



  在中間層採用輔助分類器(Auxiliary Classification),增加了兩個Loss來保證梯度回傳消失的情況,這種設計結構用來減少梯度消失,ResNet是減少梯度爆炸。從中我們可以學習到一個點在於:梯度消失解決辦法可以是在中間增加額外信號。

創新點

  GoogLeNet的創新點都是圍繞減少深度和提高性能來設計的。
1. 借鑑NiN(Network in Network)中提出的思想,採用1×1 conv 來保持空間維度的同時,降低深度,也就是降低通道數量,同時1×1 conv還可以爲你的網絡增強非線性。
2. 橫向的卷積核排列設計,使得多個不同size的卷積核能夠得到圖像當中不同cluster的信息 ,我們稱之爲“多尺度”。這樣融合了不同尺度的卷積以及池化,一個模塊一層就可以得到多個尺度的信息,下一階段也可以同時從不同尺度中提取的特徵,可以進行多維度特徵的融合,所以效果更好。把計算力拓寬,也避免了太深訓練梯度彌散的問題。
3. 對深度相對較大的網絡來說,梯度反向傳播能夠通過所有層的能力就會降低。文中指出:“在這個任務上,更淺網絡的強大性能表明網絡中部層產生的特徵應該是非常有識別力的”。通過將輔助分類器添加到這些中間層,可以提高較低階段分類器的判別力,這是在提供正則化的同時克服梯度消失問題。後面的實驗表明輔助網絡的影響相對較小(約0.5),只需要其中一個輔助分類器就能取得同樣的效果。
4. 較高層會捕獲較高的抽象特徵,其空間集中度會減少。這表明隨着網絡轉移到更高層,Inception架構中3×3和5×5卷積的比例應該會增加。而到最後一個卷積層出來的全連接,由全局平均池化替代了,減少了參數,節約了計算量。

我的思考

  Inception中爲什麼要加入池化呢?是因爲池化操作對於目前卷積網絡的成功至關重要,因此建議在每個Inception中添加一個並行池化,採用步長爲2的最大池化層將網絡分辨率減半,應該也應該具有額外的效果。
  論文中提到“Inception結構中所有的濾波器是學習到的”,怎麼理解?其實,Inception的作用是代替人工來確定卷積層中過濾器的類型,或者確定是否需要創建卷積層或池化層。Inception網絡不需要人爲決定使用哪個fliter,或者是否需要池化,而是由網絡自行確定(學習)這些參數,自行學習是否使用這些fliter或者池化,也就是說這些都是Hypeparameter。
  論文中提到了這樣一句話:max-pooling layers result in loss of accurate spatial information,作者也意識到了最大池化會導致某些精確的空間信息丟失,但是他在這裏僅僅提到了,沒有去深入思考,這讓我聯想到了最近的一個新模型,CapsNet,神經網絡提出者Hinton的新論文。其中的思想也很新穎,而且我對CapsNet能否與遷移學習相聯繫有着比較大的興趣,正在嘗試着跟從實驗室學長去研究。

  Google公司具有很多計算力超強的集羣,可以反覆驗證各種架構設計的優越性,所以GoogleNet整體架構的最終版,也就是論文中所呈現的,應該是一個非常好、很具有影響力的深層網絡架構。

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