文章目錄
- 概述
- NiN對Inception的啟發
- Inception v1
- Inception v2
- Inception v3
- Inception v4
- Xception
- 總結回顧
概述
(一)Inception結構的來源與演變
Inception(盜夢空間結構)是經典模型GoogLeNet中最核心的子網路結構,GoogLeNet是Google團隊提出的一種神經網路模型,并在2014年ImageNet挑戰賽(ILSVRC14)上獲得了冠軍,關于GoogLeNet模型詳細介紹,可以參考博主的另一篇博客 GoogLeNet網路詳解與模型搭建GoogLeNet網路詳解與模型搭建,Google團隊在隨后2年里不斷改進,相繼提出了v1-v4和xcpetion結構,本文對系列模型進行詳細介紹,
2014-2016年,谷歌實驗室發表了多篇系列經典論文,充實了Inception結構和GoogLeNet模型:
Inception v1(GoogLeNet, 2014) --> Inception v2(BN-Inception) --> Inception v3 --> Inception v4(Inception-ResNet) --> Xception(2016)
- GoogLeNet:《Going deeper with convolutions》, 2014.09
- BN:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》, 2015.02
- Inception v3:《Rethinking the Inception Architecture for Computer Vision》, 2015.12
- Inception v4:《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》, 2016.02
- Xception:《Xception: Deep Learning with Depthwise Separable Convolutions》, 2016.10
(二)什么是Inception結構?
Inception就是將多個卷積或池化操作放在一起組裝成一個網路模塊,設計神經網路時,以模塊為單位去組裝整個網路結構,Inception結構設計了一個稀疏網路結構,但是能夠產生稠密的資料,既能增加神經網路表現,又能保證計算資源的使用效率,

在GoogLeNet之前的網路中,一層一般只使用一種操作(單個卷積或池化),一層只使用一個操作的弊端是提取出來的特征往往過于單調,在實際情況中,由于影像的不同尺度等原因,需要不同程度的下采樣,或者說不同大小的卷積核,我們希望網路代替人手工自己決定到底使用 1 × 1 1\times1 1×1, 3 × 3 3\times3 3×3, 5 × 5 5\times5 5×5以及是否需要max_pooling層,由網路自動去尋找適合的結構,并且節省計算提取更為豐富的特征,Inception結構正好滿足了這樣的需求,因而獲得了更好的表現,
(三)為什么要提出Inception結構?
The most straightforward way of improving the performance of deep neural networks is by increasing their size. This includes both increasing the depth – the number of levels – of the network and its width: the number of units at each level. This is as an easy and safe way of training higher quality models, especially given the availability of a large amount of labeled training data. However this simple solution comes with two major drawbacks.
Bigger size typically means a larger number of parameters, which makes the enlarged network more prone to over?tting, especially if the number of labeled examples in the training set is limited.
Another drawback of uniformly increased network size is the dramatically increased use of computational resources.
The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions.
? 《Going deeper with convolutions》
文章提出,提升網路性能最直接的辦法就是增加網路深度和寬度,深度指網路層次數量、寬度指神經元數量,但這種方式存在以下問題:
- 引數太多,如果訓練資料集有限,很容易產生過擬合;
- 網路越大、引數越多,計算復雜度越大,難以應用;
- 網路越深,容易出現梯度彌散問題(梯度越往后穿越容易消失),難以優化模型,
為了解決提出的問題,就要在增加網路深度和寬度的同時減少引數,減少引數自然就想到將全連接變成稀疏連接,但是在實作上,全連接變成稀疏連接后實際計算量并不會有質的提升,因為大部分硬體是針對密集矩陣計算優化的,稀疏矩陣雖然資料量少,但是計算所消耗的時間卻很難減少,
那么,有沒有一種方法既能保持網路結構的稀疏性,又能利用密集矩陣的高計算性能,大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,就如人類的大腦是可以看做是神經元的重復堆積,因此,GoogLeNet團隊提出了Inception網路結構,就是構造一種“基礎神經元”結構,來搭建一個稀疏性、高計算性能的網路結構,
NiN對Inception的啟發
Network In Network (NIN)是由 M i n L i n Min Lin MinLin等人于2014年提出,其網路結構中通過引入子網路結構代替純卷積中的線性映射部分(NiN模型的詳細介紹可參考博主的另一篇博客 NiN網路詳解),這種形式的網路結構激發了更復雜的卷積神經網路的結構設計,Inception結構就是來源于這個思想,從上文圖中的native inception結構中可以看出,在相鄰的上下2層之間添加多個卷積核池化的并行操作可以提高模型的非線性表達能力,
除此之外,NiN網路中的MLPConv層則提供了 1 × 1 1\times1 1×1卷積的思路, 1 × 1 1\times1 1×1卷積不僅可以對通道數進行升降維,顯著降低引數量,還可以實作資訊的跨通道互動與整合,下面理解一下 1 × 1 1\times1 1×1卷積程序👇

