輕量化CNN網(wǎng)絡(luò)MobileNet系列詳解
深度學(xué)習(xí)100問
Author:louwill
Machine Learning Lab
MobileNet系列作為輕量級(jí)網(wǎng)絡(luò)的代表,使得CNN輕量化和移動(dòng)端的部署成為可能。MobileNet系列目前總共有三個(gè)版本, 分別是MobileNet v1、MobileNet v2和MobileNet v3。作為學(xué)習(xí)輕量化網(wǎng)絡(luò)的必經(jīng)之路,本文重點(diǎn)對(duì)MobileNet系列網(wǎng)絡(luò)進(jìn)行闡述。
MobileNet v1
MobileNet v1論文為MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications,2017年由谷歌提出,主要專注于CNN的移動(dòng)端使用和部署。

簡(jiǎn)單來說,MobileNet v1就是將常規(guī)卷積替換為深度可分離卷積的VGG網(wǎng)絡(luò)。下圖分別是VGG和MobileNet v1 一個(gè)卷積塊所包含的網(wǎng)絡(luò)層。

可以看到,VGG的卷積塊就是一個(gè)常規(guī)3*3卷積和一個(gè)BN、一個(gè)ReLU激活層。MobileNet v1則是一個(gè)3*3深度可分離卷積和一個(gè)1*1卷積,后面分別跟著一個(gè)BN和ReLU層。MobileNet v1的ReLU指的是ReLU6,區(qū)別于ReLU的是對(duì)激活輸出做了一個(gè)clip,使得最大最輸出值不超過6,這么做的目的是為了防止過大的激活輸出值帶來較大的精度損失。
那么,什么是深度可分離卷積呢?
從維度的角度看,卷積核可以看成是一個(gè)空間維(寬和高)和通道維的組合,而卷積操作則可以視為空間相關(guān)性和通道相關(guān)性的聯(lián)合映射。從inception的1*1卷積來看,卷積中的空間相關(guān)性和通道相關(guān)性是可以解耦的,將它們分開進(jìn)行映射,可能會(huì)達(dá)到更好的效果。
深度可分離卷積是在1*1卷積基礎(chǔ)上的一種創(chuàng)新。主要包括兩個(gè)部分:深度卷積和1*1卷積。深度卷積的目的在于對(duì)輸入的每一個(gè)通道都單獨(dú)使用一個(gè)卷積核對(duì)其進(jìn)行卷積,也就是通道分離后再組合。1*1卷積的目的則在于加強(qiáng)深度。下面以一個(gè)例子來看一下深度可分離卷積。
假設(shè)我們用128個(gè)3*3*3的濾波器對(duì)一個(gè)7*7*3的輸入進(jìn)行卷積,可得到5*5*128的輸出。如下圖所示:

其計(jì)算量為5*5*128*3*3*3=86400。
現(xiàn)在看如何使用深度可分離卷積來實(shí)現(xiàn)同樣的結(jié)果。深度可分離卷積的第一步是深度卷積(Depth-Wise)。這里的深度卷積,就是分別用3個(gè)3*3*1的濾波器對(duì)輸入的3個(gè)通道分別做卷積,也就是說要做3次卷積,每次卷積都有一個(gè)5*5*1的輸出,組合在一起便是5*5*3的輸出。
現(xiàn)在為了拓展深度達(dá)到128,我們需要執(zhí)行深度可分離卷積的第二步:1x1卷積(Point-Wise)?,F(xiàn)在我們用128個(gè)1*1*3的濾波器對(duì)5*5*3進(jìn)行卷積,就可以得到5*5*128的輸出。完整過程如下圖所示:

那么我們來看一下深度可分離卷積的計(jì)算量如何。第一步深度卷積的計(jì)算量:5*5*1*3*3*1*3=675。第二步1x1卷積的計(jì)算量:5*5*128*1*1*3=9600,合計(jì)計(jì)算量為10275次。可見,相同的卷積計(jì)算輸出,深度可分離卷積要比常規(guī)卷積節(jié)省12倍的計(jì)算成本。所以深度可分離卷積是MobileNet v1能夠輕量化的關(guān)鍵原因。
MobileNet v1完整網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。

MobileNet v1與GoogleNet和VGG 16在ImageNet上的效果對(duì)比,如下表所示:

可以看到,MobileNet v1相比與VGG 16精度損失不超過一個(gè)點(diǎn)的情況下,參數(shù)量小了32倍之多!MobileNet v1在速度和大小上的優(yōu)勢(shì)是顯而易見的。
MobileNet v2
MobileNet v2是在v1基礎(chǔ)上的改進(jìn)與優(yōu)化版本。MobileNet v2論文題目為MobileNetV2: Inverted Residuals and Linear Bottlenecks,由谷歌發(fā)表于2018年CVPR上。

MobileNet v1的特色就是深度可分離卷積,但研究人員發(fā)現(xiàn)深度可分離卷積中有大量卷積核為0,即有很多卷積核沒有參與實(shí)際計(jì)算。是什么原因造成的呢?v2的作者發(fā)現(xiàn)是ReLU激活函數(shù)的問題,認(rèn)為ReLU這個(gè)激活函數(shù),在低維空間運(yùn)算中會(huì)損失很多信息,而在高維空間中會(huì)保留較多有用信息。
既然如此,v2的解決方案也很簡(jiǎn)單,就是直接將ReLU6激活換成線性激活函數(shù),當(dāng)然也不是全都換,只是將最后一層的ReLU換成線性函數(shù)。具體到v2網(wǎng)絡(luò)中就是將最后的Point-Wise卷積的ReLU6都換成線性函數(shù)。v2給這個(gè)操作命名為linear bottleneck,這也是v2網(wǎng)絡(luò)的第一個(gè)關(guān)鍵點(diǎn)。

深度卷積(Depth-Wise)本身沒有改變通道的作用,比如本文前例中的深度可分離卷積的例子,在前一半的深度卷積操作中,輸入是3個(gè)通道,輸出還是3個(gè)通道。所以為了能讓深度卷積能在高維上工作,v2提出在深度卷積之前加一個(gè)擴(kuò)充通道的卷積操作,什么操作能給通道升維呢?當(dāng)然是1*1卷積了。

這種在深度卷積之前擴(kuò)充通道的操作在v2中被稱作Expansion layer。這也是v2網(wǎng)絡(luò)的第二個(gè)關(guān)鍵點(diǎn)。
MobileNet v1雖然加了深度可分離卷積,但網(wǎng)絡(luò)主體仍然是VGG的直筒型結(jié)構(gòu)。所以v2網(wǎng)絡(luò)的第三個(gè)大的關(guān)鍵點(diǎn)就是借鑒了ResNet的殘差結(jié)構(gòu),在v1網(wǎng)絡(luò)結(jié)構(gòu)基礎(chǔ)上加入了跳躍連接。相較于ResNet的殘差塊結(jié)構(gòu),v2給這種結(jié)構(gòu)命名為Inverted resdiual block,即倒殘差塊。與ResNet相比,我們來仔細(xì)看一下“倒”在哪。

從圖中可以看到,ResNet是先0.25倍降維,然后標(biāo)準(zhǔn)3*3卷積,再升維,而MobileNet v2則是先6倍升維,然后深度可分離卷積,最后再降維。更形象一點(diǎn)我們可以這么畫:

MobileNet v2的維度升降順序跟ResNet完全相反,所以才叫倒殘差。
綜合上述三個(gè)關(guān)鍵點(diǎn):Linear Bottlenecks、Expansion layer和Inverted resdiual之后就組成了MobileNet v2的block,如下圖所示。

MobileNet v2的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。

可以看到,輸入經(jīng)過一個(gè)常規(guī)卷積之后,v2網(wǎng)絡(luò)緊接著加了7個(gè)bottleneck block層,然后再兩個(gè)1*1卷積和一個(gè)7*7的平均池化的組合操作。
MobileNet v3
MobileNet v3同樣是由谷歌于于2019年提出新版本的MobileNet。在v2網(wǎng)絡(luò)的基礎(chǔ)上,v3提出了四個(gè)大的改進(jìn)措施。
使用NAS神經(jīng)架構(gòu)搜索確定網(wǎng)絡(luò)結(jié)構(gòu)
在v2的block基礎(chǔ)上引入Squeeze and Excitation結(jié)構(gòu)
使用h-swish激活函數(shù)
對(duì)v2網(wǎng)絡(luò)尾部結(jié)構(gòu)進(jìn)行改進(jìn)
v3論文為Searching for MobileNetV3,將神經(jīng)架構(gòu)搜索引入的意思已經(jīng)很明顯了。

關(guān)于NAS這里筆者不太了解,也沒法展開細(xì)說,感興趣的朋友可以直接查閱NAS相關(guān)論文。第二個(gè)改進(jìn)措施就是在v2基礎(chǔ)上引入squeeze and excitation結(jié)構(gòu),熟悉SENet的讀者應(yīng)該知道,這是一個(gè)對(duì)通道之間相互依賴關(guān)系進(jìn)行建模的操作。
Squeeze and Excitation包括Squeeze(壓縮)和Excitation(激活)兩個(gè)部分。其中Squeeze通過在特征圖上執(zhí)行Global Average Pooling得到當(dāng)前特征圖的全局壓縮特征向量,Excitation通過兩層全連接得到特征圖中每個(gè)通道的權(quán)值,并將加權(quán)后的特征圖作為下一層網(wǎng)絡(luò)的輸入。所以可以看到SE block只跟當(dāng)前的一組特征圖存在依賴關(guān)系,因此可以非常容易的嵌入到幾乎現(xiàn)在所有的卷積網(wǎng)絡(luò)中。所以MobileNet v3就自然拿來使用了。
在v2基礎(chǔ)上,v3網(wǎng)絡(luò)的block如下圖所示。

第三個(gè)改進(jìn)點(diǎn)是使用了h-swish激活函數(shù)。h-swish激活函數(shù)是基于swish的改進(jìn),swish激活函數(shù)表達(dá)式如下:

swish激活函數(shù)圖像在β取0.1、1.0和10.0時(shí)如下圖所示:

swish激活函數(shù)在一系列深度卷積網(wǎng)絡(luò)上都對(duì)效果有顯著提升,MobileNet也不例外,但是v3認(rèn)為,作為一個(gè)輕量化的網(wǎng)絡(luò),swish激活雖然能帶來精度提升,但在移動(dòng)設(shè)備上會(huì)有速度損失。所以在swish函數(shù)的基礎(chǔ)上,v3對(duì)其進(jìn)行了改進(jìn),提出了h-swish激活函數(shù)。
h-swish的基本想法是用一個(gè)近似函數(shù)來逼近swish函數(shù),讓swish函數(shù)變得不那么光滑(hard),基于MobileNet v1和v2的經(jīng)驗(yàn),v3還是選擇了ReLU6。變換邏輯如下圖所示。

swish和h-swish函數(shù)對(duì)比圖像:

可以將h-swish視為swish的低精度化模式,相較于swish,h-swish能夠保持相同精度的條件下減少時(shí)間和計(jì)算量的開銷。對(duì)v2網(wǎng)絡(luò)尾部的修改這里不做詳細(xì)描述,感興趣的讀者可直接閱讀v3論文原文進(jìn)行學(xué)習(xí)。
總結(jié)
最后一句話對(duì)MobileNet系列做個(gè)簡(jiǎn)單的總結(jié),MobileNet v1就是加了深度可分離卷積的VGG;MobileNet v2則是在v1基礎(chǔ)上加了Linear激活、Expansion layer和Inverted residual三大關(guān)鍵操作;而v3則是在v2基礎(chǔ)上引入NAS,并且加入Squeeze and Excitation結(jié)構(gòu)、h-swish激活和網(wǎng)絡(luò)尾部?jī)?yōu)化等改進(jìn)措施。
參考資料:
