大話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歷經了V一、V二、V三、V4等多個版本的發展,不斷趨於完善,下面一一進行介紹ide

1、Inception V1
經過設計一個稀疏網絡結構,可是可以產生稠密的數據,既能增長神經網絡表現,又能保證計算資源的使用效率。谷歌提出了最原始Inception的基本結構:
 
該結構將CNN中經常使用的卷積(1x1,3x3,5x5)、池化操做(3x3)堆疊在一塊兒(卷積、池化後的尺寸相同,將通道相加),一方面增長了網絡的寬度,另外一方面也增長了網絡對尺度的適應性。
網絡卷積層中的網絡可以提取輸入的每個細節信息,同時5x5的濾波器也可以覆蓋大部分接受層的的輸入。還能夠進行一個池化操做,以減小空間大小,下降過分擬合。在這些層之上,在每個卷積層後都要作一個ReLU操做,以增長網絡的非線性特徵。
然而這個Inception原始版本,全部的卷積核都在上一層的全部輸出上來作,而那個5x5的卷積核所需的計算量就太大了,形成了特徵圖的厚度很大,爲了不這種狀況,在3x3前、5x5前、max pooling後分別加上了1x1的卷積核,以起到了下降特徵圖厚度的做用,這也就造成了Inception v1的網絡結構,以下圖所示:模塊化

1x1的卷積核有什麼用呢?
1x1卷積的主要目的是爲了減小維度,還用於修正線性激活(ReLU)。好比,上一層的輸出爲100x100x128,通過具備256個通道的5x5卷積層以後(stride=1,pad=2),輸出數據爲100x100x256,其中,卷積層的參數爲128x5x5x256= 819200。而假如上一層輸出先通過具備32個通道的1x1卷積層,再通過具備256個輸出的5x5卷積層,那麼輸出數據仍爲爲100x100x256,但卷積參數量已經減小爲128x1x1x32 + 32x5x5x256= 204800,大約減小了4倍。oop

基於Inception構建了GoogLeNet的網絡結構以下(共22層):性能

對上圖說明以下:
(1)GoogLeNet採用了模塊化的結構(Inception結構),方便增添和修改;
(2)網絡最後採用了average pooling(平均池化)來代替全鏈接層,該想法來自NIN(Network in Network),事實證實這樣能夠將準確率提升0.6%。可是,實際在最後仍是加了一個全鏈接層,主要是爲了方便對輸出進行靈活調整;
(3)雖然移除了全鏈接,可是網絡中依然使用了Dropout ; 
(4)爲了不梯度消失,網絡額外增長了2個輔助的softmax用於向前傳導梯度(輔助分類器)。輔助分類器是將中間某一層的輸出用做分類,並按一個較小的權重(0.3)加到最終分類結果中,這樣至關於作了模型融合,同時給網絡增長了反向傳播的梯度信號,也提供了額外的正則化,對於整個網絡的訓練頗有裨益。而在實際測試的時候,這兩個額外的softmax會被去掉。學習

GoogLeNet的網絡結構圖細節以下:
 
注:上表中的「#3x3 reduce」,「#5x5 reduce」表示在3x3,5x5卷積操做以前使用了1x1卷積的數量。測試

GoogLeNet網絡結構明細表解析以下:
0、輸入
原始輸入圖像爲224x224x3,且都進行了零均值化的預處理操做(圖像每一個像素減去均值)。
一、第一層(卷積層)
使用7x7的卷積核(滑動步長2,padding爲3),64通道,輸出爲112x112x64,卷積後進行ReLU操做
通過3x3的max pooling(步長爲2),輸出爲((112 - 3+1)/2)+1=56,即56x56x64,再進行ReLU操做
二、第二層(卷積層)
使用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等模型都要低,對比結果以下表所示:

2、Inception V2
GoogLeNet憑藉其優秀的表現,獲得了不少研究人員的學習和使用,所以GoogLeNet團隊又對其進行了進一步地發掘改進,產生了升級版本的GoogLeNet。
GoogLeNet設計的初衷就是要又準又快,而若是隻是單純的堆疊網絡雖然能夠提升準確率,可是會致使計算效率有明顯的降低,因此如何在不增長過多計算量的同時提升網絡的表達能力就成爲了一個問題。
Inception V2版本的解決方案就是修改Inception的內部計算邏輯,提出了比較特殊的「卷積」計算結構。

一、卷積分解(Factorizing Convolutions)
大尺寸的卷積核能夠帶來更大的感覺野,但也意味着會產生更多的參數,好比5x5卷積核的參數有25個,3x3卷積核的參數有9個,前者是後者的25/9=2.78倍。所以,GoogLeNet團隊提出能夠用2個連續的3x3卷積層組成的小網絡來代替單個的5x5卷積層,即在保持感覺野範圍的同時又減小了參數量,以下圖:
 
那麼這種替代方案會形成表達能力的降低嗎?經過大量實驗代表,並不會形成表達缺失。
能夠看出,大卷積核徹底能夠由一系列的3x3卷積核來替代,那能不能再分解得更小一點呢?GoogLeNet團隊考慮了nx1的卷積核,以下圖所示,用3個3x1取代3x3卷積:
 
所以,任意nxn的卷積均可以經過1xn卷積後接nx1卷積來替代。GoogLeNet團隊發如今網絡的前期使用這種分解效果並很差,在中度大小的特徵圖(feature map)上使用效果纔會更好(特徵圖大小建議在12到20之間)。

二、下降特徵圖大小
通常狀況下,若是想讓圖像縮小,能夠有以下兩種方式:
 
先池化再做Inception卷積,或者先做Inception卷積再做池化。可是方法一(左圖)先做pooling(池化)會致使特徵表示遇到瓶頸(特徵缺失),方法二(右圖)是正常的縮小,但計算量很大。爲了同時保持特徵表示且下降計算量,將網絡結構改成下圖,使用兩個並行化的模塊來下降計算量(卷積、池化並行執行,再進行合併)

使用Inception V2做改進版的GoogLeNet,網絡結構圖以下:
 
注:上表中的Figure 5指沒有進化的Inception,Figure 6是指小卷積版的Inception(用3x3卷積核代替5x5卷積核),Figure 7是指不對稱版的Inception(用1xn、nx1卷積核代替nxn卷積核)。

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

3、Inception V3
Inception V3一個最重要的改進是分解(Factorization),將7x7分解成兩個一維的卷積(1x7,7x1),3x3也是同樣(1x3,3x1),這樣的好處,既能夠加速計算,又能夠將1個卷積拆成2個卷積,使得網絡深度進一步增長,增長了網絡的非線性(每增長一層都要進行ReLU)。
另外,網絡輸入從224x224變爲了299x299。

4、Inception V4
Inception V4研究了Inception模塊與殘差鏈接的結合。ResNet結構大大地加深了網絡深度,還極大地提高了訓練速度,同時性能也有提高(ResNet的技術原理介紹見本博客以前的文章:大話深度殘差網絡ResNet)。
Inception V4主要利用殘差鏈接(Residual Connection)來改進V3結構,獲得Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4網絡。
ResNet的殘差結構以下:
 
將該結構與Inception相結合,變成下圖:
 
經過20個相似的模塊組合,Inception-ResNet構建以下:

 

牆裂建議

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 v一、Inception v二、Inception v三、Inception v4 等思想和技術原理進行了詳細的介紹,建議閱讀這些論文以全面瞭解GoogLeNet。

關注本人公衆號「大數據與人工智能Lab」(BigdataAILab),而後回覆「論文」關鍵字可在線閱讀這篇經典論文的內容

 

推薦相關閱讀

相關文章
相關標籤/搜索