上圖程序為輸入大小為 56 × 56 × 3 56\times56\times3 56×56×3的feature map,通過3個 1 × 1 × 3 1\times1\times3 1×1×3卷積核,輸出大小為 56 × 56 × 1 56\times56\times1 56×56×1的feature map的卷積程序,當然,以上程序也可以看作是對三個通道進行了線性組合,這幾個卷積核可以看成就是一個簡單的神經元結構,每個神經元引數數量與前面的通道數量相等,通常在卷積之后會加入非線性激活函式,在這里之后加入激活函式,就可以理解成一個簡單的MLP網路了,
那么 1 × 1 1\times1 1×1卷積如何實作通道數的改變和降低模型引數的呢?
相信大家在看完下文Inception v1與native inception結構的對比后就會發現答案,
Inception v1
下圖中展示了原始Inception(native inception)結構和GoogLeNet中使用的Inception v1結構,使用Inception v1 Module的GoogleNet不僅比Alex深,而且引數比AlexNet足足減少了12倍,網路大小約是VGGNet的1/20,

GoogleNet作者的初始想法是用多個不同型別的卷積核( 1 × 1 1\times1 1×1, 3 × 3 3\times3 3×3, 5 × 5 5\times5 5×5, 3 × 3 P o o l 3\times3Pool 3×3Pool)堆疊在一起(卷積、池化后的尺寸相同,將通道相加)代替一個3x3的小卷積核(如左圖),好處是可以使提取出來的特征具有多樣化,并且特征之間的co-relationship不會很大,最后用把feature map都concatenate起來使網路做得很寬,然后堆疊Inception Module將網路變深,但僅僅簡單這么做會使一層的計算量爆炸式增長,
native inception中所有的卷積核都在上一層的所有輸出上來做,而那個5x5的卷積核所需的計算量就太大了,造成了特征圖的厚度很大,為了避免這種情況,在3x3前、5x5前、max pooling后分別加上了1x1的卷積核,以起到了降低特征圖厚度的作用,這也就形成了Inception v1的網路結構(右圖),
假設input feature map的size為 28 × 28 × 256 28\times28\times256 28×28×256,output feature map的size為 28 × 28 × 480 28\times28\times480 28×28×480,則native Inception Module的計算量有854M,計算程序如下

從上圖可以看出,計算量主要來自高維卷積核的卷積操作,因而在每一個卷積前先使用 1 × 1 1\times1 1×1卷積核將輸入圖片的feature map維度先降低,進行資訊壓縮,在使用3x3卷積核進行特征提取運算,相同情況下,Inception v1的計算量僅為358M,

Inception v1結構總共有4個分支,輸入的feature map并行的通過這四個分支得到四個輸出,然后在在將這四個輸出在深度維度(channel維度)進行拼接(concate)得到我們的最終輸出(注意,為了讓四個分支的輸出能夠在深度方向進行拼接,必須保證四個分支輸出的特征矩陣高度和寬度都相同),因此inception結構的引數為:
- branch1: C o n v 1 × 1 C o n v 1 × 1 Conv1×1 , stride=1
- branch2: C o n v 3 × 3 C o n v 3 × 3 Conv3×3, stride=1, padding=1
- branch3: C o n v 5 × 5 C o n v 5 × 5 Conv5×5, stride=1, padding=2
- branch4: M a x P o o l 3 × 3 M a x P o o l 3 × 3 MaxPool3×3, stride=1, padding=1
Inception v2
GoogLeNet憑借其優秀的表現,得到了很多研究人員的學習和使用,因此GoogLeNet團隊又對其進行了進一步地發掘改進,繼而提出了Inception v2,Inception v2的核心思想來自Google發表的2篇論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》和《Rethinking the Inception Architecture for Computer Vision》,第一篇論文的附錄里,作者給出了Inception-BN(inception v2)的模型結構,即在v1的基礎上于卷積層與激活函式之間插入BN層:Conv-BN-ReLU,并將v1結構中的 5 × 5 5\times5 5×5卷積核替換為2個 3 × 3 3\times3 3×3卷積核,第二篇論文里,作者給出了inception v2中卷積分解的詳細說明,
(一)Batch Normalization
在BN的論文里,作者提出了Internal Covariate Shift這個問題,即在訓練神經網路的程序中,因為前一層的引數變化而導致每層的輸入分布都在不斷變化(the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change),這使得我們需要更低的學習率和更小心地進行引數初始化,導致我們難以充分構建一個具有飽滿地非線性結構的模型,而這個現象就被稱作Internal Covariate Shift,為了解決這個問題,Google提出了Batch Normalization(批規范化),即在每次梯度下降前,對每個mini-batch做歸一化操作來降低資料分布的影響,
我們在影像預處理程序中通常會對影像進行標準化處理,這樣能夠加速網路的收斂,對于輸入層來說,其輸入資料滿足某一分布的特征矩陣,但對于后續層結構而言輸入的feature map就不一定滿足某一分布規律了,而BN層的目的就是使我們的feature map滿足均值為0,方差為1的分布規律,想對BN層進一步了解,推薦閱讀原論文,
(二)小卷積核替代大卷積核
在VGGNet中就提出了通過堆疊兩層
3
×
3
3\times3
3×3的卷積核可以替代一層
5
×
5
5\times 5
5×5的卷積核,堆疊三層
3
×
3
3\times3
3×3的卷積核替代一層
7
×
7
7\times7
7×7的卷積核(參考:VGGNet網路詳解與模型搭建),這樣的連接方式在保持感受野范圍的同時又減少了引數量,并且可以避免表達瓶頸,加深非線性表達能力,基于此,作者通過將inception v1結構中的
5
×
5
5\times5
5×5卷積核替換為2個
3
×
3
3\times3
3×3卷積核,如下左圖為v1結構,右圖為v2結構,

