1. 程式人生 > >論文筆記:ShuffleNet v2

論文筆記:ShuffleNet v2

ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

ShuffleNet v2

1、四個問題

  1. 要解決什麼問題?

    • 輕量化模型。
  2. 用了什麼方法解決?

    • 文中提出了幾條設計輕量化模型的實踐準則(guidelines)。

      1. Guideline 1:輸入通道數與輸出通道數保持相等可以最小化記憶體訪問成本(memory access cost,簡稱MAC)。
      2. Guideline 2:組卷積中使用過多的分組數會增加記憶體訪問成本(MAC)。
      3. Guideline 3:網路結構太複雜(分支和基本單元過多)會降低網路的並行程度。
      4. Guideline 4:Element-wise的操作消耗不可忽視(包括ReLU,Tensor相加,bias相加等等)。
    • 這篇文章主要是在ShuffleNet v1的基礎之上進行改進的,並依照提出的guidelines重新改進了Shuffle Unit,並構建了ShuffleNet v2。

  3. 效果如何?

    • 文中進行了大量的對比實驗,將上述的準則直接對現有的一些模型進行修改,驗證準則的準確性。
    • 將ShuffleNet v2與其他模型進行比較,驗證了其有效性。
  4. 還存在什麼問題?

    • 這篇論文是今年才發表在ECCV18上的文章,各方面考慮得都很全,思路也很新穎,目前網上的復現還不是很多,後面我也去復現試試。

2、論文概述

2.1、引言

  • 目前一些有效地輕量化網路都是基於depth-wise convolution和group convolution的。
  • 大多數文章中針對網路計算複雜性的度量標準是浮點運算量(FLOPs),但是文中通過實驗發現,FLOPs並不能與網路的計算速度成正比。

在這裡插入圖片描述

  • 從圖中可以看出,相同的FLOPs下,不同網路的實際執行速度有不小差距。
  • 非直接度量標準(FLOPs)和直接度量標準(實際執行速度)的結果有所偏差,原因如下:
    1. 有一些很重要的影響因素,並沒有被FLOPs考慮進去。
      1. 一個就是記憶體訪問成本(MAC)。比如執行組卷積時,算力更強的平臺如GPU就可以忽略不計,而算力相對較弱的平臺如ARM就不能忽略不計了。
      2. 另一個原因就是並行化程度。在相同的 FLOPs 下,網路並行化程度更高的網路速度更快。
    2. 具有相同FLOPs的操作在不同平臺上,執行時間效率不同。

2.2、網路設計準則

Guideline1 : Equal channel width minimizes memory access cost (MAC)

  • 輸入通道數與輸出通道數保持相等可以最小化記憶體訪問成本(memory access cost,簡稱MAC)。

  • 假設輸入通道數為 c 1 c_1 ,輸出通道數為 c 2 c_2 ,特徵圖為 h × w h \times w

    • 每個 1 × 1 1 \times 1 卷積層的FLOPs是: B = h w c 1 c 2 B = h \cdot w \cdot c1 \cdot c2
    • 則MAC(記憶體訪問操作次數)為: M A C = h w ( c 1 + c 2 ) + c 1 c 2 MAC = h \cdot w \cdot (c_1 + c_2) + c_1 \cdot c_2
    • 由於 c 1 + c 2 2 c 1 c 2 = 2 B h w c_1 + c_2 \geq 2 \sqrt{c_1 \cdot c_2} = 2 \sqrt{\frac{B}{h \cdot w}}
    • 帶入MAC的式子中,可得: M A C = h w ( c 1 + c 2 ) + c 1 c 2 2 h w B h w + c 1 c 2 MAC = h \cdot w \cdot (c_1 + c_2) + c_1 \cdot c_2 \geq 2 \cdot h \cdot w \cdot \sqrt{\frac{B}{h \cdot w}} + c_1 \cdot c_2
    • 最終得到 M A C 2 B h w + B h w MAC \geq 2 \cdot \sqrt{B \cdot h \cdot w} + \frac{B}{h \cdot w}
    • 由此可知,MAC具有下界,當輸入與輸出通道數相等,即 c 1 = c 2 c_1 = c_2 時,MAC最小。
  • 關於guideline1的實驗結果如下圖:

    • 通過變換通道數,保證了幾個實驗的FLOPs大致一樣。從實驗結果可以看出,當 c 1 = c 2 c_1 = c_2 時,速度最快。

在這裡插入圖片描述

Guideline2 : Excessive group convolution increases MAC.

  • 組卷積中使用過多的分組數會增加記憶體訪問成本(MAC)
  • 對於組卷積來說,FLOPs為: B = h w c 1 c 2 g B = \frac{h \cdot w \cdot c_1 \cdot c_2}{g} g g 為分組數。
  • 組卷積的MAC計算公式如下:

在這裡插入圖片描述

  • 假設 h , w , c 1 , B h, w, c_1, B 不變,如果分組數 g g 增加,那麼MAC也會增加。
  • 關於guideline2的實驗結果如下圖:

在這裡插入圖片描述

  • 論文中給出的建議:
    • 分組數應該根據實際課題以及應用的平臺謹慎選擇。單純的通過增加分組卷積來增加通道數從而增加精確度是一個不明智的選擇。

Guideline3 : Network fragmentation reduces degree of parallelism.

  • 網路結構太複雜(分支和基本單元過多)會降低網路的並行程度。
  • 以下是實驗中使用的結構:

在這裡插入圖片描述

  • 實驗結果如下:

在這裡插入圖片描述

Guideline4 : Element-wise operations are non-negligible.

  • Element-wise的操作消耗不可忽視
  • 通過去除shortcut和ReLU等,在GPU和ARM上都可以獲得將近20%左右的提速。

在這裡插入圖片描述

2.3、ShuffleNet v2

在這裡插入圖片描述

  • ShuffleNet v1中可以優化的點:
    1. depthwise convolution和bottleneck結構增加了MAC。
    2. 組卷積中也使用了太多的組數。
    3. 跨層連線中的element-wise add等也可以去掉。
  • 圖(a)和圖(b)是ShuffleNet v1中的Shuffle Unit,圖©和圖(d)是改進後的Shuffle Unit。
    • 增加了Channel Split操作,實際上就是把輸入通道分為2部分。
    • 依照guideline2,減少分組卷積的分組數。只將一半的通道送入卷積層,剩下一半保留。
    • 依照guideline1,輸入與輸出通道數相同。每個分支中的卷積層的輸入輸出通道數都一致。
    • 依照guideline3,減少基本單元數。因此有一個分支不做任何操作,直接做恆等對映。
    • 依照guideline4,刪去一些element-wise操作。最後使用了concat替代了element-wise add,並去除了最後的ReLU。
    • 最後加入了channel shuffle來增加通道之間的資訊交流。
    • 在網路的最後,還要在平均池化層之前加入 1 × 1 1 \times 1 卷積層來進一步融合特徵。
  • 網路結構:

在這裡插入圖片描述

2.4、實驗

  • 幾個大型模型結果比較:

在這裡插入圖片描述

  • 在COCO資料集下目標檢測結果比較:

在這裡插入圖片描述

  • 多個模型綜合比較:

在這裡插入圖片描述

3、參考資料

  1. ShuffleNet v2演算法筆記
  2. ShuffleNet V2 論文閱讀筆記