Learning MobileNet v1 v2 and ShuffleNet v1 v2


1. Abstract

目前神經(jīng)網(wǎng)絡大部分都是運行在具有強大的浮點運算能力的服務器上面。如此龐大的網(wǎng)絡是無法在普通PC上面運行,更不可能在移動端上面運行。但是由于業(yè)務需要和程序設計需要,我們可能想把CNN網(wǎng)絡到移動端上面運行。面對龐大的網(wǎng)絡和浮點運算能力比較弱的移動端,一些公司為此想降低CNN的復雜度同時保留大部分的精度。所以這里我想為大家介紹了一下我了解過的一些efficient and state-of-the-art CNN。

2. MobileNet V1

在傳統(tǒng)的CNN,當中一層CNN的FLOPs計算:w * h * d_k * d_k * c_1 * c_2,雖然w和h都在降低維度,但是channel卻一直以指數(shù)形式增加,那么每一層FLOPs都是越來越大的。MobileNet v1想把這個卷積操作的FLOPs降低,于是就利用到了depthwise convolution和pointwise convolution。如下圖所示:


depthwise, pointwise convolution
  • depthwise convolution filter一共有m個d_k * d_k大小的filter,其中m是input features map的channels數(shù)量。每個d_k * d_k的convolution filter對應每個input features map的channel做convolution。我們可以這樣看,每個filter都僅僅foucs當前channel與其他的channel沒有信息流通。
  • pointwise convolution filter就是1 * 1 convolution filters,大小為1 * 1 * c_1 * c_2,其中c_1為輸入的channel數(shù)量,c_2為輸出的channel數(shù)量。這個操作已經(jīng)是經(jīng)常常見了,我就不再多講。pointwise convolution就是僅僅foucs on relationship of channels與同一層channel上的所有feature沒有信息流通。
    我們將兩者結合起來,就近似表達成為一個d_k * d_k * c_1 * c_2的convolution filters:


    Convolution Block

我們可以算一下這種操作的FLOPs:w * h * 9 * c_1 + w * h * c_1 * c_2。這種壓縮可以大量的浮點運算量,但也有良好的準確率。這種方法當然還是具有大量的浮點數(shù)運算,對于一些算力很弱的移動設備,我們還需要壓縮模型。那么MobileNet V1為了我們提供了收縮因子:用于控制模型當中channel的個數(shù)。
用不同大小的MobileNet,在ImageNet Top-1 的準確率比較:


3. ShuffleNet V1

ShuffleNet v1與MobileNet v1一樣使用了depthwise和pointwise的convolution操作來降低運算量。但是ShuffleNet v1發(fā)現(xiàn)其實這種操作大多的FLOPS(浮點運算)都是集中在pointwise convolution。我們這里計算一下pointwise convolution的FLOPS:w * h * c_{input} * c_{output},相對于depthwise的FLOPS:w * h * 3 * 3 * c_{input}(depthwise的kernel size 為3)。pointwise convolution的浮點運算量是depthwise的c_{output} / 9倍。在CNN當中,output channels都是不斷增加的,所以FLOPS就越來越大??紤]這一點,ShuffleNet v1采用AlexNet的group convolution方式來降低pointwise的FLOPS。

channel shuffle

如上圖所示,我們將channels分開若干個group,分別做pointwise convolution。我們算一下這個操作的FLOPS:h * w * (c_{input} / g) * (c_{output} / g) * g = hwc_{input}c_{output} / g。明顯group convolution將原來的pointwise convolution降低了g倍(a圖)。但進行了這種操作以后,不同group之間的channels的連接就基本上沒有了。因此shuffleNet v1增加了channel shuffle的操作,增加了不同group之間的channels的信息連接多樣性(b圖,c圖)。

shuffleNet Units

上圖b,c為shuffleNet Units。a圖是最原始的設計,后來用group convolution代替當中的pointwise。b圖為convolution stride = 1的Unit,c圖為convolution stride = 2的Unit。

那么group設置為多少好呢?論文中作了一些對比試驗來看group設置多少好。


在不同的scale下,不同的group的表現(xiàn)