Inception v3
Inception v3來自論文《Rethinking the Inception Architecture for Computer Vision》,論文中首先給出了深度網路的通用設計原則,并在此原則上對inception結構進行修改,最終形成Inception v3,
(一)深度網路的通用設計原則
- 避免表達瓶頸,特別是在網路靠前的地方, 資訊流前向傳播程序中顯然不能經過高度壓縮的層,即表達瓶頸,從input到output,feature map的寬和高基本都會逐漸變小,但是不能一下子就變得很小,比如你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適,
另外輸出的維度channel,一般來說會逐漸增多(每層的num_output),否則網路會很難訓練,(特征維度并不代表資訊的多少,只是作為一種估計的手段), - 高維特征更易處理, 高維特征更易區分,會加快訓練,
- 可以在低維嵌入上進行空間匯聚而無需擔心丟失很多資訊, 比如在進行3x3卷積之前,可以對輸入先進行降維而不會產生嚴重的后果,假設資訊可以被簡單壓縮,那么訓練就會加快,
- 平衡網路的寬度與深度,
上述的這些并不能直接用來提高網路質量,而僅用來在大環境下作指導,
(二)卷積分解(Factorizing Convolutions)
作者將一個大卷積核的操作分解成若干個小卷積核的操作稱為卷積分解,并探討了2種不同的卷積分解方法,即對稱卷積分解和不對稱卷積空間分解,
- 對稱卷積分解
即使用小卷積核串聯來替代大卷積核,這在inception v2中已經提到過,同時作者還提出,通過大量實驗表明這種替代方案并不會造成表達能力的下降,通過堆疊兩層 3 × 3 3\times3 3×3的卷積核可以替代一層 5 × 5 5\times 5 5×5的卷積核,堆疊三層 3 × 3 3\times3 3×3的卷積核替代一層 7 × 7 7\times7 7×7的卷積核,可以看出,大卷積核完全可以由一系列的 3 × 3 3\times3 3×3卷積核來替代,那能不能再分解得更小一點呢?GoogLeNet團隊考慮了非對稱卷積分解,
- 非對稱卷積分解
任意 n × n n\times n n×n的卷積都可以通過 1 × n 1\times n 1×n卷積后接 n × 1 n\times 1 n×1卷積來替代,如下圖(右)所示,

實際上,作者發現在網路的前期使用這種分解效果并不好,還有在中度大小的feature map上使用效果才會更好,(對于mxm大小的feature map,建議m在12到20之間)
(三)降低特征圖大小
一般情況下,如果想讓特征圖的通道數,可以有如下兩種方式:

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

Inception v4
2016年ResNet網路的提出解決了隨著神經網路的加深,引數越來越多,模型越來越難以訓練,訓練時間大大增加,容易出現梯度消散問題,為了融合這一重要成果,Google團隊在論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》里提出了第四版模型,Inception v4研究了Inception模塊與殘差連接(Residual Connection)的結合來改進V3結構,

如圖,將殘差模塊的卷積結構替換為Inception結構,即得到Inception Residual結構,除了上述右圖中的結構外,作者通過20個類似的模塊進行組合,最后形成了InceptionV4的網路結構,構建了Inception-ResNet模型,
Xception
持續更新中…
總結回顧
- Inception v1主要采用了多尺度卷積核、1x1卷積操作,
- Inception v2在v1的基礎上增加了BN層,使用2個 3 × 3 3\times3 3×3小卷積核堆疊替換 5 × 5 5\times5 5×5大卷積核;
- inception v3進行了卷積分解(將 7 × 7 7\times7 7×7分解成兩個一維的卷積 1 × 7 1\times7 1×7和 1 × 7 1\times7 1×7, 3 × 3 3\times3 3×3也是一樣 1 × 3 1\times3 1×3和 3 × 1 3\times1 3×1))和特征圖降維,
- inception v4在v3的基礎上融合了Residual模塊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425037.html
標籤:AI
