天天看點

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

—— 原文釋出于本人的微信公衆号“大資料與人工智能Lab”(BigdataAILab),歡迎關注。

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

2014年,GoogLeNet和VGG是當年ImageNet挑戰賽(ILSVRC14)的雙雄,GoogLeNet獲得了第一名、VGG獲得了第二名,這兩類模型結構的共同特點是層次更深了。VGG繼承了LeNet以及AlexNet的一些架構結構(詳見  大話CNN經典模型:VGGNet),而GoogLeNet則做了更加大膽的網絡結構嘗試,雖然深度隻有22層,但大小卻比AlexNet和VGG小很多,GoogleNet參數為500萬個,AlexNet參數個數是GoogleNet的12倍,VGGNet參數又是AlexNet的3倍,是以在記憶體或計算資源有限時,GoogleNet是比較好的選擇;從模型結果來看,GoogLeNet的性能卻更加優越。

小知識:GoogLeNet是谷歌(Google)研究出來的深度網絡結構,為什麼不叫“GoogleNet”,而叫“GoogLeNet”,據說是為了向“LeNet”緻敬,是以取名為“GoogLeNet”

那麼,GoogLeNet是如何進一步提升性能的呢?

一般來說,提升網絡性能最直接的辦法就是增加網絡深度和寬度,深度指網絡層次數量、寬度指神經元數量。但這種方式存在以下問題:

(1)參數太多,如果訓練資料集有限,很容易産生過拟合;

(2)網絡越大、參數越多,計算複雜度越大,難以應用;

(3)網絡越深,容易出現梯度彌散問題(梯度越往後穿越容易消失),難以優化模型。

是以,有人調侃“深度學習”其實是“深度調參”。

解決這些問題的方法當然就是在增加網絡深度和寬度的同時減少參數,為了減少參數,自然就想到将全連接配接變成稀疏連接配接。但是在實作上,全連接配接變成稀疏連接配接後實際計算量并不會有質的提升,因為大部分硬體是針對密集矩陣計算優化的,稀疏矩陣雖然資料量少,但是計算所消耗的時間卻很難減少。

那麼,有沒有一種方法既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻表明可以将稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,就如人類的大腦是可以看做是神經元的重複堆積,是以,GoogLeNet團隊提出了Inception網絡結構,就是構造一種“基礎神經元”結構,來搭建一個稀疏性、高計算性能的網絡結構。

【問題來了】什麼是Inception呢?

Inception曆經了V1、V2、V3、V4等多個版本的發展,不斷趨于完善,下面一一進行介紹

一、Inception V1

通過設計一個稀疏網絡結構,但是能夠産生稠密的資料,既能增加神經網絡表現,又能保證計算資源的使用效率。谷歌提出了最原始Inception的基本結構:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

該結構将CNN中常用的卷積(1x1,3x3,5x5)、池化操作(3x3)堆疊在一起(卷積、池化後的尺寸相同,将通道相加),一方面增加了網絡的寬度,另一方面也增加了網絡對尺度的适應性。

網絡卷積層中的網絡能夠提取輸入的每一個細節資訊,同時5x5的濾波器也能夠覆寫大部分接受層的的輸入。還可以進行一個池化操作,以減少空間大小,降低過度拟合。在這些層之上,在每一個卷積層後都要做一個ReLU操作,以增加網絡的非線性特征。

然而這個Inception原始版本,所有的卷積核都在上一層的所有輸出上來做,而那個5x5的卷積核所需的計算量就太大了,造成了特征圖的厚度很大,為了避免這種情況,在3x3前、5x5前、max pooling後分别加上了1x1的卷積核,以起到了降低特征圖厚度的作用,這也就形成了Inception v1的網絡結構,如下圖所示:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

1x1的卷積核有什麼用呢?

1x1卷積的主要目的是為了減少次元,還用于修正線性激活(ReLU)。比如,上一層的輸出為100x100x128,經過具有256個通道的5x5卷積層之後(stride=1,pad=2),輸出資料為100x100x256,其中,卷積層的參數為128x5x5x256= 819200。而假如上一層輸出先經過具有32個通道的1x1卷積層,再經過具有256個輸出的5x5卷積層,那麼輸出資料仍為為100x100x256,但卷積參數量已經減少為128x1x1x32 + 32x5x5x256= 204800,大約減少了4倍。