我們可以留意到在同樣的FLOPS復雜度的情況下,scale越小的Networks使用越大的group越有利提高精度。在同一個FLOPS的復雜度下,group越大那么就允許越多的channels,越多的channels包含的信息量越多那么精度也能有所提高。此外,越小的網(wǎng)絡從channels增加得到精度增益越大。那么我們是不是越設置越大的group越好呢?剛剛說的是同樣的FLOPS復雜度上,但是越大group使得group convolution趨向于depthwise convolution,那么channels之間的連接幾乎沒有,這是不利于網(wǎng)絡的。

不同大小的ShuffleNet與MobileNet對比,在FLOPS略小于MobileNet的情況下,ShuffleNet的Error Rate低于MobileNet。測試平臺為驍龍820單線程下。

4. MoblieNet v2

MoblieNet v2論文題目就說明其兩個重要的keypoint。一個Inverted Residual,另外一個是Linear Bottlenecks。這篇論文的理論看得十分費力,到現(xiàn)在還是看得一般般懂。所以我這里就說一下自己理解到的state of the art。

4.1 Inverted Residual

在moblieNet v1中,我們沒有看到residual的存在,所以在v2當中我們加入了residual,但我們沒有直接照搬其內(nèi)容


residual block vs Inverted residual block

這里的是Inverted residual block。為啥我們這樣操作呢?因為不同于residual block,depthwise convolution的計算量很低,所以我們可以適當增加depthwise(增加t倍)計算的channels數(shù)量來提高模型精度。其實,其認為residual block這樣先降維(降低channels),使得下一層的信息有所一定的損失,再加上depthwise,損失更大。那么我們采用升維的操作來增加depthwise convolution的信息量,這樣減少每層block當中信息損失。

4.2 Linear Bottlenecks

這個Linear的操作是在Inverted Residual block的最后。我們想一下之前的Inverted Residual block,頭尾的維度(channels數(shù)量)顯然比中間要低,
我們可以理解成為y = B^{-1} * Relu(A * x)。x為輸入,y為輸出,A為中間的升維操作,B的逆矩陣為降維操作。而輸入和輸出的維度是近似相同的,那么其實我們用linear操作更為適合。若使用Relu的話最后輸出可能出現(xiàn)0。這樣輸出是不可逆的,信息也會損失。所以我們最后一層使用Linear來保留大量有用的信息。再者我們也可以這樣理解,最后一層輸出的降維操作,那么假如用Relu會加劇信息流失。而論文最后的Appendix,作者認為其實目標(圖像)是可以用一個低維子空間表示,通過降低激活空間的維度最終希望讓感興趣信息充滿整個字空間。

MoblieNet Units

那有人會問我:既然參數(shù)是變多了,那么MoblieNet v2還是速度不是應該更慢嗎?其實在頭尾的channels數(shù)量是很少,從而減少了Inverted Residual block中間升維的影響。

5. ShuffleNet V2

ShuffleNet v2論文題目是說Guidelines for Efficient CNN Architecture Design。一般衡量CNN網(wǎng)絡的理論運算時間,我們都是用FLOPS(浮點運算次數(shù))來表示。但其實這個有不太符合實際情況的。首先在不同硬件平臺上,convolution運算可能是存在優(yōu)化的。例如一個做3 * 3的convolution操作運算時間不一定是1 *1的convolution操作的9倍。因為在CUDNN下是有CNN并行優(yōu)化的,所以不能單單用FLOPS來衡量一個CNN的運算時間。此外FLOPS只是考慮到浮點的運算次數(shù),但是還有其他因素影響CNN的實際運算時間,例如memory access cost —— MAC(內(nèi)存訪問損失),ShuffleNet v2就是將其作為指標設計出來的模型并得到4條Guidelines。

5.1 相同的通道寬度可最小化內(nèi)存訪問成本(MAC)

對于1 * 1的卷積,我們考慮以下其MAC:hwc_{1}(讀取輸入的feature map的MAC) + hwc_{2}(寫入輸出的feature map的MAC) + c_{1} c_{2}(讀取1 * 1的卷積大?。D敲纯偟腗AC為:h * w * (c_{1} + c_{2}) + c_{1} * c_{2}。那么1 * 1的卷積FLOPS為:B = h * w * c_{1} * c_{2}。通過三角不等式我們可以得到以下的不等式:

根據(jù)三角不等式,我們可以知道僅且盡當c_1 = c_2時候,等號成立且MAC最小。所以我們希望convolution操作的輸入輸出channel一致。

5.2 過度的組卷積會增加 MAC

再考慮有g個group convolution的時候,MAC值應該是:h * w * (c_{1} + c_{2}) + c_{1} * c_{2} / g,F(xiàn)LOPS值應該是:B = h * w * c_{1} * c_{2} / g。在一般的情況下,input features的大小是固定的,其次我們要討論的是group的個數(shù)對MAC的影響,那么我應該控制FLOPS都是一致的。因此我們假設給定的輸入input features size以及FLOPS,那么我們MAC式子進行轉(zhuǎn)換可以得到:h * w * c_{1} + B * g / c_{1} + B / hw。可見Group個數(shù)越多那么MAC也就越大?;仡欀坝懻搒huffleNet v1的時候,在固定的features map和FLOPS上,group增加那么輸出的channels(c_{2})也就應該同等比例增加。隨之MAC的第一項h * w * (c_{1} + c_{2})也變大。

5.3 網(wǎng)絡碎片化(例如 GoogLeNet 的多路徑結構)會降低并行度

在論文當中的Appendix給出了一些碎片化的convolution:


fragmented operators

這種操作是將一個大kernels的conv轉(zhuǎn)換為多個小kernels的conv。這樣確實有助于提高模型的精度,但是這是通過模型的運行效率來交換的。這樣效率的差異在并行計算強的硬件上是尤其突出。

不同fragmented operators的表現(xiàn)效率

在GPU上差異是十分明顯,但是在ARM就不是特別明顯了。所以這個Guideline可以作為思考精度和效率的取舍點。

5.4 元素級運算不可忽視

一些Elements-wise的操作(如Add,ReLu),雖然這些FLOPS幾乎是沒小,但是它是存在大量的MAC,所以不能忽略其對效率的影響。

根據(jù)以上這個4條Guideline,作者設計出ShuffleNet v2:


c, d圖為ShuffleNet v2 units

我們保證每個Conv的輸入channels數(shù)量和輸出channels數(shù)量是一致的(符合G1),我們這里沒有使用Group convolution,而是采用channels split的操作(Group可以看作是2,其中論文為了簡便兩個branch的channel數(shù)量是一樣的),盡可能減少了group的數(shù)量(符合G2),在圖c當中,其中一個branch是identity沒有減弱并行度(符合G3),最后我們在最后連接上沒有用上Add和ReLU,而是Concat降低一定的MAC(符合G4)。首先這個構造是可以提高模型的運行效率的,我們可以看看下圖的一小部分實驗結果(有興趣的同學可以看看論文的實驗部分):


classification error and speed of models

可見shuffleNet v2的效果是挺優(yōu)秀的。

這里我們可以討論一下為什么shuffleNet v2也能夠在提高模型精度。

  1. 在同一樣的FLOPS下,效率越高的模型,其可以將模型做得更深,精度自然也會上來。
  2. 在每一個block里面,我們都有一個branch(一般的feature map)是直接join到最后的結果的,它存在一種特征復用的效果。這一塊有點類似于DenseNet。我們通過下圖每一層權值的L1-norm對比得知:

由于DenseNet把當前輸出連接到后續(xù)的每一個blocks,所以它引入了冗余性,而ShuffleNet v2將特征從用雖然也是會傳遞到后續(xù)的每一層,但是傳遞的feature數(shù)量是呈指數(shù)遞減的。在本論文當中,只有一半的feature map直接join到輸出當中,再通過channels shuffle,本層傳遞到后兩層的feature map的數(shù)量只有0.25,如此類推。那么重用率大約是r^{j - i},r為channel split當中identity的占比數(shù)量,而i,j代表目標層序號。

6. Summary

我覺得這些CNN的網(wǎng)絡其實給我的感覺是設計符合自己業(yè)務需求的Guidelines。所以根據(jù)需求去選擇符合自己的Guidelines便好,有空我會將這些模型都寫一遍,讓自己和大家都能夠 get your hands dirty。講真算法不能光看論文還需要落地的。

7. References

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容