1. 程式人生 > >Inception-V2,V3 - 2015

Inception-V2,V3 - 2015

Inception-V2,V3

1.Introduction

2012年,"AlexNet"獲得了冠軍,並且發現AlexNet成功地適用於很多機器視覺任務,目標檢測,影象分割,人體動作識別,視訊分類,目標跟蹤,影象超解析度等。
2014年,更深更寬的"VGGNet"和“GoogLeNet”在比賽中均取得了非常好且相近的成果。有趣的是,在分類上的突出表現同樣也適用於其他領域,這說明深度神經網路模型結構上的提升能夠有效的轉換為大部分機器視覺任務的效果提升,尤其是依賴於更復雜更高層的視覺特徵的任務。
儘管VGGNet有著非常吸引人的特點:結構簡單,但是同時這也帶來了一個問題,網路需要大量的運算。然而GoogLeNet卻在嚴格的儲存和計算容量預算下依然取得了很好的成果。例如,GoogleNet只用到了大約5M的引數,而AlexNet用到了大約60M的引數,而VGGNet則是用到了大約140M的引數。從這裡看出GoogleNet的引數個數遠遠小於另外兩個網路。
Inception的計算量也是遠小於VGGNet和其他一些效能更好的網路。這就使得Inception網路能夠運用於大資料環境,大量的資料需要在有限的儲存和計算容量下進行處理,如mobile vision setting。
但是Inception網路本身結構的複雜性使得我們很難針對網路結構進行調整。並且介紹Inception的文章也沒有對有助於對GoogleNet進行變體的因素進行詳細介紹。那麼本篇文章,我們會介紹一些普世的規則以及一些優化辦法來讓我們能夠有效的增大我們的網路。儘管這些規則不僅限於Inception類的網路,但是我們會以Inception作為上下文,因為這些規則能夠很好地與Inception結構相匹配,並且在這樣的結構中也容易觀察。這都是因為得益於Incetpion模組中有使用大量的降維和並行運算結構。

2.General Design Principles

這裡我們將要介紹一些設計技巧,這些技巧來自於對多種結構的CNN進行大量實驗得出來的。當然這些技巧在當下來說具有一定的猜想性,還是需要未來很多的實驗來證明它們的有效性。而且如果不合理運用這些技巧可能會帶來網路嚴重的效能下降。

  1. 避免特徵表達瓶頸,尤其是在網路的淺層。前向網路可以被表徵為一個從輸入層到分類器的無環圖。這就明確了資訊流的方向。對於任何隔斷輸入和輸出的截斷面,我們都可以得到該截斷面所通過的資訊量。我們需要避免資訊極度壓縮帶來的瓶頸。一般而言,從輸入層到輸出層特徵維度大小應該緩慢下降。理論上,資訊內容不僅僅來自於特徵表達的維度,因為它丟掉了很多重要因素如互相關結構;維度僅僅提供資訊的一個粗略估計。
  2. 高維度特徵表達在網路的區域性中處理起來更加容易。增加CNN每個神經元的啟用值會更多地解耦合特徵,這會使得網路訓練更快。
  3. 空間資訊聚集可以通過低維度嵌入來完成,而且在幾乎不損失特徵表達能力的情況下。例如,在實施較大卷積核(3x3)時,我們可以先對輸入特徵進行降維,不會造成太大影響。我們猜測這個原因是如果輸出被運用在空間資訊聚集的上下文環境中,相鄰神經元的強相關性會使得在降維過程中只有很少的資訊丟失。考慮到這些訊號很容易被壓縮,降維將會加快學習。
  4. 平衡網路的寬度和深度。網路的最優performance可以通過平衡每個stage的卷積核數量和網路深度來達到。同時增加網路的深度和寬度會有助於得到更高效能的網路。然而,對於固定的計算資源預算,最優的提升都來自於深度和寬度的同時增大(也就是一味強調網路深度或者寬度是不行的)。只有平衡好深度和寬度,才能取得最優。
    儘管這些規則聽起來好像挺對,但是它們都還不夠直接,以至於很難使用他們來提高網路效能。

3.Factorizing Convolutions with Large Filter Size

GoogLeNet很多的提升都來自於大量降維模組的使用。這可以被視為一種特殊的有效的對於卷積的因式分解。在一個視覺網路中,鄰近的啟用值輸出往往是高度互相關的。因此,我們希望這些啟用值可以在聚合之前就進行降維,這應該可以得到相似的區域性特徵表達。
這裡我們探索了在各種結構中利用其他方式來進行卷積因式分解,尤其是為了增加計算的有效性。因為Inception網路是全連線卷積的,每個權重都對應於每個啟用值的一次乘積操作。因此,任何計算開銷的減少都將意味著訓練引數的減少。這意味著在適當的因式分解下,我們可以得到更多解耦合的引數,這會加快我們的訓練。同時,我們可以使用節約下來的計算和儲存容量來增加捲積核數量提高網路效能。

