縱覽輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet、Xception

 2018-01-08 14:23:00.0

原標題:縱覽輕量化卷積神經網絡:SqueezeNet、MobileNet、ShuffleNet、Xception

作者:餘霆嵩

本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。

目錄

一、引言

二、輕量化模型

2.1 SqueezeNet

2.2 MobileNet

2.3 ShuffleNet

2.4 Xception

三、網絡對比

一、引言

自 2012 年 AlexNet 以來,卷積神經網絡(簡稱 CNN)在圖像分類、圖像分割、目標檢測等領域獲得廣泛應用。隨着性能要求越來越高,AlexNet 已經無法滿足大家的需求,於是乎各路大牛紛紛提出性能更優越的 CNN 網絡,如 VGG、GoogLeNet、ResNet、DenseNet 等。由於神經網絡的性質,爲了獲得更好的性能,網絡層數不斷增加,從 7 層 AlexNet 到 16 層 VGG,再從 16 層 VGG 到 GoogLeNet 的 22 層,再到 152 層 ResNet,更有上千層的 ResNet 和 DenseNet。雖然網絡性能得到了提高,但隨之而來的就是效率問題。

效率問題主要是模型的存儲問題和模型進行預測的速度問題(以下簡稱速度問題)

  • 第一,存儲問題。數百層網絡有着大量的權值參數,保存大量權值參數對設備的內存要求很高;

  • 第二,速度問題。在實際應用中,往往是毫秒級別,爲了達到實際應用標準,要麼提高處理器性能(看英特爾的提高速度就知道了,這點暫時不指望),要麼就減少計算量。

只有解決 CNN 效率問題,才能讓 CNN 走出實驗室,更廣泛的應用於移動端。對於效率問題,通常的方法是進行模型壓縮(Model Compression),即在已經訓練好的模型上進行壓縮,使得網絡攜帶更少的網絡參數,從而解決內存問題,同時可以解決速度問題。

相比於在已經訓練好的模型上進行處理,輕量化模型模型設計則是另闢蹊徑。輕量化模型設計主要思想在於設計更高效的「網絡計算方式」(主要針對卷積方式),從而使網絡參數減少的同時,不損失網絡性能。

本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是:SqueezeNet、MobileNet、ShuffleNet、Xception。

(PS: 以上四種均不是模型壓縮方法!!)

以下是四個模型的作者團隊及發表時間

其中 ShuffleNet 論文中引用了 SqueezeNet;Xception 論文中引用了 MobileNet

二、輕量化模型

由於這四種輕量化模型僅是在卷積方式上做了改變,因此本文僅對輕量化模型的創新點進行詳細描述,對實驗以及實現的細節感興趣的朋友,請到論文中詳細閱讀。

2.1 SqueezeNet

SqueezeNet 由伯克利&斯坦福的研究人員合作發表於 ICLR-2017,論文標題:

《SqueezeNet:AlexNet-level accuracy with 50x fewer parameters and <0.5MB》

命名:

從名字——SqueezeNet 就知道,本文的新意是 squeeze,squeeze 在 SqueezeNet 中表示一個 squeeze 層,該層採用 1*1 卷積覈對上一層 feature map 進行卷積,主要目的是減少 feature map 的維數(維數即通道數,就是一個立方體的 feature map,切成一片一片的,一共有幾片)。

創新點:

1. 採用不同於傳統的卷積方式,提出 fire module;fire module 包含兩部分:squeeze 層+expand 層

創新點與 inception 系列的思想非常接近!首先 squeeze 層,就是 1*1 卷積,其卷積核數要少於上一層 feature map 數,這個操作從 inception 系列開始就有了,並美其名曰壓縮,個人覺得「壓縮」更爲妥當。

Expand 層分別用 1*1 和 3*3 卷積,然後 concat,這個操作在 inception 系列裏面也有。

