ShuffleNetV1/V2簡述 | 輕量級網絡

ShuffleNet系列是輕量級網絡中很重要的一個系列,ShuffleNetV1提出了channel shuffle操作,使得網絡可以盡情地使用分組卷積來加速,而ShuffleNetV2則推倒V1的大部分設計,從實際出發,提出channel split操作,在加速網絡的同時進行了特征重用,達到了很好的效果
來源:曉飛的算法工程筆記 公眾號

ShuffleNet V1


論文: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

Introduction

? 神經網絡的精度越來越高,而推理性能也在逐漸變慢,在實際應用中不得不在性能與準確率間進行折中。為此,論文對小網絡的耗時進行分析,提出了ShuffleNet。論文首先介紹了ShuffleNet的核心操作Channel Shuffle以及Group Convolutions,然后再介紹Shuffle unit的結構,最后介紹ShuffleNet的架構。

Channel Shuffle for Group Convolutions

? 在目前的一些主流網絡中,通常使用pointwise卷積進行維度的降低,從而降低網絡的復雜度,但由于輸入維度較高,pointwise卷積的開銷是十分巨大的。對于小網絡而言,昂貴的pointwise卷積會帶來明顯的性能下降,比如在ResNext unit中,pointwise卷積占據了93.4%的計算量。為此,論文引入了分組卷積,首先探討了兩種ShuffleNet的實現:

  • 圖1a是最直接的方法,將所有的操作進行了絕對的維度隔離,但這會導致特定的輸出僅關聯了很小一部分的輸入,阻隔了組間的信息流,降低了表達能力。
  • 圖1b對輸出的維度進行重新分配,首先將每個組的輸出分成多個子組,然后將每個子組輸入到不同的組中,能夠很好地保留組間的信息流。

? 圖1b的思想可以簡單地用channel shuffle操作進行實現,如圖1c所示,假設包含$g$組的卷積層輸出為$g\times n$維,首先將輸出reshape()為$(g, n)$,然后進行transpose(),最后再flatten()回$g\times n$維。

ShuffleNet Unit

? 基于channel shuffle操作,論文提出了兩種ShuffleNet unit,從圖2a的基礎殘差結構開始,中間包含一個$3\times 3$深度卷積進行特征提取:

  • 圖2b為特征圖大小不變的ShuffeNet unit,將開始的$1\times 1$卷積層替換成pointwise分組卷積+channel shuffle操作,第二個pointwise分組卷積的作用是為了恢復到unit的輸入維度,方便與shortcut進行element-wise addition。后面的兩個卷積操作根據可分離深度卷積論文的建議只接了BN,沒有接BN+ReLU。論文嘗試了在第二個pointwise分組卷積后面再接一次channel shuffle操作,但并沒有提高很多精度。
  • 圖2c為特征圖大小減半的ShuffleNet unit,可用于block間的特征下采樣。主要在shortcut中添加$3\times 3$平均池化以及將最后的element-wise addition替換為channel concatenation,增加輸出維度且不會帶來太多的計算量。

? Shuffle unit的計算是比較高效的,對于$c\times h\times w$的輸入,bottleneck的中間維度為$m$,ResNet unit的計算量為$hw(2cm + 9m^2)$FLOPs,ResNeXt unit的計算量為$hw(2cm+9m^2/g)$FLOPs,ShuffleNet unit的計算量為$hw(2cm/g + 9m)$,$g$為卷積的分組數。在同等計算資源情況下,計算量的減少意味著ShuffeNet可以使用維度更多的特征圖,這在小網絡中十分重要。
? 需要注意的是,盡管深度卷積通常有較低的理論復雜度,但在實現時的效率是不高的。為此,ShuffleNet僅對bottleneck中的特征(維度較低)使用深度卷積。

Network Architecture

? ShuffleNet的結構如表1所示,3個不同的stage由ShuffleNet unit堆疊而成,每個stage的首個ShuffleNet unit比較特殊,使用圖2c的stride=2結構,特征圖大小縮小一倍,channel數增大一倍。其它的ShuffleNet unit使用圖2b的結構,bootlneck的維度設定為輸出的$1/4$。表1中設計不同分組數的網絡,并修改了對應的輸出維度,模型大小整體保持在140MFLOPs左右,網絡的分組數越大,可設置維度也越大。

