GoogLeNet 解讀

GoogLeNet系列解讀

 版權聲明:本文爲博主原創文章,轉載請註明出處 https://blog.csdn.net/shuzfan/article/details/50738394

本文介紹的是著名的網絡結構GoogLeNet及其延伸版本,目的是試圖領會其中的思想而不是單純關注結構。算法

 

 

GoogLeNet Incepetion V1

這是GoogLeNet的最先版本,出如今2014年的《Going deeper with convolutions》。之因此名爲「GoogLeNet」而非「GoogleNet」,文章說是爲了向早期的LeNet致敬。markdown

Motivation

深度學習以及神經網絡快速發展,人們再也不只關注更給力的硬件、更大的數據集、更大的模型,而是更在乎新的idea、新的算法以及模型的改進。網絡

通常來講,提高網絡性能最直接的辦法就是增長網絡深度和寬度,這也就意味着巨量的參數。可是,巨量參數容易產生過擬合也會大大增長計算量。ide

文章認爲解決上述兩個缺點的根本方法是將全鏈接甚至通常的卷積都轉化爲稀疏鏈接。一方面現實生物神經系統的鏈接也是稀疏的,另外一方面有文獻1代表:對於大規模稀疏的神經網絡,能夠經過分析激活值的統計特性和對高度相關的輸出進行聚類來逐層構建出一個最優網絡。這點代表臃腫的稀疏網絡可能被不失性能地簡化。 雖然數學證實有着嚴格的條件限制,但Hebbian準則有力地支持了這一點:fire together,wire together。模塊化

早些的時候,爲了打破網絡對稱性和提升學習能力,傳統的網絡都使用了隨機稀疏鏈接。可是,計算機軟硬件對非均勻稀疏數據的計算效率不好,因此在AlexNet中又從新啓用了全鏈接層,目的是爲了更好地優化並行運算。post

因此,如今的問題是有沒有一種方法,既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻代表能夠將稀疏矩陣聚類爲較爲密集的子矩陣來提升計算性能,據此論文提出了名爲Inception 的結構來實現此目的。性能

Architectural Details

Inception 結構的主要思路是怎樣用密集成分來近似最優的局部稀疏結構。 
做者首先提出下圖這樣的基本結構: 
這裏寫圖片描述 
對上圖作如下說明: 
1 . 採用不一樣大小的卷積核意味着不一樣大小的感覺野,最後拼接意味着不一樣尺度特徵的融合; 
2 . 之因此卷積核大小採用一、3和5,主要是爲了方便對齊。設定卷積步長stride=1以後,只要分別設定pad=0、一、2,那麼卷積以後即可以獲得相同維度的特徵,而後這些特徵就能夠直接拼接在一塊兒了; 
3 . 文章說不少地方都代表pooling挺有效,因此Inception裏面也嵌入了。 
4 . 網絡越到後面,特徵越抽象,並且每一個特徵所涉及的感覺野也更大了,所以隨着層數的增長,3x3和5x5卷積的比例也要增長。學習

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

具體改進後的Inception Module以下圖: 
這裏寫圖片描述優化

GoogLeNet

GoogLeNet的總體結構以下圖:

這裏寫圖片描述

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

下圖是一個比較清晰的結構圖:

這裏寫圖片描述

Conclusion

GoogLeNet是谷歌團隊爲了參加ILSVRC 2014比賽而精心準備的,爲了達到最佳的性能,除了使用上述的網絡結構外,還作了大量的輔助工做:包括訓練多個model求平均、裁剪不一樣尺度的圖像作屢次驗證等等。詳細的這些能夠參看文章的實驗部分。

本文的主要想法實際上是想經過構建密集的塊結構來近似最優的稀疏結構,從而達到提升性能而又不大量增長計算量的目的。GoogleNet的caffemodel大小約50M,但性能卻很優異。

GoogLeNet Inception V2

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

Introduction

14年以來,構建更深的網絡逐漸成爲主流,可是模型的變大也使計算效率愈來愈低。這裏,文章試圖找到一種方法在擴大網絡的同時又儘量地發揮計算性能。

首先,GoogLeNet V1出現的同期,性能與之接近的大概只有VGGNet了,而且兩者在圖像分類以外的不少領域都獲得了成功的應用。可是相比之下,GoogLeNet的計算效率明顯高於VGGNet,大約只有500萬參數,只至關於Alexnet的1/12(GoogLeNet的caffemodel大約50M,VGGNet的caffemodel則要超過600M)。

GoogLeNet的表現很好,可是,若是想要經過簡單地放大Inception結構來構建更大的網絡,則會當即提升計算消耗。此外,在V1版本中,文章也沒給出有關構建Inception結構注意事項的清晰描述。所以,在文章中做者首先給出了一些已經被證實有效的用於放大網絡的通用準則和優化方法。這些準則和方法適用但不侷限於Inception結構。

General Design Principles

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

1 . 避免表達瓶頸,特別是在網絡靠前的地方。 信息流前向傳播過程當中顯然不能通過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,可是不能一會兒就變得很小。好比你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。 
另外輸出的維度channel,通常來講會逐漸增多(每層的num_output),不然網絡會很難訓練。(特徵維度並不表明信息的多少,只是做爲一種估計的手段)

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

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

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

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

Factorizing Convolutions with Large Filter Size

大尺寸的卷積核能夠帶來更大的感覺野,但也意味着更多的參數,好比5x5卷積核參數是3x3卷積核的25/9=2.78倍。爲此,做者提出能夠用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,(保持感覺野範圍的同時又減小了參數量)以下圖: 
這裏寫圖片描述 
而後就會有2個疑問:

1 . 這種替代會形成表達能力的降低嗎? 
後面有大量實驗能夠代表不會形成表達缺失;

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

從上面來看,大卷積核徹底能夠由一系列的3x3卷積核來替代,那能不能分解的更小一點呢。文章考慮了 nx1 卷積核。 
以下圖所示的取代3x3卷積: 
這裏寫圖片描述

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

總結以下圖:

這裏寫圖片描述

(1) 圖4是GoogLeNet V1中使用的Inception結構;

(2) 圖5是用3x3卷積序列來代替大卷積核;

(3) 圖6是用nx1卷積來代替大卷積核,這裏設定n=7來應對17x17大小的feature map。該結構被正式用在GoogLeNet V2中。

未完待續


  1. Sanjeev Arora, Aditya Bhaskara, Rong Ge, and Tengyu Ma. Provable bounds for learning some deep representations. CoRR, abs/1310.6343, 2013. 
相關文章
相關標籤/搜索