1. 程式人生 > >圖像分類(一)GoogLenet Inception_V1:Going deeper with convolutions

圖像分類(一)GoogLenet Inception_V1:Going deeper with convolutions

地方 此外 -s 數值計算 mbed 原本 樸素 思路 並行

論文地址

在該論文中作者提出了一種被稱為Inception Network的深度卷積神經網絡,它由若幹個Inception modules堆疊而成。Inception的主要特點是它能提高網絡中計算資源的利用率,這得益於網絡結構的精心設計(基於 Hebbian principle 和 the intuition of multi-scale processing ),使得網絡在增加寬度和深度的同時又能保持計算開銷不變。作者在論文中還介紹了 Inception 的一個應用例子——GoogLenet,該網絡憑借在分類和檢測任務下的出色表現在2014年的 ILSVRC競賽上奪得冠軍。


1. Motivation and High Level Considerations

從LeNet-5開始,不斷出現的卷積神經網絡CNNs有一個標準的結構——堆疊的卷積層(可能跟著contrast normalization和max pooling)後面接一個或多個全連接層。盡管max-pooling layers會使精確的空間信息丟失,但是類似於AlexNet的卷積網絡已經被成功地應用到了localization、object detection和human pose estimation中。在 ImageNet上進行分類的CNNs也不斷增加網絡層數和 layer size,同時使用 dropout 避免加深加寬網絡後出現嚴重的overfitting。這是因為提升深度網絡性能最直接的方式就是增加網絡的尺寸,包括加深和加寬兩方面。但是這樣做有兩個drawbacks:

  • 更大尺寸的網絡意味著更多的參數,這使得增大後的網絡更容易overfitting,尤其在訓練集數據有限的情況下。按道理說這可以通過增大訓練集解決,但是創建高質量的訓練集非常棘手且昂貴
  • 網絡尺寸均勻增加會導致計算消耗的資源急劇增加


解決上述兩個問題最基本的方法是將全連接變成稀疏連接結構(sparsely connected architectures),甚至在卷積層內部也這樣。這樣做除了模擬生物系統以外,還有堅實的理論基礎,Arora 在論文中開創性的工作就證明了這一點。Arora等人的主要研究結果表明,如果數據集的概率分布可以用一個大型且非常稀疏的深度神經網絡表示的話(該深度神經網絡類似於分類器,可以將數據集內的所有樣本正確分類),那麽可以通過分析最後一層的激活值的相關性和對輸出高度相關的神經元進行聚類來逐層構建理想的網絡拓撲。雖然嚴格的數學證明需要很強的條件,但是事實上該研究結果與著名的Hebbian principle(neurons that fire together, wire together)是一致的,這說明在實踐中,即使不完全滿足嚴格的條件,這種潛在的思想也是可以應用的。


不過,使用上述解決方法的話在實現上會有些難度:

  • 目前,計算設備在非均勻稀疏數據結構的數值計算非常低效。即使稀疏網絡結構需要的計算量被減少100倍,查找和緩存失敗的開銷也會使理論上運算量減少帶來的優勢不復存在
  • 此外,非均勻稀疏模型(網絡結構的稀疏形式不統一)需要更復雜的設計和計算設備。當前大多數基於視覺的機器學習系統是利用卷積的特點在空間域實現稀疏的,但是卷積僅是在淺層作為對patches稠密連接(dense connection)的集合。早些的時候,為了打破網絡對稱性和提高學習能力,傳統的網絡都使用了稀疏連接。可是,後來為了更好地優化並行運算在AlexNet中又重新啟用了全連接

相反,均勻的結構(或者統一的結構)、大量的filters和更大的batch size允許網絡使用高效的密集計算(dense computation)。既然如此,那是否可以在網絡中既使用稀疏結構,又能利用密集矩陣(dense matrices)在當前硬件上的高計算性能對稀疏結構進行數值計算?大量關於稀疏矩陣( sparse matrix)計算的文獻表明,將稀疏矩陣聚類成相對密集的子矩陣,往往能使稀疏矩陣乘法達到最先進的實用性能。但是在該論文中作者沒有利用這一思路,只是說,在不遠的將來類似的方法或許會被用於非均勻深度學習結構的自動構建。

作者的思路是,是否可以通過簡單易得的dense components(dense network中常見的組件,比如卷積、全連接等)逼近和覆蓋卷積網絡中理想的局部稀疏結構?事實證明,這是可以的!!作者設計的 Inception module就可以做到這一點。


2. Inception module

Serre 在論文中使用一系列參數固定、尺寸不同的 Gabor filters 來解決多尺度(multiple scales)問題(如下圖)。受此啟發,作者在 Inception module 中也使用了相同的2層深度模型,不過所有filters參數不是固定的,需要通過學習得到。(補充:之所以引入尺度這個概念,其實是為了更貼近人類的視覺系統。多尺度模擬了不同遠近的物體在視網膜上的形成,而尺度不變性保證不同遠近物體可以對視覺神經有相同的刺激。類似的,引入尺度這個概念可以保證在圖像或特征不同大小時,算法都能有效地提出相同的關鍵點)

