ShuffleNetv2論文詳解

語言: CN / TW / HK

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 12 月更文挑戰」的第2天,點擊查看活動詳情。 - 摘要 - 1、介紹 - 2、高效網絡設計的實用指導思想 - G1-同樣大小的通道數可以最小化 MAC - G2-分組數太多的卷積會增加 MAC - G3-網絡碎片化會降低並行度 - G4-逐元素的操作不可忽視 - 3、ShuffleNet V2:一個高效的架構 - 4、實驗 - 5、結論 - 6,個人思考 - 參考資料

近期在研究輕量級 backbone 網絡,我們所熟悉和工業界能部署的網絡有 MobileNet V2ShuffleNet V2RepVGG 等,本篇博客是對 ShuffleNet v2 論文的個人理解分析。本文的參考資料是自己對網絡上資料進行查找和篩選出來的,質量相對較高、且對本文有參考意義的文章。ShuffleNet v2 論文最大的貢獻在於看到了 GPU 訪存帶寬(內存訪問代價 MAC)對於模型推理時間的影響,而不僅僅是模型複雜度,也就是 FLOPs 和參數量 Params 對於推理時間的影響,並由此提出了 4 個輕量級網絡設計的原則和一個新穎的 卷積 block 架構-ShuffleNet v2。

摘要

當前,神經網絡結構的設計基本由間接的計算複雜度主導,例如 FLOPs,但是直接的度量如速度,還取決於其他因素,例如內存的獲取損耗和平台特性。因此,我們將使用直接的標準衡量,而不僅僅是 FLOPs。因此本文建議直接在目標平台上用直接度量進行測試。基於一系列控制條件實驗,作者提出了設計高效網絡結構的一些實用指導思想,並據此提出了一個稱之為 ShuffleNet V2 的新結構。綜合的對比實驗證明了作者的模型在速度和準確性上取得了最佳的平衡(state-of-the-art)。

1、介紹

為了衡量計算複雜度,一個廣泛採用的度量方式是浮點運算的次數 FLOPs,但是,它是一個間接的度量,是對我們真正關心的直接度量比如速度或者時延的一種近似估計。在以前的工作中,這種不一致已經被學者們所發現,比如 MobileNet v2 要比 NASNET-A 快很多,但是它們兩者具有差不多的 FLOPs。

圖1

圖 1 中在 GPUARM 兩個平台上,具有相同 FLOPs 的模型運行速度也會相差很多。因此只用 FLOPs 來衡量計算複雜度是不充分的,也會導致得不到最優的網絡設計。

導致這種不一致的主要有兩個原因:一是影響速度的幾個重要因素只通過 FLOPs 是考慮不到的,比如 MAC(Memory Access Cost)和並行度;二是具有相同 FLOPs 的模型在不同的平台上可能運行速度不一樣。 因此,作者提出了設計有效網絡結構的兩個原則。一是用直接度量來衡量模型的性能,二是直接在目標平台上進行測試。

2、高效網絡設計的實用指導思想

首先,作者分析了兩個經典結構 ShuffleNet v1 和 MobileNet v2 的運行時間。ARM 和 GPU 平台的具體運行環境如下圖所示。

ARM和GPU的具體運行環境

圖2

從圖 2 可以看出,雖然以 FLOPs 度量的卷積佔據了大部分的時間,但其餘操作也消耗了很多運行時間,比如數據輸入輸出、通道打亂和逐元素的一些操作(張量相加、激活函數)。因此,FLOPs 不是實際運行時間的一個準確估計。

  1. G1:同樣大小的通道數可以最小化 MAC
  2. G2:太多的分組卷積會增加 MAC。
  3. G3:網絡碎片化會減少並行度。
  4. G4:逐元素的操作不可忽視。

G1-同樣大小的通道數可以最小化 MAC

現代的網絡如 Xception [12], MobileNet [13], MobileNet V2 [14], ShuffleNet [15] 都採用了深度可分離卷積,它的點卷積(即 $1\times 1$ 卷積)佔據了大部分的計算複雜度(ShuffleNet 有分析)。假設輸入特徵圖大小為 $hwc_1$,那麼卷積核 shape 為 $(c_2, c_1, 1, 1)$,輸出特徵圖長寬不變,那麼 $1 \times 1$ 卷積的 FLOPs 為 $B = hwc_{1}c_{2}$。