Experiments

? 為了設定不同的網絡復雜度,對表1的網絡層維度加一個縮放因子$s$,比如ShuffleNet 0.5X為表1的所有層輸出維度減少一倍。

? 對不同scale和分組數的性能。

? 對比channel shuffle對不同網絡大小作用。

? 在保持復雜度的情況下,將stage2-4盡量替換成類似于其它主流網絡結構(具體設計看原文),進行性能對比。

? 對比同復雜度的MobileNet性能。

? 對比主流網絡的性能。

? 對比作為目標檢測主干的性能。

? CPU單線程推理速度對比。

Conclusion

? ShuffleNet的核心在于使用channel shuffle操作彌補分組間的信息交流,使得網絡可以盡情使用pointwise分組卷積,不僅可以減少主要的網絡計算量,也可以增加卷積的維度,從實驗來看,是個很不錯的work。

ShuffleNet V2


論文: ShuffleNet V2: Practical Guidelines for Efficient
CNN Architecture Design

Introduction

? 論文發現,作為衡量計算復雜度的指標,FLOPs實際并不等同于速度。如圖1所示,FLOPs相似的網絡,其速度卻有較大的差別,只用FLOPs作為衡量計算復雜度的指標是不夠的,還要考慮內存訪問消耗以及GPU并行。基于上面的發現,論文從理論到實驗列舉了輕量級網絡設計的5個要領,然后再根據設計要領提出ShuffleNet V2。

Practical Guidelines for Efficient Network Design

? 為了保證結果的正確性,論文在以下工業設備中進行理論的相關測試:

  • GPU. A single NVIDIA GeForce GTX 1080Ti is used. The convolution library is CUDNN 7.0
  • ARM. A Qualcomm Snapdragon 810.

? 包含以下5個輕量級網絡設計要領:

  1. G1: Equal channel width minimizes memory access cost (MAC).

? 主流的網絡大都使用深度分離卷積,其中pointwise卷積承擔了大部分的計算開銷。假設輸入維度$c_1$和輸出維度$c_2$,特征圖大小為$h$和$w$,則$1\times 1$的卷積核的計算量$B=hwc_1 c_2$,內存訪問消耗$MAC=hw(c_1+c_2)+c_1 c_2$,MAC可以表示為B相關的公式:

$MAC=hw(c_1+c_2)+c_1 c_2 \ge hw\sqrt{c_1 c_2} + c_1 c_2=\sqrt{hwB} + \frac{B}{hw}$

? 上式在$c_1$和$c_2$相等時取得最小值,即輸入輸出維度相等時,內存訪問消耗最小。

? 為了避免理論與實際不符,論文在實際設備上進行了對比,在保持FLOPs不變的情況下,調整輸入輸出維度的比例,可以看到1:1的情況下計算速度最快。因此,在設計結構時盡量保持卷積的輸入輸出的維度一致。

  1. G2: Excessive group convolution increases MAC

? 分組卷積能夠降低FLOPs,在固定的FLOPs情況下,分組卷積能夠使用更多的channel數,但channel的增加會帶來MAC的提高,$1\times 1$分組卷積的MAC與FLOPs的關系為

? $g$為分組數,$B=hwc_1 c_2/g$為FLOPs。在固定輸入和計算量情況下,MAC隨著$g$增加而增加。

? 論文同樣也在實際設備上進行了對比,使用更多的分組反而降低了推理的速度,主要由于MAC的增加。因此,需要謹慎地根據平臺和任務選擇分組數,選擇大的分組數能帶來一定程度的準確率提升,但也會導致計算消耗的快速提升。

  1. G3: Network fragmentation reduces degree of parallelism

? 目前一些網絡在單個block中使用了多通過,比如NASNET-A在單個block中使用了13個分支,而常規的網絡僅使用2-3個分支。盡管這樣的設計能夠提升準確率,但是對設備并行計算不友好,會帶來性能的下降。

? 在實際設備上進行對比,在固定FLOPs情況下,分別對比串行和并行分支結構的性能。從結果來看,單分支的結構性能最好,性能的下降在GPU設備上最為明顯。

  1. G4: Element-wise operations are non-negligible

? 論文對ShuffleNetV1和MobileNetV2的耗時進行了分析,發現element-wise操作(ReLU, AddTensor, AddBias, etc)的消耗是不可忽視的,特別在GPU設備上。盡管這些操作FLOPs不高,但其MAC相對較高。

? 在實際設備對比中,固定FLOPs的情況下,使用更多的element-wise操作會導致網絡的性能下降。

? 最后總結下論文發現的網絡設計要領:

  • 使用相同輸入輸出維度的卷積
  • 了解分組卷積帶來的損耗
  • 減少分支的數量
  • 減少element-wise操作

ShuffleNet V2: an Efficient Architecture

? 如上面提到的,ShuffleNetV1的pointwise分組卷積以及bottleneck結果均會提高MAC,導致不可忽視的計算損耗。為了達到高性能以及高準確率,關鍵是在不通過稠密卷積以及過多分組的情況下,獲得輸入輸出一樣的大維度卷積。

? ShuffeNetV1的unit結構如圖3ab所示,為了達到上面的目的,V1的基礎上加入channel split操作,如圖3c所示。在每個unit的開頭,將特征圖分為$c-c{'}$以及$c{'}$兩部分。根據G3,一個分支直接往后傳遞。根據G1,另一個分支包含3個輸入輸出維度一樣的卷積。根據G2,不再使用分組卷積,而且unit的開頭已經相當于進行了分組卷積。在完成卷積操作后,將特征concate,恢復到unit的輸入大小(符合G1),然后進行channel shuffle操作。這里沒有了element-wise adddition操作,符合了G4,在實現的時候將concat/channel shuffle/channel split合在一起做了,能夠進一步提升性能。
? 空間下采樣的操作進行了少量的修改,如圖3d所示,去掉了channel split操作,因此輸出的維度會翻倍。

? 類似于ShuffleNetV1,設定$c^{'}=c/2$stage2-4為堆疊ShuffleNet unit的結構,在全局池化前加了一個$1\times 1$卷積來幫助特征融合。ShuffleNetV2不僅速度快,準確率也不低,主要得益于兩個方面,首先是模型性能高,使得可以使用更大的維度以及網絡容量,其次是channel split可以使得部分特征直接穿過block,相當于DenseNet的特征重用。

? 論文對DenseNet以及ShuffleNetV2的特征重用程度進行了可視化對比,在DenseNet中,相鄰層的連接比其它層更強,意味著所有層的稠密連接存在冗余。而在ShuffleNet中,層間的影響力以$(1-c^{'})/c=0.5$的倍數進行衰減,與DenseNet有一定的相似性。

Experiment

? 將ShuffleNetV2 unit應用到大網絡中進行對比。

? 對比ShuffleNetV2作為檢測網絡主干的性能。

? 與不同大小的主流分類網絡進行性能對比。

Conclusion

? 論文從實踐出發,以實際的推理速度為指導,總結出了5條輕量級網絡的設計要領,并根據要領提出了ShuffleNetV2,很好地兼顧了準確率和速度,其中channel split操作十分亮眼,達到了類似DenseNet的特征重用效果。

CONCLUSION


? ShuffleNet系列是輕量級網絡中很重要的一個系列,ShuffleNetV1提出了channel shuffle操作,使得網絡可以盡情地使用分組卷積來加速,而ShuffleNetV2則推倒V1的大部分設計,從實際出發,提出channel split操作,在加速網絡的同時進行了特征重用,達到了很好的效果 。

?
?
?

如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的算法工程筆記】

work-life balance.

posted @ 2020-07-06 10:33  曉飛的算法工程筆記  閱讀(71)  評論(0編輯  收藏
最新chease0ldman老人