技術分享圖片

此外,作者還借鑒了Lin在論文中提出的Network-in-Network方法來增強網絡的表示能力( representation power)。在應用時,NIN方法可以被視為1層1*1卷積層+rectified linear activation,這樣就使得該方法可以很容易地被集成到當前的 CNN pipelines 中。在設計 Inception module 時,NIN方法被大量使用。作者這樣做的主要目的並非是想提高網絡的表示能力,而是在 Inception module 中將NIN方法當做降維模塊(dimension reduction modules,這裏的升維降維指的是改變 channels 數,即通道方向上的升維降維)用來克服計算瓶頸,不然computaitional bottlenecks 會限制網絡的size。這樣設計使得網絡不僅能夠增加深度,還能增加網絡的寬度,同時還不會帶來顯著的性能損失。


Inception architecture的核心思想是找到如何通過簡單易得的稠密組件(dense components指的是卷機層、池化層等卷積網絡的組件)逼近和覆蓋卷積網絡中理想的局部稀疏結構的方法。Arora在論文中提供了一種逐層構建的方法,具體是:先分析某層輸出的相關性並根據相關性對輸出聚類得到clusters;然後這些clusters會構成下一層的神經元,同時與前一層中的神經元相連。假設來自earlier layer的每個unit都對應於input image中的一些區域,並且這些units被分成 filter banks(對feature map進行卷積時每個卷積核filter的計算結果被稱為filter bank)。在較低的層(接近input image)中,相關的units會集中在局部區域,也就是說,聚類的得到的clusters會集中在單個區域(單個位置)。因此,這些units可以被下一層的1*1卷積覆蓋,得到下一層的clusters。但是,units聚類時也會得到少量對應較大 patches 的 clusters 和更少量的對應更大patches的clusters。所以,為了避免Inception module中的所有 patches尺寸相同,作者在module中同時使用了 1*1、3*3 和 5*5 三種尺寸的 filters,這麽做更多的是基於便利性(方便對齊,如果設定stride=1,那麽只要分別設定padding=0,1,2就能得到維度相同的特征,而後可以直接拼接)而非必要性。這也意味著 Inception module 是所有這些層的組合,其輸出的 filter banks 拼接成單個輸出向量(不同尺度特征的融合)成為下一階段的輸入。除了三種卷積之外,作者在Inception module中還添加了一條並行的池化路徑,因為池化操作在目前先進的卷積網絡中至關重要,添加池化路徑後應該會給module帶來額外的好處。至此,樸素形式的Inception module已經設計完成,如Figure 2(a)所示:

技術分享圖片

隨著 Inception modules 逐層堆疊,網絡的輸出相關性肯定會變化:當更高的抽象特征被更高的層捕獲時,抽象特征的空間集中程度預計會減小(像在低層時聚類出現的單個區域會減少),因此隨著網絡層數的加深,3*3和5*5卷積的比例應該增加。

樸素形式的 Inception modules 的設計存在一個大問題,那就是具有大量 filters 的卷積層會使得計算非常昂貴(輸出channel較多)。當池化單元添加到 module 中後,這個問題會變得更明顯。這是因為卷積層的輸出通道數還可以通過減少filters降低,但是池化單元的輸出通道數等於前一階段(即Figure 2(a)中的 previous layer)輸入的通道數,無法減少。隨後池化層輸出和卷積層輸出的合並會導致這一階段到下一階段的輸出通道數不可避免的增加。顯然,經過幾個 modules 後,網絡的計算量會爆炸。

為了解決這個問題,作者提出在 naive Inception modules中計算量會大幅增加的地方應用dimension reductions 和 projections,即 dimension reduction layer projection layer。這是基於embeddings的成功:即使低維嵌入可能包含大量關於 large image patch 的信息。然而 embeddings 以密集、壓縮形式表示信息並且壓縮後的信息更難處理。作者希望在需要的地方保持表示的稀疏性,在必要的地方對信號進行壓縮。也就是如 Figure 2(b)所示,在原本計算昂貴的 3*3和5*5卷積之前使用1*1卷積降維(dimension reduction layer),同時,1*1卷積還帶有 rectified linear activation;在池化單元之後,作者同樣使用了1*1卷積(projection layer),作用是減少通道數,避免計算爆炸。至此,得到 Inception V1的結構,即 Inception module with dimension reductions


3. Inception network

一般,Inception nework(或Inception architecture)是通過 Inception modules相互堆疊得到的,中間可能還會添加 stride 為2的 max-pooling layers 來將網格的分辨率減半。

