MobileNetV2 論文閱讀

李謦伊
謦伊的閱讀筆記
8 min readDec 23, 2020

MobileNetV2 基於 MobileNetV1 做改進,提出了一個創新的 layer module: the inverted residual with linear bottleneck,能夠在提升準確度的同時也提升了速度,是由 Google 於 2018 年發表的輕量化模型。

📝 Paper: https://arxiv.org/abs/1801.04381

🔍 官方 github: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_example.ipynb

本文將會來講解 MobileNetV2 主要的創新點: Linear Bottlenecks、Inverted residuals、Model Architecture 以及 MobileNetV1、MobileNetV2 和 ResNet 的比較

先來回顧一下MobileNetV1 中所提出的 Depthwise Separable Convolutions,其包含了深度卷積 (depthwise convolution) 和逐點卷積 (pointwise convolution),能夠在保持準確度下降低計算量,詳細概念可參考以下文章

Linear Bottlenecks

將 MobileNetV1 最後輸出的 ReLU 運算去除掉,這樣的結構就稱之為 Linear Bottlenecks

之所以去除掉的原因是因為作者在 MobileNetV1 的訓練中發現深度卷積部分的卷積核很容易 fail 掉,就是指訓練出來的卷積核很多是空的,而作者認為出現這個原因很可能是因為 ReLU 的關係。

示意圖

在說明 ReLU 會導致深度卷積部分的卷積核fail 掉的原因之前,先來講一下作者在論文中提到神經網路進行卷積運算後所輸出的 manifold of interest

manifold of interest 就是指對於神經網路有用的特徵訊息,通常有用的特徵訊息會比原輸入圖像要小,因此可以將其 embedding 到低維空間中,而降低維度的方式可以簡單地使用減少通道維度 (channel) 來達到。

MobileNetV1 遵循了這個想法在通道維度上引入了寬度因子,照理說降低維度至維持 manifold of interest 的大小不會造成準確率下降,但在神經網路輸出之前會先經過 ReLU 運算,而 ReLU 在低維空間上容易丟失訊息 (當輸出為負值時會被轉換為 0)

為此作者做了個實驗來證明: 先將低維的 manifold of interest embedding 到高維空間 (n-dimension),再降維到原來的維度,其中 manifold of interest 的維度採用二維。轉換的方法是使用一個隨機矩陣 T 映射到 n 維空間後進行 ReLU 運算,再利用 T 的逆矩陣映射回原來的空間。由下圖可以看到 ReLU 在低維空間上容易丟失訊息,而在高維空間上丟失的訊息較少。

經由上述作者總結了兩點:

  • 若經過 ReLU 運算後,manifold of interest 仍為非 0,則相當於經過一個線性轉換
  • 只有當 manifold of interest 包含於輸入空間的一個低維子空間中,ReLU 才能完整的保持 manifold of interest 的資訊

因此 linear bottleneck 基於以上的概念拿掉了模型最後輸出的 ReLU,如下圖 c 所示。下圖 a 表示為一般的卷積操作,b 表示為 MobileNetV1 採用的 Depthwise Separable Convolution,d 則是 MobileNetV2 的 Inverted Residual Block 結構。

然而當 block 進行堆積時,c 與 d 的結構是相等的 — 可以將 c 的 bottleneck layer 作為 d 的輸入來看就可以看出這兩者結構相同。對於 d 結構: input bottleneck 先使用 pointwise 卷積 (就是指 1x1 卷積層,也稱為 expansion layer) 將通道進行擴展,擴展後卷積層的通道大小 (inner size) 與 input bottleneck 的通道大小的比率就稱為 expansion ratio

Inverted Residual

Inverted Residual 如同其名就是在 linear bottleneck layer 之間加入了 ResNet 的 shortcut connection,能夠更好的回傳梯度與特徵重用,之所以選擇加在 linear bottleneck 是因為作者認為 bottleneck 已經包含了所有重要的資訊

名稱上還有個 ”Inverted”,是因為其結構與傳統的 residual block 相反:傳統的 residual block 會先使用 1x1 卷積層進行降維,接著進行 3x3 的卷積操作,最後再使用 1x1 卷積層回復至原來的維度;而 Inverted Residual 則是先使用 pointwise 卷積 (1x1 卷積層) 提升維度,接著進行 3x3 的 depthwise 卷積操作,最後再使用 pointwise 卷積回復至原來的維度,這樣 Inverted 的設計可以提高記憶體的使用效率

❓ 為什麼要先使用 pointwise 卷積來提升維度?

💬 因為 depthwise 卷積的設計無法改變通道維度,若上一層的通道維度太低,容易導致效果不佳。為了改善這個問題,在每個 depthwise 卷積之前都先使用 pointwise 卷積提升維度。

Model Architecture

先來看一下 Bottleneck residual block 的架構,如下圖所示模型結構包括了 pointwise 1x1 卷積層 (又稱為 expansion layer)、depthwise 卷積層、linear bottleneck layer,其中 t 為 expansion ratio (默認值為 6)、ReLU6 表示最大輸出值限制為 6

❓ 為什麼要使用 ReLU6 將最大輸出值限制為 6?

💬 因為在低運算資源下使用低精度模型: float16 或 int8 時,若不限制 ReLU 的輸出範圍 (0~正無窮),則有可能讓輸出的激活值散佈在很大的範圍,這會導致低精度模型難以精確描述大範圍的數值,進而造成準確度大幅下降

然後將上述的 linear bottleneck 進行堆積後就形成了 MobileNetV2,模型結構顯示於下表2,其中 t 為 expansion ratio、c 為通道數 (channel)、n 為 block 重複的次數、s 為 stride,值得注意的是在重複的 block 中第一個 layer 的 stride 為 2

另外,MobileNetV2 也有使用MobileNetv1 中的 Width Mutiplier, Resolution Multiplier 來控制模型寬度與輸入解析度。Width Mutiplier 值可以從 0.35~1.4,而 Resolution Multiplier 值可以從 96~224,上表 2 中默認 Width Mutiplier=1.0, Resolution Multiplier=224

📚 Stride=1 與 Stride=2 的差別

在下圖4 可以看到 MobileNetV2 和其他模型的架構比較圖。在 MobileNetV2 的架構中有分為 Stride=1, Stride=2 兩種,當 Stride=1 時會使用 shortcut connection,而當 Stride=2 則不採用

MobileNetV1、MobileNetV2 和 ResNet 比較

我畫了一張圖可以更清楚的了解這三種模型架構

實驗結果

MobileNetV2 在 ImageNet Classification、Object Detection、Semantic Segmentation 均獲得不錯的表現,本文僅貼出在 ImageNet Classification 上的表現結果,其它部分可以從論文中查看。

由表4 可以看出在相同參數下,MobileNetv2 比 MobileNetv1 和 ShuffleNet得到更好的結果;若使用 Width Mutiplier=1.4 能獲得更高的準確度。

--

--