MobileNetV2 論文

368chen發表於2020-10-08

https://arxiv.org/abs/1801.04381

Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation

Abstract

本文提出了一種新的移動架構MobileNetv2,改善了多個任務和基準的State-of-the-art水平。同時我們介紹了一種基於此框架的面向目標檢測任務的有效應用模型SSDLite。此外,我們介紹了簡化移動語義分割模型DeepLabv3構建新的Mobile DeepLabv3.

MobileNetv2架構是基於倒置殘差結構(inverted residual structure),原本的殘差結構的主分支是有三個卷積,兩個逐點卷積通道數較多,而倒置的殘差結構剛好相反,中間的卷積通道數(依舊使用深度分離卷積結構)較多,旁邊的較小。此外,我們發現去除主分支中的非線性變換是有效的,這可以保持模型表現力。論文在ImageNet classification, COCO object detection, VOC image segmentation上做了對比實驗,驗證了該架構的有效性。


Introduction

現代先進網路需要的高計算資源超出了移動和嵌入式裝置的能力。本文針對這一資源限制條件設計了一套新的神經網路架構,該架構能在保持類似精度的條件下顯著的減少模型引數和計算量。

論文的主要貢獻在於提出一種新型層結構: 具有線性瓶頸的倒殘差結構(the inverted residual with linear bottleneck)。

該模組首先將輸入的低維壓縮表示(low-dimensional compressed representation)擴充套件到高維,使用輕量級深度卷積做過濾;隨後用linear bottleneck將特徵投影回低維壓縮表示 這個模組可以使用任何現代框架中。此外,該模組特別適用於移動裝置設計,它在推理過程不實現大的張量,這減少了需要嵌入式硬體設計對主儲存器訪問的需求。

Related Work

調整深度神經網路在精度和效能之間取得一個最佳平衡,是近幾年的熱門話題。 許多工作致力於方向可分為:

  • 改進先進模型達到更加效能;
  • 超引數調優以及各種網路修剪方法和連通性學習;
  • 改變內容卷積塊的聯通結構,例如ShuffleNet引入稀疏性等。
  • 最近,也有一個新方向將包括遺傳演算法和強化學習在內的優化演算法引入,這使得得到的模型非常複雜。

我們追求的是找到關於神經網路操作使用的發展方向,這可以更簡易的指導網路設計。我們的網路設計基於MobileNetV1的,保留了該模型的簡單性,顯著的提高了其準確性,達到了針對移動應用的分類和檢測應用的先進水平。


初步,討論和直覺(Preliminaries, discussion and intuition)

深度分離卷積(Depthwise Separable Convolutions)

將標準卷積拆分為深度分離卷積在MobileNetv1中詳細講解過了,其基本思想:將標準卷積拆分為兩個分卷積:第一層稱為深度卷積(depthwise convolution),對每個輸入通道應用單通道的輕量級濾波器;第二層稱為逐點卷積(pointwise convolution),負責計算輸入通道的線性組合構建新的特徵。

標準卷積L i L_iLi​為h i × w i × d i h_i×w_i×d_ihi​×wi​×di​,應用標準卷積核K ∈ R k × k × d i × d j K∈R^{k×k×d_i×d_j}K∈Rk×k×di​×dj​產生輸出L j L_jLj​為h i × w i × d j h_i×w_i×d_jhi​×wi​×dj​.

  • 標準卷積的計算消耗為:h i ⋅ w i ⋅ d i ⋅ d j ⋅ k ⋅ k h_i·w_i·d_i·d_j·k·khi​⋅wi​⋅di​⋅dj​⋅k⋅k.
  • 拆分後深度分離卷積計算消耗為:h i ⋅ w i ⋅ d i ( k 2 + d j ) h_i·w_i·d_i(k^2+d_j)hi​⋅wi​⋅di​(k2+dj​),計算消耗比例因子$\frac{k2d_j}{k2+d_j} $

MobileNetv2中使用的卷積核大小k = 3 k=3k=3,與標準卷積相比計算量減少了8~9倍,精度上有略微的損失。

Linear Bottlenecks

這部分是論文的主要Insight了,我覺得比較難的理解,這裡貼出我自己的看法~

我們認為深度神經網路是由n nn個L i L_iLi​層構成,每層經過啟用輸出的張量為h i × w i × d i h_i×w_i×d_ihi​×wi​×di​。我們認為一連串的卷積和啟用層形成一個**興趣流形(manifold of interest,這就是我們感興趣的資料內容)**,現階段還無法定量的描述這種流行,這裡以經驗為主的研究這些流行性質。

長期以來我們認為:在神經網路中興趣流行可以嵌入到低維子空間,通俗點說,我們檢視的卷積層中所有單個d通道畫素時,這些值中存在多種編碼資訊,興趣流行位於其中的。我們可以通過變換,進一步嵌入到下一個低維子空間中(例如通過1 × 1 1×11×1卷積變換維數,轉換興趣流行所在空間維度)。

乍一看,這樣的想法比較容易驗證,可通過減少層維度從而降低啟用空間的維度。MobileNetv1是通過寬度因子(width factor)在計算量和精度之間取折中。用上面的理論來說,寬度因子控制啟用空間的維度,直到興趣流行橫跨整個空間。

然而,由於深度卷積神經網路的層是具有非線性啟用函式的。以ReLU變換(F ( x ) = m a x ( 0 , x ) F(x)=max(0,x)F(x)=max(0,x))為例,會存在以下問題:

  • 如果當前啟用空間內興趣流行完整度較高,經過ReLU,可能會讓啟用空間坍塌,不可避免的會丟失資訊。(如下Figure 1的示意圖)
  • 如果經過ReLU變換輸出是非零的,那輸入和輸出之間是做了一個線性變換的,即將輸入空間中的一部分對映到全維輸出,換句話來說,ReLU的作用是線性分類器

下圖展現了興趣流行的變換示例:

在這裡插入圖片描述

Input是一張2維資料,其中興趣流行是藍色的螺紋線;本例使用矩陣T TT將資料嵌入到n nn維空間中,後接ReLU,再使用T − 1 T^{-1}T−1將其投影回2D平面。

可以看到設定n = 2 , 3 n=2,3n=2,3時資訊丟失嚴重,中心點坍塌掉了。當n = 15..30 n=15..30n=15..30之間,恢復的資訊明顯多了。

總結一下,我們強調了兩個性質:

  • 如果興趣流行經過ReLU變換後得到非零的結果,這時ReLU對應著是一個線性變換
  • 只有當輸入流行可包含在輸入空間的低維子空間中,ReLU才能完整的保持輸入流行的資訊。

存在的問題: 我們想要興趣流行存在低維空間中,即想要提升效果,維度是要低一點。但是維度如果低的話,啟用變換ReLU函式可能會濾除很多有用資訊,而ReLU對於沒有濾除的部分,即非零的部分的作用是一個線性分類器。

既然在低維空間中使用ReLU做啟用變換會丟失很多資訊,論文針對這個問題使用linear bottleneck(即不使用ReLU啟用,做了線性變換)的來代替原本的非線性啟用變換。到此,優化網路架構的思路也出來了:通過在卷積模組中後插入linear bottleneck來捕獲興趣流行 實驗證明,使用linear bottleneck可以防止非線性破壞太多資訊。
(附錄中說了一個看法: 如果輸入流行可通過啟用空間嵌入到顯著的低維子空間,那麼通常ReLU變換可保留資訊,同時為所需的複雜性引入一組可表達的函式.我看的不是很懂,要表達的是ReLU的必要性~)

從linear bottleneck到深度卷積之間的的維度比稱為Expansion factor(擴充套件係數),該係數控制了整個block的通道數。linear bottleneck的使用操作的流程演化圖如下:

在這裡插入圖片描述

  • 圖(a):普通模型架構使用標準卷積將空間和通道資訊一起對映到下一層,引數和計算量會比較大
  • 圖(b),MobileNetv1中將標準卷積拆分為深度卷積和逐點卷積,深度卷積負責逐通道的過濾空間資訊,逐點卷積負責對映通道。將空間和通道分開了
  • 圖©和圖(d)是MobileNetv2的結構(d是c的下一個連線狀態),同樣是將標準卷積拆分為深度卷積和逐點卷積,在逐點卷積後使用了接1 × 1 1×11×1卷積,該卷積使用線性變換,總稱為一層低維linear bottleneck,其作用是將輸入對映回低維空間

Inverted residuals

由上面的分析,直覺上我們認為linear bottleneck中包含了所有的必要資訊,對於Expansion layer(即linear到深度卷積部分)僅是伴隨張量非線性變換的部分實現細節,我們可將shortcuts放在linear bottleneck之間連線。示意圖如下:

在這裡插入圖片描述

選擇這樣的結構,可以提升梯度在乘積層之間的傳播能力,有著更好的記憶體使用效率。

下表是bottleneck convolution的基本實現:

在這裡插入圖片描述

  • 首先是1×1 conv2d變換通道,後接ReLU6啟用(ReLU6即最高輸出為6,超過了會clip下來)
  • 中間是深度卷積,後接ReLU
  • 最後的1×1 conv2d後面不接ReLU了,而是論文提出的linear bottleneck

Inverted residuals結構示意圖如下(方塊的高度即代表通道數):

在這裡插入圖片描述

可以看到相比與之前的殘差模組,中間的深度卷積較寬,除了開始的升維的1 × 1 1×11×1卷積,做shortcut的1 × 1 1×11×1卷積通道數較少,呈現的是倒立狀態,故稱為Inverted residuals。

這樣的結構在構建block時,自然的將輸入和輸出分離了。把模型的網路**expressivity (expansion layers,由擴充套件層決定)capacity(encoded by bottleneck inputs,由bottleneck通道決定)**分開。


Model Architecture

構建的MobileNetv2的基本單元是bottleneck depth-separable convolution,下表給出了MobileNetv2的結構體系(2 8 2 × 32 ( s = 2 ) → 2 8 2 × 64 ( s = 1 ) → 1 4 2 × 96 28^2×32(s=2) \rightarrow 28^2×64(s=1) \rightarrow 14^2×96282×32(s=2)→282×64(s=1)→142×96這裡步長設定應該反了):

在這裡插入圖片描述

其中初始的全卷積為32個卷積核,後面接了19個 residual bottleneck layers。這裡使用ReLU6(即f ( x ) = m i n { m a x ( 0 , x ) , 6 } f(x)=min\{max(0,x),6\}f(x)=min{max(0,x),6})作為非線性啟用函式,這樣在低精度計算下具有更強的魯棒性。對於我們所有的實驗,選擇擴充套件因子(expansion factor)等於6,例如採用64的通道的輸入張量產生128通道的輸出,則中間的深度卷積的通道數為6 × 64 = 384 6×64=3846×64=384。

Memory efficient inference

這部分沒看懂,簡單的翻譯了一下

MobileNetv2中的inverted residual bottleneck對於移動裝置有非常高效的實現。

對於整個模型計算圖G GG,是由表示邊的操作運算和表示節點的中間計算張量。 中間計算需要最小化儲存在記憶體中的張量總數。多數情況下,這需要搜尋所有合理計算順序∑ ( G ) \sum(G)∑(G)選擇最小的:M ( G ) = min ⁡ π ∈ ∑ ( G ) max ⁡ i ∈ 1.. n [ ∑ A ∈ R ( i , π , G ) ∣ A ∣ ] + s i z e ( π i ) M(G)=\min_{\pi∈\sum(G)}\max_{i∈1..n}\left [\sum_{A∈R(i,\pi,G)}|A| \right ]+size(\pi_{i})M(G)=π∈∑(G)min​i∈1..nmax​⎣⎡​A∈R(i,π,G)∑​∣A∣⎦⎤​+size(πi​)其中R ( i , π , G ) R(i,\pi,G)R(i,π,G)是包含已連線π i . . π n \pi_i..\pi_nπi​..πn​任意節點的中間張量列表;∣ A ∣ |A|∣A∣表示張量A AA的大小;s i z e ( i ) size(i)size(i)是操作i ii期間所需的儲存總和。

對於只有常見平行結構的圖(例如殘差結構)來說,只有一個非常見計算順序可以簡化計算圖G GG上推斷所需的記憶體:M ( G ) = max ⁡ o p ∈ G [ ∑ A ∈ o p i n p ∣ A ∣ + ∑ A ∈ o p o u t ∣ B ∣ + ∣ o p ∣ ] M(G)=\max_{op∈G}\left [\sum_{A∈op_{inp}}|A| + \sum_{A∈op_{out}}|B| + |op|\right ]M(G)=op∈Gmax​⎣⎡​A∈opinp​∑​∣A∣+A∈opout​∑​∣B∣+∣op∣⎦⎤​注意所需記憶體可簡化為最大化計算所有操作的輸入和輸出組合的總大小,如果我們將bottleneck殘差結構作為一個單一操作處理(即將內部卷積認為一次性張量),那麼總的記憶體量是由bottleneck張量主導的,而不是bottleneck內部的張量大小決定的(佔比更大)。

對於Bottleneck Residual Block:

一個bottleneck block操作運算F ( x ) F(x)F(x)可表示為三個運算操作的組合F ( x ) = [ A ⋅ N ⋅ B ] x F(x)=\left [A \cdot N \cdot B\right ]xF(x)=[A⋅N⋅B]x
其中

  • A : R s × s × k → R s × s × n A:R^{s×s×k} \rightarrow R^{s×s×n}A:Rs×s×k→Rs×s×n是線性變換;
  • N : R s × s × n → R s ′ × s ′ × n N:R^{s×s×n} \rightarrow R^{s'×s'×n}N:Rs×s×n→Rs′×s′×n是每個通道的非線性變換;
  • B : R s ′ × s ′ × n → R s ′ × s ′ × k ′ B:R^{s'×s'×n} \rightarrow R^{s'×s'×k'}B:Rs′×s′×n→Rs′×s′×k′是另一個輸出的線性變換

對於MobileNetv2來說,N = R e L U 6 ⋅ d w i s e ⋅ R e L U 6 N=ReLU6 \cdot dwise \cdot ReLU6N=ReLU6⋅dwise⋅ReLU6,但是結果適用於每個通道變換。假設輸入大小主要由∣ x ∣ |x|∣x∣主導,輸出主要由∣ y ∣ |y|∣y∣主導,那麼F ( x ) F(x)F(x)計算所需的記憶體可以下降到∣ s 2 k ∣ + ∣ s ′ 2 2 k ′ ∣ + O ( max ⁡ ( s 2 , s ′ 2 ) ) |s^2k|+|s^{'2}2k'|+O(\max(s^2,s^{'2}))∣s2k∣+∣s′22k′∣+O(max(s2,s′2))

在這裡插入圖片描述


Experiment

訓練細節:

部分設定
使用工具TensorFlow
訓練器RMSPropOptimizer, decay and momentum都設定0.9
標準的權重衰減4e-5
學習率初始學習率為0.045,每個epoch後衰減0.98
batch_size16GPU內設定96
其他細節每層後使用BN層

Ablation study

對於Inverted residual connections,驗證不同結構下的連線方式對模型效能影響。對比結果如下圖(b)所示:

在這裡插入圖片描述

圖(a)是對比Linear Bottleneck設計的有效性:
從理論上來講,linear bottleneck的限制不如non-linearities嚴重,因為linear bottleneck總能線上性範圍改變偏置和縮放。圖示liear bottleneck的效果要更佳,這為non-linearity操作在低維空間收益不佳的假設做了有力的驗證。

ImageNet Classification

本次比較MobileNetv1,ShuffleNet和NASNet-A模型:

核心單元結構如下:
在這裡插入圖片描述

效能和引數對比如下:

在這裡插入圖片描述

詳細的對比圖如下:

在這裡插入圖片描述

Object Detection

**SSDLite:**我們對SSD結構做了修改,將SSD的預測層中所有普通卷積替換為深度分離卷積,這樣計算更高效,引數量和計算成本大大降低。如下圖:

在這裡插入圖片描述

再對比評估了MobileNetv1和MobileNetv2的效能,還有YOLOv2和SSD網路在COCO資料集上表現,對於MobileNetv2來講,SSDLite的第一層附加到第15層上作為擴充套件(官方程式碼沒放出來,不確定這裡具體怎麼處理~),第二層和SSDLite的其餘部分附加到最後一層。對比如下:

在這裡插入圖片描述

MobileNetv2在極少的引數量下有著不錯的效能~

Semantic Segmentation

將MobileNetv1,MobileNetv2以DeepLabv3為特徵提取器做比較,在PASCAL VOC 2012上做比較。

在構建移動模型時,嘗試了以下三種設計結構:

  • 不同的特徵提取器
    • 基於MobileNet系列的,和基於ResNet101系列的
  • 簡化DeepLabv3結構,加快計算
    • 對於DeepLabv3頂端部分(即ASPP模組)做處理
  • 使用不一同的推理策略,提升效能
    • 使用資料增強,水平翻轉、多尺度輸入等

對比結果如下:

在這裡插入圖片描述

從表中總結一下:

  • 使用包括MF(多尺度和隨機翻轉)配置的推理策略顯著增加計算量(MAdds),不適合應用在移動裝置上。
  • 使用輸出OS(輸出步幅)=16的比OS=8的要有效
  • MobileNetv1相比ResNet已經是強大的特徵提取器了
  • DeepLabv3的頂端部分在MobileNetv2倒數第二個特徵對映上構建比在最後的特徵對映上構建要有效,倒數第二層的通道數為320,而最後一個為1280,這樣能顯著減少計算量,而在效能上只是略微的受損
  • DeepLabv3的頂端部分計算成本很高,移除ASPP模組可顯著的減少MAdds,卻只有少量的效能損失(黑體加粗部分,有較好的效能,計量下降到只有2.75B)

Conclusion

論文設計的新的Inverted residual bottleneck結構,能夠構建一系列高效移動模型,基本的構建單元具有多種特性,同時在記憶體處理上有極好的性質。新提出的Inverted residual bottleneck結構在理論上具有獨特的性質,允許將網路expressivity (expansion layers,由擴充套件層決定)和capacity(encoded by bottleneck inputs,由bottleneck通道決定)分開,這是未來研究的重要方向。


附錄

本文非常好在有許多數學上的證明,不再是結果(很多文章都是State-of-the-art,所以我的模型就是好,上一篇有這種感覺的文章是ResNet)說明一切的,而是有理論指導的了。