[MobileNet 系列] MobileNetV2-小改動大進化,終端的唯一選擇

1. Introduction

MobileNetV1 之後,又一個全新的 MobileNet 誕生了:MobileNetV2。在開始閱讀 MobileNetV2 之前,建議先理解 MobileNetV1 重要的創新 Depthwise Separable Convolution (DSConv),DSConv 的準確度比 Conv 稍差一點點,但速度加快很多,基本上終端模型的運算絕對會將 DSConv 列在考慮清單之內。

MobileNetV2 秉持著 MobileNet 系列一貫的特色,透過小小的改動,使得模型的準確率以及速度有全面的提升。這次 MobileNetV2 將 residual 的概念引進模型當中,並且提出了一個運算模組稱為:inverted residual block (本文將這個模組簡稱為 IRB),IRB 具有 residual 提升準確率的優點,同時又兼顧速度以及低運算量,將 shortcut 連接在小 channel 的 layer之間。因為 IRB 的提出使得 MobilNetV2 獲得顯著的效能提升。之前工作時開發團隊花了一段時間打通 residual 運算後,我們都直接利用 MobileNetV2 作為產品的主要架構,因為該模型不論在物件偵測、物件辨識上,都優於 MobileNetV1,所以 MobileNetV2 可以說是近年來終端應用的首選。

2. Inverted Residual Block

IRB 一言以蔽之,就是結合 DSConv 以及 residual 的運算,但特別的是 IRB 的 residual 是連結在 bottleneck 的 layer 之間,其中 bottleneck layers 指的是 channel 數小的輸入、輸出層,就是下面示意圖中比較瘦的層。透過以下的示意圖,我們可以總結 IRB 是先經過一個 PConv (Conv 1×1) 將 channel 數擴增後,再通過一個 DConv 取得空間上的關係,最後過一個 PConv 縮小 channel 數,並和輸入層做 element-wise 相加。實際上在 MobileNetV2 的架構中,中間層的 channel 數被設定為輸入層的 $6$ 倍 (expansion rate, $t = 6$),詳細架構可以參考第 4 節。

另外需要特別注意的是,在一般 residual 運算裡,相加後會過一個 $\text{ReLU}$ 的 activation,但是 MobileNetV2 指出 $\text{ReLU}$ 會傷害模型的準確性,因此一律以 linear 的方式作為作後的連接。

或許有人會問為甚麼要特意將 residual 以 linear 的方式連接在兩個 bottleneck 之間,這麼做的原因主要是可以減少運算時記憶體的使用量,達到輕量化的效果 (參考第 3 節),並且棄用 $\text{ReLU}$ 可以減少 information loss。此時我們可以更進一步地探討,輸入層 bottleneck 到輸出層 bottleneck 之間如果加入 $\text{ReLU}$ 是不是真的有 information loss,導致效能下降的問題?若對這些理論推導沒有興趣的讀者,可以直接跳到下一章節,若對數學不反感的話,就繼續看下去吧。

其實道理很簡單,假設層跟層之間的 activation function 都有加入 $\text{ReLU}$,那如果出現某個 feature $\mathbf{x}$ 使得 $\mathbf{Bx}$ 跑到負數的位置,經過 $\text{ReLU}$ 轉換之後,這些資訊等於完全流失。

具體來說,假設 $\mathbf{x} \in \mathbb{R}^2$,那經過所有不同的 $\mathbf{B} \in \mathbb{R}^{1\times 2}$ 做線性轉換過後,$\mathbf{Bx}$ 所形成的範圍相當於整個三維空間 $\mathbb{R}^3$。但是若我們在線性轉換後加入一個非線性轉換 $\text{ReLU}$,那 $\text{ReLU} (\mathbf{Bx})$ 所形成的範圍只剩下三維空間的上半部。當任意 $\mathbf{x}$ 轉換後進入下半部空間時,$\text{ReLU} (\mathbf{Bx})$ 所包含的值都會被清為 $0$,無法復原回原始的 $\mathbf{x}$,這個狀況即為 information loss。

如果想要避免資訊流失,其實就等同於讓 $\text{ReLU} (\mathbf{Bx})$ 可以 one-to-one 復原回 $\mathbf{x}$。要避免資訊流施需要滿足兩個條件,假設 $\mathbf{x} \in \mathbb{R}^n$,$\mathbf{B} \in \mathbb{R}^{m\times n}$,那經過非線性轉換後, $\text{ReLU} (\mathbf{Bx})$ 不為 $0$ 的數量至少要有 $n$ 個,且對應到 $\mathbf{B}$ 裡的 $n$ 個向量必須為線性獨立 (linearly independent)。為了得知資訊有沒有流失,作者特別將中間層的值分布畫出來,並且看到大多數非零的數量都是落在門檻以上的,只有少數 layer 若在門檻以下,代表有部分的層可能會遇到資訊流失的問題。

