深度學習與CV教程(10) | 輕量化CNN架構 (SqueezeNet,ShuffleNet,MobileNet等)

ShowMeAI發表於2022-06-05

ShowMeAI研究中心


前言

卷積神經網路的結構優化和深度加深,帶來非常顯著的影像識別效果提升,但同時也帶來了高計算複雜度和更長的計算時間,實際工程應用中對效率的考慮也很多,研究界與工業界近年都在努力「保持效果的情況下壓縮網路複雜度」,也誕生了很多輕量化網路。在本篇內容中,ShowMeAI對常見主流輕量級網路進行展開講解。

本篇重點

  • 神經網路引數與複雜度計算
  • 輕量化網路
  • SqueezeNet
  • Xception
  • ShuffleNet V1~V2
  • MobileNet V1~V3

1.基礎知識

我們先來做一點基礎知識儲備,本篇講到的輕量化CNN框架,我們需要了解引數量和計算量的估測與計算方式。

1.1 複雜度分析

  • 理論計算量(FLOPs):浮點運算次數(FLoating-point Operation)
  • 引數數量(params):單位通常為 \(M\),用 float32 表示。

1.2 典型結構對比

  • 標準卷積層 std conv(主要貢獻計算量)
    • params:\(k_h\times k_w\times c_{in}\times c_{out}\)
    • FLOPs:\(k_h\times k_w\times c_{in}\times c_{out}\times H\times W\)
  • 全連線層 fc(主要貢獻引數量)
    • params:\(c_{in}\times c_{out}\)
    • FLOPs:\(c_{in}\times c_{out}\)
  • group conv
    • params:\((k_h\times k_w\times c_{in}/g \times c_{out}/g)\times g=k_h\times k_w\times c_{in}\times c_{out}/g\)
    • FLOPs:\(k_h\times k_w\times c_{in}\times c_{out}\times H\times W/g\)
  • depth-wise conv
    • params:\(k_h\times k_w\times c_{in}\times c_{out}/c_{in}=k_h\times k_w\times c_{out}\)
    • FLOPs:\(k_h\times k_w\times c_{out}\times H\times W\)

2.SqueezeNet

輕量化網路中一個著名的網路是 SqueezeNet ,它發表於ICLR 2017,它擁有與 AlexNet 相同的精度,但只用了 AlexNet 1/50 的引數量。

SqueezeNet 的核心在於採用不同於常規的卷積方式來降低引數量,具體做法是使用 Fire Module,先用 \(1 \times 1\) 卷積降低通道數目,然後用 \(1 \times 1\) 卷積和 \(3 \times 3\) 卷積提升通道數。

2.1 壓縮策略

SqueezeNet 採用如下3個策略:

  • ① 將 \(3 \times 3\) 卷積替換為 \(1 \times 1\) 卷積
  • ② 減少 \(3 \times 3\) 卷積的通道數
  • ③ 將降取樣操作延後,這樣可以給卷積提供更大的 activation map,從而保留更多的資訊,提供更高的分類準確率。

其中,策略1和2可以顯著減少模型引數量,策略3可以在模型引數量受限的情況下提高模型的效能。

2.2 Fire Module

Fire Module是SqueezeNet網路的基礎模組,設計如下圖所示:

SqueezeNet; Fire Module 模組


一個 Fire Module 由 Squeeze 和 Extract 兩部分組成

  • Squeeze 部分包括了一系列連續的 \(1 \times 1\) 卷積
  • Extract 部分包括了一系列連續的 \(1 \times 1\) 卷積和一系列連續的 \(3 \times 3\) 卷積,然後將 \(1 \times 1\)\(3 \times 3\) 的卷積結果進行concat。

記 Squeeze 部分的通道數為 \(C_{s{1\times 1}}\),Extract部分 \(1 \times 1\)\(3 \times 3\) 的通道數分別為 \(C_{e{1\times 1}}\)\(C_{e{3\times 3}}\),作者建議 \(C_{s{1\times 1}} \lt C_{e{1\times 1}} + C_{e{3\times 3}}\) ,這樣做相當於在 Squeeze 和 Extraxt 之間插入了 bottlenet。

2.3 網路結構

Fire Module的基礎上搭建SqueezeNet神經網路。它以卷積層開始,後面是 8 個 Fire Module,最後以卷積層結束,每個 Fire Module 中的通道數目逐漸增加。另外網路在 conv1,fire4,fire8,conv10的後面使用了 max-pooling。

