機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networksを読んだのでメモ

はじめに

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networksを読んだのでメモ.より良いbackbone networkであるEfficientNetを提案.感覚的に持ってたモデルの深さと幅,入力に関する解像度とモデルの精度間の関係をいくつか実験的に検証して面白かったのでまとめる.

Problem Formulation

まず問題の定式化から入る.あるi番目の畳み込み層の入出力関係を次のように定義する.

\displaystyle
Y_i=\mathcal{F}_i(X_i)

これを多層化した最終的なモデルは\mathcal{N}=\mathcal{F}_k\odot\dots\odot\mathcal{F}_1(X_1)=\odot_{j=1\dots k}\mathcal{F}_j(X_1)と表現する.あるベースラインモデルに対し,モデルの深さd,チャネル数w,入力の解像度rの3つを探索のパラメータとして次のような最適化問題を解くのが目標.

\displaystyle
\max_{Dow,r}Accuracy(\mathcal{N}(d,w,r))\\
s.t.\ \mathcal{N}(d,w,r)=\odot_{I=1\dots s}\hat{\mathcal{F}}_i^{d\cdot\hat{L_i}}\left(X_{\langle r\cdot\hat{H}_i,r\cdot\hat{W}_i,w\cdot\hat{C}_i\rangle}\right)\\
\ \ \mathrm{Memory}(\mathcal{N})\leq\text{target memory}\\
\ \ \mathrm{FLOPS}(\mathcal{N})\leq\text{target flops}

\hat{\mathcal{F}}などハットのついた変数は初期のベースラインモデルのパラメータを表す.

Scaling Dimensions

各変数とモデルのスケールアップの関係を考える.dはモデルの性能を上げる上では一般的に大きくすることを考えるが,深いモデルの学習には課題がつきまとう.また,batch norm等のテクニックで学習できたとしても性能向上という上ではある一定までしか恩恵がない.というのもResNetの実験においてResNet-101からResNet1000に変えたところで精度は(良くなっても)そこまで大きく向上しなかったという実例がある.

wに関しては,大きくすることでより詳細な特徴を得ることができるとともに学習が容易になるという研究報告がある.一方でwがとても大きくdが小さいモデルはより高次の特徴を得るのが難しいとされている.

rに関して,物体検出や単純な分類問題においても大きな値を使った方が精度向上が見込まれ,最近では224x224ではなく299x299や331x331,ImageNetのSoTAであるGPipeは480x480など高解像度化している.ただ単純に大きくしても精度がサチってただ計算コストが増すだけになるらしい.

上記の話で得られる知見としては,w,d,rを大きくすればモデルの精度は向上するが大きすぎると逆に精度を劣化させるということ.これらの内容を表す実験結果は論文中のFigure 3にあるので要参照.

Compound Scaling

基本的にw,d,rは独立ではない.つまりrを大きくした場合,その分dを大きくすることで受容野を広げ特徴を捕らえやすくなることが直感的に言える.そこでこの直感を検証するためwを固定でd,rの組み合わせを変えて実験を行なった.結果は論文中のFigure 4にあって直感通りの結果となった.この結果から,精度と効率を追求するためにはw,d,rのバランスを調整することが重要ということが言え,定式化された問題の妥当性が言える.

ちなみにw,d,rのバランスをとって良いモデルを作るという先行研究はすでにあったらしいがどれもマニュアルのチューニングとのこと.ここではw,d,rを一様にスケールする係数\phiを使った以下の新しいcompound scaling methodを提案する.

\displaystyle
\mathrm{depth}: d=\alpha^\phi\\
\mathrm{width}: w=\beta^\phi\\
\mathrm{resolution}: r=\gamma^\phi\\
s.t.\:\alpha\cdot\beta^2\cdot\gamma^2\approx 2\\
\alpha\geq 1,\beta\geq 1,\gamma\geq 1

\alpha,\beta,\gammaは定数でグリッドサーチで決定するとのこと.\phiは直感的には計算コスト等を考慮したユーザー依存の変数.ここで\alpha\cdot\beta^2\cdot\gamma^2\approx 2という条件は,モデルのFLOPSが(\alpha\cdot\beta^2\cdot\gamma^2)^\phiで計算されることから,\phiを変えた時のFLOPSを2^\phiで見積もれるようにするためとのこと.

EfficientNet Architecture

ここから本題.今回の探索方法ではモデルの1層の演算\hat{\mathcal{F}_i}の構成は不変なため,ベースラインの設計がかなり重要.そこで既存のneural architecture searchを使って精度と速度を最適化したベースラインを作ったとのこと.最適化のゴールはACC(m)\times [FLOPS(m)/T]^wで,ACC(m),FLOPS(m)がモデルの精度と速度,ww=-0.07のハイパーパラメータ,TはターゲットとなるFLOPS.結果できたのが論文のTable 1に記述されているEfficientNet-B0.主要なモジュールとしてMobileNet-v2等で使われているmobile inverted bottleneck MBConvが使われていることが特徴とのこと.

EfficientNet-B0からはじめて探索していく戦略として,(1)\phi=1に固定して\alpha,\beta,\gammaをグリッドサーチ,(2)\alpha,\beta,\gammaを固定して\phiを任意のスケールで変更という2ステップ.結果として\alpha=1.2,\beta=1.1,\gamma=1.15が得られ,\phiを変えてEfficientNet-B1からEfficientNet-B7まで作ったとのこと.

まとめ

初めてこういうタイプの問題設定の論文を読んだが意外と面白かった.あまりモデルを作り込む研究をしてこなかったのでbackbone modelは適当なベースラインと同じものを使ってたせいで,MBConvみたいに知らない構造があったり,最近は入力の解像度を大きしてるという話は発見だった.