基于Inception建構了GoogLeNet的網絡結構如下(共22層):

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

對上圖說明如下:

(1)GoogLeNet采用了子產品化的結構(Inception結構),友善增添和修改;

(2)網絡最後采用了average pooling(平均池化)來代替全連接配接層,該想法來自NIN(Network in Network),事實證明這樣可以将準确率提高0.6%。但是,實際在最後還是加了一個全連接配接層,主要是為了友善對輸出進行靈活調整;

(3)雖然移除了全連接配接,但是網絡中依然使用了Dropout ; 

(4)為了避免梯度消失,網絡額外增加了2個輔助的softmax用于向前傳導梯度(輔助分類器)。輔助分類器是将中間某一層的輸出用作分類,并按一個較小的權重(0.3)加到最終分類結果中,這樣相當于做了模型融合,同時給網絡增加了反向傳播的梯度信号,也提供了額外的正則化,對于整個網絡的訓練很有裨益。而在實際測試的時候,這兩個額外的softmax會被去掉。

GoogLeNet的網絡結構圖細節如下:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在3x3,5x5卷積操作之前使用了1x1卷積的數量。

GoogLeNet網絡結構明細表解析如下:

0、輸入

原始輸入圖像為224x224x3,且都進行了零均值化的預處理操作(圖像每個像素減去均值)。

1、第一層(卷積層)

使用7x7的卷積核(滑動步長2,padding為3),64通道,輸出為112x112x64,卷積後進行ReLU操作

經過3x3的max pooling(步長為2),輸出為((112 - 3+1)/2)+1=56,即56x56x64,再進行ReLU操作

2、第二層(卷積層)

使用3x3的卷積核(滑動步長為1,padding為1),192通道,輸出為56x56x192,卷積後進行ReLU操作

經過3x3的max pooling(步長為2),輸出為((56 - 3+1)/2)+1=28,即28x28x192,再進行ReLU操作

3a、第三層(Inception 3a層)

分為四個分支,采用不同尺度的卷積核來進行處理

(1)64個1x1的卷積核,然後RuLU,輸出28x28x64

(2)96個1x1的卷積核,作為3x3卷積核之前的降維,變成28x28x96,然後進行ReLU計算,再進行128個3x3的卷積(padding為1),輸出28x28x128

(3)16個1x1的卷積核,作為5x5卷積核之前的降維,變成28x28x16,進行ReLU計算後,再進行32個5x5的卷積(padding為2),輸出28x28x32

(4)pool層,使用3x3的核(padding為1),輸出28x28x192,然後進行32個1x1的卷積,輸出28x28x32。

将四個結果進行連接配接,對這四部分輸出結果的第三維并聯,即64+128+32+32=256,最終輸出28x28x256

3b、第三層(Inception 3b層)

(1)128個1x1的卷積核,然後RuLU,輸出28x28x128

(2)128個1x1的卷積核,作為3x3卷積核之前的降維,變成28x28x128,進行ReLU,再進行192個3x3的卷積(padding為1),輸出28x28x192

(3)32個1x1的卷積核,作為5x5卷積核之前的降維,變成28x28x32,進行ReLU計算後,再進行96個5x5的卷積(padding為2),輸出28x28x96

(4)pool層,使用3x3的核(padding為1),輸出28x28x256,然後進行64個1x1的卷積,輸出28x28x64。

将四個結果進行連接配接,對這四部分輸出結果的第三維并聯,即128+192+96+64=480,最終輸出輸出為28x28x480

第四層(4a,4b,4c,4d,4e)、第五層(5a,5b)……,與3a、3b類似,在此就不再重複。

從GoogLeNet的實驗結果來看,效果很明顯,差錯率比MSRA、VGG等模型都要低,對比結果如下表所示:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

二、Inception V2

GoogLeNet憑借其優秀的表現,得到了很多研究人員的學習和使用,是以GoogLeNet團隊又對其進行了進一步地發掘改進,産生了更新版本的GoogLeNet。

