1. 程式人生 > >《Rethinking the Inception Architecture for Computer Vision》筆記

《Rethinking the Inception Architecture for Computer Vision》筆記

介紹

深度學習在計算機視覺方面取得了很大突破。在2014ILSVRC分類比賽中中,VGG和GoogLeNet取得了優異成績。卷積網路架構上的改進可以提升計算機視覺各類任務的效能。

VGG以很樸素的方式描述了特徵,但有很大的計算量。GoogLeNet中的Inception結構設計的目的就是減少計算量和記憶體。GoogLeNet中只有5百萬引數,是AlexNet的1/12(6千萬引數),VGG引數是AlexNet的3倍多。

Inception的計算量小,效能優異。可以把它應用到對計算和視訊記憶體有嚴格要求的一些場景中。但是Inception結構的複雜性使得網路難改進。如果只是單純放大網路,計算量的增加帶來的增益會立刻消失。GoogLeNet的論文沒有描述清楚決定其多樣性設計的因素,使得它難以拓展到新的用例上。如果增大Inception型別模型的容量,如果只是double濾波器組的數量,引數量和計算量將會增大4倍;在許多場景中,不允許這樣設計。

下面講解幾個增大卷積網路的原則和優化方法。

通用設計原則

這些原則只是原理性的,基於實驗結果。

1、避免表示瓶頸,尤其是在網路的前面。前向傳播網路可以看做一個有向無環圖,從輸入到輸出。一般來說,representation size從輸入到輸出特徵應該緩慢減小。理論上來說,不能僅僅通過維度得到資訊,因為它已經丟棄了許多重要特徵例如相關結構,維度只能代表資訊的粗略估計。

2、高維度特徵在網路區域性處理更加容易。在卷積網路中增加非線性可以解耦合特徵,訓練更快。

3、空間聚合可以以低緯度嵌入進行,這樣不會影響representational power。例如,在進行大尺度卷積(3x3)時,在空間聚合前,先對輸入進行降維,這樣不會帶來嚴重影響。我們猜測原因為:如果輸出是為了空間聚合,那麼臨近單元的強相關性在降維過程中資訊損失會很少。考慮到這些訊號容易壓縮,降維會加速學習過程。

4、平衡寬度和深度。增加寬度或深度都會帶來效能上的提升,兩者同時增加帶了並行提升,但是要考慮計算資源的合理分配。

分解大的卷積核

GoogLeNet效能優異很大程度在於使用了降維。降維可以看做卷積網路的因式分解。例如1x1卷積層後跟著3x3卷積層。在網路角度看,啟用層的輸出是高相關的;因此在聚合前進行降維,可以得到類似的區域性表示效能。

這裡,考慮計算效能,我們探索其他形式的卷積因式分解。因為Inception結構是全卷積,每一個啟用值對應的每一個權重,都對應一個乘法運算。因此減小計算量意味著減少引數。所以通過解耦和引數,可以加快訓練。利用節省下來的計算和記憶體增加filter-bank大小,來提升網路效能。

分解為更小的卷積

大的卷積計算量更大,例如filter相同情況下,5x5卷積核比3x3卷積核計算量大25/9=2.78倍。5x5卷積核相比3x3卷積核有廣闊“視野”,可以捕捉到更多資訊,單純減小卷積核大小會造成資訊損失。是否可以通過多層網路替代5x5卷積。把5x5網路看做全卷積,每個輸出是卷積核在輸入上滑動;可以通過2層的3x3的全卷積網路替換。如下圖:

rethinking_inception_01.jpg

原來的Inception結構:

rethinking_inception_02.jpg

使用2個3x3替換5x5後的Inception結構:

rethinking_inception_03.jpg

對於分解的卷積層,使用線性啟用還是非線性啟用,實驗表明,非線性啟用效能更好。

空間上分解為非對稱卷積

大於3x3的卷積層,都可以分解為連續的3x3的卷積層,那麼是不是可以分解為更小的卷積核呢?實際上分解為非對稱的更好。例如一個3x1卷積,後面跟一個1x3卷積,相當於3x3的卷積。如下圖:

rethinking_inception_04.jpg

兩層結構計算量減少33%;而2x2卷積代替的話計算量僅僅減少11%。

理論上,nxn卷積可以通過1xn->nx1卷積代替,隨著n增大,能減少更多計算量。在實踐中,在網路前幾層這樣的分解效果並不好;但是在中等網路中,有這不錯的效能(mxm大的feature map,m介於12到20)。在這等尺寸下,1x7->7x1有著非常好的卷積效果。

使用輔助分類器

GoogLeNet引入了附加分類器,其目的是想把有效梯度傳遞回去,從而加快訓練。我們發現輔助分類器扮演著regularizer的角色;因為當輔助分類器使用了batch-normalized或dropout時,主分類器效果會更好。

降低特徵圖大小

pooling層用來減小feature map大小。為了避免出現representational bottleneck,在使用pooling前常常增加feature map個數。例如k個dxd的feature map,pooling後為k個d2×d2。如果想要得到pooling後有2k個feature map,那麼在pooling前面的卷積層卷積核就應該有2k個。前者卷積計算量為2D2k2,而後者為2(d2)2k2,是前者四分之一。這樣在representation上會有瓶頸。可以使用另一種方法,降低更多計算量:使用2個模組P和C。P表示pooling,C表示卷積;它們stride都為2。如下圖所示:
rethinking_inception_05.jpg

Inception-V2

我們提出Inception-V2模型。結構圖下圖所示:
rethinking_inception_06.jpg

把7x7卷積替換為3個3x3卷積。包含3個Inception部分。第一部分是35x35x288,使用了2個3x3卷積代替了傳統的5x5;第二部分減小了feature map,增多了filters,為17x17x768,使用了nx1->1xn結構;第三部分增多了filter,使用了卷積池化並行結構。網路有42層,但是計算量只有GoogLeNet的2.5倍。

通過平滑標籤正則化模型

輸入x,模型計算得到類別為k的概率

p(k|x)=exp(zk)Ki=1exp(zi)

假設真實分佈為q(k),交叉熵損失函式

l=k=1Klog(p(k))q(k)

最小化交叉熵等價最大化似然函式。交叉熵函式對邏輯輸出求導

lzk=p(k)q(k)

假設q(k)=δk,y,當k=y時,δk,y=1,當ky時,δk,y=0。實際中,優化時,對於邏輯輸出,使得達到zyzk,ky。這樣會導致兩個問題,1、over-fitting;2、使得損失函式對邏輯輸出的導數差異變大,降低了模型的適應能力。導致這兩個問題的原因在於模型對於結果預測太過自信。

為了避免模型過於自信,引入一個獨立於樣本分佈的變數u(k)

q(k|x)=(1ϵ)δk,y+ϵu(k)

實驗中使用均勻分佈代替u(k),即u(k)=1K。訓練集為ImageNet的實驗中,K=1000,ϵ=0.1

訓練方法

batch-size=32,epoch=100。SGD+momentum,momentum=0.9。使用RMSProp,decay=0.9,ϵ=0.1,效果達到最好。lr=0.045,每2個epoch,衰減0.94。梯度最大閾值=2.0.

低解析度影象的識別

對於低分辨有影象,使用“高解析度”receptive field。實踐中:1、減小前2個卷積層的stride,2、去掉第一個pooling層。

實驗結果

單模型,single crop得到的結果
rethinking_inception_07.jpg