SqueezeNet 結構如下圖所示,左側是不加 shortcut 的版本,中間是加了 shortcut 的版本,右側是在不同通道的特徵圖之間加入 shortcut 的版本。

SqueezeNet; SqueezeNet 網路結構


SqueezeNet的效能類似於AlenNet,然而引數量只有後者的1/50,使用Deep Compression可以進一步將模型大小壓縮到僅僅有0.5M。

2.4 SqueezeNet缺點

SqueezeNet 缺點如下:

  • SqueezeNet 通過更深的網路置換更多的引數,雖然有更低的引數量,但是網路的測試階段耗時會增加,考慮到輕量級模型傾向於應用在嵌入式場景,這一變化可能會帶來新的問題。
  • AlaxNet 的引數量(50M)大部分由全連線層帶來,加上一部分引數量進行對比,數字稍有誇張。

3.Xception

另一個需要提到的典型網路是 Xception,它的基本思想是,在 Inception V3 的基礎上,引入沿著通道維度的解耦合,基本不增加網路複雜度的前提下提高了模型的效果,使用Depthwise Seperable Convolution實現。

Xception雖然不是出於輕量級的考慮而設計的模型,但是由於使用了pointwise convolution和depthwise convolution的結合,實際上也起到了降低引數量的效果,我們也放在輕量模型裡做個介紹。

3.1 設計動機

卷積在 HWC(高 \(\times\)\(\times\) 通道數)這3個維度上進行學習,既考慮空間相關性,又考慮通道相關性,可以考慮這兩種相關性解耦分開。

Xception 的做法是使用 point-wise convolution 考慮 cross-channel correlation,使用 depthwise convolution 考慮 spatial correlation。

3.2 從Inception到Extreme version of Inception

下圖是一個 Inception V3 的基礎模組,分別用 \(1 \times 1\) 卷積和 \(3 \times 3\) 卷積考慮通道相關性和空間相關性,基本結構是用 \(1 \times 1\) 卷積降維,用 \(3 \times 3\) 卷積提取特徵:

Xception; Inception 網路結構


如果將上述結構簡化,則可以得到如下的結構,可見每一個分支都包含了一個 \(1 \times 1\) 卷積和一個 \(3 \times 3\) 卷積:

Xception; 對 Inception 簡化


從上圖中可見,對於每一個分支,該模組使用 \(1 \times 1\) 卷積對輸入特徵圖進行處理,然後使用 \(3 \times 3\) 卷積提取特徵。

如果考慮空間相關性和通道相關性的解耦合,即用同一個 \(1 \times 1\) 卷積進行通道處理,將處理結果沿著通道維度拆解為若干部分,對於每一部分使用不同的 \(3 \times 3\) 卷積提取特徵,則得到如下圖所示的模組:

Xception; 解耦合 Inception


考慮一種更為極端的情況,在使用 \(1 \times 1\) 卷積之後,沿著通道維度進行最為極端的拆解,對於拆解後的每一個部分使用 \(3 \times 3\) 卷積提取特徵,這一步可以使用 depthwise convolution 實現,最後將這些提取到的特徵圖進行 concat,這就是 Xception 的基礎模組,如下圖所示:

Xception; Inception 改造為 Xception 基礎模組


通過上圖可以看到,該模組將輸入資料在「通道維度」上解耦,我們稱之為 extreme version of inception module。這點與 depthwise seperable convolution 很相似。

3.3 Extreme version of Inception與Depthwise Seperable Convolution

這一操作與 Depthwise Seperable Convolution 十分相似,後者包含 Depthwise Convolution 和 Pointwise Convolution 兩部分。

上圖所示的基礎模組與 Depthwise Seperable Convolution 有如下兩點不同:

  • ① Depthwise Seperable Convolution先使用depthwise convolution,再使用 \(1 \times 1\) 卷積進行融合;上圖所示的基礎模組先使用 \(1 \times 1\) 卷積,再使用depthwise convolution。
  • ② Depthwise Seperable Convolution 的 depthwise convolution 和 \(1 \times 1\) 卷積之間沒有啟用函式;上圖所示的基礎模組的這兩個操作之間有啟用函式。

在 Xception 中,作者直接使用了 Depthwise Seperable Convolution 作為基礎模組。

3.4 Xception網路結構

最後將這一基礎模組疊加,並結合殘差連線,就得到了Xception網路結構:

Xception; Xception 網路結構

4.ShuffleNet

