1. 程式人生 > >GoogLeNet系列解讀

GoogLeNet系列解讀

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

GoogLeNet Incepetion V1

這是GoogLeNet的最早版本,出現在2014年的《Going deeper with convolutions》。之所以名為“GoogLeNet”而非“GoogleNet”,文章說是為了向早期的LeNet致敬。

Motivation

深度學習以及神經網路快速發展,人們不再只關注更給力的硬體、更大的資料集、更大的模型,而是更在意新的idea、新的演算法以及模型的改進。

一般來說,提升網路效能最直接的辦法就是增加網路深度和寬度,這也就意味著巨量的引數。但是,巨量引數容易產生過擬合

也會大大增加計算量

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

早些的時候,為了打破網路對稱性和提高學習能力,傳統的網路都使用了隨機稀疏連線。但是,計算機軟硬體對非均勻稀疏資料的計算效率很差,所以在AlexNet中又重新啟用了全連線層,目的是為了更好地優化並行運算。

所以,現在的問題是有沒有一種方法,既能保持網路結構的稀疏性,又能利用密集矩陣的高計算效能。大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算效能,據此論文提出了名為Inception 的結構來實現此目的。

Architectural Details

Inception 結構的主要思路是怎樣用密整合分來近似最優的區域性稀疏結構。
作者首先提出下圖這樣的基本結構:
這裡寫圖片描述
對上圖做以下說明:
1 . 採用不同大小的卷積核意味著不同大小的感受野,最後拼接意味著不同尺度特徵的融合;
2 . 之所以卷積核大小採用1、3和5,主要是為了方便對齊。設定卷積步長stride=1之後,只要分別設定pad=0、1、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.
  2. Min Lin, Qiang Chen, and Shuicheng Yan. Network in network. CoRR, abs/1312.4400, 2013.