SqueezeNet 的核心在於 Fire module,Fire module 由兩層構成,分別是 squeeze 層+expand 層,如下圖 1 所示,squeeze 層是一個 1*1 卷積核的卷積層,expand 層是 1*1 和 3*3 卷積核的卷積層,expand 層中,把 1*1 和 3*3 得到的 feature map 進行 concat。

具體操作情況如下圖所示:

Fire module 輸入的 feature map 爲 H*W*M 的,輸出的 feature map 爲 H*M*(e1+e3),可以看到 feature map 的分辨率是不變的,變的僅是維數,也就是通道數,這一點和 VGG 的思想一致。

首先,H*W*M 的 feature map 經過 Squeeze 層,得到 S1 個 feature map,這裏的 S1 均是小於 M 的,以達到「壓縮」的目的,詳細思想可參考 Google 的 Inception 系列。

其次,H*W*S1 的特徵圖輸入到 Expand 層,分別經過 1*1 卷積層和 3*3 卷積層進行卷積,再將結果進行 concat,得到 Fire module 的輸出,爲 H*M*(e1+e3) 的 feature map。

fire 模塊有三個可調參數:S1,e1,e3,分別代表卷積核的個數,同時也表示對應輸出 feature map 的維數,在文中提出的 SqueezeNet 結構中,e1=e3=4s1。

講完 SqueezeNet 的核心——Fire module,看看 SqueezeNet 的網絡結構,如下圖所示:

網絡結構設計思想,同樣與 VGG 的類似,堆疊的使用卷積操作,只不過這裏堆疊的使用本文提出的 Fire module(圖中用紅框部分)

看看 Squezeenet 的參數數量以及性能:

在這裏可以看到,論文題目中提到的小於 0.5M,是採用了 Deep Compression 進行模型壓縮之後的結果!!

看了上圖再回頭看一看論文題目:

SqueezeNet :AlexNet-level accuracy with 50x fewer parameters and <0.5MB

標!題!黨!SqueezeNet < 0.5MB, 這個是用了別的模型壓縮技術獲得的,很容易讓人誤以爲 SqueezeNet 可以壓縮模型!!

SqueezeNet 小結:

1 Fire module 與 GoogLeNet 思想類似,採用 1*1 卷積對 feature map 的維數進行「壓縮」,從而達到減少權值參數的目的;

2 採用與 VGG 類似的思想——堆疊的使用卷積,這裏堆疊的使用 Fire module

SqueezeNet 與 GoogLeNet 和 VGG 的關係很大!

2.2 MobileNet

MobileNet 由 Google 團隊提出,發表於 CVPR-2017,論文標題:

《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》

命名:

MobileNet 的命名是從它的應用場景考慮的,顧名思義就是能夠在移動端使用的網絡模型。

創新點:

1. 採用名爲 depth-wise separable convolution 的卷積方式代替傳統卷積方式,以達到減少網絡權值參數的目的。

通過採用 depth-wise convolution 的卷積方式,達到:1. 減少參數數量 2. 提升運算速度。(這兩點是要區別開的,參數少的不一定運算速度快!還要看計算方式!)

depth-wise convolution 不是 MobileNet 提出來的,也是借鑑,文中給的參考文獻是 2014 年的博士論文——《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》

depth-wise convolution 和 group convolution 是類似的,depth-wise convolution 是一個卷積核負責一部分 feature map,每個 feature map 只被一個卷積核卷積;group convolution 是一組卷積核負責一組 feature map,每組 feature map 只被一組卷積核卷積。Depth-wise convolution 可以看成是特殊的 group convolution,即每一個通道是一組。

MobileNets 精華在於卷積方式——depth-wise separable convolution;採用 depth-wise separable convolution,會涉及兩個超參:Width Multiplier 和 Resolution Multiplier 這兩個超參只是方便於設置要網絡要設計爲多小,方便於量化模型大小。

