MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
MobileNetV2: Inverted Residuals and Linear Bottlenecks
背景
自從AlexNet在2012年贏得ImageNet大賽的冠軍一來,卷積神經網絡就在計算機視覺領域變得越來越流行,一個主要趨勢就是為了提高准確率就要做更深和更復雜的網絡模型,然而這樣的模型在規模和速度方面顯得捉襟見肘,在許多真實場景,比如機器人、自動駕駛、增強現實等識別任務及時地在一個計算力有限的平台上完成,這是我們的大模型的局限性所在。
目前針對這一問題的研究主要是從兩個方面來進行的:
對復雜模型采取剪枝、量化、權重共享等方法,壓縮模型得到小模型;
直接設計小模型進行訓練。
MobileNet系列就屬於第二種情況。
MobileNet V1核心在於使用深度可分離卷積取代了常規的卷積。
MobileNet V2在MobileNet V1的基礎山進行了如下改進:
- 去掉了bottleneck的非線性激活層
- 使用Inverted residual block
深度可分離卷積
深度可分離卷積可分為兩部分:
- 深度卷積(depthwise convolution)
- 逐點卷積(pointwise convolution)
在進行深度卷積的時候,每個卷積核只關注單個通道的信息,而在逐點卷積中,每個卷積核可以聯合多個通道的信息。以下我們通過一個具體的例子說明常規卷積與深度可分離卷積的區別。
以下討論均基於padding=same的情況。
常規卷積操作如下圖:
假設輸入層為一個大小為64×64像素、三通道彩色圖片。經過一個包含4個卷積核的卷積層,卷積核尺寸為3×3×3。最終則會輸出4個Feature Map,且尺寸與輸入圖像尺寸相同。
深度可分離卷積操作中深度卷積如下圖:
圖中深度卷積使用的是3個尺寸為3×3的卷積核,經過該操作之后,輸出的特征圖尺寸為64×64×3。
深度可分離卷積操作中逐點卷積如下圖:
圖中逐點卷積使用的是4個尺寸為1×1×3的卷積核,經過該操作之后,輸出的特征圖尺寸就為64×64×4。
那么可分離卷積相對於常規卷積計算量有多少降低呢?
假設輸入圖像尺寸為\(D_F * D_F * M\),標准卷積核尺寸為\(D_K * D_K * M * N\),其中\(M\)為通道數,\(N\)為卷積核個數。
采用標准卷積核進行卷積時,輸出尺寸為\(D_F * D_F * N\),計算量為\(D_K * D_K * M * N * D_F * D_F\)。
采用可分離卷積的計算量為:
\(D_K * D_K * M * D_F * D_F + M * N * D_F * D_F\)
前半部分為尺寸為\(D_F * D_F * M\)的原圖經過\(M\)個\(D_K * D_K\)的卷積核的計算量,后半部分為尺寸為\(D_F * D_F * M\)的特征圖經過\(N\)個\(1 * 1 * M\)的卷積核的計算量。
則,可分離卷積相對常規卷積的計算量對比為:
\(\frac{D_K * D_K * M * D_F * D_F + M * N * D_F * D_F}{D_K * D_K * M * N * D_F * D_F} = \frac{1}{N} + \frac{1}{D_K^2}\)
卷積核的個數一般比較大,在此可以忽略,而最常使用的卷積核尺寸為\(3 * 3\),這樣,可分離卷積相對常規卷積,計算量就降為了\(\frac{1}{9}\)。
V2版本相對於V1版本,主要是針對激活函數進行了思考,並且引入了殘差連接。
使用如\(ReLU\)之類的激活函數能夠給神經網絡帶來如下好處:1. 壓縮模型參數,這可有效地使得模型計算量變小;2. 給神經網絡引入非線性變化,使得模型能夠擬合任意復雜的函數。
作者首先使用矩陣\(T\)將原始數據\(X_m\)映射到高維空間,之后使用\(ReLU\)函數將高維數據進行壓縮,然后使用矩陣\(T\)的逆矩陣\(T^{-1}\)將高維數據映射回原空間,變化函數如下:
下圖展示了原始數據特征以及將原始數據映射到高維空間之后再映射回來之后的特征。
可見,將原始數據映射到的高維空間維度較少時,映射回來的數據與原來的數據差距很大,當高維空間維度大時,映射回來的數據與原數據差距要更小。作者認為當將數據映射的高維空間維度不足時,非線性激活函數的使用會使得數據特征大量丟失,因此在其設計的\(MobileNet V2\)版中,在\(bottleneck\)構造塊的最后使用了線性激活函數取代了非線性激活。除此之外,作者也並沒有直接使用ReLU激活函數,而是使用了ReLU6激活函數,ReLU6激活函數相對於ReLU的區別就是,對於激活值加了一個6的上限。該操作可以使得模型的參數范圍進行進一步壓縮,以讓模型存儲和計算量進一步降低。
除了激活函數使用的變化之外,作者引入了殘差連接。
我們知道,對於神經網絡而言,更深更復雜的構造理論上總會帶來更好的性能。但是,深度神經網絡存在着梯度消失、梯度爆炸等的原因使得模型訓練很困難,而殘差連接就是針對該問題而進行設計的。
常規的殘差塊如下圖:
為了降低計算量,首先使用\(1*1\)的卷積核將原始數據特征維度進行降低,然后再通過常規卷積層,最后又使用\(1*1\)卷積核將特征進行升維,最后將前后特征進行相加。因為是先降維再升維的操作,該結構稱為寬,窄,寬結構。
\(MobileNet V2\)使用的殘差連接結構如下:
因為深度可分離卷積的存在已經使得模型的計算量降低,因此,作者認為,這里不需要將數據進行降維,取而代之的是,為了提高模型的性能,作者在這里使用\(1*1\)卷積核來先將數據進行升維,然后又進行可分離卷積操作之后,又使用\(1*1\)卷積核進行降維操作,最后,將前后特征進行相加。因為是先升維,再降維的操作,該結構稱為窄,寬,窄的結構,作者將該構造結構稱之為\(Inverted \ residual \ block\)。
\(MobileNet \ V2\)的構造塊如下圖:
模型的配置如下: