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

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

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

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

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

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

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

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

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

這種在深度卷積之前擴充通道的操作在v2中被稱作Expansion layer。這也是v2網(wǎng)絡(luò)的第二個關(guān)鍵點。
MobileNet v1雖然加了深度可分離卷積,但網(wǎng)絡(luò)主體仍然是VGG的直筒型結(jié)構(gòu)。所以v2網(wǎng)絡(luò)的第三個大的關(guā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相比,我們來仔細看一下“倒”在哪。

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

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

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

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

關(guān)于NAS這里筆者不太了解,也沒法展開細說,感興趣的朋友可以直接查閱NAS相關(guān)論文。第二個改進措施就是在v2基礎(chǔ)上引入squeeze and excitation結(jié)構(gòu),熟悉SENet的讀者應(yīng)該知道,這是一個對通道之間相互依賴關(guān)系進行建模的操作。
Squeeze and Excitation包括Squeeze(壓縮)和Excitation(激活)兩個部分。其中Squeeze通過在特征圖上執(zhí)行Global Average Pooling得到當(dāng)前特征圖的全局壓縮特征向量,Excitation通過兩層全連接得到特征圖中每個通道的權(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如下圖所示。

第三個改進點是使用了h-swish激活函數(shù)。h-swish激活函數(shù)是基于swish的改進,swish激活函數(shù)表達式如下:

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

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

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

可以將h-swish視為swish的低精度化模式,相較于swish,h-swish能夠保持相同精度的條件下減少時間和計算量的開銷。對v2網(wǎng)絡(luò)尾部的修改這里不做詳細描述,感興趣的讀者可直接閱讀v3論文原文進行學(xué)習(xí)。
總結(jié)
最后一句話對MobileNet系列做個簡單的總結(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ò)尾部優(yōu)化等改進措施。
參考資料:
往期精彩:
【原創(chuàng)首發(fā)】機器學(xué)習(xí)公式推導(dǎo)與代碼實現(xiàn)30講.pdf
【原創(chuàng)首發(fā)】深度學(xué)習(xí)語義分割理論與實戰(zhàn)指南.pdf
點個在看