依據上述的討論,我們可以得到以下結論:

  • 只要 expansion 夠大,並且符合某些條件,即使使用 $\text{ReLU}$ 還是可以避免 information loss
  • IRB 將 residual 連接在 bottleneck,如果搭配 $\text{ReLU}$ 的使用會讓某些 layer 有過多等於 $0$ 的 neuron,造成 information loss

因此透過這兩個結論,我們可以推論出 IRB 這個架構的合理性,其一,他將 residual 設在 bottleneck 上,搭配有 6 倍 expansion 的中間層,使用足夠大的 expansion 可以幫助減少 bottleneck 的 information loss。其二,在 bottleneck 的地方完全捨棄 $\text{ReLU}$ 的使用,因為在低維度的空間,實驗上會發現某些層可能有過多等於 $0$ 的 neuron 產生。總結來說,我們可以發現 IRB 基本上就是符合這兩個論點的模組,在 bottleneck 之後採用 expansion layer 的同時,在 residual 的 bottleneck 刪除 $\text{ReLU}$ 運算,確保資訊流失量降到最低。

3. Memory Efficiency

在現有的 deep learning framework 裡面,如 TensorFlow,會將一系列 operation 做 fusion 的動作,目的是為了減少臨時變量進而改善記憶體的使用量,我們可以想見若要將各種 op 融合在一起,那就必須確保這些 op 運算過程中所產生出來的臨時變量,不會再被使用,所以才能讓我們一路到底將這些 op 運算的結果完成。以下面運算 op 為例,我們不能以第一種方式融合,因為 Conv1 的運算結果需要連接到 Add0 做相加的運算,如果將 Conv1 和其他 op 融合再一起後,Conv1 的運算結果將遺失,導致沒辦法做 Add0 的運算了。所以比較合理的融合選擇是第二種方式,將 residual block 整個融合在一起。

從上述例子我們就可以看出,程式在執行深度學習模型的一系列運算時,如果遇到 residual block 的話,記憶體的使用量主要是根據輸入大小,以及輸出大小來決定,其他中間的運算都不會有臨時 tensor 被宣告出來,直接運算到最後的 element-wise add (註1)。所以如果我們將 residual block 的運算融合,那 residual block 的運算過程只需要儲存:輸入 tensor 、輸出 tensor,以及中間 op 的一些運算臨時變量。因此 IRB 利用 bottleneck 作為 residual 連結的方式,在運算時可以省下很多記憶體空間,這就是 MobileNetV2 為何要在 bottleneck 之間連結的原因,同時我認為這也是 MobileNetV2 這篇論文最大的貢獻點。

關於 tensorflow 的 op fusion 以及其他底層程式邏輯,個人並沒有深入研究,只能地粗淺看過 tensorflow 底層程式碼,搭配論文的解釋加以理解,若對這個領域有興趣的朋友可以自行研究 tensorflow 底層的運算機制。

註1:中間的 op 可能還是會宣告一些臨時變量,比如在做 convolution 時,涉及到大量的相加相乘運算,一定會有一些臨時的變量產生,但是最後運算出來的 tensor 不用占用額外的記憶體儲存,而是會直接被用來執行下一個運算,

4. Model Structure

MobileNetV2 的整體模型架構如下:

$t$ 代表 expansion 的倍數,bottleneck 的 channel 如果是 $32$ 的話,那中間層的 channel 數會被設定為 $192$。$c$ 代表該層的輸出 channel 數。$n$ 代表該運算重覆的次數。$s$ 代表 convolution 運算時 stride 的大小。

延續 MobileNetV1 的設定,MobileNetV2 也有 $\alpha$ 跟 $\rho$ 兩個 hyper parameter,分別決定模型的 channel 數量以及模型 feature 的大小。另外有幾點需要特別注意,第一,可以看到 MobileNetV2 裡面的某些 bottleneck 會使用 $\text{stride}=2$,這個設定會造成特徵圖的長寬減為一半,自然也就無法使用 residual 的 element-wise 相加了,因此只要遇到 $\text{stride}=2$ 的 IRB,會自動忽略 residual 的動作。第二,輸入 feature 經過 IRB 之後 $\text{channel}=\{16, 24, \cdots\}$ 會改變,這也會使得 residual 無法 element-wise 相加,解決的辦法就是利用一個 $1\times 1 \text{ Conv}$ 將輸入 feature 的層數增加,再接上 residual。

