從GoogLeNet至Inception v3


從GoogLeNet至Inception v3

一.CNN發展縱覽

   我們先來看一張圖片:

  

 

1985年,Rumelhart和Hinton等人提出了后向傳播(Back Propagation,BP)算法(也有說1986年的,指的是他們另一篇paper:Learning representations by back-propagating errors),使得神經網絡的訓練變得簡單可行,這篇文章在Google Scholar上的引用次數達到了19000多次,目前還是比Cortes和Vapnic的Support-Vector Networks稍落后一點,不過以Deep Learning最近的發展勁頭來看,超越指日可待

幾年后,LeCun利用BP算法來訓練多層神經網絡用於識別手寫郵政編碼,這個工作就是CNN的開山之作,多處用到了5*5的卷積核,但在這篇文章中LeCun只是說把5*5的相鄰區域作為感受野,並未提及卷積或卷積神經網絡。

 

1998年的LeNet5標注着CNN的真正面世,但是這個模型在后來的一段時間並未能火起來,主要原因是要求機器性能較好,而且其他的算法像SVM也能達到類似的效果甚至超過。

AlexNet是在2012年被發表的一個經典之作,並在當年取得了ImageNet最好的成績,也是在那年之后,更多的更深的神經網絡被提出,其官方提供的數據模型,他的top-1誤差率為37.5%,以及top-5的誤差率為17%,這是相當好的一個成績。

2014年,VGG-Net 在ILSVRC localization and classification 兩個問題上分別取得了第一名和第二名,VGG-Net不同於AlexNet的地方是:VGG-Net使用更多的層,通常有16-19層,而AlexNet只有8層。另外一個不同的地方是:VGG-Net的所有 convolutional layer 使用同樣大小的 convolutional filter,大小為 3 x 3。

同年,GoogLeNet, 在2014年ILSVRC挑戰賽獲得冠軍,將Top5 的錯誤率降低到6.67%. 一個22層的深度網絡,論文在http://arxiv.org/pdf/1409.4842v1.pdf,題目為:Going deeper with convolutions。GoogLeNet這個名字也是挺有意思的,為了像開山鼻祖的LeNet網絡致敬,他們選擇了這樣的名字。

下圖為GooLeNet的網絡結構圖:

令人感興趣的是,在GoogLeNet出來之前,主流的網絡結構突破大致是網絡更深(即層數增加),網絡更寬(即神經元數目增多),但這樣做存在一些缺點:

 

  1. 當訓練集有限時,參數過多,模型會出現過擬合;
  2. 網絡越大,計算復雜度越大,設計起來越困難;
  3. 當層數增多時,梯度越往后越容易消失;

 

針對上述缺點,我們考慮到一味的追求准確率而增加網絡規模有一部分原因就是特征提取模塊的設計沒有能很好提取出圖像的特征,如果能在基本的特征提取單元上做一些優化,然后用優化后的特征提取模塊去構建網絡,可能會有利於最后的識別效果。由此,Inception 模型孕育而生。

二.Inception v1模型

 

 

一般的卷積層只是一味增加卷積層的深度,但是在單層上卷積核卻只有一種,比如對於VGG,單層卷積核只有3x3大小的,這樣特征提取的功能可能就比較弱。GoogLenet想的就是能不能增加單層卷積層的寬度,即在單層卷積層上使用不同尺度的卷積核,GoogLenet構建了Inception module這個基本單元,基本的Inception module中有1x1卷積核,3x3卷積核,5x5卷積核還有一個3x3下采樣,從而產生了Inception v1模型,如下圖所示,

這樣尺寸不同的卷積核就可以提取不同尺寸的特征,單層的特征提取能力增強了,但是我在讀的過程中想到的問題是,對於像VGG這種網絡,我同樣可以通過卷積-下采樣-卷積這種方式提取不同尺寸的信息,所以為何Inception module這種網絡會有很好的效果的,我想到的原因是卷積-下采樣-卷積雖然能夠提取不同尺寸的信息,但是由於是通過下采樣這種方式實現的,所以必會帶來信息的丟失,和Inception module這種方式相比,顯然丟失的信息更多。

 

上面Inception module結構會存在一個問題,就是前一層的輸出不經任何處理直接輸入到下一層的卷積層中,這樣如果前一層的特征圖數量很多,有經過5x5這種大尺寸的卷積,帶來的計算量也是非常大。從而產生了Inception v2模型。

三.Inception v2模型

Inception v2的網絡在v1的基礎上,進行了改進,一方面了加入了BN層,減少了Internal Covariate Shift(內部neuron的數據分布發生變化),使每一層的輸出都規范化到一個N(0, 1)的高斯,另外一方面學習VGG用2個3x3的conv替代inception模塊中的5x5,既降低了參數數量,也加速計算;

一個5*5的網絡等於兩個3*3的降級:

所以在修正過后的Inception module在輸出到下一層卷積之前,會對數據進行一次降維,怎么降維,就是采用1x1卷積核實現,比如原來有256個輸入特征圖,先用1x1的卷積核對特征圖進行線性組合,使得輸出只有96的特征圖,這樣不會帶來信息損失,又減小了下一層卷積的計算量,修正后的Inception module如下圖所示:

這種Inception module既能大大提升卷積提取特征的能力,又不會使計算量提升很多。它的網絡結構如下:

四.Inception v3模型
Inception v3的網絡設計准則:

 