MobileNet 將標準卷積分成兩步:

  • 第一步 Depth-wise convolution, 即逐通道的卷積,一個卷積核負責一個通道,一個通道只被一個卷積核「濾波」;

  • 第二步,Pointwise convolution,將 depth-wise convolution 得到的 feature map 再「串」起來,注意這個「串」是很重要的。「串」作何解?爲什麼還需要 pointwise convolution?作者說:However it only filters input channels, it does not combine them to create new features. Soan additional layer that computes a linear combination ofthe output of depth-wise convolution via 1 × 1 convolutionis needed in order to generate these new features。

從另外一個角度考慮,其實就是:輸出的每一個 feature map 要包含輸入層所有 feature map 的信息。然而僅採用 depth-wise convolution,是沒辦法做到這點,因此需要 pointwise convolution 的輔助。

輸出的每一個 feature map 要包含輸入層所有 feature map 的信息」這個是所有采用 depth-wise convolution 操作的網絡都要去解決的問題,ShuffleNet 中的命名就和這個有關!詳細請看 2.3

Standard convolution、depth-wise convolution 和 pointwise convolution 示意圖如下:

其中輸入的 feature map 有 M 個,輸出的 feature map 有 N 個。

對 Standard convolution 而言,是採用 N 個大小爲 DK*DK 的卷積核進行操作(注意卷積核大小是 DK*DK, DK*DK*M 是具體運算時一個卷積核的大小!)

而 depth-wise convolution + pointwise convolution 需要的卷積核呢?

Depth-wise convolution :一個卷積核負責一個通道,一個通道只被一個卷積核卷積;則這裏有 M 個 DK*DK 的卷積核;

Pointwise convolution:爲了達到輸出 N 個 feature map 的操作,所以採用 N 個 1*1 的卷積核進行卷積,這裏的卷積方式和傳統的卷積方式是一樣的,只不過採用了 1*1 的卷積核;其目的就是讓新的每一個 feature map 包含有上一層各個 feature map 的信息!在此理解爲將 depth-wise convolution 的輸出進行「串」起來。

下面舉例講解 Standard convolution、depth-wise convolution 和 pointwise convolution。

假設輸入的 feature map 是兩個 5*5 的,即 5*5*2;輸出 feature map 數量爲 3,大小是 3*3(因爲這裏採用 3*3 卷積核)即 3*3*3。

標準卷積是將一個卷積核(3*3)複製M 份(M=2), 讓二維的卷積核(麪包片)拓展到與輸入 feature map 一樣的麪包塊形狀。

Standard 過程如下圖,X 表示卷積,+表示對應像素點相加,可以看到對於 O1 來說,其與輸入的每一個 feature map 都「發生關係」,包含輸入的各個 feature map 的信息。

Depth-wise 過程如下圖,可以看到 depth-wise convolution 得出的兩個 feature map——fd1 和 fd2 分別只與 i1 和 i2「發生關係」,這就導致違背上面所承認的觀點「輸出的每一個 feature map 要包含輸入層所有 feature map 的信息」,因而要引入 pointwise convolution。

那麼計算量減少了多少呢?通過如下公式計算:

其中 DK 爲標準卷積核大小,M 是輸入 feature map 通道數,DF 爲輸入 feature map 大小,N 是輸出 feature map 大小。本例中,DK=3,M=2,DF=5,N=3,參數的減少量主要就與卷積核大小 DK 有關。在本文 MobileNet 的卷積核採用 DK=3,則大約減少了 8~9 倍計算量。

看看 MobileNet 的網絡結構,MobileNet 共 28 層,可以發現這裏下采樣的方式沒有采用池化層,而是利用 depth-wise convolution 的時候將步長設置爲 2,達到下采樣的目的。

1.0 MobileNet-224 與 GoogLeNet 及 VGG-16 的對比:

可以發現,相較於 GoogLeNet,雖然參數差不多,都是一個量級的,但是在運算量上卻小於 GoogLeNet 一個量級,這就得益於 depth-wise convolution!