5. Experiments

5.1 Linear Bottleneck

首先,作者利用某個分類任務作為作者提出的論點之驗證。從以下左圖可以看到,在 residual bottleneck 中加入 $\text{ReLU}$ 會讓分類的準確性下降接近 1 個百分點,這也一定程度說明了在低維空間加入非線性函數可能會對效能造成傷害。另一方面,從右圖作者分別將 shortcut 連接在 expansion 和 bottleneck 上做比較,可以很明顯的看出在 bottleneck 的 residual 效果最好。所以說 shortcut 在 bottleneck 上是可以保留必要資訊的,相反的若將 shortcut 放在 expansion 上,可能 expansion 接下來接到的是一個 bottleneck,反而會將資訊壓縮導致部分 information loss,因此這個實驗的結果其實顯而易見。

但是個人認為作者僅用一個分類實驗就想佐證他的論點有點過於薄弱,比較好的方式還是多做幾個實驗,如果在不同的場景下結果都和作者提出的論點一樣,才會是一個強而有力的證據。不過這篇論文至少讓我們得知在 MobileNetV2 這個架構中,Linear bottleneck 應該是一個較佳的選擇。

5.2 MobileNetV2 vs Other Models

MobileNetV2 在 ImageNet 的分類任務中,明顯比其他模型更具優勢,不論在準確度方面或是速度方面,都可以說是最佳的選擇。在實驗中,MobileNetV2 是以 RMSprop 的方式做優化,並且將 decay 和 momentum 都設置為 $0.9$、batch size 設置為 $96$,另外 MobileNetV2 在每層都會加入 batch normalization。和 MobileNetV1 一樣,MobileNetV2 將初始的 learning rate 設置為 $0.045$,並在每個 epoch 後都會逐漸減少 $0.98$ 倍。

以下左圖比較不同輕量化模型在不同 resolution $\rho$ 、不同 multiplier $\alpha$ 之下的比較,另外 MobileNetV2 額外加入了一個 $\rho = 1.4$ 加入比較,因為在這個設定下其模型的運算量才可以和其他模型相當。以下右圖則是詳細列出某些模型的 top 1 準確率、參數量、運算量以及 CPU 使用時長。從以下圖表可以發現 MobileNetV2 的速度和準確度都是優於 MobileNetV1 的,雖然在準確度上輸 NasNet,但速度卻有天壤之別。當我們把 MobileNetV2 的運算量稍微提升至和 NasNet 差不多的水平後,MobileNetV2 在準確度上就超越了 NasNet,並且同時具有速度上的優勢。

5.3 Object Detection: SSDLite

除了上述比較效能的實驗之外,這篇論文還特別提出了另一個架構,就是利用 MobileNet 作為 SSD 物件偵測模型的 backbone,這個模型稱為 SSDLite。此模型也極具參考價值,因為 SSDLite 大幅降低原始 SSD 的大小以及運算量,並且讓準確度維持在一個不錯的水準。讓人驚豔的是 SSDLite 的準確性可以優於 YOLOv2,但仔細思索後其實這是可以想見的結果,因為 SSD 的框架將圖片各種 scale 考慮進來加以利用,並且利用各種 residual shortcut 讓模型深度加深很多,使得 SSDLite 的準確率大幅提升。

6. Summary

MobileNetV2 是一個很常見的模型,基於 MobileNetV1 的基礎上額外加入 residual 的概念,並且提出一些洞見,讓 MobileNetV2 可以維持在低運算量、低記憶體使用量的同時,更進一步地提升模型的準確度。基本上終端只要有支援 residual 操作,MobileNetV2 絕對會是我們的首選,下一篇將要提到的 MobileNetV3 雖然更進一步地提升效能,但因為含有一些不常見的運算,終端並沒有支援,導致 MobileNetV3 使用率上反而比較低,因此我們可以將 MobileNetV2 視為兼顧實務應用的劃時代發明。

7. Reference

MobileNetV2: Inverted Residuals and Linear Bottlenecks

其他相關文章

機器學習系列文章總整理
[MobileNet 系列] MobileNetV1-為終端而生
EM Algorithm 詳盡介紹: 利用簡單例子輕鬆讀懂 EM 的原理及概念
Gaussian Mixture Model (GMM) -混合高斯模型的介紹以及完整數學式推導