天天看點

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

原文連結::https://arxiv.org/abs/1707.01083

Abstract

論文提出了一種計算效率極高的卷積神經網絡結構——ShuffleNet,它是專門為計算能力有限的移動平台設計的。這個新結構用來兩個新操作——逐漸群卷積(pointwise group convulution)和通道混洗(channel shuffle)在保障精确率損失不大的同時大大減少了計算成本。基于ImageNet資料集的分類任務和MS COCO的目标檢測任務上ShuffleNet都表現出了優于其他結構的性能,如 top-1 error 僅為7.8%,超越了之前MobileNet在ImageNet分類為任務的表現。

1. Introduction

為了解決主要的視覺識别任務,建構更深更大的卷積神經網絡是一個基本的趨勢,大多數準确率高的卷積神經網絡通常都有上百層和上千個通道,需要數十億的 FLOPS。這篇報告走的是另一個極端,在隻有幾十或者幾百 FLOPS 的計算資源預算下,追求最佳的精度,目前的研究主要集中在剪枝、壓縮和量化上。在這裡我們要探索的是根據我們的計算資源設計一種高效的基本網絡架構。

我們注意到最先進的網絡結構(比如Xception和ResNeXt)中由于大量 1 x 1 卷積核耗費了過多計算資源,使得這種結構在小型網絡中會變得效率很低。我們的目的是使用逐點群卷積來減小 1x1 卷積的計算複雜度,同時為了克服群卷積帶來的副作用,我們提出了通道清洗來幫助資訊流通。基于這兩種技術,我們建構了一種叫做ShuffleNet的高效架構,在給定計算複雜度預算下,相比于其他流行的架構,我們的ShuffleNet允許使用更多的特征通道,這有助于編碼更多的資訊,尤其是對小型網絡的表現這一點至關重要。

我們在ImageNet分類任務和MS COCO目标檢測任務上評估了我們的模型,一系列可控制的實驗都證明我們設計模型的優越性。我們也在一塊基于ARM的計算核心上做了真實的硬體加速,ShuffleNet模型于AlexNet相比,在精度降低不大的同時實作了13倍的實際加速。

2. Related Work

2.1 高效模型設計

在過去的很多年裡我們已經看到了深度神經網絡在計算機視覺領域的巨大成功,其中模型設計扮演了重要的角色。在嵌入式裝置上運作高品質模型的需求如日劇增,這也促進了高效模型設計方面的研究。 例如,與單純的堆疊卷積層相比,GoogleNet在增加了網絡深度的同時極大地降低了複雜度;SqueezeNet在保持精度的同時大大減少參數和計算量;ResNet利用高效的bottleneck結構實作驚人的效果;SENet介紹了一種結構單元降低了網絡的計算成本。于我們的工作同時進行的一項工作是使用強化學習和模型研究來探索高效的模型設計。

2.2 群卷積

群卷積這個概念第一次是出現在用兩個GPU運作AlexNet網絡時,現在它已經在ResNetXt中展示了其高效性。Xception中提出的深度可分離卷積概括了Inception序列,最近的MobileNet使用深度可分離卷積實作了最先進的結果。我們的工作概括了群卷積和新形式的深度可分離卷積。

2.3 通道清洗操作

據我們所知,在高效模型設計上,先前的工作中很少提到通道清洗操作,盡管CNN cuda-convnet 支援 随機稀疏卷積層,這個等價于在随機通道清洗後面跟一組卷積層。這樣的随機清洗操作有不同的目的,并且之後很少使用了。直到最近,另一個同時展開的工作也采用了這個想法用于一個兩階段的卷積層,然而它們沒有調查通道清洗的有效性和其在小型網絡設計上的通途。

2.4 模型加速

這個方向旨在保證預訓練模型精确度的同時加速推理。常見的措施有修剪網絡連接配接或通道數減少預訓練模型中的備援連接配接;量化或因式分解減少計算備援加速推理;在不修改參數的前提下,通過FFT或者其他方法來優化卷積計算減少時間消耗;知識蒸餾是将在大模型中學到的知識遷移到小模型中使得小模型訓練更加容易。

關于這部分的内容我在之前的部落格中也有提到:https://blog.csdn.net/h__ang/article/details/88238734

三. Approach

3.1 針對群卷積做通道清洗

現代神經網絡經常由多個相同結構的重複塊組成。在它們之中,最先進的網絡如Xception和ResNeXt在建構塊時引入了高效的深度分離卷積群組卷積,使得其在性能和計算成本之間取得了平衡。然而我們注意到兩個設計中都未完全采用 1 x 1 的卷積核,因為這需要考慮複雜度的問題。舉個例子,在ResNeXt中僅僅對 3x3 的卷積核采用組卷積,是以在ResNeXt中對于每一個殘差單元來講逐點卷積占據了93.4%的計算量。在小型網絡中,昂貴的逐點卷積導緻有限的通道數滿足計算的限制,這往往會損壞模型的精确度。

