Efficient CNN 介紹(二):MobilenetV2

黃顯堯
Taiwan AI Academy
Published in
15 min readJul 10, 2020

前言

在這篇文章當中,會介紹 MobilenetV2 透過何種方式進而大幅的改善 MobilenetV1 的準確率以及效能以達到 Efficient CNN 的目的。在正式開始之前,假如想要更了解 MobilenetV1 所使用的 depthwise separable convolution 的話,歡迎閱讀 Efficient CNN 介紹(一):MobilenetV1

Introduction

在最近幾年,無論是在影像分類,物件偵測等各種的電腦視覺問題上,Neural Network 皆取得了超越人類的準確度,然而為了提高準確度,往往需要花費大量的運算資源,在這樣的情況下使得我們無法輕易的在手機或是嵌入式系統上運行我們的模型。
在 2017年時 Google 提出了 MobilenetV1,透過 depthwise separable convolution 使得 CNN 可以在更少的運算資源中,達到更高的準確率,基於 MobilenetV1 , Google 更在 2018年的時候提出了 MobilenetV2,進而使得 CNN 可以更加的輕量,卻同時達到更高的準確率。

MobilenetV2

在 MobilenetV2 中,提出了一個全新的 layer module: The inverted residual with linear bottleneck。也就是如以下的步驟:
1. 接收一個經過壓縮的 low-dimension representation
2. 此 module 會將此 representation 擴展成 high-dimension representation
3. 透過 depthwise separable convolution 進行捲積
4. 將此 high-dimension representation 壓縮成 low-dimension representation
透過這樣的方式,使得我們可以達到一個目的:

在低維度傳遞資料,在高維度擷取特徵

進而達到 Efficient CNN 的目的。

因此在以下我們將 MobilnetV2 分成以下幾個大項目並進行講解,分別是:Depthwise Separable Convolutions, Linear Bottlenecks 和 Inverted residuals。

Depthwise Separable Convolutions

在現今 Effecient CNN 當中,往往會使用到 Depthwise separable convolutions 作為其主要的 build block (e.g., MobilenetV1, ShufflenetV1 甚至是 2019 年的 MobilenetV3 或是 MixNet),原因是其透過將傳統的 Covolution 拆解成 depthwise convolution 以及 pointwise convolution 的方式,可以大幅度的減少傳統 convolution 所需要的運算資源,卻又不會降低準確率。

詳細 Depthwise Separable Convolutions 的介紹可以閱讀 — Efficient CNN 介紹(一):MobilenetV1

Linear Bottlenecks

在開始介紹 Linear Bottlenecks 之前,首先需要先跟大家解釋什麼是 “manifold of interest”。在一個 neural network 訓練的過程,當我們將一張照片作為 input 放入 neural network 之後,每當經過了一層 layer 的 forward,我們都會得到一個這層的 output,也可以稱作為 feature map。非正式的說,當我們將一堆照片作為 input 放入一個 neural network 之後,經過某一層 layer 後所得到的 output,我們可以說這些 output 構成了一個 “manifold of interest”,白話的說,“manifold of interest” 也就是對於這個 neural network 來說重要的資訊
但是實際上,由於並非整個 feature map 都是 “manifold of interest”,也就是說不同 layer 所傳遞的 feature map 並非皆是重要的資訊,因此假如我們可以將 feature map 當中 的 “manifold of interest” embedding 至一個較低維度的子空間,我們便可以讓整個 CNN 變得更加的輕量,同時又維持了他原本的 performance。
而要如何將 “manifold of interest” embedding 至一個較低維度的子空間呢,最直覺的作法便是減少各個 layer 的維度(又稱作channel size),直到 “manifold of interest” 剛好為整個 feature map 為止。如此一來,在減少維度的同時,我們一方面可以減少整個 neural network 的運算量,而另一方面由於我們依舊保持著 feature map 當中的 “manifold of interest”,因此並不會使得 accuracy 大幅度的下降。
然而,當我們仔細回想整個 CNN 的架構之後,我們會發現這個 ”最直覺的方法” 實際上是行不通的,原因是因為在 CNN 當中,其包含了 non-linear function (e.g., ReLU),因此當我們減少了 channel size 使得整個 feature map 剛好都是 “manifold of interest” 之後,再經過 ReLU,反而會因為整個 feature map 皆是重要的資訊而使得我們反而失去了些許重要資訊。
因此我們來仔細的討論一下,為何 ReLU 以及減少 channel size 不能同時使用呢?首先我們先來仔細了解一下在 CNN 當中,我們實際上做了什麼,也就是如下這個式子:

S 為經過 ReLU 之後所得到的 non-zero volume (通常也就是一層 layer 的 output ),而 B 為 linear transform (e.g., convolution。以 pytorch 來舉例的話,則為 nn.Conv2d 或是 nn.Linear ),而映射到 output S 當中的非0的值為 input x 和 B 透過 linear transform 所獲得 (也就是經過 ReLU 之後所得到的 非 0 output )。
因此我們可以說對於部份的 input x 來說,其對應到 output S 的關係,僅僅只有 linear transform 而已(我自己認為這邊的意思代表說對於 ReLU 來說,大於 0 的值會在 output S 中保持一模一樣的值,而其他則會在 output S 當中為 0,因此對於 output S 來說,其非 0 的值,其實僅僅等同於對 input x 做 linear transform,因為 ReLU 對他所作的只是把他的值原樣的繼續傳下去),因此簡單來說,

當我們在做一個分類問題的時候,其實整個 CNN 在做的事情其實只是對於 output S 中非 0 的值做線性分類。

而在另一方面,當 ReLU 將部份的 output 轉換為 0 時,不可避免的我們會在某些 channel 中失去我們所需要的訊息,但是,假設我們今天擁有足夠多的 channel 的時候,儘管在某些 channel 中會失去一些訊息,但是那些訊息依舊有很大的可能可以被保留在其他的 channel 當中,因此當我們的 “input manifold” 是可以被 embedding 至一個明顯維度較少的子空間的時候,ReLU 便可以一方面保留住我們所需要的訊息,一方面為我們的增加我們函式的複雜性(CNN 其實便是一個很複雜的函式)。

也就是說,當我們的 feature map 當中有冗於的空間,ReLU 才可以一方面保留住重要的訊息,一方面增加模型的複雜度!

因此,我們可以根據上面的討論歸納兩個特點,分別如下:

  1. 對於 ReLU 來說,其只是在對 “manifold of interest” 做一個 linear transform (因為大於 0 的值依舊維持一樣值)。
  2. 當 “manifold of interest” 為 input 中低維度的子空間時(也就是有冗於的 feature ),ReLU 可以完整的保存著所有的訊息。

也因為這兩個特點,我們可以得到一個結論:

當我們要透過將 Channel size 減少來使得我們可以將 “manifold of interest” embedding 至一個較低維度的子空間,我們並無法使用 ReLU,原因在於 ReLU會將部份重要的訊息丟掉,尤其是在經過 embedding 過得 “manifold of interest”

因此,當 “manifold of interest” 確實存在為 input space 當中的某個低維度子空間時,我們可以簡單的透過一個 linear transform 來將 input space embedding 成一個 channel size 較小的 “manifold of interest”,而這個 linear transform 也就是所謂的 linear bottleneck layers

所以總結一下,linear bottleneck layers 就是一個將重要的資訊 (manifold of interest) encode 成一個更加精簡的 feature map 的線性轉換

看了上面的內容後,可能大家還是會不懂到底 linear bottleneck 是如何整合進 Depthwise Separable Convolutions,而又是在哪個地方達到 linear transform 這個目的的呢? 因此我們透過下面這個圖來跟大家做介紹:

圖片來源:https://arxiv.org/pdf/1801.04381.pdf

(a) 為一般的 convolution 也就是在做 convolution 的同時,也增加了 channel size,這樣同時做捲積以及增加 channel size 的作法會使得我們需要較多的運算量。
(b) 則為在 MobilenetV1 中所使用的 Depthwise Separable Convolutions,將一般的 convolution 拆解成了兩個步驟,分別為單純做捲積的 depthwise convolution 以及增加 channel size 的 pointwise convolution,透過將原先一個步驟拆解成兩個步驟的過程可以使得我們減少許多的運算,卻與一般的 convolution 達到相同的目的。
(c ) (d)則為剛剛所提到的 linear bottleneck(可以將 (c ) (d) 串接在一起看,顏色紋路相同的 block 可以對齊重疊),從 (c ) 來看的話,一樣是在一開始有一個 depthwise convolution,而後有一個 pointwise convolution,但相較於 (b) 的 pointwise convolution 將 channel size 增加, (c )則是將 channel size 縮小了,目的就如同剛剛所提到,為將“manifold of interest” embedding 至一個較低維度的子空間,而在剛剛的結論當中,我們知道說要將“manifold of interest” 可以 embedding 至一個較低維度的子空間,我們可以透過 linear transform 來進行,因此在 (c ) 當中將 channel size 減少的 pointwise convolutioin 並沒有使用到 non-linear function(e.g., ReLU),目的為避免 non linear function(e.g., ReLU) 使得我們的訊息流失,而在減少 channel size 的 pointwise 之後會使用另外一個 pointwise convolution 將 channel size 增加,也就是 (d) 的最一開始,而由於是使 channel size 擴張,因此在這個階段我們就可以使用 non-linear function 增加我們函式的複雜程度,卻不會流失掉我們所需要的訊息(如同上面所提到)。

Inverted residuals

而 bottleneck blocks 如同在 Resnet 中廣泛被使用的 residual block 一樣,是一個當中有許多 bottleneck 並有一個 expansion 的 block。然而,從上面的討論中,我們可以知道說 bottleneck 實際上包含了所有我們所需要的資訊(因為是將“manifold of interest” embedding 至一個較低維度的子空間),而 expansion layer 僅是一個為了使我們進行 non-linear transform 並且不會遺失掉資訊的過程,因此跟過去不同的地方為,MobilenetV2 是對 bottleneck 使用 shortcuts 而並非對 expansion layer 使用 shortcuts 連結(也因為這樣的方式跟過去連接 shortcut 的方法相反,因此稱作為 “Inverted” residuals),我們可以用下圖再重新的解釋一次:

圖片來源:https://arxiv.org/pdf/1801.04381.pdf

(a) 為過去大家所使用的 residual block,其中為了減少 convolution 的運算負擔,會將 channel size 壓縮之後才進行 convolution,而 shortcut 的部份為了傳遞較多的資訊,因次連接了兩個 channel size 較大的 expansion layer 。
(b) 當中,也就是 Mobilenetv2 所提出的 Inverted residual block 當中, shortcut 的連接並非於 expansion layer,而是於 linear bottleneck layer,原因為經過 linear bottleneck layer 的 feature map 為將“manifold of interest” embedding 至較低維度的子空間,也就包含了我們所需要的所有資訊,因此對這個包含我們所需要的所有資訊的 feature map 做 short cut 便也顯得合理許多。而 expansion layer 所做的事情只是為了抵銷 non-linear function 所造成訊息流失而已。

Running time and parameter count for bottleneck convolution

表格來源:https://arxiv.org/pdf/1801.04381.pdf

上表為 Bottleneck residual block 實際的實做方式,對於一個 input size 為 h * w 的輸入來說,其所需要的所有運算量為:

相比 Mobilenetv1 來說,多了一個額外的 1* 1 convolution ,然而這樣的設計卻可以使得我們使用較少的 input output channel size ,因此在實際上 MobilenetV2 所需資源相比於 MobileNetV1 以及 ShuffleNet 來說,可以大幅度的減少:

The max number of channels/memory (in Kb) (表格來源:https://arxiv.org/pdf/1801.04381.pdf)

Experiment

在講述了 Mobilenetv2 所提出的架構後,接下來我們可以透過下面的實驗看出 Mobilenetv2 在準確度以及效能的提昇,比較過去的 Mobilenetv1 和Shufflenet 都有顯著的提昇。

ImageNet Classification

(表格來源:https://arxiv.org/pdf/1801.04381.pdf)

Object Detection

(表格來源:https://arxiv.org/pdf/1801.04381.pdf)

Semantic Segmentation

(表格來源:https://arxiv.org/pdf/1801.04381.pdf)

Ablation study

而作者也同時驗證了於論文中提出的 Linear bottleneck 以及 Inverted residual 皆可以使得網路的準確度有效的提昇。

圖片來源:https://arxiv.org/pdf/1801.04381.pdf

Conclusion

在 Mobilenetv2 這篇論文當中,透過 linear bottleneck 以及 inverted residual 等方式,使得準確度和效能皆可以更加提高。而在論文當中也詳細的解釋了為何這樣設計的緣由,並透過實驗加以佐證。

Reference

Mark Sandler Andrew Howard Menglong Zhu Andrey Zhmoginov Liang-Chieh Chen. MobileNetV2: Inverted Residuals and Linear Bottlenecks.

--

--