輕量級神經網路:ShuffleNetV2解讀

CVer發表於2019-06-03

其實,我個人是比較偏向於工程師風格,工程導向,也許是和本科讀的機械專業有關吧。這就讓我養成了一個習慣:什麼東西我都想知道是什麼? 為什麼? 怎麼用?

最近一直在思考一個問題,大規模的神經網路和小規模的神經的網路的之間有什麼區別? 為什麼有了大規模神經網路的精度後還要去研究小規模的神經網路呢?

當然是要恰飯的嘛! 你個大網路雖然濃眉大眼精度高,但我要怎麼用你?我為了用你我好要給你準備很多的儲存空間,GPU,機房,散熱嗎?成本會很高的鴨,會沒錢吃飯的鴨!沒辦法,我只能投入輕量級網路的懷抱裡咯。

正應了這句老話:


輕量級神經網路:ShuffleNetV2解讀

廢話說完了,進入正題。

論文名:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design 論文地址:arxiv.org/abs/1807.1116 會議:ECCV2018

這篇文章來自來自曠視和清華研究組,被ECCV2018所收錄。為什麼直接介紹shuffleNetV2,而不是從V1開始?因為V2的效果一定是比V1好的,並且V2是從V1上發展而來,這樣我們就可以既學習了V2又學習了V1的不足。對照的學習,這樣我jio得效率是最高的。

論文主要分為三部分:

輕量級神經網路:ShuffleNetV2解讀


首先談一談目前模型用的指標FLOPs,之後討論了一下高效網路設計的設計準則,最後在shuffleNetV1上運用設計準則設計出shuffleNetV2。

摘要

【摘要】目前,網路架構設計主要由計算複雜度的間接度量(如FLOPs)測量。然而,直接度量(例如,速度)還取決於諸如儲存器訪問成本和平臺特性的其他因素。因此,這項工作建議評估目標平臺上的直接度量,而不僅僅考慮FLOPs。基於一系列對照實驗,這項工作為高效的網路設計提供了幾個實用指南。此外,提出了一種稱為ShuffleNetV2的新架構。利用消融實驗驗證了我們的模型在速度和準確度方面是最好的。

Section 1 FLOPs?

什麼是FLOPs

首先,先介紹一下FLOPs。


輕量級神經網路:ShuffleNetV2解讀


FLOPS: 全大寫,指每秒浮點運算次數,可以理解為計算的速度。是衡量硬體效能的一個指標。(硬體)

FLOPs: s小寫,指浮點運算數,理解為計算量。可以用來衡量演算法/模型的複雜度。(模型) 在論文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)

2017年,ICIR收錄了NVIDIA發表的一篇論文,在這篇論文的附錄裡,NVIDIA詳細的講解了一下FLOPs的計算。


輕量級神經網路:ShuffleNetV2解讀

對於卷積層來說:

輕量級神經網路:ShuffleNetV2解讀

有人將其簡化了一下:

輕量級神經網路:ShuffleNetV2解讀


感興趣的同學可以移步CNN模型所需的計算力(flops)和引數(parameters)數量是怎麼計算的? - 知乎

https://www.zhihu.com/question/65305385

在此推薦一個神器(pytorch):torchstat

https://github.com/Swall0w/torchstat

可以用來計算pytorch構建的網路的引數,空間大小,MAdd,FLOPs等指標,簡單好用。

比如:我想知道alexnet的網路的一些引數

只需要:

from torchstat import stat
import torchvision.models as models

model = model.alexnet()
stat(model, (3, 224, 224))

就能得到結果啦:

輕量級神經網路:ShuffleNetV2解讀

可以看到每一層都有結果!兼職是神器呀。

再附上一個常用網路的引數

輕量級神經網路:ShuffleNetV2解讀

來源:https://github.com/sovrasov/flops-counter.pytorch

以及:

輕量級神經網路:ShuffleNetV2解讀

跑的有點遠,收!

輕量級神經網路:ShuffleNetV2解讀


作者認為FLOPs是一種簡介的測量指標,是一個近似值,並不是我們真正關心的。我們需要的是直接的指標,比如速度和延遲。

輕量級神經網路:ShuffleNetV2解讀

圖c是經典小網路在GPU上的MFLOPs與速度(Batches/sec)的關係。 圖d是經典小網路在ARM上的MFLOPs與速度(Batches/sec)的關係。

我們可以發現,具有相似的FLOPs的網路,執行的速度卻不一樣。有的相差還挺大。

作者在此提出了第一個觀點:因此,使用FLOP作為計算複雜度的唯一指標是不充分的。

為什麼不能只用FLOPs作為指標呢?

作者認為有如下幾個原因:

1) FLOPs沒有考慮幾個對速度有相當大影響的重要因素。 2)計算平臺的不同。

1) FLOPs沒有考慮幾個對速度有相當大影響的重要因素

MAC和並行度

MAC

比如:MAC(記憶體訪問成本),計算機在進行計算時候要載入到快取中,然後再計算,這個載入過程是需要時間的。其中,分組卷積(group convolution)是對MAC消耗比較多的操作。

什麼是分組卷積?

group convolution 分組卷積

分組卷積最早是出現在AlexNet,當時這麼做是為了解決視訊記憶體不夠的問題。AlexNet使用的GPU型號是NVIDIA GTX 580,只有1.5GB的視訊記憶體可以用,但是這個模型需要3GB的RAM才能進行訓練。


輕量級神經網路:ShuffleNetV2解讀

可以看到,AlexNet有兩個部分,上面是在一個GPU上操作的,下面是在另外一個GPU上的操作,最後再進行特徵融合。將兩部分的卷積核組進行視覺化,得到如下圖:


輕量級神經網路:ShuffleNetV2解讀


AlexNet也指出,不管怎麼樣學習。最後卷積核組始終會分成兩個獨立的任務,上面是黑白過濾器,下面則是彩色過濾器

我們一般的卷積操作如下圖,卷積會對輸入資料的整體一起做卷積操作,即輸入資料:H1×W1×C1;而卷積核大小為h1×w1,一共有C2個,然後卷積得到的輸出資料就是H2×W2×C2。這裡假設輸出和輸出的WH不變

輕量級神經網路:ShuffleNetV2解讀


但是,當我門對一般的卷積進行“切割”之後,就是分組卷積了(如下圖)。

輕量級神經網路:ShuffleNetV2解讀

輸入資料被分成了2個group(g=2),卷積核(filters)被分成了2個group,每一個group都只有原來一半的feature map。用每組的卷積核同它們對應組內的輸入資料進行卷積操作,得到了兩組不同的輸出資料,再用通道合併(concatenate首尾相接)的方式組合起來,最終的輸出資料的通道仍是C2。需要注意的是,這種分組只是在Channel上進行劃分,即某幾個通道編為一組。

也就是說,分組數g決定以後,就將並行的運算g個相同的卷積過程。每個過程也就是每組,輸入資料為H1×W1×C1/g,卷積核大小為h1×w1×C1/g,一共有C2/g個,輸出資料為H2×W2×C2/g。

總之,Group convolution是一種卷積操作,先切分channel,然後分組卷積,運算上沒有什麼特別的地方,只是單純的通道分組處理,降低複雜度。

這樣就可以帶來一個好處:降低引數

我們用C1×K×K×C2 近似的計算引數量。

輕量級神經網路:ShuffleNetV2解讀


假設輸入通道為256,輸出通道也為256,kernel size為3×3,一般卷積引數為256×3×3×256。

分組卷積之後的引數量如下圖:

輕量級神經網路:ShuffleNetV2解讀


實施分組卷積時(g=8),每個組的輸入channel和輸出channel均為32(256/8),引數為8×32×3×3×32,是原來的八分之一。

什麼分組卷積會消耗MCA?

並行度

第二個對速度有相當大影響的重要因素就是模型的並行度。

在相同的FLOPs下,具有高並行度的模型可能比具有低並行度的另一個模型快得多。如果網路的並行度較高,那麼速度就會有顯著的提升。

2)計算平臺的不同

不同的執行平臺,得到的FLOPs也不相同。有的平臺會對操作進行最佳化,比如:cudnn加強了對3×3conv計算的最佳化。這樣一來,不同平臺的FLOPs大小確實沒有什麼說服力。

效率對比準則

透過以上的分析,作者提出了2個網路執行效率對比的設計準則:

1 使用直接度量方式如速度代替FLOPs。

2 要在目標計算平臺上計算,不然結果不具有代表性。

Section 2 高效網路設計實用指南

在這一節中,作者首先分析了兩個具有代表性的最先進網路的執行時效能(ShuffleNetV1,MobileNetV2)。然後,推出了四個高效網路設計指南,這些指南不僅僅考慮了FLOP

分析ShuffleNetV1,MobileNetV2

作者分別在GPU和CPU上去對ShuffleNetV1,MobileNetV2的執行時間進行了測試。


輕量級神經網路:ShuffleNetV2解讀


  • GPU使用單個NVIDIA GeForce GTX 1080Ti。卷積庫是CUDNN 7.0。

  • CPU使用高通驍龍 810.

測試結果如下:

輕量級神經網路:ShuffleNetV2解讀


可以看到,整個執行時被分解用於不同的操作。處理器在運算的時候,不光只是進行卷積運算,也在進行其他的運算,特別是在GPU上,卷積運算只佔了運算時間的一般左右。


輕量級神經網路:ShuffleNetV2解讀