論文中 FLOPs 的計算是把乘加當作一次浮點運算的,所以其實等效於我們通常理解的 MACs 計算公式。

簡單起見,我們假設計算設備的緩衝足夠大能夠存放下整個特徵圖和參數。那麼 $1 \times 1$ 卷積層的內存訪問代價(內存訪問次數)為 $MAC = hwc_1 + hwc_2 + c_{1}c_{2} = hw(c_{1} + c_{2}) + c_{1}c_{2}$,等式的三項分別代表輸入特徵圖、輸出特徵圖和權重參數的代價。由均值不等式,我們有:

$$ \begin{aligned} MAC &= hw(c_{1} + c{2}) + c_{1}c_{2} \ &= \sqrt{(hw)^{2}(c_{1} + c_{2})^{2}} + \frac{B}{hw} \ &\geq \sqrt{(hw)^{2}(4c_{1}c_{2})}+ \frac{B}{hw} \ &\geq 2\sqrt{hwB} + \frac{B}{hw} \ \end{aligned} $$

由均值不等式,可知當 $c_1 = c_2$ 時,$(c_{1} + c_{2})^{2} = 4c_{1}c_{2}$,即式子 $(c_{1} + c_{2})^{2}$ 取下限。即當且僅當 $c_{1}=c_{2}$ ($1 \times 1$ 卷積輸入輸出通道數相等)時,MAC 取得最小值。但是這個結論只是理論上成立的,實際中緩存容量可能不夠大,緩存策略也因平台各異。所以我們進一步設計了一個對比試驗來驗證,實驗的基準的網絡由 10 個卷積 block 組成,每個塊有兩層卷積,第一個卷積層輸入通道數為 $c_{1}$ 輸出通道數為$c_{2}$,第二層與第一層相反,然後固定總的 FLOPs 調整$c_{1}:c_{2}$的值測試實際的運行速度,結果如表 1 所示:

表1

可以看到,當比值接近 1:1 的時候,網絡的 MAC 更小,測試速度也最快。

G2-分組數太多的卷積會增加 MAC

分組卷積是現在輕量級網絡結構(ShuffleNet/MobileNet/Xception/ResNeXt)設計的核心,它通過通道之間的稀疏連接(也就是隻和同一個組內的特徵連接)來降低計算複雜度。一方面,它允許我們使用更多的通道數來增加網絡容量進而提升準確率,但另一方面隨着通道數的增多也對帶來更多的 MAC

針對 $1 \times 1$ 的分組卷積,我們有:

分組卷積 FLOPs 的計算公式,我寫的 MobileNet v1 論文詳解 有給出推導。

$$ \begin{aligned} B = h \ast w \ast 1 \ast 1 \ast \frac{c_1}{g} \ast \frac{c_2}{g} \ast g = \frac{hwc_{1}c_{2}}{g} \end{aligned} $$

$$ \begin{aligned} MAC = hw(c_{1} + c_{2}) + \frac{c_{1}c_{2}}{g} = hwc_{1} + \frac{Bg}{c_1}+\frac{B}{hw}\end{aligned} $$

固定 $\frac{c_2}{g}$ 的比值,又因為輸入特徵圖 $c_{1} \times h \times w$ 固定,從而也就固定了計算代價 $B$,所以可得 上式中 $MAC$ 與 $g$ 成正比的關係。

其中 $B$ 是卷積層的浮點運算次數(FLOPs),$g$ 是分組卷積的組數,可以看到,如果給定輸入特徵圖尺寸(shape)$c_{1} \times h \times w$ 和計算代價 $B$,則 $MAC$ 與組數 $g$ 成正比。本文通過疊加 10 個分組點卷積層設計了實驗,在保證計算代價(FLOPs)相同的情況下采用不同的分組組數測試模型的運行時間,結果如下表 2 所示。

表2

