本文就近年提出的四個輕量化模型進行學習和對比,四個模型分別是: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。就是自己「挖」個坑,自己再填上去。
個人介紹: 餘霆嵩,廣東工業大學研三學生,研究方向:深度學習,目標檢測,影象分類,模型壓縮