MobileNet 小結:

  • 1. 核心思想是採用 depth-wise convolution 操作,在相同的權值參數數量的情況下,相較於 standard convolution 操作,可以減少數倍的計算量,從而達到提升網絡運算速度的目的。

  • 2. depth-wise convolution 的思想非首創,借鑑於 2014 年一篇博士論文:《L. Sifre. Rigid-motion scattering for image classification. hD thesis, Ph. D. thesis, 2014》

  • 3. 採用 depth-wise convolution 會有一個問題,就是導致「信息流通不暢」,即輸出的 feature map 僅包含輸入的 feature map 的一部分,在這裏,MobileNet 採用了 point-wise convolution 解決這個問題。在後來,ShuffleNet 採用同樣的思想對網絡進行改進,只不過把 point-wise convolution 換成了 channel shuffle,然後給網絡美其名曰 ShuffleNet,欲知後事如何,請看 2.3 ShuffleNet

2.3 ShuffleNet

ShuffleNet 是 Face++團隊提出的,與 MobileNet 一樣,發表於 CVPR-2017,但晚於 MobileNet 兩個月纔在 arXiv 上公開。論文標題:

《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》

命名:

一看名字 ShuffleNet,就知道 shuffle 是本文的重點,那麼 shuffle 是什麼?爲什麼要進行 shuffle?

shuffle 具體來說是 channel shuffle,是將各部分的 feature map 的 channel 進行有序的打亂,構成新的 feature map,以解決 group convolution 帶來的「信息流通不暢」問題。(MobileNet 是用 point-wise convolution 解決的這個問題)

因此可知道 shuffle 不是什麼網絡都需要用的,是有一個前提,就是採用了 group convolution,纔有可能需要 shuffle!!爲什麼說是有可能呢?因爲可以用 point-wise convolution 來解決這個問題。

創新點:

1. 利用 group convolution 和 channel shuffle 這兩個操作來設計卷積神經網絡模型, 以減少模型使用的參數數量。

其中 group convolutiosn 非原創,而 channel shuffle 是原創。channel shuffle 因 group convolution 而起,正如論文中 3.1 標題: . Channel Shuffle for Group Convolution;

採用 group convolution 會導致信息流通不當,因此提出 channel shuffle,所以 channel shuffle 是有前提的,使用的話要注意!

對比一下 MobileNet,採用 shuffle 替換掉 1*1 卷積,這樣可以減少權值參數,而且是減少大量權值參數,因爲在 MobileNet 中,1*1 卷積層有較多的卷積核,並且計算量巨大,MobileNet 每層的參數量和運算量如下圖所示:

ShuffleNet 的創新點在於利用了 group convolution 和 channel shuffle,那麼有必要看看 group convolution 和 channel shuffle。

Group convolution

Group convolution 自 Alexnet 就有,當時因爲硬件限制而採用分組卷積;之後在 2016 年的 ResNeXt 中,表明採用 group convolution 可獲得高效的網絡;再有 Xception 和 MobileNet 均採用 depth-wise convolution, 這些都是最近出來的一系列輕量化網絡模型。depth-wise convolution 具體操作可見 2.2 MobileNet 裏邊有簡介。

如下圖 (a) 所示, 爲了提升模型效率,採用 group convolution,但會有一個副作用,即:「outputs from a certain channel are only derived from a small fraction of input channels.」

於是採用 channel shuffle 來改善各組間「信息流通不暢」問題,如下圖 (b) 所示。

具體方法爲:把各組的 channel 平均分爲 g(下圖 g=3)份,然後依次序的重新構成 feature map

Channel shuffle 的操作非常簡單,接下來看看 ShuffleNet,ShuffleNet 借鑑了 Resnet 的思想,從基本的 resnet 的 bottleneck unit 逐步演變得到 ShuffleNet 的 bottleneck unit,然後堆疊的使用 ShuffleNet bottleneck unit 獲得 ShuffleNet;