很明顯使用分組數多的網絡速度更慢,比如 分為 8 個組要比 1 個組慢得多,主要原因在於 MAC 的增加 。因此,本文建議要根據硬件平台和目標任務謹慎地選擇分組卷積的組數,不能簡單地因為可以提升準確率就選擇很大的組數,而忽視了內存訪問代價(MAC)的增加。

G3-網絡碎片化會降低並行度

GoogLeNet 系列和自動搜索得到的網絡架構中,每個網絡的 block 都採用多分支(multi-path)結構,在這種結構中多采用小的算子(fragmented operators 支路算子/碎片算子)而不是大的算子,block 中的每一個卷積或者池化操作稱之為一個 fragmented operator。如 NASNET-A[9]網絡的碎片算子的數量(即一個 building block 的單個卷積或池化操作的總數)為 13。相反,在 ResNet[4] 這樣的標準網絡中,碎片算子的數量為 2 或者 3。

Residual Block 有兩種,basic blockbottleneck block 的殘差結構。fragment,翻譯過來就是分裂的意思,可以簡單理解為網絡的單元或者支路數量。

儘管過去的論文已經表明,這種 fragmented structure(碎片化/支路結構)能夠提升模型的準確性,但是其會降低效率,因為這種結構 GPU 對並行性強的設備不友好。而且它還引入了額外的開銷,如內核啟動和同步。

kernel launching and synchronization. synchronization:同步支路結構分支之間的同步。network fragmentation 我翻譯為網絡碎片化。

為了量化網絡碎片化(network fragmentation)如何影響效率,我們評估了一系列具有不同碎片化程度(degree of fragmentation)的網絡塊(network blocks)。具體來説,對比實驗實驗的每個構建塊由 1 到 4 個 順序或並行結構的1x1 卷積層組成。The block structure 如附錄圖1所示。

附錄圖1

每個 block 重複堆疊 10 次。表 3 的結果表明,碎片化會降低 GPU 的速度,例如 4-fragment 比 1-fragment 結構慢約 3 倍。但是在 ARM 上,fragmentation 對速度的影響速會比 GPU 相對較小些。

表3

G4-逐元素的操作不可忽視

如圖 2 所示,例如 MobileNet v2ShuffleNet v1 這樣的輕量級模型中,按元素操作(element-wise)會佔用大量時間的,尤其是在 GPU 平台上。

在我們的論文中,逐元素算子包括 ReLUAddTensorAddBias 等,它們的 FLOPs 相對較小,但是 MAC 較大。特別地,我們把 depthwise convolution 當作一個 逐元素算子(element-wise operator),因為它的 MAC/FLOPs 的比值也較高。

shortcut 操作並不能當作 element-wise 算子。

論文使用 ResNet 的 "bottleneck" 單元進行實驗,其是由 $1 \times 1$ 卷積、然後是$3 \times 3$ 卷積,最後又是 $1 \times 1$ 卷積組成,並帶有 ReLUshortcut 連接,其結構圖如下圖所示。在論文的實驗中,刪除 ReLUshortcut 操作,表 4 報告了不同變體 "bottleneck" 的運行時間。我們觀察到,在刪除 ReLU 和 shortcut 後,在 GPU 和 CPU 平台都取得了 20% 的加速。

bottleneck

表4

結論和討論。根據上訴 4 個指導原則和經驗研究,我們得出高效的網絡結構應該滿足: 1. 使用平衡的卷積,也就是通道數一樣; 2. 合理使用分組卷積; 3. 減少碎片度; 4. 減少逐元素操作。

以上 4 個理想的屬性的發揮效果取決於平台特性(例如內存操作和代碼優化),這超出了論文理論上的範圍,但在實際網絡設計中我們應儘量遵守這些原則。 之前輕量級神經網絡體系結構的進展主要是基於 FLOPs 的度量標準,並沒有考慮上述 4 個屬性。比如 ShuffleNet v1 嚴重依賴分組卷積,這違反了 G2MobileNet v2 利用了反轉瓶頸結構,這違反了 G1,而且在通道數較多的擴展層使用 ReLU 和深度卷積,違反了 G4NAS 網絡生成的結構碎片化很嚴重,這違反了 G3

3、ShuffleNet V2:一個高效的架構