GoogLeNet設計的初衷就是要又準又快,而如果隻是單純的堆疊網絡雖然可以提高準确率,但是會導緻計算效率有明顯的下降,是以如何在不增加過多計算量的同時提高網絡的表達能力就成為了一個問題。

Inception V2版本的解決方案就是修改Inception的内部計算邏輯,提出了比較特殊的“卷積”計算結構。

1、卷積分解(Factorizing Convolutions)

大尺寸的卷積核可以帶來更大的感受野,但也意味着會産生更多的參數,比如5x5卷積核的參數有25個,3x3卷積核的參數有9個,前者是後者的25/9=2.78倍。是以,GoogLeNet團隊提出可以用2個連續的3x3卷積層組成的小網絡來代替單個的5x5卷積層,即在保持感受野範圍的同時又減少了參數量,如下圖:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

那麼這種替代方案會造成表達能力的下降嗎?通過大量實驗表明,并不會造成表達缺失。

可以看出,大卷積核完全可以由一系列的3x3卷積核來替代,那能不能再分解得更小一點呢?GoogLeNet團隊考慮了nx1的卷積核,如下圖所示,用3個3x1取代3x3卷積:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

是以,任意nxn的卷積都可以通過1xn卷積後接nx1卷積來替代。GoogLeNet團隊發現在網絡的前期使用這種分解效果并不好,在中度大小的特征圖(feature map)上使用效果才會更好(特征圖大小建議在12到20之間)。

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

2、降低特征圖大小

一般情況下,如果想讓圖像縮小,可以有如下兩種方式:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

先池化再作Inception卷積,或者先作Inception卷積再作池化。但是方法一(左圖)先作pooling(池化)會導緻特征表示遇到瓶頸(特征缺失),方法二(右圖)是正常的縮小,但計算量很大。為了同時保持特征表示且降低計算量,将網絡結構改為下圖,使用兩個并行化的子產品來降低計算量(卷積、池化并行執行,再進行合并)

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

使用Inception V2作改進版的GoogLeNet,網絡結構圖如下:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

注:上表中的Figure 5指沒有進化的Inception,Figure 6是指小卷積版的Inception(用3x3卷積核代替5x5卷積核),Figure 7是指不對稱版的Inception(用1xn、nx1卷積核代替nxn卷積核)。

經實驗,模型結果與舊的GoogleNet相比有較大提升,如下表所示:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

三、Inception V3

Inception V3一個最重要的改進是分解(Factorization),将7x7分解成兩個一維的卷積(1x7,7x1),3x3也是一樣(1x3,3x1),這樣的好處,既可以加速計算,又可以将1個卷積拆成2個卷積,使得網絡深度進一步增加,增加了網絡的非線性(每增加一層都要進行ReLU)。

另外,網絡輸入從224x224變為了299x299。

四、Inception V4

Inception V4研究了Inception子產品與殘差連接配接的結合。ResNet結構大大地加深了網絡深度,還極大地提升了訓練速度,同時性能也有提升(ResNet的技術原理介紹見本部落格之前的文章:大話深度殘差網絡ResNet)。

Inception V4主要利用殘差連接配接(Residual Connection)來改進V3結構,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4網絡。

ResNet的殘差結構如下:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

将該結構與Inception相結合,變成下圖:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

通過20個類似的子產品組合,Inception-ResNet建構如下:

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

牆裂建議

2014至2016年,GoogLeNet團隊發表了多篇關于GoogLeNet的經典論文《Going deeper with convolutions》、《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》、《Rethinking the Inception Architecture for Computer Vision》、《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》,在這些論文中對Inception v1、Inception v2、Inception v3、Inception v4 等思想和技術原理進行了詳細的介紹,建議閱讀這些論文以全面了解GoogLeNet。

關注本人公衆号“大資料與人工智能Lab”(BigdataAILab),然後回複“論文”關鍵字可線上閱讀這篇經典論文的内容。

大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進)

推薦相關閱讀

  • 大話卷積神經網絡(CNN)
  • 大話循環神經網絡(RNN)
  • 大話深度殘差網絡(DRN)
  • 大話深度信念網絡(DBN)
  • 大話CNN經典模型:LeNet
  • 大話CNN經典模型:AlexNet
  • 大話CNN經典模型:VGGNet
  • 深度學習中常用的激勵函數

繼續閱讀