下圖展示了 ShuffleNet unit 的演化過程

  • 圖 (a):是一個帶有 depth-wise convolution 的 bottleneck unit;

  • 圖 (b):作者在 (a) 的基礎上進行變化,對 1*1 conv 換成 1*1 Gconv,並在第一個 1*1 Gconv 之後增加一個 channel shuffle 操作;

  • 圖 (c): 在旁路增加了 AVG pool,目的是爲了減小 feature map 的分辨率;因爲分辨率小了,於是乎最後不採用 Add,而是 concat,從而「彌補」了分辨率減小而帶來的信息損失。

文中提到兩次,對於小型網絡,多多使用通道,會比較好。

「this is critical for small networks, as tiny networks usually have an insufficient number of channels to process the information」

所以,以後若涉及小型網絡,可考慮如何提升通道使用效率

至於實驗比較,並沒有給出模型參數量的大小比較,而是採用了 Complexity (MFLOPs) 指標,在相同的 Complexity (MFLOPs) 下,比較 ShuffleNet 和各個網絡,還專門和 MobileNet 進行對比,由於 ShuffleNet 相較於 MobileNet 少了 1*1 卷積層,所以效率大大提高了嘛,貼個對比圖隨意感受一下好了

ShuffleNet 小結:

  • 1. 與 MobileNet 一樣採用了 depth-wise convolution,但是針對 depth-wise convolution 帶來的副作用——「信息流通不暢」,ShuffleNet 採用了一個 channel shuffle 操作來解決。

  • 2. 在網絡拓撲方面,ShuffleNet 採用的是 resnet 的思想,而 mobielnet 採用的是 VGG 的思想,2.1 SqueezeNet 也是採用 VGG 的堆疊思想

2.4 Xception

Xception 並不是真正意義上的輕量化模型,只是其借鑑 depth-wise convolution,而 depth-wise convolution 又是上述幾個輕量化模型的關鍵點,所以在此一併介紹,其思想非常值得借鑑。

Xception 是 Google 提出的,arXiv 的 V1 版本 於 2016 年 10 月公開。論文標題:

《Xception: Deep Learning with Depth-wise Separable Convolutions》

命名:

Xception 是基於 Inception-V3 的,而 X 表示 Extreme,爲什麼是 Extreme 呢?因爲 Xception 做了一個加強的假設,這個假設就是:

we make the following hypothesis: that the mapping of cross-channels correlations and spatial correlations in the feature maps of convolutional neural networks can be entirely decoupled

創新點:

1. 借鑑(非採用)depth-wise convolution 改進 Inception V3

既然是改進了 Inception v3,那就得提一提關於 inception 的一下假設(思想)了。

「the fundamental hypothesis behind Inception is that cross-channel correlations and spatial correlations are sufficiently decoupled that it is preferable not to map them jointly」

簡單理解就是說,卷積的時候要將通道的卷積與空間的卷積進行分離,這樣會比較好。(沒有理論證明,只有實驗證明,就當它是定理,接受就好了,現在大多數神經網絡的論文都這樣。

既然是在 Inception V3 上進行改進的,那麼 Xception 是如何一步一步的從 Inception V3 演變而來。

下圖 1 是 Inception module,圖 2 是作者簡化了的 inception module(就是隻保留 1*1 的那條「路」,如果帶着 avg pool,後面怎麼進一步假設嘛~)

假設出一個簡化版 inception module 之後,再進一步假設,把第一部分的 3 個 1*1 卷積核統一起來,變成一個 1*1 的,後面的 3 個 3*3 的分別「負責」一部分通道,如圖 3 所示; 最後提出「extreme」version of an Inception,module Xception 登場,,先用 1*1 卷積覈對各通道之間(cross-channel)進行卷積,如圖 4 所示,

作者說了,這種卷積方式和 depth-wise convolution 幾乎一樣。Depth-wise convolution 較早用於網絡設計是來自:Rigid-Motion Scatteringfor Image Classification,但是具體是哪一年提出,不得而知;至少 2012 年就有相關研究,再比如說 AlexNet,由於內存原因,AlexNet 分成兩組卷積 ;想深入瞭解 Depth-wise convolution 的可以查閱本論文 2.Prior work,裏面有詳細介紹。

Xception 是借鑑 Rigid-Motion Scatteringfor Image Classification 的 Depth-wise convolution,是因爲 Xception 與原版的 Depth-wise convolution 有兩個不同之處

  • 第一個:原版 Depth-wise convolution,先逐通道卷積,再 1*1 卷積; 而 Xception 是反過來,先 1*1 卷積,再逐通道卷積;

  • 第二個:原版 Depth-wise convolution 的兩個卷積之間是不帶激活函數的,而 Xception 在經過 1*1 卷積之後會帶上一個 Relu 的非線性激活函數;

Xception 結構如上圖所示,共計 36 層分爲 Entry flow;Middle flow;Exit flow。。

Entry flow 包含 8 個 conv;Middle flow 包含 3*8 =24 個 conv;Exit flow 包含 4 個 conv,所以 Xception 共計 36 層。

文中 Xception 實驗部分是非常詳細的,實現細節可參見論文。

Xception 小結:

Xception 是基於 Inception-V3,並結合了 depth-wise convolution,這樣做的好處是提高網絡效率,以及在同等參數量的情況下,在大規模數據集上,效果要優於 Inception-V3。這也提供了另外一種「輕量化」的思路:在硬件資源給定的情況下,儘可能的增加網絡效率和性能,也可以理解爲充分利用硬件資源。

三、網絡對比

本文簡單介紹了四個輕量化網絡模型,分別是 SqueezeNet、 MobileNet、 ShuffleNet 和 Xception,前三個是真正意義上的輕量化網絡,而 Xception 是爲提升網絡效率,在同等參數數量條件下獲得更高的性能。

在此列出表格,對比四種網絡是如何達到網絡輕量化的。

實現輕量化技巧

這麼一看就發現,輕量化主要得益於 depth-wise convolution,因此大家可以考慮採用 depth-wise convolution 來設計自己的輕量化網絡,但是要注意「信息流通不暢問題」。

解決「信息流通不暢」的問題,MobileNet 採用了 point-wise convolution,ShuffleNet 採用的是 channel shuffle。MobileNet 相較於 ShuffleNet 使用了更多的卷積,計算量和參數量上是劣勢,但是增加了非線性層數,理論上特徵更抽象,更高級了;ShuffleNet 則省去 point-wise convolution,採用 channel shuffle,簡單明瞭,省去卷積步驟,減少了參數量。

學習了幾個輕量化網絡的設計思想,可以看到,並沒有突破性的進展,都是借鑑或直接使用前幾年的研究成果。希望廣大研究人員可以設計出更實在的輕量化網絡。

通過這幾篇論文的創新點,得出以下可認爲是發 (Shui) 論文的 idea:

  • 1. 採用 depth-wise convolution,再設計一個方法解決「信息流通不暢」問題,然後冠以美名 XX-Net。(看看 ShuffleNet 就是)

  • 2. 針對 depth-wise convolution 作文章,卷積方式不是千奇百怪麼?各種卷積方式可參考 Github(https://github.com/vdumoulin/conv_arithmetic),挑一個或者幾個,結合起來,只要參數量少,實驗效果好,就可以發 (Shui) 論文。

  • 3. 接着第 2,如果設計出來一個新的卷積方式,如果也存在一些「副作用」,再想一個方法解決這個副作用,再美其名曰 XX-Net。就是自己「挖」個坑,自己再填上去。

個人介紹餘霆嵩,廣東工業大學研三學生,研究方向:深度學習,目標檢測,圖像分類,模型壓縮


文章來源:機器之心