Factorization into smaller convolutions

在VGGNet中,這個思想被提到過,也就是大卷積核可以用多層小卷積核來替代,如5x5可以被兩層3x3代替,在感受野沒有變化的情況下,減小了引數。那麼原來的Inception結構就變為下圖。
這裡寫圖片描述
那麼這個代替方案,確實減小了引數數量,同時也減小了計算量。但是,我們還是要提出兩個疑問:

  1. 這樣的方案會影響特徵的表達嗎?也就是是否會降低模型的特徵表達能力。
  2. 如果我們主要目的是因式分解計算中的線性部分,那麼是否在第一個3x3層使用線性啟用(依然以5x5來舉例)?
    為了驗證,我們進行了對照實驗,一組採用兩層ReLU,一組採用linear+ReLU。我們發現linear+ReLU的效果總是低於兩層ReLU。我們將這種差距歸結於多一層的非線性啟用可以使網路學習特徵變體的更為複雜的空間,尤其是當我們對啟用輸出使用了batch-normalize(這與VGG中提到的思路相同,也就是多一次非線性,增加網路的特徵表達能力)。
Spatial Factorization into Asymmetric Convolutions

經過上面的分析,我們發現大於3x3的卷積核似乎都不怎麼有用了,因為它們總能夠被分解為一系列的3x3卷積層。仍然我們要問是否可以分解的更小呢,比如2x2卷積核。然後,我們發現有比2x2卷積核更好的就是使用非對稱卷積,比如nx1。例如使用3x1卷積在跟上一個1x3卷積等同於一個兩層網路覆蓋與3x3卷積相同的感受野。如下圖。
這裡寫圖片描述
可以發現儘管是兩層,同樣的輸出大小,引數個數少了33%。通過比較,將3x3因式分解為兩個2x2,僅僅只減少了11%的計算量。
理論上,我們可以更進一步,任意的nxn卷積都可以被1xn加上nx1卷積核來代替,而且隨著n的增大,節省的引數和計算量將激增。實際運用中,我們發現這樣的因式分解在網路的淺層似乎效果不佳,但是對於中等大小的特徵圖卻有著非常好的效果(12~20大小的特徵圖)。

4.Utility of Auxiliary Classifiers

GoogLeNet引入了輔助分類器這一個概念來幫助非常深的網路更好的收斂。它的原本意圖是在網路訓練時,推動有用的梯度向網路淺層傳遞並讓它們能夠立馬起到作用提高收斂性來對抗深度網路的梯度下降問題。另外Lee等人也提到輔助分類器有助於更穩定的學習和更好的收斂。有趣的是,我們發現輔助分類器在訓練早期並不會推動收斂:在訓練中在到達很高accuracy之前,有沒有輔助分類器的存在似乎並不影響。在訓練的末期,帶有輔助分類器的網路就會超過沒有輔助分類器的網路來到一個更高的平臺。
GoogLeNet在網路的兩個不同的地方設定了輔助分類器。將更為淺層的那個輔助分類器移走對於網路最後的結果沒有任何相反的作用(也就是這個分類器沒用)。結合前面提到的,這說明GoogLeNet原本的假設——這些輔助分類器能夠幫助低層特徵訓練,是錯誤的。我們認為輔助分類器其實就是起到了泛化的作用,它就是一個正則化方法。這個說法可以通過下面這個事實來證明,網路的主分類器能夠取得更好的結果如果輔助分類器採用batch-normalized或者引入dropout。這也同時為batch normalization是個正則化方法的猜想提供了一點微薄的支援。

5.Efficient Grid Size Reduction

傳統的卷積網路會使用一些pooling操作來減少特徵圖的大小。為了避免特徵表達瓶頸,在進行pooling之前,都會擴大網路特徵圖的數量。例如,現在有K個dxd的特徵圖,如果想要變成2K個d/2xd/2的特徵圖,那我們首先需要進行一個步長為1,帶有2K個卷積核的卷積,然後再進行池化。這意味著總共的計算開銷將被在較大的特徵圖上進行昂貴的卷積所主導,約 2 d 2 k 2 2d^2k^2 次操作。另一種方式呢,就是先池化後卷積,這樣的話,計算量就變為 2 ( d / 2 ) 2 k 2 2(d/2)^2k^2 ,變為剛才的1/4。然後這會引入表達瓶頸因為特徵的整體維度由 d 2 k 2 d^2k^2 變成了 ( d / 2 ) 2 k 2 (d/2)^2k^2 ,這導致網路的表達能力減弱。明顯這樣做顯然是不行的,於是我們想到一種辦法能夠減少計算開銷而且也能避免表達瓶頸的辦法。也就是使用兩個並行的步長2的模組:池化和卷積。
這裡寫圖片描述
左圖為改進的Inception模組可以同時減小特徵圖大小並且增加特徵圖數量,這樣在減少計算量的同時也避免了表達瓶頸,符合上面提出的原則1。右圖是同樣的操作,不過它從特徵圖大小的視角出發。