Inception network主要有兩方面的好處:

  • 該網絡增加stage的數量和每個stage(module)中的單元數量時不用擔心計算復雜度爆炸(即加深加寬)。這主要得益於無處不在的dimension reduction
  • 網絡的設計符合直覺,即視覺信息應該在不同scales上處理,然後進行聚合以便下一階段能夠同時從不同scales提取特征(the intuition of multi-scale processing )


4. GoogLeNet

GoogLeNet是Inception nework最成功的一個應用,該網絡在2014年舉辦的ILSVRC競賽上奪得冠軍。之所以被稱為GoogLeNet而不是GoogleNet是為了向 Yann LeCuns 提出的 LeNet-5致敬。具體結構如 Table 1 所示:

技術分享圖片

需要說明的是:網絡中的所有卷積,包括 Inception modules 的卷積層,都使用了 rectified linear activation;該網絡的感受野(receptive filed)尺寸為224*224,輸入是減去均值的RGB圖像;Table 1中的”#3x3 reduce“和”#5x5 reduce“分別代表3*3卷積和5*5卷積層前面的1*1卷積所使用的 filters數目; max-pooling layer後面的 projection layer使用的filters數目可以在 pool proj 那一列看到;所有的 reduction layer 和 projection layer 同樣都使用 rectified linear activation


GoogLeNet網絡的設計考慮到了計算效率和實用性,所以inference過程可以在單個設備上運行,甚至於那些內存資源有限的設備。如果只計算含參層的話該網絡一共有22層,如果再加上池化層就有27層。需要特別說明的是,在每個classifier(該網絡有3個softmax分類器)之前還使用了average pooling和FC。FC的添加使得網絡很容易適應和微調其它數據集,作者這麽做其實主要是為了方便(不使用全連接層而像NIN那樣使用avearge pooling的話,更換訓練集時就需要對網絡結構進行大量修改,反之,使用全連接層的話僅需簡單地修改下輸出神經元個數),並沒有期望它會產生很大的影響。實驗證明確實如此,將全連接層除去(使用average pooling代替全連接層)反而能將 top-1 accuracy 提高0.6%(除去全連接層後dropout層依然保留)。

由於比較深,網絡訓練時反向傳播梯度的能力就成了應該關註的重點。作者為了鼓勵低層的區分性、增強反向傳播的梯度信號(避免梯度消失)並提供額外的regularization,在網絡的中間層添加了 2個輔助分類器(auxiliary classifiers)用於向前傳導梯度。這是基於這樣一種認識:相對較淺的網絡已經具有強大的性能,那麽網絡中間層產生的特征應該更有區分性。這些分類器以一種 smaller convolutional networks的形式出現在網絡中。值得註意的是,在訓練時,這些分類器的損失會被以加權(權重為0.3)的形式計算網絡的總損失當中,但是在 inference 時,這些輔助網絡會被廢棄不用。

GoogLeNet 除了 Table 1 中列出的 layers,還有一些包括輔助分類器在內的附加網絡,更詳細的結構如 Figure 3 所示:

技術分享圖片


5. Training Methodology

GoogLeNet網絡使用 DistBelief 分布式機器學習系統進行訓練,該系統使用適量的模型和數據並行。作者訓練時使用異步隨機梯度下降法,動量為0.9,固定的學習率計劃(每8個epochs學習速率下降4%)。在 inference 時,使用 Polyak averaging 創建最終的model 。因為各種變化,導致作者也無法明確給出最有效的訓練方法。

此外,GoogLeNet 在分類和檢測任務上的應用細節等可以參見原論文,這裏不再記錄。


6. Inception v1 總結

  • Inception module的設計目的是使用常見的 dense components 逼近理想的局部稀疏結構,以避免網絡加深加寬帶來的計算爆炸
  • Serre使用了一系列參數固定尺寸不同的Gabor filters解決圖像當中的多尺度問題。之所以使用一組濾波器就是為了保證對不同尺度的圖像都能檢測出相同的特征。Inception module借鑒這一點,同時使用了1*1、3*3、5*5卷積提取特征以提升對不同尺度圖像的檢測能力
  • Inception module借鑒了NIN的特性,在原先的卷積過程中附加了1*1的卷積核加上ReLU激活,這不僅提升了網絡的深度,提高了representation power,還在通道方向進行了降維,減少了更新參數量
  • GoogLeNet 中存在一些包括輔助分類器在內的附加網絡,詳細見 Figure 3 及論文


參考資料

  • 1*1的卷積核與Inception
  • 論文導讀:GoogLeNet模型,Inception結構網絡簡化(Going deeper with convolutions)
  • GoogLeNet系列解讀InceptionV1/V2
  • GoogLeNet
  • Deep Learning-TensorFlow (13) CNN卷積神經網絡_ GoogLeNet 之 Inception(V1-V4)
  • 從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2
  • 翻譯論文匯總

圖像分類(一)GoogLenet Inception_V1:Going deeper with convolutions