【論文読み】EfficientNet
Kaggleの画像コンペで多用されているEfficientNetについて、中身を知らずに使うのもどうかと思って元の論文を読んでみたので、理解したことをまとめてみる。
EfficientNetとは?
従来のCNNにおいては、次の3点の中から1点を選んでモデルをスケールアップさせることが、精度を向上させるための主な施策であった。
- ネットワークの層
- ネットワークの幅(Channel数)
- 入力画像の解像度
もちろん過去にも、上記の中から2点以上を選んでモデルをスケールアップさせる試みも行われていなかったわけではない。 しかし2点以上を選んでモデルをスケールアップしようとすると、選択自由度が増える分探索空間が広くなるため、チューニングに手間がかかる問題があった。
論文ではこの問題に対して、CNNにおいてモデルをスケールアップする方式 Compound Model Scaling を提案している。 Compound Model Scalingでは、先の3点についてGrid Searchによりスケーリング係数を決め、モデルをスケールアップするための関係式を提供する。 モデルをスケールアウトする際にこの関係式を利用することで、チューニングの手間を省きつつ限られた計算資源の中で精度のよいモデルを学習できる。 もちろん環境ごとにチューニングしてスケーリング係数を決めればよりよい精度を持つモデルを作れるが、本論文はチューニングの手間を削減しつつ精度のよいモデルを作ることが目的であることに注意したい。
Compound Model Scalingは、探索したスケーリング係数をもとにBaseline Modelをスケールアップすることであるため、Baseline Modelの選択も重要である。 従来のCNN(ResNetやMobileNet)をBaseline Modelとし、Compound Model Scalingを適用しても精度の改善はみられた。 しかし本論文では、新たに設計した EfficientNet をBaseline Modelとして採用している。
EfficientNetをBaseline Modelに採用し、Compound Model Scalingを適用したモデルEfficientNet-B7では、ImageNetにおいてTop1で84.4%、Top5で97.1%の精度となりSOTAを達成した。 また、最高性能を誇っていたCNN(GPipe)と比較してパラメータ数が8.4倍程度少なく、推論では6.1倍高速であった。
EfficientNetの実装
- TensorFlow実装(論文に記載の実装)
- PyTorch実装
関連研究
CNNの精度
AlexNetが2012年にImageNetのコンペで優勝したあとのCNNの変遷を見ると、高い精度を得るためにパラメータ数を増やす傾向が見られる。 GPipeはImageNetにおいて最高精度84.3%を達成したモデルであるが、その反面5.57億と非常に多くのパラメータ数を持つため、モデル並列による学習が必須となっていた。 もちろん精度の向上は依然として重要だが、パラメータ数の増加によりメモリに収まらない問題が大きくなってきた。
CNNの効率
画像認識がモバイルデバイスでも利用されるようになると、効率的に画像処理のタスクをこなすモデルが必要になってきた。 モデル圧縮などの手法が適用されることに加えて、MobileNetなどのモバイル向けに効率化されたCNNが考案された。 また、NAS(Neural Network Search)の登場により、効率的なCNNを探索することがモバイルデバイス向けのモデル設計で注目されてきた。 一方でモバイルデバイス向けではない大きいモデルでは、探索空間が広くチューニングコストも大きいことからNASの適用は一般的ではなかった。
モデルのスケーリング
従来のCNNでもモデルをスケールアップする取り組みが行われている。 ResNetはネットワークの層の深さを調整することでモデルをスケールアップする一方、MobileNetはネットワークの幅を調整することでスケールアップする方式を採用している。 また一般的に入力画像サイズを大きくすると、演算量が増えるとともに精度も向上することもわかっている。
Compound Model Scaling
限られた計算資源(メモリや演算量)の中で精度を最大にするCNNを探索するためには、次の最適化問題を解くことと同じと言える。
: ネットワーク
: 演算
: Baseline Modelで定義したネットワークの層数
: Baseline Modelに入力されるShapeが である入力テンソル
: ネットワークの層数
: ネットワークの幅(Channel数)
: 入力画像の解像度
各スケーリングパラメータの考察
- ネットワークの層数
- CNNにおいてネットワークの層を増やすことは、より複雑な特徴量を捉えることができて汎化性能の向上につながる一方で、勾配消失問題が発生しやすくなる
- 勾配消失問題を解消するため、ResNetのSkip ConnectionやBatch Normlizationなどの手法が提案されている
- ネットワークの幅
- ネットワークの幅を広げることでより細かい特徴を捉えられ、より学習がうまくいくようになる
- ネットワークの幅が広くてネットワークの層数が少ない場合は、複雑な特徴を捉えきれないという問題がある
- 入力画像の解像度
- 入力画像の解像度を高めることで、より細かい特徴を捉えることができる
いずれのスケーリングパラメータについてもパラメータを増加させることで精度は向上するが、パラメータ増加に伴って精度の向上速度が鈍化する傾向が見られた。
また、これらのスケーリングパラメータは相互に関連しているものである。 例えば、大きな画像を扱う場合はネットワークの層と幅のスケーリング量も大きくする必要がある。 実際にスケーリングパラメータ1つだけを固定してモデルをスケールアップさせるよりも、バランスよく各スケーリングパラメータを調整してモデルをスケールアップしたほうが精度が良くなる傾向が見られた。
Compound Model Scalingの導入
ここまでの議論で、各スケーリングパラメータをバランスよくスケーリングすることが重要だとわかった。 そこで本論文では、各スケーリングパラメータを程よい具合にスケールアップさせるための式を提案した。 これを、Compound Model Scalingと呼んでいる。
はユーザが指定するスケーリング係数、 はそれぞれBaseline Modelにおける「ネットワークの層数」「ネットワークの幅」「入力画像の解像度」である。 制約条件において が2乗されているのは、畳み込み演算が主となるCNNにおいて「ネットワークの幅」と「入力画像の解像度」が演算量に2乗のオーダーで効いてくるためである。
EfficientNet
Compound Model Scalingの効果を正しく評価するためには、Baseline Modelの選択が重要である。 本論文ではEfficientNetと呼ばれる新たなモデルを設計し、Baseline Modelとして採用した。
EfficientNetは、NASを利用して精度と演算量を目的関数に設定し、最適化して設計した。 最適化の目的関数は、モデル 、目的演算量 、精度と演算量を調整するハイパーパラメータ として、次のように設定した。
NASによって最適化されたネットワークをEfficientNet-B0と名付けた。 EfficientNet-B0は、MobileNetV2 で導入されたMobile Inverted Bottleneckを複数段重ねた構成となっている。 Mobile Inverted Bottleneckでは、SENet によるSE Blockも導入している。
なお、Grid Searchによってスケーリング係数 が得られた。 EfficientNet-B0のスケーリング係数を固定した状態で の値を変更してBaseline Modelをスケールアップさせ、EfficientNet-B1からEfficientNet-B7までを得た。
実験
Baseline ModelにMobileNetやResNetを利用しCompound Model Scalingを適用すると、従来のように1点(例えばネットワークの深さのみ)を選んでモデルをスケールアップしたときと比較して高い精度が得られることが確認できた。 これは、Compound Model Scalingが一般的なCNNに対しても有効であることを裏付けている。
EfficientNetの学習は次の条件のもとで行い、EfficientNet-B7ではTop1で84.4%、Top5で97.1%の精度を達成した。
- Optimizer: RMSProp (Decay 0.9, Momentum 0.9)
- Batch Normalization: Momentum 0.99
- Dropout: に比例して増加(EfficientNet-B0は0.2、EfficientNet-B7は0.5)
- Weight Decay: 1e-5
- Learning Rate: 初期 0.256, 2.4 epoch毎に0.97減衰
- Swish Activation
- Fixed AutoAugument Policy
- Stochastic Depth: Survival Probability 0.8
EfficientNet-B7のパラメータ数は66M、計算量は37BFLOPSである。 過去に最高精度を達成したGPipeよりも8.4倍パラメータが少なく、かつ精度が優れている。 これらのことから、EfficientNetはパラメータ数と計算量が他のCNNよりも小さいにもかかわらず、精度がよいモデルであると言える。 転移学習においてもEfficientNetは、他のCNNを超える精度を達成している。
考察
EfficientNetにCompound Model Scalingを適用してモデルをスケールアップした場合、従来のように1点(例えばネットワークの深さのみ)を選んでモデルをスケールアップしたときと比較すると、ImageNetのTop-1について2.5%の精度向上が見られた。 このことから、精度向上にCompound Model Scalingが効果的であることがわかる。
Class Activation Map を見てみると、Compound Model Scalingを適用してスケールアップしたモデルは、きちんと関連する領域に焦点を当ててオブジェクトの詳細な特徴まで捉えられていることがわかる。 一方で従来のスケールアップ方式では、オブジェクトの詳細まで捉えられていない、もしくはオブジェクトの全体を捉えられていないことがわかる。
【2020.12.11 追記】
MNISTのデータセットを使って、PyTorchにてPre-trainモデルからEfficientNetを学習するソースコードを KaggleのNotebook として公開した。 Notebookの最後では学習済みのEfficientNetのモデルを使用し、手書き数字の画像が正しく分類できていることも示している。