為了解決這個問題,一個最直接的方法就是應用通道稀疏連接配接,比如在 1x1 的卷積層上做組卷積,通過確定每個卷積操作僅作用在相應的輸入通道上來減少計算成本。然而,如果多個組卷積堆疊在一起,就會産生一個副作用:一個确定通道的輸出僅僅取決于輸入通道的一部分,下圖的(a)展示了兩個堆疊組卷積層的情況,很明顯一個确定組的輸出僅與組内的輸入有關,這樣的性質阻止了不同通道組之間的資訊流通,弱化了資訊表達能力。

如果我們允許組卷積獲得不同組的輸入資料(正如下圖(b)所示),這樣的話輸入和輸出通道将會完全相關了。具體來講,對于由上個組卷積層産生的feature map,我們将每個組的通道拆分為幾個子組,然後将不同子組重新組合送入下一層。

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

這個過程由一個叫做通道清洗的操作高效而優雅的實作(正如上圖©)所示,步驟如下:

  • 有g個組的卷積層進行劃分使得輸出有 gxn 個通道;(劃分為g個組,每個組有n個通道)
  • feature map reshape為(g, n);
  • 将次元為(g, n)的feature map轉置為(n, g);
  • 平坦化之後分組送入下一層;(這時到底劃分為幾個組就取決于下一個組卷積的組數了)

用一組圖來更加貼切的說明一下(還是盜别人的圖,捂臉):

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

而且,通道清洗是可微分的,這意味着模型可以進行 end-to-end 的訓練;通道清洗操作使得使用多個組卷積層建構更強大的結構成為可能,下一節中我們将會介紹一種帶有通道清洗群組卷積的有效網絡單元。

現在換一種思路來了解組卷積,假定輸入的次元為 Hin x Win x Din,卷積核的次元為 h x w x Din x Dout,标準卷積的結果就是輸出次元為 Hin x Win x Dout,它的每一個元素包含了所有輸入通道的資訊,因為它使用 h x w x Din 對 Hin x Win x Din 做卷積來得到每一個元素的;在做組卷積時,它是先把 h x w x Din x Dout 的卷積核分為 g 個組,那麼每個組的次元為 h x w x (Din / g) x (Dout / g),這時每個組對應輸入的一部分,比如第一個組對應的輸入為 Hin x Win x [0: (Din / g)],第二組對應的輸入為 Hin x Win x [(Din / g) : (2Din / g)],以此類推…,用每個組的卷積核和對應的輸入做卷積得到 g 個 次元 Hin x Win x (Dout / g) 的輸出,拼接在一起得到一個 Hin x Win x Dout 的輸出。

其優點:

  • 可以高效地進行訓練,卷積倍分成多個路徑,每個路徑可由不同的GPU分開處理,是以模型可以并行方式在多個GPU上進行訓練;
  • 模型更加高效,即模型參數會随着分組數的增大而減少。舉個例子,在上面的陳述中标準卷積有 h x w x Din x Dout 個參數。具有 g個分組的組卷積的參數量為 h x w x (Din / g) x (Dout / g) x g = h x w x (Din / g) x Dout,減少了g倍;
  • 分組卷積也許能提供比标準完整 2D 卷積更好的模型,原因和稀疏過濾器的關系有關。

參考文獻:https://zhuanlan.zhihu.com/p/57575810

3.2 ShuffleNet單元

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

我們專門為小型網絡提出了一種新穎的ShuffleNet單元,我們從上圖(a)開始,這是一個殘差塊,在主分支的 3x3 卷積層我們使用了深度卷積,接着,我們用 1x1 的 組逐點卷積 和通道清洗取代第一個1x1卷積層得到圖(b),第二個組逐點卷積的目的是恢複通道次元讓其和shortcut比對上,第二個組卷積後面沒有加上通道清洗,除此之外,3x3 深度卷積層後面也沒有過ReLU函數了;至于ShuffleNet中應用步長的情況,我們簡單地做了兩點修正:

  • 在shortcut路徑上添加了一個 3x3 的平均池化層;
  • 使用通道拼接代替(b)中的元素相加,在擴大通道的同時增加的計算成本卻很少;

多虧了通道清洗和群逐點卷積,在ShuffleNet單元中的所有元素才可以高效地計算。與ResNet和ResNeXt相比,我們的結構在相同的配置下計算複雜度更低。舉個例子,給定次元為 c x h x w 的輸入,c為輸入層的通道數,bottleneck的通道為m:

  • ResNet單元需要的計算量為 hw(2cm + 9m**2)
  • ResNeXt單元需要 hw(2cm + 9m**2/g) FLOPS,
  • ShuffleNet單元僅僅需要 hw(2cm/g + 9m) FLOPS,這裡的g是卷積層的分組數。

換句話來講,在給定計算預算的限制下,ShuffleNet可以使用更寬的特征映射。我們發現這對小型網絡很重要,因為小型網絡沒有足夠的通道傳遞資訊。

另外我們還發現了一個問題,ShuffleNet的深度卷積僅僅作用在bottlenet上,這是由于深度卷積雖然理論上的計算複雜度很低,但是與其他密集型卷積相比其計算/存儲通路的效率很差。其原因在于兩點:

  • depthwise的卷積核複用率比普通卷積要小很多,記憶體中的置換率也比普通卷積高;
  • depthwise的卷積是per channel的,每個卷積的操作矩陣都很小,這麽小的矩陣不容易得到充分并行。

3.3 Network Architexture

基于上面的ShuffleNet單元,我們提出了ShuffleNet的整體結構如下表一:

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

網絡主要由三個階段的ShuffleNet單元堆疊組成,在每個階段的第一個組成層的步長都是2,同一個階段内的其它超參數是保持相同的,下一個階段的輸出通道數相對于上一個階段翻倍,特征尺寸相對于上一個階段減半。

在ShuffleNet單元中,組數g控制着逐點卷積連接配接的稀疏性,表1探索了不同組數的影響,在實驗中我們對不同組數采用不同的輸出通道數保證整體的計算複雜度基本不變(大約140MFLOPS)。很明顯,在給定的計算複雜度限制下較大的組數可以有更多的輸出通道數,着幫助我們可以編碼很多的資訊,然而太多的組數也有可能導緻組内資訊過少,丢失精度。

為了将網絡定制到所需要的複雜度,我們簡單地在通道數上應用一個比例因子s,舉個例子,我們将表1中的網絡定義為"ShuffleNet 1x",那麼"ShuffleNet sx"就是将ShuffleNet 1x中的卷積核的通道數縮減s倍,這将會導緻網絡的計算複雜度整體縮減s**2倍。

四. Experiments

我們在ImageNet 2012分類資料集上對模型進行了評估,我們遵循了ResNet的大多數訓練參數設定,除了兩點:

  • 我們将權重衰減率由1e-4改為4e-5;
  • 在資料預處理時使用較少的aggressive scale增強;

這是由于在小模型往往會欠拟合而不是過拟合,我們在4塊GPU上花了1-2天對模型進行了 3 x 10**5疊代,batchsize為1024。為了進行基準測試,我們在ImageNet驗證集上比較了top-1 的表現,将原來 的圖檔尺寸裁剪為 224 x 224。

4.1 Ablation Study

ShuffleNet的核心觀點就在于逐點組卷積和通道清洗,在這個子部分我們對其進行評估。

4.1.1 逐點組卷積

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

同一行表示的是相同的計算複雜度下,不同組數下的分類錯誤率,可以看到随着組數g的增大,一般情況下錯誤率會下降,因為分組越多,意味着可以從更多的通道數中擷取資訊。但是同時也有例外,當g增大到一定程度時錯誤率會上升,這是因為組數太多時組内資訊過少,丢失精度,總的而言,越小的模型更傾向于需要更大的分組數。

4.1.2 Channel Shuffle vs. No Shuffle

通道清洗的目的是對于多組卷積層進行跨層的資訊流動,下表展示了不同ShuffleNet結構下的模型準确率:

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

4.2 Comparison with Other Structure Units

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

4.3 Comparison with MobileNets and Other Frameworks

與MobileNets相比:

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

與其他一些流行架構相比:

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

4.4 Generalization Ability

table7展示了兩種分辨率不同的輸入下不同結構的表現:

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

4.5 Actual Speedup Evaluation

ShuffleNet模型解讀Abstract1. Introduction2. Related Work三. Approach四. Experiments

最後,我們在ARM的平台上評估了真實的推理速度,盡管越大的分組數理論上會有更好的表現,但是在實際實施時卻沒有想象中的效率高,經驗認為g=3通常會在準确率和實際推理時間之間取得平衡。由于記憶體通路和其他的一些開銷,理論上4倍的計算複雜度的減少經常隻會帶來 2.6倍的實際速度的提升。盡管如此,與AlexNet相比,我們的ShuffleNet 0.5x 模型在同一個計算複雜度下依然有13x的速度提升。

參考文章:

[1] https://blog.csdn.net/u011974639/article/details/79200559

[2] Diagonalwise Refactorization: An Efficient Training Method for Depthwise Convolutions

源碼連結:https://github.com/MG2033/ShuffleNet

繼續閱讀