InceptionV1 論文原文:Going deeper with convolutions 中英文對照
InceptionBN 論文原文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 中英文對照
InceptionV2/V3 論文原文:Rethinking the Inception Architecture for Computer Vision 中英文對照
InceptionV4 論文原文: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learnin
本文介紹的是著名的網絡結構GoogLeNet及其延伸版本,目的是試圖領會其中的思想而不是單純關注結構。本文大量參考該博客 和 GoogleNet詳解,感謝。
Notes
- Inception V1
- Motivation
- Architectural details
- GoogLeNet
- Auxililary Classifier
- Conclusion
- Inception BN
- Motivation
- BN
- Architectural Details
- Conclusion
- Inception V2、V3
- Inception V4
## GoogLeNet Inception V1
【Motivation】
一般來說,提升網絡性能最直接的辦法就是增加網絡深度和寬度,或者增加核的數量,但這也意味着巨量的參數。但這種方式存在着明顯的問題:
(1)參數太多,如果訓練數據集有限,很容易產生過擬合;
(2)網絡越大、參數越多,計算復雜度越大,難以應用,尤其是W中含有大量0的情況下,造成資源的浪費;
(3)網絡越深,容易出現梯度彌散問題,難以優化模型。(ReLU不解決梯度彌散的問題,只延緩)
解決這些問題的方法當然就是在增加網絡深度和寬度的同時減少參數,為了減少參數,自然就想到將全連接甚至一般的卷積變成稀疏連接。但是在實現上,全連接變成稀疏連接后實際計算量並不會有質的提升,因為大部分硬件是針對密集矩陣計算優化的,稀疏矩陣雖然數據量少,但是計算所消耗的時間卻很難減少。這就代表着,我們要尋找一個方法,既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。
大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能。因此,GoogLeNet團隊提出了Inception網絡結構,就是構造一種“基礎神經元”結構,來搭建一個稀疏性、高計算性能的網絡結構。
【Architectural Details】
Inception 結構的主要思路是怎樣用密集成分來近似最優的局部稀疏結構,下圖為原始的Inception結構:
該結構將CNN中常用的卷積(1x1,3x3,5x5)、池化操作(3x3)堆疊在一起,一方面增加了網絡的寬度,另一方面也增加了網絡對尺度的適應性。具體來看,對Inception做如下的解釋:
1 . 采用不同大小的卷積核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2 . 之所以卷積核大小采用1、3和5,主要是為了方便對齊。設定卷積步長stride=1之后,只要分別設定padding=0、1、2,那么卷積之后便可以得到相同維度的特征,然后這些特征就可以直接拼接在一起了;
3 . 文章說很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
4 . 網絡越到后面,特征越抽象,而且每個特征所涉及的感受野也更大了,因此隨着層數的增加,3x3和5x5卷積的比例也要增加。
但是,這種疊加不可避免的使得Inception
模塊的輸出通道數增加,這就增加了Inception
模塊中每個卷積的計算量。因此在經過若干個模塊之后,計算量會爆炸性增長。為此采用1×1卷積核來進行降維,改進后的Inception Module如下:
值得注意的是:
1x1
卷積是在最大池化層之后,而不是之前。這是因為:池化層是為了提取圖像的原始特征,一旦它接在1x1
卷積之后就失去了最初的本意。1x1
卷積在3x3
、5x5
卷積之前。這是因為:如果1x1
卷積在它們之后,則3x3
卷積、5x5
卷積的輸入通道數太大,導致計算量仍然巨大。
為了方便理解它是如何有效的,我們舉下述的例子:
【GoogLeNet】
在GoogLeNet中,借鑒了AlexNet和VGG的stack(repeat)策略,將Inception單元重復串聯起來,構成基本的特征提取結構。
InceptionNet V1
是一個22層的深度網絡。 如果考慮池化層,則有29層。如下圖中的depth
列所示。
網絡具有三組Inception
模塊,分別為:inception(3a)/inception(3b)
、inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)
、inception(5a)、inception(5b)
。三組Inception
模塊被池化層分隔。
對上圖說明如下:
(1)GoogLeNet采用了模塊化的結構(Inception結構),方便增添和修改;
(2)網絡最后采用了average pooling來代替全連接層,該想法來自NIN(Network in Network),事實證明這樣可以將准確率提高0.6%。但是,實際在最后還是加了一個全連接層,主要是為了方便對輸出進行靈活調整;
(3)雖然移除了全連接,但是網絡中依然使用了Dropout ; (在avg pooling之后,FC之前)
(4)為了緩解梯度消失,網絡額外增加了2個輔助的softmax用於向前傳導梯度(輔助分類器Auxililary Classifier)。輔助分類器是將中間某一層的輸出用作分類,並按一個較小的權重(0.3)加到最終分類結果中,這樣相當於做了模型融合,同時給網絡增加了反向傳播的梯度信號。
原始輸入的圖像為224×224×3,接下來的是對各層進行更細致的解釋:
接下來就以第一層(卷積層)和第三層(Inception 3a層)為例進行詳細的解釋。
【Auxililary Classifier】
- 為了緩解梯度消失的問題,
InceptionNet V1
給出了兩個輔助分類器。這兩個輔助分類器被添加到網絡的中間層,它們和主分類器共享同一套訓練數據及其標記。其中:- 第一個輔助分類器位於
Inception(4a)
之后,Inception(4a)
模塊的輸出作為它的輸入。 - 第二個輔助分類器位於
Inception(4d)
之后,Inception(4d)
模塊的輸出作為它的輸入。 - 兩個輔助分類器的結構相同,包括以下組件:
- 一個尺寸為
5x5
、步長為3
的平均池化層。 - 一個尺寸為
1x1
、輸出通道數為128
的卷積層。 - 一個具有
1024
個單元的全連接層。 - 一個
drop rate = 70%
的dropout
層。 - 一個使用
softmax
損失的線性層作為輸出層。
- 一個尺寸為
- 第一個輔助分類器位於
- 在訓練期間,兩個輔助分類器的損失函數的權重是0.3,它們的損失被疊加到網絡的整體損失上。在推斷期間,這兩個輔助網絡被丟棄。
在
Inception v3
的實驗中表明:輔助網絡的影響相對較小,只需要其中一個就能夠取得同樣的效果。事實上輔助分類器在訓練早期並沒有多少貢獻。只有在訓練接近結束,輔助分支網絡開始發揮作用,獲得超出無輔助分類器網絡的結果。
- 兩個輔助分類器的作用:提供正則化的同時,克服了梯度消失問題。
【Conclusion】
Inception v1 有 22 層,但只有 500w 的參數量,是 AlexNet 的 1/12。為什么要減少參數量?一是因為參數越多,需要喂給模型的數據量就越大,二是因為參數越多,耗費的計算資源就越大。
InceptionNet 為什么參數少而且效果好?一是因為用平均池化層代替了最后的全連接層,二是因為上面解釋的 Inception Module 的作用。
## GoogleNet InceptionBN
關鍵點:優化策略:BN、用兩個3x3代替一個5x5、LRN是不必要的。
【Motivation】
存在Internal Covariate Shift現象(協方差偏移,參考天雨粟)
- 當底層網絡中參數發生微弱變化時,由於每一層中的線性變換與非線性激活映射,這些微弱變化隨着網絡層數的加深而被放大(類似蝴蝶效應);
- 參數的變化導致每一層的輸入分布會發生改變,進而上層的網絡需要不停地去適應這些分布變化,使得我們的模型訓練變得困難。
- 較規范的定義:在深層網絡訓練的過程中,由於網絡中參數變化而引起內部結點數據分布發生變化的這一過程被稱作Internal Covariate Shift。
Internal Covariate Shift的存在會使得 網絡的學習速率降低、網絡陷入梯度飽和區,網絡收斂速率減緩。
解決辦法:引入Batch Normalization,作為深度網絡模型的一個層,每次先對input數據進行歸一化,再送入神經網絡輸入層。
【Batch Normalization】
關於BN,論文看的我十分鬧心,因為數學的底子太差,很多知識不熟悉。這里推薦莫煩的講解視頻,和這個博客來解釋什么是BN,用一句話總結就是
批處理就是 對於每個隱層神經元,把 逐漸向非線性函數映射后向取值區間極限飽和區靠攏的輸入分布 強制拉回到 均值為0方差為1的比較標准的正態分布 ,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。
- Batch normalization實現:轉自 <深度學習優化策略-1>Batch Normalization(BN)
1、使網絡某一層的輸入樣本做白化處理(最后發現等價於零均值化(Normalization)處理,擁有零均值,方差為1),輸入樣本之間不相關。通過零均值化每一層的輸入,使每一層擁有服從相同分布的輸入樣本,因此克服內部協方差偏移的影響。
E(X)是輸入樣本X的期望,Var是輸入樣本X的方差。注意,對於一個d維的輸入樣本X=(x1,x2,....xd),要對某一層所有的維度一起進行零均值化處理,計算量大,且部分地方不可導,因此,這里的是針對每個維度k分別處理。
2、數據簡化:輸入樣本X規模可能上億,直接計算幾乎是不可能的。因此,選擇每個batch來進行Normalization,得出Batch Normalization(BN)的處理方式:
從上圖可以看出,因為簡單的對數據進行normalize處理會降低,把數據限制在[0,1]的范圍內,對於型激活函數來說,只使用了其線性部分,會限制模型的表達能力。所以,還需要對normalize之后的進行變換:
r和B做為參數,可以通過網絡訓練學到。
3、BN的參數求導:輸入樣本進行變換之后,要進行梯度反向傳播,就必須計算BN各個參數的梯度,梯度計算公式如下:
可見,通過BN對輸入樣本進行變換是可導的,不會對梯度反向傳播造成影響。
4、為了加快訓練,我們在模型訓練階段使用BN,但是在推理階段並不一定要使用。訓練一個BN網絡完整的流程:
關於具體實現,可以參考 機器不學習的專欄,實現的很具體
【Architectural details】
-
InceptionBN
的主要貢獻是提出了Batch Normalization
。論文指出,使用了Batch Normalization
之后:- BN 減少了內部協方差,提高了梯度在網絡中的流動,加速了網絡的訓練。
- 減少梯度對參數大小或初始值的依賴,使網絡在使用較大學習速率訓練網絡參數時,也不會出現參數發散的情況。
- 正則化模型,減少模型對dropout,careful weight initialnization依賴
- 網絡具有更好的泛化能力。
-
InceptionBN
網絡訓練的技巧有:- 使用更高的學習率。
- 刪除
dropout
層、LRN
層。 - 減小
L2
正則化的系數。 - 更快的衰減學習率。學習率以指數形式衰減。
- 更徹底的混洗訓練樣本,使得一組樣本在不同的
epoch
中處於不同的mini batch
中。 - 減少圖片的形變。
-
InceptionBN
的網絡結構比Inception v1
有少量改動:-
5x5
卷積被兩個3x3
卷積替代。這使得網絡的最大深度增加了 9 層,同時網絡參數數量增加 25%,計算量增加 30%。 -
28x28
的inception
模塊從2個增加到3個。 - 在
inception
模塊中,有的采用最大池化,有的采用平均池化。 - 在
inception
模塊之間取消了用作連接的池化層。 -
inception(3c),inception(4e)
的子層采用步長為 2 的卷積/池化。
Pool+proj
列給出了inception
中的池化操作。avg+32
意義為:平均池化層后接一個尺寸1x1
、輸出通道32
的卷積層。max+pass through
意義為:最大池化層后接一個尺寸1x1
、輸出通道數等於輸入通道數的卷積層。
-
【Conclusion】
總的來說,BN通過將每一層網絡的輸入進行normalization,保證輸入分布的均值與方差固定在一定范圍內,減少了網絡中的Internal Covariate Shift問題,並在一定程度上緩解了梯度消失,加速了模型收斂;並且BN使得網絡對參數、激活函數更加具有魯棒性,降低了神經網絡模型訓練和調參的復雜度;最后BN訓練過程中由於使用mini-batch的mean/variance作為總體樣本統計量估計,引入了隨機噪聲,在一定程度上對模型起到了正則化的效果。