6.Inception-v2

這裡我們將結合上面提到的點提出一個新的結構。這個網路的結構如下表。每層的輸出大小就是下一層的輸入大小。我們在Inception模組間有使用到Efficient Grid Size Reduction。然後對於padded的卷積層會進行0-padding。在Inception結構內部也是會進行0-padding來保證grid大小不變,所有其他的層都不使用padding。這些卷積核堆的size都是根據principle 4來進行選取的。
這裡寫圖片描述

figure 5是引入小卷積核,這裡用到了principle 3。
這裡寫圖片描述

figure 6是引入非對稱卷積核,在我們的結構裡, n = 7 n=7 ,這裡也用到了principle 3。
這裡寫圖片描述

figure 7是用來改增大特徵圖數量的Inception模組,這個結構被用在最粗糙(8x8)的特徵圖上來獲取更高維度的表達,這裡用到了principle 2。這個結構僅僅使用在網路的最高層(coarsest grid,特徵圖已經衰減到最小),因為在這層當局部處理(通過1x1卷積)相對於空間資訊聚合的比例增加的時候生成高維稀疏表達就變得最為重要的。
這裡寫圖片描述
對於網路的Inception部分,3層figure5+5層figure6+2層figure7,只有模組交接處會進行Efficient Grid Size Reduction。
然而,我們發現網路的效能對於各種變體來說是相對穩定的,只要遵循了最開始提到的principles。儘管我們的網路有42層,但是計算量卻僅僅比GoogLeNet高了2.5倍。

輔助分類器如下圖,加在最後的17x17層的後面。
這裡寫圖片描述

7.Model Regularization via Label Smoothing

這裡我們提出一個通過估計訓練過程中label-dropout的邊緣化效果來泛化分類器。
對於每個訓練樣本x,我們的模型計算它作為每個標籤k的可能性, k { 1... K } : p ( k x ) = e x p ( z k ) i = 1 K e x p ( z i ) k \in \{1...K\}: p(k|x) = \frac{exp(z_k)}{\sum^K_{i=1}exp(z_i)} 。這裡 z i z_i l o g i t s logits 或者沒有歸一化的對數概率。考慮訓練樣本的真實分佈為 q ( k x ) q(k|x) ,然後將其歸一化使得 k q ( k x ) = 1 \sum_kq(k|x) = 1 。為了簡便,我們忽略對於樣本x的 p p q q 相關性,也就是互相獨立。我們定義樣本的損失函式為交叉熵: l = k = 1 K l o g ( p ( k ) ) q ( k ) l = -\sum^K_{k=1}log(p(k))q(k) 。最小化交叉熵就相當於最大化標籤的對數概率,這個標籤是根據樣本的真實分佈 q ( k ) q(k) 選擇出來的。交叉熵對於 z k z_k 來說是可導的,因此可以使用梯度訓練。梯度表示為 l z k = p ( k ) q ( k ) \frac{\partial l}{\partial z_k} = p(k) - q(k) 被限制在-1到1之間。
考慮只有一個真實標籤y的情況,也就是 q ( y ) = 1 q(y)=1 並且對於所有$k \neq y q(k)=0$。在這種情況下,最小化交叉熵就等價於最大化正確標籤的對數概率。對於帶有標籤y的樣本x,對數概率最大化為 q ( k ) = δ k , y q(k)=\delta_{k,y} δ k , y \delta_{k,y} 是Dirac delta,只要當k和y相等時才等於1,其他時候都為0。這個最大值對於有限的 z k z_k 來說是很難達到的,但是當 z y z k z_y\gg z_k 對於所有 k y k \neq y ,也就是對應正確標籤的logits要遠遠大於別的logits。然後這會帶來兩個問題。

  1. 會帶來過擬合:如果模型學會對每個訓練樣本都將所有的概率賦予真實標籤,那麼這將不能保證泛化效果。
  2. 這會激勵最大logit與其他logits的差距加大,結合有範圍的梯度 $ \frac{\partial l}{\partial z_k}$ ,這會降低模型的適應能力。直觀的理解就是,模型會過於相信自己的預測。
    我們提出一種鼓勵模型不要過於自信的機制。當然這似乎對於我們的目的——最大化訓練標籤的對數概率有相反的作用,但是它確實會幫助泛化我們的模型並且使其適應性更強。這個方法很簡單。考慮一個獨立於訓練樣本x的標籤分佈 u ( k ) u(k) ,以及一個平滑因子 ϵ \epsilon 。對於一個真實標籤為y的訓練樣本,我們將其本來的標籤分佈 q ( k x ) = δ k , y q(k|x)=\delta_{k,y} 置換為 q ( k x ) = ( 1 ϵ ) δ k , y + ϵ u ( k ) q'(k|x)=(1-\epsilon)\delta_{k,y} + \epsilon u(k) 這是利用 ϵ \epsilon