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