重新審查 ShuffleNet v1ShuffleNet 是一個 state-of-the-art 網絡,被廣泛應用於低端設備中(如手機)。它啟發了我們論文中的工作,因此,它首先被審查和分析。

根據 ShuffleNet v1,輕量級神經網絡的主要挑戰在於,在給定預算(FLOPs)的情況下,特徵圖的通道數也是受限制的。為了在不顯著增加 FLOPs 計算量的情況下提高通道數,ShuffleNet v1 論文采用了兩種技術:逐點組卷積和類瓶頸結構(pointwise group convolutions and bottleneck-like structures.);然後引入“channel shuffle” 操作,令不同組的通道之間能夠進行信息交流,提高精度。其構建模塊如圖 3(a)(b) 所示。

從本文 Section 2 的討論,可以知道逐點組卷積和瓶頸結構都增加了 MAC( G2G1 )。這個成本不可忽視,特別是對於輕量級模型。另外,使用太多分組也違背了 G3shortcut connection 中的逐元素加法(element-wise "Add")操作也不可取 (G4)。因此,為了實現較高的模型容量和效率,關鍵問題是如何保持大量且同樣寬的通道,同時沒有密集卷積也沒有太多的分組

如何保持大量且同樣寬的通道,同時沒有密集卷積也沒有太多的分組,這句話比較難理解。我的理解:1,卷積 block 裏面的卷積層通道多且同樣寬的通道的,意味着兩個連接的卷積層的通道數要多且相等。2,這裏密集卷積是指 $1\times 1$ 卷積。3,使用分組卷積時,分組數 group 不宜過多,那就意味着 DW 卷積的輸入通道數要較小。

ShuffleNet v2 的通道拆分。在 ShuffleNet v1 block的基礎上,ShuffleNet v2 block 引入通道分割(Channel Split)這個簡單的算子來實現上述目的,如圖 3(c) 所示。在每個單元 (block) 的開始,我們將輸入特徵圖的 $c$ 個通道切分成 (split) 兩個分支 (branches):$c-c^{'}$ 個通道和 $c^{'}$ 個通道。根據 G3 網絡碎片儘可能少,其中一個分支保持不變(shortcut connection),另外一個分支包含三個通道數一樣的卷積來滿足 G1。和 v1 不同,v2 block 的兩個 $1 \times 1$ 卷積不再使用分組卷積,一部分原因是為了滿足 G2,另外一部分原因是一開始的通道切分 (split)操作已經完成了分組效果。

最後,對兩個分支的結果進行拼接(concatnate),這樣對於卷積 block 來説,輸入輸出通道數是一樣的,符合 G1 原則。和 ShuffleNet v1 一樣都使用通道打亂(channel shuffle)操作來保證兩個分支的信息進行交互

ResNet 的 basic block 和 bottleneck block 也是這樣設計的,符合 G1 原則。

圖3

通道打亂之後的輸出,就是下一個單元的輸入。ShuffleNet v1 的 “Add” 操作不再使用,逐元素操作算子如:ReLUDW 卷積 只存在於在右邊的分支。與此同時,我們將三個連續的逐元素操作算子:拼接(“Concat”)、通道打亂(“Channel Shuffle”)和通道拆分(“Channel Split”合併成一個逐元素算子。根據 G4原則,這些改變是有利的。

針對需要進行空間下采樣的 block,卷積單元(block)進行了修改,通道切分算子被移除,然後 block 的輸出通道數變為兩倍,詳細信息如圖 3(d) 所示。

圖 3(c)(d) 顯示的卷積 block疊加起來即組成了最後的 ShuffleNet v2 模型,簡單起見,設置 $c^{'} = c/2$,這樣堆疊後的網絡是類似 ShuffleNet v1 模型的,網絡結構詳細信息如表 5 所示。v1 和 v2 block 的區別在於, v2 在全局平均池化層(global averaged pooling)之前添加了一個 $1 \times 1$ 卷積來混合特徵(mix up features),而 v1 沒有。和 v1 一樣,v2 的 block 的通道數是按照 0.5x 1x 等比例進行縮放,以生成不同複雜度的 ShuffleNet v2 網絡,並標記為 ShuffleNet v2 0.5×、ShuffleNet v2 1× 等模型。

注意:表 5 的通道數設計是為了控制 FLOPs,需要調整通道數將 FLOPs 與之前工作對齊從而使得對比實驗公平,沒有使用 2^n 通道數是因為其與精度無關。

表5

根據前文的分析,我們可以得出此架構遵循所有原則,因此非常高效。

網絡精度的分析ShuffleNet v2 不僅高效而且精度也高。有兩個主要理由:一是高效的卷積 block 結構允許我們使用更多的特徵通道數,網絡容量較大。二是當 $c^{'} = c/2$時,一半的特徵圖直接經過當前卷積 block 並進入下一個卷積 block,這類似於 DenseNetCondenseNet 的特徵重複利用。

DenseNet 是一種具有密集連接的卷積神經網絡。在該網絡中,任何兩層之間都有直接的連接,也就是説,網絡每一層的輸入都是前面所有層輸出的並集,而該層所學習的特徵圖也會被直接傳給其後面所有層作為輸入。

在 DenseNet 論文中,作者通過畫不同權重的 L1 範數值來分析特徵重複利用的模式,如圖 4(a)所示。可以看到,相鄰層之間的關聯性是遠遠大於其它層的,這也就是説所有層之間的密集連接可能是多餘的,最近的論文 CondenseNet 也支持這個觀點。

圖4

在 ShuffleNet V2 中,很容易證明,第 $i$ 層和第 $i+j$ 層之間直接相連的特徵圖通道數為 $r^{j}c$,其中 $r=(1−c^{'})/c$。換句話説,兩個 blocks 之間特徵複用的數量是隨着兩個塊之間的距離變大而呈指數級衰減的。相距遠的 blocks,特徵重用會變得很微弱。

圖 4 的兩個 blocks 之間關聯性的理解有些難。

因此,和 DenseNet 一樣,Shufflenet v2 的結構通過設計實現了特徵重用模式,從而得到高精度,並具有更高的效率,在實驗中已經證明了這點,實驗結果如表 8 所示 。

表8

4、實驗

精度與 FLOPs 的關係。很明顯,我們提出的 ShuffleNet v2 模型很大程度上優於其他網絡,特別是在小的計算量預算情況下。此外,我們也注意到 MobileNet v2 模型在 圖像尺寸為$224 \times 224$ 和模型計算量為 40 MFLOPs 量級時表現不佳,這可能是因為通道數太少的原因。相比之下,我們的設計的高效模型可以使用更多的通道數,所以並不具備此缺點。另外,如 Section 3 討論的那樣,雖然我們的模型和 DenseNet 都具有特徵重用功能,但是我們的模型效率更高。

推理速度和 FLOPs/Accuracy 的關係。本文比較了 ShuffleNet v2、MobileNet v2、ShuffleNet v1 和 Xception 四種模型的實際推理速度和 FLOPs的關係,如圖 1(c)(d) 所示,在不同分辨率條件下的更多結果在附錄表 1 中提供。

儘管 MobileNet v1 的精度表現不佳,但是其速度快過了 SHuffleNet v2等網絡。我們認為是因為 MobileNet v1 符合本文建議的原則(比如 G3 原則, MobileNet v1 的碎片化程度少於 ShuffleNet v2)。

與其他方法的結合。ShuffleNet v2 與其他方法結合可以進一步提高性能。當使用 SE 模塊時,模型會損失一定的速度,但分類的精度會提升 0.5%。卷積 block 的結構如附錄 2(b)所示,對比實驗結果在表 8 中。

附錄圖2

Sequeeze-and-Excitation(SE) block 不是一個完整的網絡結構,而是一個子結構(卷積 block),通用性較強、即插即用,可以嵌到其他分類或檢測模型中,和 ResNextShuffleNet v2 等模型結合。SENet 主要是學習了 channel 之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。SE 其 block 結構圖如下圖所示。

SE

大型模型通用化(Generation to Large Models)。雖然本文的消融(ablation)實驗主要是針對輕量級網絡,但是 ShuffleNet v2 在大型模型($FLOPs \geq 2G$)的表現上也絲毫不遜色。表6 比較了50 層的 ShuffleNet v2ShuffleNet v1ResNet50ImageNet 分類實驗上的精度,可以看出同等 FLOPs=2.3G 條件下 ShuffleNet v2 比 v1 的精度更高,同時和 ResNet50 相比 FLOPs 減少 40%,但是精度表現更好。實驗用的網絡細節參考附錄表2

表6

對於很深的 ShuffleNet v2 模型(例如超過 100 層),我們通過添加一個 residual path 來輕微的修改基本的 block 結構,來使得模型的訓練收斂更快。表 6 提供了 帶 SE 模塊的 164 層的 ShuffleNet v2 模型,其精度比當前最高精度的 state-of-the-art 模型 SENet 精度更高,同時 FLOPs 更少。

目標檢測任務評估。為了評估模型的泛化性能,我們使用 Light-Head RCNN 作為目標檢測的框架,在 COCO 數據集上做了對比實驗。表 7 的實驗結果表明模型在 4 種不同複雜度條件下, ShuffleNet v2 做 backbone 的模型精度比其他網絡更高、速度更快,全面超越其他網絡。

表7

Table 7: Performance on COCO object detection. The input image size is 800 1200. FLOPs row lists the complexity levels at 224 224 input size. For GPU speed evaluation, the batch size is 4. We do not test ARM because the PSRoI Pooling operation needed in [34] is unavailable on ARM currently. 比較檢測任務的結果(表 7),發現精度上 ShuffleNet v2 > Xception ≥ ShuffleNet v1 ≥ MobileNet v2。 比較分類任務的結果(表 8),精度等級上 ShuffleNet v2 ≥ MobileNet v2 > ShuffeNet v1 > Xception

表8

5、結論

我們建議對於輕量級網絡設計應該考慮直接 metric(例如速度 speed),而不是間接 metric(例如 FLOPs)。本文提出了實用的原則和一個新的網絡架構-ShuffleNet v2。綜合實驗證了我們模型的有效性。我們希望本文的工作可以啟發未來的網絡架構設計可以更重視平台特性和實用性。

這裏的直接 metric,可以是inference time or latency,也可以是模型推理速度 speed,其意義都是一樣的。

6,個人思考

分析模型的推理性能得結合具體的推理平台(常見如:英偉達 GPU、移動端 ARM CPU、端側 NPU 芯片等),目前已知影響推理性能的因素包括: 算子計算量 FLOPs(參數量 Params)、算子內存訪問代價(訪存帶寬)。但相同硬件平台、相同網絡架構條件下, FLOPs 加速比與推理時間加速比成正比。

舉例:對於 GPU 平台,Depthwise 卷積算子實際上是使用了大量的低 FLOPs、高數據讀寫量的操作。這些具有高數據讀寫量的操作,加上 GPU 的訪存帶寬限制,使得模型把大量的時間浪費在了從顯存中讀寫數據上,導致 GPU 的算力沒有得到“充分利用”。結論來源知乎文章-FLOPs與模型推理速度

最後,目前 AI 訓練系統已經有了一個公認的評價標準和平台-MLPerf,但是 AI 推理系統的評估,目前還沒有一個公認的評價指標。Training 系統的性能可以使用“達到特定精度的時間”這個簡單的標準來衡量。但 Inference 系統卻很難找到一個簡單的指標,LatencyThroughputPowerCost 等等,哪個指標合適呢?目前沒有統一的標準。

參考資料

  1. Group Convolution分組卷積,以及Depthwise Convolution和Global Depthwise Convolution
  2. 分組卷積和深度可分離卷積
  3. 理解分組卷積和深度可分離卷積如何降低參數量
  4. 深度可分離卷積(Xception 與 MobileNet 的點滴)
  5. MobileNetV1代碼實現
  6. 輕量級神經網絡:ShuffleNetV2解讀
  7. ShufflenetV2_高效網絡的4條實用準則
  8. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
  9. MobileNetV2: Inverted Residuals and Linear Bottlenecks
  10. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
  11. Squeeze-and-Excitation Networks