ShuffleNet 是由曠世科技提出的輕量化CNN網路,論文名稱《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》,目標是改造網路架構使其能應用在移動裝置上。

4.1 設計動機

ShuffleNet的動機在於大量的 \(1 \times 1\) 卷積會耗費很多計算資源,而 Group Conv 難以實現不同分組之間的資訊交流;ShuffleNet 的解決方式是:使用 Group Conv 降低引數量;使用Channel Shuffle實現不同組之間的資訊交流,進而對ResNet進行改進,可以看作ResNet的壓縮版本。

4.2 Group Conv

我們再來看看Group Conv這個結構,它的基本思想是對輸入層的不同特徵圖進行分組,再使用不同的卷積核對不同組的特徵圖進行卷積,通過分組降低卷積的計算量。

而Depthwise Convolution可以視作Group Conv的一種特殊情形。

假設輸入通道為 \(C_i\),輸出通道為 \(C_o\),分組數目為 \(g\),Group Conv的操作如下:

  • 將輸入特徵圖沿著通道分為 \(g\) 組,每一組的通道數目為 \(C_i/g\)
  • 使用 \(g\) 個不同的卷積核,每一個卷積核的濾波器數量為 \(C_o/g\)
  • 使用這 \(g\) 個不同的卷積核,對 \(g\) 組特徵圖分別進行卷積,得到 \(g\) 組輸出特徵圖,每一組的通道數為 \(C_o/g\)
  • 將這 \(g\)組的輸出特徵圖結合,得到最終的 \(C_o\) 通道的輸出特徵圖。

4.3 Channel Shuffle

Group Conv 的一個缺點在於不同組之間難以實現通訊。一個可能的解決方式是使用 \(1 \times 1\) 卷積進行通訊,但是這樣會引入很大的計算量。

文中提出的思路是對 Group Conv 之後的特徵圖沿著通道維度進行重組,這樣資訊就可以在不同組之間流轉,即 Channel Shuffle,如下圖(c)所示。

ShuffleNet; Channel Shuffle


其實現過程如下:

  • ① 輸入特徵圖通道數目為 \(g\times n\)
  • ② 將特徵圖的通道維度reshape為 \((g,n )\)
  • ③ 轉置為 \((n,g )\)
  • ④ 平坦化成 \(g \times n\) 個通道

4.4 ShuffleNet基礎模組

結合 Group Conv 和 Channel Shuffle,對ResNet的基礎模組bottleneck(下圖(a))進行改進,就得到了 ShuffleNet 的基礎模組(下圖(b)和(c))

ShuffleNet; ShuffleNet 基礎模組


4.5 ShuffleNet缺點

  • Channel Shuffle 操作較為耗時,導致 ShuffleNet 的實際執行速度沒有那麼理想。
  • Channel Shuffle 的規則是人為制定的,更接近於人工設計特徵。

5.ShuffleNet V2

在 ShuffleNet 之後又有改進的版本 ShuffleNet V2,改進了上述提到的 ShuffleNet 缺點,減少其耗時。

5.1 設計動機

ShuffleNet的輕量級網路設計,FLOPs 減少了很多,但實際的時間消耗並不短。原因是網路訓練或者推理的過程中,FLOPs 僅僅是其耗時的一部分,其他操作(如記憶體讀寫、外部資料 IO 等)也會佔用時間。

ShuffleNet V2 的作者分析了幾種網路結構在 GPU/ARM 這兩種平臺上的計算效能指標,並提出了4條移動端卷積網路設計的準則,根據這些準則改進 ShuffleNet 得到了 ShuffleNet V2。

我們先來看看這4條移動端網路設計準則:

5.2 高效CNN設計的幾個準則

使用的指標是記憶體訪問時間(Memory Access Cost, MAC)。用理論和實驗說明了以下幾條準則。

1) 輸入輸出通道數目相同時,卷積層所需的MAC最小。

理論推導:假設 \(1 \times 1\) 卷積的輸入通道數目為 \(c_1\),輸出通道數目為 \(c_2\),特徵圖大小為 \(h\times w\),則這樣一個 \(1 \times 1\) 卷積的 FLOPs 為:

\[B=hwc_1 c_2 \]

所需的儲存空間如下,其中 \(hwc_1\) 表示輸入特徵圖所需空間, \(hwc_2\) 表示輸出特徵圖所需空間, \(c_1c_2\) 表示卷積核所需空間:

\[MAC = hw(c_1 + c_2 + c_1 c_2) \]

