ShuffleNet系列是輕量級網路中很重要的一個系列,ShuffleNetV1提出了channel shuffle操作,使得網路可以盡情地使用分組卷積來加速,而ShuffleNetV2則推倒V1的大部分設計,從實際出發,提出channel split操作,在加速網路的同時進行了特徵重用,達到了很好的效果
來源:曉飛的演算法工程筆記 公眾號
ShuffleNet V1
論文: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
- 論文地址:https://arxiv.org/pdf/1707.01083.pdf
- 論文程式碼:https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV1
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
- 論文地址:https://arxiv.org/pdf/1807.11164.pdf
- 論文程式碼:https://github.com/megvii-model/ShuffleNet-Series/tree/master/ShuffleNetV2
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個輕量級網路設計要領:
-
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的情況下計算速度最快。因此,在設計結構時儘量保持卷積的輸入輸出的維度一致。
-
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的增加。因此,需要謹慎地根據平臺和任務選擇分組數,選擇大的分組數能帶來一定程度的準確率提升,但也會導致計算消耗的快速提升。
-
G3: Network fragmentation reduces degree of parallelism
目前一些網路在單個block中使用了多通過,比如NASNET-A在單個block中使用了13個分支,而常規的網路僅使用2-3個分支。儘管這樣的設計能夠提升準確率,但是對裝置平行計算不友好,會帶來效能的下降。
在實際裝置上進行對比,在固定FLOPs情況下,分別對比序列和並行分支結構的效能。從結果來看,單分支的結構效能最好,效能的下降在GPU裝置上最為明顯。
-
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操作,在加速網路的同時進行了特徵重用,達到了很好的效果 。
如果本文對你有幫助,麻煩點個贊或在看唄~
更多內容請關注 微信公眾號【曉飛的演算法工程筆記】