Paper reading

Jiun Da Lin
8 min readApr 20, 2021

--

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

出處: ICML 2019

作者: Mingxing Tan 1 Quoc V. Le 1

Arxive連結: https://arxiv.org/abs/1905.11946

簡介

自從 AlexNet 在2012年取得 ImageNet的冠軍後,CNN的領域就一直持續不段的更新,然而,照幾個重要的模型推出年份來看看這些歷年 ImageNet 冠軍的分數以及 Param size 我們會發現在 2014 年 Google 所推出的模型大小約為 6.8M ,其 Top-1 Accuray 能夠達到 74.8 的準確度,而2017年後 SENet 的推出也一洗之前紀錄,Top-1 Accuray 能夠達到 82.7%,但 Param size 卻來到了145M 之高,而 2018 年 Google 所提出的 Gpipe 雖然被大家稱為效率怪獸,實現跨多個加速器的高效訓練,但 Param size 卻也來到了驚人的 557M 之高,儘管近幾年來處理器發展蓬勃,僅僅花了3年效能就翻了36倍,然而在同個時期 GPU 內存卻僅增加了 3 倍,這也導致我們的模型受限於硬體資源的瓶頸,為了解決這個現況,Google 在 2019 年時便提出了新的開源模型-Efficient,本篇文章後續也會詳細的介紹它們的設計發想以及效能表現。

在這篇論文當中,作者提出了一個新的想法-Compound scaling, 他認為我們現今的模型可以透過幾種方式來增加精確度:

  1. Width scaling: 透過增加 model 每個 layer 的寬度
  2. Depth scaling: 透過增加 model 的 layer 數量
  3. Resolution scaling: 透過增加 model 輸入圖片的解析度
Conpound scaling

而作者也提出了一個如下方公式的假設,他認為一個模型花費的 floating point opereations 可以被估計為下列公式,其中 alpha 代表的是 depth 深度的變動倍數,beta 是 width 寬度的變動倍數,gamma 是 resolution 大小的變動倍數,phi 則是用以調動我們的硬體資源多寡的變數,若有更多的運算資源則可以設為較大的數字,這邊先假設為 1 :

hypothesis flops expense formula

這邊他做了一個實驗,他假設今天我們的 phi 為1時他想看看各個 component 會對 FLOPs 造成的影響,在實驗中顯示,depth (alpha) 每增加一倍,FLOPs 就會同時增加一倍,而 width(beta) 每增加一倍,FLOPs 就會同時增加 beta 的平方倍,resolution 則也是跟 width 一樣每增加一倍,FLOPs 就會同時增加 gamma 的平方倍,這邊他就得知上面的公式能夠表達為轉換為下面的表達方式:

hypothesis flops expense formula

在求出他們與 FLOPs 之間的倍數關係後,我們就能夠依照這個關係建立出一個 EfficientNet-b0 的原型了(Table 1.),而之後便只需要依照我們擁有的算力資源去設定 phi 的大小去展開 alpha, beta, gamma 項便能夠設計出 b1~b7 分別對應的模型,

Table 1

Model architecture

在上方 Table 1. 當中我們可以看到 EfficientNet-b0 是由一系列的 MBConv 所組成的,這邊我們就來稍微介紹一下他的演進,在下方圖片當中,大家最耳熟能詳的應該就是圖(a)那種 Convolution 形式,然而這種算法卻有一個致命的缺點,就是每次都會需要花費大量的資源在做大矩陣與大矩陣的相乘,為了改善這個問題,便有人提出了圖(b)的作法,他們將Convolution這件事拆開成了 Depthwise Convollution 以及 Pointwise Convolution,透過先收集Spatial 間的資訊,再融合 Channels 間的資訊,便能夠使用更少的資源來達到跟圖 (a) 一般的精確度,而之後又有人提出了如圖 (c) 的作法,他將中接那層的 Channels 又更進一步壓縮,僅保留重要的 Channels,又更進一步的節省了資源,而圖 (d) 則是這邊論文所採用的方式,這主要來自於 MobileNet-V2 所使用的架構:

  1. 接收一個經過壓縮的 low-dimension representation
  2. 此 module 會將此 representation 擴展成 high-dimension representation
  3. 透過 depthwise separable convolution 進行捲積
  4. 將此 high-dimension representation 壓縮成 low-dimension representation

利用這種方式,便能達到在低維度傳遞資料,在高維度擷取特徵的效果。

MBConv

另外一方面,在 EfficientNet 當中也使用到了 SENet 的 Module,其原理主要是透過 Squeeze 來壓縮資訊,緊接著在使用 Excitation 來還原為 feature map 的大小,生成出一個對應各個位置重要程度的 Weights,最後在跟原來 Residual 的 Branch 做 position product,透過這種方式便能夠達到類似 Attention 的效果。

SENet

Experiment

在實驗的部分,作者使用了 CAM 來觀察模型學習效果,從下方圖片可以看到,最右邊的 Column 是採用 Compound scaling,在 heatmap上明顯優於左邊四個方法,成功地抓住圖片的重點。

另外作者也比較了跟不同 Model 的分數比較,並測試在多個 Dataset 上面,從下方結果可以發現平均下來在 Acc. 略高於原紀錄的方法上 Param 數量明顯下降,這邊下降最多的高達 21 倍。

延伸應用

另外最近因為 EdgeAI 頗為火紅,所以也有許多人透過 EfficientNet 去改造成為了 Latency 更低的架構並提出了 5 個版本(如紅色的座標點),在 ImageNet 上分數最高的版本(lite4)約為 80.4%:

對模型優化的方法主要有下面兩種:

Quantization:

透過 TensorFlow 所提出的 Post-training quantization 便能夠量化變數值域的效果,如下方圖片所示,將 FP32 轉換為 Int8,也能夠解決許多 Edge 應用不支援 FP32 的問題。

Heterogeneous hardware:

若是我們要部署到 Edge 端會遇到的另一個問題就是硬體的不同,加速問題也會面臨不同的挑戰,如 GPU、TPU、CPU 等等的架構就都不盡相同,因此為了解決這個問題有兩處能個優化:

  1. 移除 squeeze-and-excitation 架構
  2. 將所有 swish 激活函數取代為 RELU6

而下方的表格也顯示了經過上面兩種的加速方法之後的道速度上大大的優化!

Reference

lhttps://arxiv.org/pdf/1801.04381v4.pdf

lhttps://zhuanlan.zhihu.com/p/32702350

lhttps://medium.com/ai-academy-taiwan/efficient-cnn-%E4%BB%8B%E7%B4%B9-%E4%BA%8C-mobilenetv2-7809721f0bc8

lhttps://blog.tensorflow.org/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html

--

--