根據均值不等式可得:

\[MAC \ge 2 \sqrt {hwB} + \frac {B}{hw} \]

等式成立的條件是 \(c_1 = c_2\),即在給定 FLOPs,輸入特徵通道數和輸出特徵通道數相等時,MAC 達到取值的下界。 實驗證明:\(c_1\)\(c_2\)越接近、速度越快,如下表。

高效CNN的設計準則; 當輸入、輸出通道數目相同時,卷積層所需的 MAC 最小

2) 過多的group操作會增大MAC

理論推導:帶 group 的 \(1 \times 1\) 卷積的FLOPs如下,其中 \(g\) 表示分組數目:

\[B = \frac{hwc_1c_2}{g} \]

MAC 如下:

\[MAC = hw(c_1 + c_2 + \frac {c_1c_2}{g} ) \]

因此:

\[\begin{aligned} MAC &= hw(c_1 + c_2 + \frac {c_1c_2}{g} \\ & =hwc_1 + \frac {Bg} {c_1} + \frac {B} {hw} \end{aligned} \]

可見,在一定 FLOPs 的情況下,分組數目 \(g\) 越大,MAC 也越大。

實驗證明:在FLOPs基本不變的操作下,group越大,速度越慢,如下圖所示。

高效CNN的設計準則; 過多的 group 操作會增大MAC


3) 模型的碎片化程度越低,模型速度越快

實驗證明:fragment 表示碎片化程度的量化,serious 表示序列,即幾個卷積層的疊加,parallel 表示並行,即類似於 Inception 的設計。可見在 FLOPs 不變的情況下,分支數量越多,網路的實際耗時越大。

高效CNN的設計準則; 模型的碎片化程度越低,模型速度越快


4) element-wise操作所帶來的時間消耗遠比在FLOPs上的體現的數值要多。

element-wise 操作雖然基本不增加 FLOPs,但是在 ShuffleNet V1 和 MobileNet V2 中,其耗時是十分可觀的,如下圖:

高效CNN的設計準則; element-wise 操作所帶來的時間消耗遠比在 FLOPs 上的體現的數值要多


實驗證明:基於 ResNet 的 bottleneck 進行了實驗,short-cut 是一種 element-wise 操作。實驗證明short-cut 操作會帶來耗時的增加。

高效CNN的設計準則; short-cut 操作會帶來耗時的增加


5.3 ShuffleNet V2基礎模組

基於前面提到的4條準則,對 ShuffleNet 的基礎模組(下圖(a)(b))進行修改,得到 ShuffleNet V2 的基礎模組(下圖中(c)(d)):

ShuffleNet V2; ShuffleNet V2 基礎模組


圖中 (c) 和 (a) 相比,有如下不同之處:

  • ① 模組的開始處增加了一個 Channel Split 操作,將輸入特徵圖沿著通道分為 \(c'\)\(c-c'\) 兩部分,文中 \(c'=c/2\) ,對應於「準則1」。
  • ② 取消了 \(1 \times 1\) 卷積中的 Group 操作,對應於「準則2」。
  • ③ Channel Shuffle 移到了 Concat 後面,對應「準則3」。(因為 \(1 \times 1\) 卷積沒有 Group 操作,沒有必要在後面接 Channel Shuffle)
  • ④ element-wise add 替換成 concat,對應「準則4」。

(b)、(d) 之間的區別也類似,另外(d) 的兩個分支都進行了降取樣,且最初沒有 Channel Split 操作,因此 Concat 之後的通道數目翻倍。

5.4 ShuffleNet V2整體結構

上述 ShuffleNet V2 基礎模組級聯,配合卷積、池化等銜接,就得到了如下圖的 ShuffleNet V2 結構:

ShuffleNet V2; ShuffleNet V2


6.MobileNet

另外一個非常有名的輕量化移動端網路是 MobileNet,它是專用於移動和嵌入式視覺應用的卷積神經網路,是基於一個流線型的架構,使用深度可分離的卷積來構建輕量級的深層神經網路。 MobileNet 憑藉其優秀的效能,廣泛應用於各種場景中,包括物體檢測、細粒度分類、人臉屬性和大規模地理定位。

MobileNet有 V1 到 V3 不同的版本,也逐步做了一些優化和效果提升,下面我們來分別看看它的細節。

6.1 MobileNet核心思想

MobileNet V1 的核心是將卷積拆分成 Depthwise Conv 和 Pointwise Conv 兩部分,我們來對比一下普通網路和MobileNet的基礎模組

  • 普通網路(以VGG為例)\(3 \times 3\) Conv BN ReLU
  • Mobilenet基礎模組\(3 \times 3\) Depthwise Conv BN ReLU 和 \(1\times1\) Pointwise Conv BN ReLU

MobileNet; MobileNet 基礎模組


6.2 MobileNet缺點

  • ① ReLU啟用函式用在低維特徵圖上,會破壞特徵。
  • ② ReLU輸出為0時導致特徵退化。用殘差連線可以緩解這一問題。

7.MobileNet V2

MobileNet V2 針對 MobileNet 的上述2個問題,引入了 Inverted Residual 和 Linear Bottleneck對其進行改造,網路為全卷積,使用 RELU6(最高輸出為6)啟用函式。下面我們展開介紹一下核心結構:

7.1 Inverted Residual

我們對比一下普通殘差模組和Inverted Residual的差別

1) 普通殘差模組

先使用 \(1 \times 1\) 卷積降低通道數量,然後使用 \(3 \times 3\) 卷積提取特徵,之後使用 \(1 \times 1\) 卷積提升通道數量,最後加上殘差連線。整個過程是「壓縮-卷積-擴張」。

2) Inverted Residual

先使用 \(1 \times 1\) 卷積提升通道數量,然後使用 \(3 \times 3\) 卷積提取特徵,之後使用 \(1 \times 1\) 卷積降低通道數量,最後加上殘差連線。整個過程是「擴張-卷積-壓縮」。

對比兩個結構塊如下圖所示:

輕量化CNN架構; Residual block & Inverted Residual block


7.2 Linear Bottleneck

相比於 MobileNet 的基礎模組,MobileNet V2 在 Depthwise Convolution 的前面加了一個 \(1 \times 1\) 卷積,使用 ReLU6 代替 ReLU,且去掉了第二個 \(1 \times 1\) 卷積的啟用函式(即使用線性的啟用函式),防止 ReLU 對特徵的破壞。

7.3 MobileNet V2基礎模組

使用上述的方法對 MobileNet 的基礎模組進行改進,得到如下所示的 MobileNet V2 基礎模組:

MobileNet V2; MobileNet V2 基礎模組


8.MobileNet V3

在 MobileNet V2 的基礎上,又提出了MobileNet V3,它的優化之處包括:引入了 SE尾部結構改進通道數目調整h-swish 啟用函式應用NAS 網路結構搜尋等。我們來逐個看一下:

8.1 SE結構

MobileNet V3 在 bottleneck 中引入了 SE 結構,放在 Depthwise Convolution 之後,並且將 Expansion Layer 的通道數目變為原來的 \(1/4\) ,在提升精度的同時基本不增加時間消耗。

MobileNet V3; 引入SE


8.2 尾部結構改進

MobileNet V3對尾部結構做了2處修改,從下圖中「上方結構」修改為「下方結構」:

MobileNet V3; 修改尾部結構


  • \(1 \times 1\) 卷積移動到 avg pooling 後面,降低計算量。
  • 去掉了尾部結構中「擴張-卷積-壓縮」中的 \(3 \times 3\) 卷積以及其後面的 \(1 \times 1\) 卷積,進一步減少計算量,精度沒有損失。

8.3 通道數目調整

相比於 MobileNet V2,MobileNet V3 對頭部卷積通道數目進行了進一步的降低。

8.4 h-swish啟用函式

MobileNet V3 採用了 \(\mathbf{h-swish}\) 啟用函式,對應的 \(\mathbf{swish}\)\(\mathbf{h-swish}\) 啟用函式計算公式如下:

\[\mathbf{swish}[x] = x \cdot \sigma(x) \]

\[\mathbf{h-swish}[x] = x \frac {\mathbf{ReLU6}(x + 3)}{6} \]

8.5 NAS網路結構搜尋

MobileNet V3 先用 NAS 搜尋各個模組,得到大致的網路結構,相當於整體結構搜尋;然後用NASAdapt得到每個卷積層的通道數目,相當於區域性搜尋。

9.參考資料

10.要點總結

  • 神經網路引數與複雜度計算
  • 輕量化網路
  • SqueezeNet
  • Xception
  • ShuffleNet V1~V2
  • MobileNet V1~V3

史丹佛 CS231n 全套解讀

ShowMeAI 系列教程推薦

ShowMeAI用知識加速每一次技術成長

相關文章