天天看點

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

EfficientNet論文筆記

增加模型精度的方法有增加網絡的深度,特征圖的通道數以及分辨率(如下圖a-d所示)。這篇文章研究了模型縮放,發現仔細平衡網絡的深度、寬度和分辨率可以獲得更好的性能(下圖e)。在此基礎上,提出了一種新的縮放方法,使用一個簡單而高效的複合系數來均勻地标度深度/寬度/分辨率的所有次元,不僅取得了SOTA,而且參數更少,計算複雜度更低。

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

一個卷積層\(i\)可以定義為\(Y_{i}=\mathcal{F}_{i}\left(X_{i}\right)\),其中\(\mathcal{F}_{i}\)是操作符,\(X_i\)是輸入張量,形狀大小為\(\left\langle H_{i}, W_{i}, C_{i}\right\rangle\)(簡單起見,沒有引入batchsize),\(Y_i\)是輸出張量,是以一個卷積網絡\(\mathcal{N}\)可以表示為一系列層的組合:

\[\mathcal{N}=\mathcal{F}_{k} \odot \ldots \odot \mathcal{F}_{2} \odot \mathcal{F}_{1}\left(X_{1}\right)=\odot_{j=1 \ldots k} \mathcal{F}_{j}\left(X_{1}\right)

\]

卷積神經網絡(如resnet)通常是被分為多個stage的,一個stage的所有層共享相同的結構。是以,上述公式可以變換為:

\[\mathcal{N}=\bigodot_{i=1 \dots s} \mathcal{F}_{i}^{L_{i}}\left(X_{\left\langle H_{i}, W_{i}, C_{i}\right\rangle}\right)

其中\(\mathcal{F}_{i}^{L_{i}}\)表示的是層\(F_i\)在\(stage\) \(i\)重複了\(L_i\)次,\(\left\langle H_{i}, W_{i}, C_{i}\right\rangle\)是第\(i\)層的輸入。根據上面的定義,這篇文章的目标可以抽象成如下公式:

\[\begin{array}{l}{\max _{d, w, r} \quad \operatorname{Accuracy}(\mathcal{N}(d, w, r))} \\ {\text {s.t.} \quad \mathcal{N}(d, w, r)=\bigoplus_{i=1 \ldots s} \hat{\mathcal{F}}_{i}^{d \cdot \hat{L}_{i}}\left(X_{\left\langle r \cdot \hat{H}_{i}, r \cdot \hat{W}_{i}, w \cdot \hat{C}_{i}\right\rangle}\right)} \\ {\text { Memory }(\mathcal{N}) \leq \text { target-memory }} \\ {\text { FLOPS }(\mathcal{N}) \leq \text { target flops }}\end{array}

搜尋最優的\(d, w, r\),使精确度最高,并且參數量以及運算複雜度不超過目标量。

網絡深度越深,可以抓取更豐富更複雜的特征,泛化得更好,通道數和分辨率放大,可以抓取更精細化的特征,更好訓練。通常是單一的縮放三個中的一個變量,單一擴充網絡寬度、深度或分辨率的任何次元都可以提高精度,但是對于更大的模型,精度增益會降低。如下圖所示:

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
文章觀察到網絡的深度,特征圖的通道數以及分辨率三者是互相依賴的,比如,對于更高分辨率的圖像而言,我們應該要提高網絡深度,這樣才會讓更大的感受野幫網絡在更大圖像的更多像素中抓取到相似的特征,同時也應該提高通道數,抓取大圖像的更精細的特征。同樣,作者也用實驗驗證了這一點,如下圖所示:
EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

第一個基線網絡(d=1.0, r=1.0)有18個卷積層,分辨率為224x224,而最後一個基線(d=2.0, r=1.3)有36層,分辨率為299x299。是以為了追求更高的精度和效率,在ConvNet縮放過程中平衡網絡寬度、深度和分辨率的所有次元是至關重要的。

現在來介紹作者提出的方法——複合縮放(compound scaling),該方法使用了一個複合參數\(\phi\)有原則性地均勻縮放網絡深度,寬度以及分辨率。如下公式如示:

\[\begin{aligned} \text { depth: } d &=\alpha^{\phi} \\ \text { width: } w &=\beta^{\phi} \\ \text { resolution: } r &=\gamma^{\phi} \\ \text { s.t. } \alpha & \cdot \beta^{2} \cdot \gamma^{2} \approx 2 \\ & \alpha \geq 1, \beta \geq 1, \gamma \geq 1 \end{aligned}

\(\alpha, \beta, \gamma\)皆為常量,可以在很小的栅格中進行搜尋,\(\phi\)可以由使用者定義控制資源的縮放因子,加倍網絡深度将加倍FLOPS,但加倍網絡寬度或分辨率将使FLOPS增加四倍,是以這裡的\(\beta, \gamma\)取的平方,保持三者對于FLOPS的權重是一樣的。最終總的FLOPS等于\(\left(\alpha \cdot \beta^{2} \cdot \gamma^{2}\right)^{\phi}\),即為\(2^\phi\)。

複合縮放的方法分為兩步:

  • 第一步:固定\(\phi\)為1,這時候的網絡(作者命名為EfficientNet-B0)不是很深,對這個網絡利用公式2和3對\(\alpha, \beta, \gamma\)進行搜尋,找到最優值。
  • 第二步:固定\(\alpha, \beta, \gamma\)為常數,使用不同\(\phi\)的公式3放大EfficientNet-B0,依次得到EfficientNet-B1至B7。

看似簡單,但效果極佳,各個模型的性能表如下:

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

可以看到是又小又快,精度還高,很棒。

繼續閱讀