1.避免表示瓶頸,即特征圖大小應緩慢下降,特別是在網絡靠前的地方;信息流前向傳播過程中顯然不能經過高度壓縮的層,即表達瓶頸。從input到output,feature map的寬和高基本都會逐漸變小,但是不能一下子就變得很小。比如你上來就來個kernel = 7, stride = 5 ,這樣顯然不合適。 另外輸出的維度channel,一般來說會逐漸增多(每層的num_output),否則網絡會很難訓練。(特征維度並不代表信息的多少,只是作為一種估計的手段) 

2.高維表示可以用網絡代替;高維特征更易處理。 高維特征更易區分,會加快訓練。

3. 可以在低維嵌入上進行空間匯聚而無需擔心丟失很多信息。 比如在進行3x3卷積之前,可以對輸入先進行降維而不會產生嚴重的后果。假設信息可以被簡單壓縮,那么訓練就會加快。

4.平衡網絡的寬度和深度。

使用大尺寸濾波器卷機分解:

 

GoogleNet的精度增益主要來自維度降低,這可以認為是卷積分解的特例。考慮到網絡臨近的激活高度相關,因此集成之前可以降維。Inception模塊是全卷積的,每個權值對應一個乘法運算,進行卷積分解后可以減少參數數目進行快速訓練,這樣就可以增加濾波器組的大小提升精度。

將大卷積分解成小卷積:

5×5的卷積可以使用兩層3×3卷積代替,如圖4為原始Inception模塊,圖5為替換后的模塊,節約的計算時間可以用來增加濾波器數目。對於一個5x5卷積核卷積的區域,可以先使用一個3x3對5x5的區域進行卷積,然后再使用一個3x3核對剛剛的卷積結果再進行一次卷積,最終也是得出一個數據,在效果上和5x5卷積是等效的。這樣就減少了一次卷積計算的次數,原來5x5卷積需要做25次乘加,現在兩次3x3只需要做9+9=18次乘加,如果卷積核更大,減小的計算量也更大。

是基於什么考慮才做這種分解呢?我們可以看到分解導致卷積核的參數變小,這就說明原來5x5卷積核其實是有部分參數冗余的,即我們其實並不需要25個參數提取特征,而可能需要18個參數就可以了,這時因為由於提取區域像素都是緊鄰的,像素之間的關聯性很強,這都到時5x5卷積核各個參數之間其實也是有很強關聯的,即參數存在冗余可以進一步壓縮;進一步想,其實這是一種緊密網絡到稀疏網絡的轉換。上面所說的是大的卷積核分解成小的卷積核,Inception v3中還提出了另一種分解方式從圖中可以看出,3x3的卷積,可以先用一個1x3的卷積,緊接着跟着一個3x1的卷積也是可以實現相同的輸出的,同樣對於5x5和7x7也是可以處理的,這樣也可以明顯降低卷積核參數和計算量。

 

 

 

需要注意的是:3×3的卷積使用3×1卷積和1×3卷積代替,這種結構在前幾層效果不太好,但對特征圖大小為12~20的中間層效果明顯。

附加分類器

 

附加分類器有batch norm層效果更好,得出其扮演規格化的角色。GoogLenet中就做過相似的工作,常規網絡都是在最后一層計算loss,然后進行梯度方向傳播,但是如果網絡層很多,這就導致梯度消失的現象,使用Auxiliary Classifiers,在網絡中間層加上分類器,計算輔助失真和梯度,然后把這個梯度加到常規網絡的梯度上,有效解決了梯度消失的現象,其實這樣做的方式,呼應了ResNet中解決梯度消失的問題得方法,雖然ResNet表面上看起來loss是在最后一層計算的,但是其實本質上最后一層的loss其實在R esNet的子網絡中都有計算,也就相當於GoogLenet中把loss層加上網絡中間層的方式。

  在GoogLeNet中,使用了多余的在底層的分類器,直覺上可以認為這樣做可以使底層能夠在梯度下降中學的比較充分,但在實踐中發現兩條:

 

  1. 多余的分類器在訓練開始的時候並不能起到作用,在訓練快結束的時候,使用它可以有所提升
  2. 最底層的那個多余的分類器去掉以后也不會有損失。

 

以為多余的分類器起到的是梯度傳播下去的重要作用,但通過實驗認為實際上起到的是regularizer的作用,因為在多余的分類器前添加dropout或者batch normalization后效果更佳。

降低特征圖大小

池化用來降低特征圖大小,為避免表示瓶頸,即更有效的保存圖像信息,應在池化之前增加濾波器數目,以前的網絡都是在卷積層后面加上一個pooling層來降低特征圖的尺寸,但是這種降低尺寸的方式不可避免地有信息的損失,在《Rethinking Inception》論文中提出了另一種降低特征圖尺寸的方式如下圖所示:

 

 

右圖是正常的縮小,但計算量很大。左圖先pooling會導致特征表征遇到瓶頸,違反上面所說的第一個規則,為了同時達到不違反規則且降低計算量的作用,將網絡改為下圖

 


 
這種方法是同時進行步長為2的卷積和池化,然后串聯,從圖中可以看出降低尺寸是用過卷積加上合適的stride實現的,當然也有一個支路是通過pooling的方式實現,這種方式可以有效避免信息的損失。
實驗結果

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

 

五.Inception v4模型
先給出Inception v4的模型圖:

 

 

 

Inception-v3到inception-v4網絡變得更深了,在GAP前Inception-v3包括了4個卷積模塊運算(1個常規卷積塊+3個inception結構),Inception-v4變成了6個卷積模塊。對比兩者的卷積核的個數,Inception-v4比Inception-v3也增多了許多。對比[原論文]( )中提出的Inception-ResNet-v1和Inception-ResNet-v2,Inception-v4沒有residual連接,但取得了Inception-ResNet-v2相近的結果。
 

參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM