天天看點

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

1.概述

  這篇文章是高性能神經網絡的經典論文之一shufflenet-v2, 發表于18年7月份,由曠視的馬甯甯,孫堅等人提出。21年的RepVgg論文中的一些理論基礎很多也是來自于這篇文章。這篇文章層層遞進的可以總結為如下這樣幾個問題:

  • 高性能網絡在做什麼?
  • 之前高性能網絡設計是怎麼做的?這樣設計的依據目标函數是否存在問題?
  • 高性能網絡的真實的設計目标是什麼?依據設計目标,進行對比實驗,可以得到一些有用的怎樣的設計準則?
  • 依據提出的設計準則,設計了一個網絡,效果是否可以達到預期?

2. 高效能網絡

  如果是學術競賽,accuracy必定是越高越好。但在實際的業務場景下,算法人員要考慮的除了accuracy之外,還包括efficiency. 其中對于efficiency 的範疇包括網絡運作所需要 的耗時、記憶體、帶寬等實際算法工業化落地所要面對的各種實際因素。高效網絡,可以了解為在精度不降低的情況下,上述實際參數越低,則越高效率。而在這幾個參數中,耗時可能是使用者實際更加關注的。

  首先要保證精度基本不掉點。就要明确精度來源于哪裡。我們能想到的可能包括以下3點:

  1. 網絡深度: 網絡越深,非線性越強,
  2. 網絡寬度:也即具體到一個卷積層中卷積的通道數,通道數目越多,特征越豐富
  3. 特征之間的資訊交流:普通卷積操作所固有的

  但上述精度的獲得事實上是由算法的計算複雜度所帶來的,也就是我們通常所講的計算量Flops(float point operations),它大概可以表示為sum(M * N * K * K * CIN * COUT), sum是代表一個網絡有幾層,這個網絡的計算量就有幾個這樣的通式相加而成。可以看到其實計算量與精度的來源是一個互為寄生的關系。

  • 網絡深度代表的是sum的層數,層數多了,但計算量勢必也會變大,是以會變得低效。
  • 網絡寬度對應的是COUT, 特征豐富了,計算量識别也會變大, 是以會變得低效。
  • 特征之間的資訊交流對應的是K和CIN, 相比較于以上兩點,這點會比較含糊。

  是以高效網絡的設計一般都是針對這一點進行改進。比如包括常見的:用3 * 3卷積代替7 * 7 卷積,來降低參數量;用group卷積來為CIN除以一個g因子,來降低計算量;Depthwise 卷積和Pointwise 卷積, 來降低計算量 。

  shfflenet v1和mobilenet v2的核心思想都可以歸結于group卷積和Depthwise卷積。這也是shufflenetv2之前高效網絡的大概設計思路。

3. 如何設計輕量級網絡

   shufflenet v2首先指出以往的高效網絡的設計在根上就是錯的。如果講高效網絡設計作為一個優化問題的話,之前研究學者的優化目标是 m i n ( F l o p s ) min({Flops}) min(Flops)優化條件是盡可能保持網絡的深度、廣度不下降,特征之間的資訊交流不要少。但一系列異常的現象不斷的出現:

  異常現象1:MobileNet v2和NASNET-A的計算量相當,但前者要遠遠快于後者。

  異常現象2 更大範圍的将經典的高效網絡計算量和運作速度列舉出來。如下圖所示(先暫時不要看下圖中的Shufflenet V2的點):

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  如果我們将Xception、ShuffleNet v1、MobileNet v2的計算量限制的一樣,如圖c所示,在主流GPU上,其速度卻千差萬别。

  是以将Flops作為高效網絡設計的目标變量,設計出來的網絡極有可能不具有實際的使用價值。另外對比圖c和圖d, 在GPU平台上運作耗時可能相差較大,但在ARM上卻沒有那麼大的差異。

  是以,作者認為首先需要明确兩點:

  • 我們的目标函數的展現以FLOP作為理論目标函數是有問題。其直接的實體名額應該是耗時(或者延時性),但我們在實際實驗之前,必須要有理論的目标函數,否則都是馬後炮,這個理論的目标函數應該是大概f(Flops)的一個東西。
  • 網絡是否高效的分析,必須要建立在指定硬體平台的基礎上,因為一個網絡設計在GPU上展現了很大的優勢,但在ARM平台上卻展現不出來。(一個比較直覺的解釋之一是,不同的平台加速算子的實作以及優化程度不同,比如cudnn可能對3 x 3卷積操作進行了特别的操作)。

  是以,接下來的思路就可以比較順的梳理為:找到f(Flops)------->梳理處規則性的準則------->設計除高效的網絡。

3.1 找到f(Flops)

   Flops之是以不等同于耗時的高低,原因在于Flops的公式可以看出,它僅僅是對卷積層的操作數的公式。神經網絡除此之外,還包括data io, data shuffle 和 elemetwise 操作(例如addTensor和Relu操作等)。

  很容易的,把神經網絡的所有可能耗時的操作統計全的話,就可統計出如下圖所示的耗時分布(以shufflenet v1和mobilenet v2為例)。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  可以看到,對于GPU來講,卷積操作僅占整體耗時分布的50%左右(可以認為對應的就是Flops算出來的大小),這也就難怪,圖c中,如果保持Flops一緻,實際耗時千差萬别。但對于ARM平台,卷積操作幾乎占據90%左右,對應圖d中,Flops基本和實際耗時一緻。而shufflenet v2就是針對圖中Data和Elemwise兩大塊進行分析。

3.2 四條設計準則

3.2.1 G1: CIN==COUT

  來看證明過程:以1x1卷積為例子,作者引入了一個MAC(memory access cost)的概念來描述Data耗時,它的計算公式為:hw(CIN+COUT)+CIN * COUT。計算量B的公式為hw Cin Cout如果計算量B固定的話,則MAC滿足如下的不等式子,

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

如果我們希望MAC最小,則測試可得Cin==Cout.推導過程見我的手抄版本。事實上對于k*k的卷積也是同樣的結論,不再重複證明。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

3.2.2 G2: group卷積的g并不是越大越好。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  如果以1x1卷積的MAC為例可以寫出上面的式子。可以看到如果以g為變量,MAC會随着g的增大而增大。是以group的卷積并不是越大越好。但這并不是講group卷積就沒有價值了,它仍舊是可以使用的。隻不過我們假設它的使用場景:如果一個算法人員,我們使用了g卷積,他希望借此可以将輸出通道的數量擴大g倍,來達到相同運作速度的情形下,獲得一個更好的精度效果。他可能會失望,因為根據G2,此時網絡的速度會變慢。但其實他可以将輸出通道的數量擴大的倍數不要那麼的大,來獲得一個計算量耗時+MAC耗時整體不變,來達到提升精度的效果。這其實就涉及到trade-off了。

3.2.3 G3: fragmented operators影響網絡的并行度

  fragmented operators也就是網絡中獨立存在的一個卷積或者池化單元。為了确認對fragmented operators概念了解的沒有錯,可以通過以下幾個子產品進行以下驗證。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

   接下來作者,做了一個實驗來驗證fragment的數量(以及并行和串行結構)對運作耗時的影響,如下表所示,

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

保證FLOPS一緻的前提下,fragment的數量越多,耗時越長,對于4:1的fragment數量,耗時大概會達到3:1的量級。但下表也有以下兩點資訊需要注意:對于非并行晶片,CPU來講,這種fragment的數量似乎并沒有太大影響。對于GPU來講,當通道數目上升之後,fragment的數量對運作耗時的影響似乎在變小。是以一般部署的時候,大部分公司都會将卷積操作于BN操作進行合并,來減少fragment的數量。再有就是2021年的repVGG論文,的一個核心操作就是将多個卷積進行合并操作。但想說的是G3的實驗貌似沒有控制MAC的控制變量,若fragment的數量上升,此時MAC其實也在增加,是以增加的耗時可能是由MAC引起的。

3.2.4 G4:Elementwise操作是不可忽略的

  Elementwise操作狹義的來講包括Relu、Addtensor、Addbias操作,廣義的來講,一切具有高的MAC/FLOPS比的操作都可以納入到這部分,比如包括Deepwise 卷積。在之前的高效能網絡中,這部分由于其Flops低,極易被忽略。如下圖實驗結果所示:

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

3.3 總結與讨論

  總結下來就是4條結論。

  1. 使用balanced的卷積;
  2. 小心使用group卷積的代價。
  3. 減少fragmentation度。
  4. 減少element-wise操作。

  之前的一些輕量級網絡犯得錯誤包括:shufflenetv1過度依賴group卷積,違背了G2; 使用bottleneck-like結構違背了G1。MobileNet v2則是因為inverted bottleneck結構違背了G1.使用了厚的卷積特征違背了準則G4.(薄的eletment-wise耗時約占四分之一,厚的eletment-wise耗時約占六分之一)自動生成的結構則嚴重的違背了準則G3。

4. 實驗結果

  接下來讓我們看一看,shufflent v2的網絡結構。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

其中c和d是shufflenet v2的網絡結構, a和b是shufflenetv1的網絡結構。結構c是本文的重點或者說創新點,首先通過引入channel split結構,将Group卷積消除掉,符合規則2.其次無論是右分支還是整體uint分支都滿足cin==cout,符合規則1. 第三點是将add操作替換為Concat操作(是否可以通過指針直接得到),符合規則4. 圖d則是在圖b的基礎上進行了少許改動。

  如下圖所示是網絡結構的具體堆砌方式。大概就是c結構和d結構進行混合,d結構負責拉升通道數量,增加特征的豐富性,提升精度;c結構用來展現本文高效能網絡的優勢。是以通道數量的變化是24–》48–》96》192而不是我們之前遇到的2^n方式的增長形式。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  最後,來看結果:首先是經典高效網絡之間,計算量、速度和準确率之間的比較。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  shufllenet v2加上se子產品,依舊可以提升0.5個百分點。

  shufflenet v2有與大網絡抗衡的能力。與resnet-50性能比,與SENet網絡性能比。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

  用在檢測主幹上,也是最好的。

高性能網絡之shufflenet v21.概述2. 高效能網絡3. 如何設計輕量級網絡4. 實驗結果4. 個人感想

4. 個人感想

  repVGG的這篇論文其實的先導文章就是shufflenetv2。v2通過實際定量的實驗,推導除了一些準則還是很有意義的。并讓我們知道了影響速度的因素除了flops還有mac,并行度。但也會有一些瑕疵,總感覺沒有将flops和mac以及并行度放到一個次元上,感覺是三個次元空間上的因素。

繼續閱讀