我們將卷積部分認為是FLOPs操作。雖然這部分消耗的時間最多,但其他操作包括資料IO,資料混洗和逐元素操作(AddTensor,ReLU等)也佔用了相當多的時間。因此,再次確認了模型使用FLOPs指標對實際執行時間的估計不夠準確。

基於這一觀察,作者從幾個不同的方面對執行時間(或速度)進行了詳細分析,併為高效的網路架構設計提出了幾個實用指南。

四個高效網路設計指南

G1 輸入輸出具有相同channel的時候,記憶體消耗是最小的

由於目前主流網路均使用的depthwise separable convolutions,其中pointwise convolution(同上)(如1×1卷積)佔據了很大一塊的運算量(dwc和pwc之後寫文章詳述,在此就不說了)。所以作者以1×1卷積為例,假設feature map的大小為h×w輸入輸出channel分別為c1和c2,那麼:


輕量級神經網路:ShuffleNetV2解讀


由均值不等式,我們可得:


輕量級神經網路:ShuffleNetV2解讀


當 c1 = c2 時取得最小值。

來人,上實驗:

輕量級神經網路:ShuffleNetV2解讀

為了驗證這一個想法,作者設計了這個實驗。實驗網路是由10個block堆疊組成,每個block包含2個1×1卷積層,第一個卷積層的輸入輸出通道分別是c1和c2,第二個卷積層相反(c2,c1)。4行結果分別表示不同的c1:c2比例,但是每種比例的FLOPs都是相同的。

可以看出當c1和c2比例越接近時,速度越快,尤其是在c1:c2比例為1:1時速度最快。這與G1所提出的當c1和c2相等時MAC達到最小值相所對應。

G2 過多的分組卷積操作會增大MAC,從而使模型速度變慢

之前有提到,分組卷積操作會減少引數,這樣一來網路的計算量也就減少了。但是呢,認為網路的計算量減少,不代表模型的速度也會減少。MAC主要的消耗來源就來自分組卷積,分組卷積一多,MAC消耗的越多,模型速度也就變慢了。

和前面同理,帶group操作的1×1卷積的FLOPs如下所示,多了一個除數g,g表示分組數量。這是因為每個卷積核都只和c1/g個通道的輸入特徵做卷積。


輕量級神經網路:ShuffleNetV2解讀


MAC計算同理,和前面不同的是這裡卷積核的儲存量除g。

MAC和B之間的關係如下:


輕量級神經網路:ShuffleNetV2解讀


可以看出在B不變時,g越大,MAC也越大。

上實驗!


輕量級神經網路:ShuffleNetV2解讀


很清楚的看到,g越小,速度越快。因此,作者建議應根據目標平臺和任務仔細選擇組號。雖然組卷積能增加模型的準確度,但是作者認為盲目使用較大的組號是不明智的,因為這將會使得計算成本增加帶來的缺點大於準確度增加帶來的優點。

G3 模型中的分支數量越少,模型速度越快

作者認為,模型中的網路結構太複雜(分支和基本單元過多)會降低網路的並行程度,模型速度越慢。

文章用了一個詞:fragment,翻譯過來就是分裂的意思,可以簡單理解為網路的單元或者支路數量。


輕量級神經網路:ShuffleNetV2解讀


為了研究fragment對模型速度的影響,作者做了第三個實驗。具體地,每個模型由block組成,每個block由1到卷積組成,分別將它們重複10次。


輕量級神經網路:ShuffleNetV2解讀


得到的結果如下:


輕量級神經網路:ShuffleNetV2解讀


其中, 2-fragment-series表示一個block中有2個卷積層序列,也就是簡單的疊加; 4-fragment-parallel表示一個block中有4個卷積層並行,類似Inception的整體設計。 可以看出在相同FLOPs的情況下,單卷積層(1-fragment)的速度最快。

G4 Element-wise操作不能被忽略

Element-wise包括Add/Relu/short-cut/depthwise convolution等操作。

再回到之前的執行時間圖:


輕量級神經網路:ShuffleNetV2解讀

元素操作型別操作雖然FLOPs非常低,但是帶來的時間消耗還是非常明顯的,尤其是在GPU上。元素操作操作雖然基本上不增加FLOPs,但是所帶來的時間消耗佔比卻不可忽視。也即Small FLOPs heavy MAC。

於是作者做了一個實驗,採用的是Resnet50的瓶頸結構(bottleneck),除去跨層連結shortcut和 ReLU:




得到結果如下:




可以看到,在 GPU 和 ARM 結構上都獲得了接近 20% 的提速。

總結設計指南

把作者提出的四個高效網路設計指南再總結一下:

(1) 卷積層使用相同的輸入輸出通道數。

(2) 注意到使用大的分組數所帶來的壞處。

(3) 減少分支以及所包含的基本單元。

(4) 減少Element-wise操作。

Section 3 ShuffleNet V2

終於到了最後的部分了!

這一部分,作者根據之前所提出的設計指南,在shufflenetV1的基礎上進行修改,得到了shuffleNetV2。首先,簡要的回顧一下V1,看看V1的網路結構中有什麼地方違反了四條設計指南,再進行修改。

回顧ShuffleNet v1

shuffleNet在resnext單元基礎上進行改進。


輕量級神經網路:ShuffleNetV2解讀


shuffleNet主要擁有兩個創新點:

(1)pointwise group convolution 逐點分組卷積

(2)channel shuffle

原因:

1。逐點卷積佔了很大的計算量————> 逐點分組卷積

2。不同組之間特徵通訊問題 ————> channel shuffle

逐點組卷積,就是帶分組的卷積核為1×1的卷積,也就是說逐點組卷積是卷積核為1×1的分組卷積。

什麼是channel shuffle?

分組會導致資訊的丟失,為了解決這個問題,shuffleNetV1給出的方法就是交換通道,如下圖:




因為在同一組中不同的通道蘊含的資訊可能是相同的,如果不進行通道交換的話,學出來的特徵會非常侷限。如果在不同的組之後交換一些通道,那麼就能交換資訊,使得各個組的資訊更豐富,能提取到的特徵自然就更多,這樣是有利於得到更好的結果。如圖c所示,每組中都有其他所有組的特徵。




於是shuffleNetV1從最初的a到了b。首先用帶group的1×1卷積代替原來的1×1卷積,同時跟一個channel shuffle操作。然後是3×3 dwc,然後去掉了兩個ReLU層,這個在Xception和mobileNetV2中有所介紹。

V1有何不妥?


輕量級神經網路:ShuffleNetV2解讀


如Section 2所述,逐點組卷積增加了MAC違背了G2。這個成本不可忽視,特別是對於輕量級模型。另外,使用太多分組也違背了 G3。

輕量級神經網路:ShuffleNetV2解讀

瓶頸結構違背了G1與多單位違背了G3。

輕量級神經網路:ShuffleNetV2解讀


為了實現較高的模型容量和效率,關鍵問題是如何保持大量且同樣寬的通道,既沒有密集卷積也沒有太多的分組Add操作是元素級加法操作也不可取違反了G4。因此,為了實現較高的模型容量和效率,關鍵問題是如何保持大量且同樣寬的通道,既沒有密集卷積也沒有太多的分組。

為此,作者引入了channel split

shuffleNetV2


輕量級神經網路:ShuffleNetV2解讀


左圖是V1,右圖是V2。

1.在每個單元的開始,透過Channel split將c特徵通道的輸入被分為兩支,分別帶有 c−c' 和c'個通道。按照準則G3,一個分支的結構仍然保持不變。另一個分支由三個卷積組成, 為滿足G1,令輸入和輸出通道相同。與 ShuffleNet V1 不同的是,兩個 1×1 卷積不再是組卷積(GConv),因為Channel Split分割操作已經產生了兩個組。

2.卷積之後,把兩個分支拼接(Concat)起來,從而通道數量保持不變 (G1),而且也沒有Add操作(element-wise操作)(G4)。然後進行與ShuffleNetV1相同的Channel Shuffle操作來保證兩個分支間能進行資訊交流。

3.depthwise convolution保留

上述構建模組被重複堆疊以構建整個網路,被稱之為 ShuffleNet V2。基於上述分析,本文得出結論:由於對上述四個準則的遵循,shuffleNetV2架構設計非常的高效。

V2(左)和V1(右)網路整體結構如下圖:


輕量級神經網路:ShuffleNetV2解讀

作者在多個模型的測試對比結果如下:

輕量級神經網路:ShuffleNetV2解讀
從FLOPs、精度、速度上進行詳細對比。實驗中不少結果都和前面幾點發現吻合,比如MobileNet v1在GPU上速度最快,主要使用了DW卷積以及逐點卷積,使得網路結構簡單,沒有太多複雜的支路結構,符合G3;IGCV2和IGCV3因為group操作較多(違反G2),所以整體速度較慢;最後的幾個透過自動搜尋構建的網路結構,和前面的第3點發現對應,因為支路較多,所以速度較慢,符合G3的標準,另外IGCV2與IGCV3的速度較慢主要是因為使用了較多的group。

shuffleNetV2和其他幾個輕量級網路在GPU和ARM兩個平臺上的對比如下:


輕量級神經網路:ShuffleNetV2解讀

可以看到,速度和準確度都是最好的。

ShuffleNet V2 在 COCO 目標檢測任務上的效能與其他小網路對比:

輕量級神經網路:ShuffleNetV2解讀

最後,作者夾帶了點小“私活”:

輕量級神經網路:ShuffleNetV2解讀


相關文章