yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2019] EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks #47

Open yoheikikuta opened 4 years ago

yoheikikuta commented 4 years ago

論文リンク

https://arxiv.org/abs/1905.11946

公開日(yyyy/mm/dd)

2019/05/28

概要

CNN において、resolution, depth, width の 3 つを固定した ratio で uniform にスケールする compound scaling を考案。それぞれ $ r, d, w $ としたときに $ r = γ^\phi, d = α^\phi, w = β^\phi $ というパラメトライズをして、この $ α, β, γ $ を定数にして $ \phi $ を大きくしていくことでスケールアップしていくという手法である。 NAS と合わせてパラメタ数が少なく accuracy も同等以上に高いモデルを構築することに成功した。以下の図のように、従来の手法よりもかなり優れたモデルが構築できるようになった。

実装は https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

yoheikikuta commented 4 years ago

最近あまり画像関連の論文を読んでいなかった。 EfficientNet は名前は聞いていたがどんなもんか把握してなかったので、さすがにこんだけ話題になっているのだから自分でちゃんと読んでおこう、ということで読むことにした。

図のインパクトがなかなかに凄いよね。

yoheikikuta commented 4 years ago

ResNet 等で depth 方向、WideResNet 等で width 方向、GPipe 等で resolution のスケーリングアップが有効であると示されてきた(depth のスケーリングアップは層の数を増やすこと、width のスケーリングアップとはチャンネル数を増やすこと、resolution のスケーリングアップとは入力画像のサイズを大きくすること)。

例えば、ResNet でそれぞれスケールアップすると、以下のように確かに性能が向上することが見て取れる。

確かに効いてはいるが、モデルが大きくなっていくにつれて性能向上度合いは鈍化している ということが見て取れる。

これらの要素は当然組み合わせることができるので、同じような実験でいくつかのスケールアップの組み合わせを試すと以下のような結果が得られたとのこと。以下の図では、各点では異なる width のスケーリングがなされていて、depth のスケーリングは d で resolution のスケーリングは r で表現されている(r = 1.3 なら画像入力が 1.3 倍になって、224×224 が 299×299 になる。有効数字がひどいが大目に見よう)。

この結果から分かるのは、depth と width と resolution のスケールアップは性能向上に効きやすい組み合わせが存在するということである。

yoheikikuta commented 4 years ago

論文ではスケールアップの部分の問題設定をちょろっと数式で定式化しているが、わざわざ書くほどのものでもないのでここでは割愛する。

重要なのは、これまでの観測に基づいて以下のようにスケールアップの戦略(compound scaling method)を定めたということである。

論文の本質的な内容はこれに尽きる。 resolution が大きくなったら合わせて depth と width もスケールアップするのが自然だよね、どういう風にスケールアップさせるかはそれぞれ定数を決めてあとは同じ factor $ \phi $ でべき乗することにしました、というもの。これは完全に経験則に基づくものだ。

$ α β^2 γ^2 $ がだいたい 2 という制約を置いているのは、FLOPS は雑に言って $ α β^2 γ^2 $ に比例する(モデルの width, height のアスペクト比は常に 1:1 としている)ので、スケールアップによる FLOPS が $ (α β^2 γ^2)^\phi = 2^\phi $ という風に近似できて扱いやすいためである。

あとは NAS でベースのネットワークを定めて、提案手法でスケーリングアップを試してみたらめちゃくちゃ性能が良かった、という話だ。 NAS が出てきてからだいぶそういう傾向はあったが、画像認識のモデルは building block はだいたい出揃っているのでそれらをいかに上手く組み合わせるかという感じで収束している感がある。 著者が二人とも NAS とかにも精通しているので、そういった知見を生かして決定版のモデルを作ったぞ、という感じなんだろう。

yoheikikuta commented 4 years ago

スケールアップのベースとなるネットワークは Mnas の論文 と同様の search space で、accuracy × (FLOPS / const)^ω という感じの目的関数を最適化するように求めているとのこと。あまり詳しく追ってないが、FLOPS の方はいくらか手でスケーリングを加えた上で accuracy と FLOPS のバランスを求めていることになっているはず。

このようにして求まったベースのモデルが EfficientNet-B0 で、以下のようなアーキテクチャになっている。 MBConv は MobileNet V2 で使われている inverted bottleneck である。昔どっかで発表した時の資料の この辺 を思い出すなどする。

これで準備は整ったのでスケールアップの実験をしていく。 手順としては以下。

yoheikikuta commented 4 years ago

まずは MobileNet {V1, V2} と ResNet-50 に適用した結果。 確かに同程度の FLOPS であれば単一のスケールアップの場合と比べると性能が良くなっている。

yoheikikuta commented 4 years ago

スケールアップした結果が以下。φ の具体的な数字が書いてないが FLOPS からだいたい察しろということなのかもしれない。結果としては、accuracy が高いというよりかは同じような accuracy でパラメタ数や FLOPS 数がかなり小さくなっているというものである。

GPipe が出た時にも思ったけど、ImageNet の top-5 acc が 97% ってのは来るとこまで来た感じもあるよなぁ。

yoheikikuta commented 4 years ago

冒頭の model size vs. accuracy と同様に、FLOPS vs. accuracy を描いたものが以下。 大まかな傾向は変わらず。

yoheikikuta commented 4 years ago

transfer learning をしてもやはり、優秀ということも実験している。 プロット見辛いなぁ...

yoheikikuta commented 4 years ago

ここまでは提案手法がパラメタ数や accuracy という観点で確かに実験的に良い結果を示したというものだった。これまでの知見に基づいてモデル構築の良さそうな組み合わせを見つけました、という以上には特に感想もないかなぁと思っていた。

しかし、最後に見せている class activation map の結果はちょっと興味深い。 提案手法では class activation map が正しく物体の画像とリンクしているという結果になっている。ただ accuracy が異なるモデルでの比較なので性能が同じくらいの別モデルでの比較も見たい気はする。

yoheikikuta commented 4 years ago

ということで一通り読んだ。 画像認識モデルの最新版ということでキャッチアップできたのは良かったが、単純な画像認識のモデルアーキテクチャはだいぶ収束してきたという感じで純粋な面白さはそんなになかったかな。

まだ試しにちょろっと触ったという程度なので、どこかで画像認識系のタスクをするときに遭遇したらちゃんと使っていこう。