EfficientNet はどれほど効率的なのか?
本記事では、Weights & Biases を用いて、より小規模な ImageNet 風データセットにおける EfficientNet ファミリーの評価を行います。この記事は翻訳版です。誤訳などがあればコメント欄でお知らせください。
Created on August 26|Last edited on August 26
Comment

さて、対象が 1,400 万枚の画像からなるデータセットであることを考えると、あなたの直近の家族旅行で撮った写真よりはだいぶ多いはずだし、「Efficient(効率的)」という看板は話半分に受け取っておくべきかもしれない。とはいえ EfficientNet ファミリーの特筆すべき点は、計算コストが同程度の他のアーキテクチャに対して容易に優れた性能を示すところにある。
本記事では、EfficientNet ファミリーを支える中核原理について解説します。主に、複合スケーリングと呼ばれる手法を取り上げます。これは、利用可能(もしくは今後確保)できる計算資源に合わせて、ニューラルネットワークを効率的にスケールさせるための技法です。
また、現実世界をよりよく反映し、ImageNet よりはるかに小規模なデータセットで、各種 EfficientNet のスケールを試した結果も示します。結果はインタラクティブに可視化でき、この投稿のタイトルが投げかける問い――EfficientNet はどれほど効率的か?――にも自分で答えを見いだせるはずです。
始めましょう。
目次
畳み込みネットワークのスケーリングResNet と WideResNet によるモデルの深さと幅のスケーリングProGAN におけるプログレッシブ・リサイズによるモデル解像度のスケーリングアーキテクチャのスケーリングによる収穫逓減複合スケーリングEfficientNet のアーキテクチャそれほど効率的ではないネットワーク大きな問題結論
畳み込みネットワークのスケーリング
EfficientNet の論文が最初に指摘するのは、ニューラルネットのスケーリング自体は多くの人が常に行っているものの、従来、どのようにスケールさせるかを決める方法は、コインを投げたりサイコロを振ったり、はてはカエルの足を捧げて炎の中の啓示を待つのと大差ない精度しかない、という点です。

具体的には、ネットワークを強化する主な方法が三つあると指摘しています。深さ、幅、解像度。
- 深さとは、ネットワークに含まれる層の数のことです。いわゆる「ディープ」ラーニングをディープたらしめている要素ですね…。
- 幅とは、各畳み込み層が使用するチャネル数(好みによってはフィルタ/カーネル)を指します。PyTorch では、これは out_channels Conv2d 層の引数です。
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
torchvision.transforms.Resize(size, interpolation=2)
ある程度までは、これは分類(つまり ImageNet)に焦点を当てた畳み込みネットワークを用いるコンピュー���ビジョン特有の話です。ただし、一般的な発想自体は他のアーキテクチャや領域にも応用可能です。
ここで気づくのは、これらの要素はいずれも非常に簡単に変更できるという点です。場合によっては、引数をひとつ指定するだけで済みます。しかし実際のところ、どれもモデルの性能にかなり大きな影響を及ぼし得ます。
そしてもちろん、モデルをスケーリングするためのこれらのハイパーパラメータは、個別にはすでに相当徹底的に検討されています。
ResNet と WideResNet によるモデルの深さと幅のスケーリング
ResNet はその典型的な例です。ResNet の発想の大きな部分は、ネットワークの層数をどこまで増やせるかを探ることにありました。一般論としては、層を増やすほど性能が向上する傾向があるようです(ただし、この主張を検証した研究は多数あり、大きな但し書きが付きます)。
もうひとつ、やや知名度は劣りますが WideResNet というアーキテクチャがあります。名前から想像できるとおり、幅方向にスケーリングした ResNet(つまり Conv 層のチャネル数を増やした ResNet)です。これが有効なのは、パラメータ数が増えるという分かりやすい理由だけでなく、基盤となる畳み込みの CUDA カーネルが複数のフィルタ間で並列化するように書かれているためという利点もあるからです。
つまり、チャネル数を減らした場合とほぼ同じ速度で、より良い性能が得られるというわけです。
ProGAN におけるプログレッシブ・リサイズによるモデル解像度のスケーリング
画像サイズという概念自体はあまりに単純で、特定のモデルや論文を指し示すべきものではありません。直感的には、画像のサイズや解像度を上げれば、ネットワークに与えられる情報量が増えます。入力情報が増えることでモデルはより良い予測ができるようになりますが、その分だけ計算量が増えるのは言うまでもありません。
近年では、プログレッシブ・リサイズがコンピュータビジョンの各種タスクでかなり一般的な手法になりつつあります。私の知る限り、これが効果的に最初に用いられたのは NVIDIA の ProGAN 学習の進行に合わせて画像サイズを段階的に大きくしていくモデルです。念のために言っておくと、EfficientNet と複合スケーリングはプログレッシブ・リサイズとは無関係ですが、指摘しておく価値があると思いました。
アーキテクチャのスケーリングによる収穫逓減
さて、深さ・幅・解像度をそれぞれ個別に増やしていけば、ネットワークの性能は確かに向上します。とはいえ、古い言い回しのとおり、良いことにもいずれ終わりが来るのです。
ある時点を過ぎると、深さ・幅・解像度を増やして得られる性能向上は頭打ちになります。しかも、これらの次元でスケーリングするたびに計算コストが増えることを考えると、ある閾値を超えた先では割に合わなくなります。
ここで、その考え方を示す EfficientNet 論文のプロットを見てみましょう。

この3つのプロットは、ImageNet の Top-1 精度で測ったモデル性能が、幅(左)、深さ(中央)、解像度(右)をスケールしたときにどのように変化するかを示しています。いずれも当初は性能が向上しますが、やがて伸びが頭打ちになります。
しかし、あのプロットを並べてしばらく眺めていると、ネットワークをスケールするにはもっと良い方法があることに気づきます——3つの主要なスケーリング要素のうちどれか1つだけを大きく増やすのではなく、幅・深さ・解像度をそれぞれ同程度にスケールすればよいのです。
これは、各ハイパーパラメータを少しずつ(やり過ぎない程度に)スケールすると、大きな性能向上が見込める領域に沿って前進できるため、全体として頭打ちに達するまでの時間を長くできるからです。
最初は「ふーん、まあ、動くには動くんだろうね」という程度に見えるかもしれませんが、よく考えてみると、このバランスの取れたスケーリングという発想は実に深いものです。
こう言い換えましょう。今日のディープラーニングの多くは、突き詰めればモデルのどこに計算資源を割り当てるかという問題に帰着します。ここでは、計算資源を FLOPs(浮動小数点演算回数)とネットワークのパラメータ数で測ることにします。
FLOPs の数は計算量を直接測る指標であり、標準的なツールで算出できます。ご存じのとおり、パラメータ数を増やすことは、どんな方法であれタダではありません。だからこそ、脳内で思いつく限り最大の層数に単純に設定したりはしないのです。

つまり、EfficientNet 論文の著者たちが本当に答えようとしている問いは、こういうことです——ネットワークに追加できる FLOPs/パラメータの予算が x あるとして、最も高い性能が得られるようにそれをどう配分・拡張すればよいのか?
彼らが導き出した答えは、複合スケーリングのためのアルゴリズムです。
ただしその前に、深さ・幅・解像度を具体的にどのようにスケールするのかを厳密に定義する必要があります。著者らはこれを、w、d、r の3つの数で表しています。
まずベースラインのネットワーク(たとえば入力が 224×224 の ResNet18)を用意します。デフォルトのネットワークでは、最初は 3 つの数 w, d, r はすべて 1 になります。ここで、層数を 36 に増やす(つまり層数を 2 倍にする)と、これは d=2 に相当します。同様に、たとえば w を 3 に増やすというのは、各畳み込み層のフィルタ数を 3 倍にすることを意味します。解像度についても考え方は同様です。r=1.5 と設定すれば、入力画像サイズは 336×336(224×1.5=336)に変更することになります。
このシンプルな約束事は、EfficientNet 論文が導入した複合スケーリング手法をこれから詳しく説明するうえで非常に役に立ちます。具体的な解説はこのあとすぐ行います。
ちなみに、EfficientNet には物体検出向けのバージョンもあるって話、しましたっけ?
名前は(個人的にはかなり笑ってしまうのですが)EfficientDet です(わかりますよね、「Det」は detection の略)。
よし、ここまで引き延ばしてお約束を果たしたところで、本題の複合スケーリングに進みましょう!
複合スケーリング
次に必要なのは、先ほど触れた 3 つの数(w、d、r)をどう設定するか、その方法です(私のように注意力が金魚並みの人のために念のためもう一度)。
EfficientNet が推奨する方法は次のとおりです。
上の式では、は、各次元をどの程度スケーリングするかを表す定数で、そしては、追加で使用できる計算資源の量を表す変数です。
なんてややこしいんだ!そこまで複雑にする必要ある?べき乗だの指数だの、どうしてそんな回りくどいことをするの?これはもっと単純なアイデアのはずじゃなかったの?
では、注意して読んでください。これからこの文章を読んでいる人のうち2%の思考を吹き飛ばす話をします。
ConvNet で最も一般的な演算は何でしょう?そのとおり、畳み込みです。FLOPs の観点では、畳み込みの計算コストは深さ d に対しては線形に、幅 w と解像度 r に対しては二次的に増加します。つまり、深さを 2 倍にすると計算コストも 2 倍になり、幅または解像度を 2 倍にすると計算コストは 4 倍になる、ということです。
以上を踏まえると、数式をまとめれば、パラメータを用いて畳み込みネットワークをスケーリングするというのは、つまりこういう意味になります。これらの規則を適用すると、新しいネットワークの計算コストはおおよそこれにより、計算コストを明確に測定し、それに応じてネットワークをスケーリングするためのすっきりした方法が得られます。
もしここまでの数式がよく飲み込めなかったとしても、直感的には、…を設定するとを 0 に設定するとベースラインモデルになります。設定するとを 1 に設定すると、元のモデルに比べて総容量がおおよそ2倍、計算コストもおおよそ2倍のモデルになります。設定するとを 2 に設定すると、2 番目のモデルに比べて総容量がおおよそ 2 倍、計算コストもその第 2 版のおおよそ 2 倍のモデルになります。以降も同様です。
この複合スケーリングを別の見方で捉えるなら、各スケーリング段ごとにネットワークの深さ・幅・解像度をそれぞれある一定の倍率(たとえば 1.5)で掛けていく操作だと考えられます。この見方では、はスケーリング処理における反復回数(インデックス)を表します。つまり、 を設定するとは、ネットワークを 5 回スケーリングした結果になります。
いいですね。ただし、ひとつ小さな問題に気づいたかもしれません——あのスケーリング定数(論文では α、β、γ と呼ばれています)をどうやって設定すればよいのでしょうか。
論文では、少数の候補値を試してうまくいく組み合わせを探る小規模なグリッドサーチを用いることが提案されています。
参考までに、EfficientNet アーキテクチャ(このあと詳しく扱います)で実験を走らせて得られた具体的な値は、次のとおりです。。
完璧です!これで私たちはもう分かりました。正確に厳密な意味でのネットワークのスケーリング方法です。ですが、私たちがまだ触れていない EfficientNet 論文のもうひとつの重要な要素があります——そう、EfficientNet そのものです。
EfficientNet のアーキテクチャ
ここまでの核心はモデルのスケーリングです。ですが、その前提として、まずはスケーリングの恩恵を十分に引き出せる良い初期モデルが手元にあることが必要です。
この文脈での「良いモデル」とは、スケーリングの基準となる総 FLOPs を最小化しつつ高い性能を達成できるモデルのことです。
そこで著者らは(今回はスケーリング系列の中で最小のネットワークだけを探せばよいので、それほど悪くない選択だと思いますが)アーキテクチャ探索を用い、次のような構成にたどり着きます。

MBConv に馴染みがなければ、これは MobileNetV2 で導入された層のことです。ほかに言えることはあまりありませんが、要するにアーキテクチャ探索で得られたモデルで、ちゃんと動くということです。
次は?スケーリングだ!
ベースラインのネットワークはこう呼ばれます EfficientNetb0最初のスケール版で、おおよそ容量が2倍のものは EfficientNet-B1 と呼ばれ、同様に7倍のものもあります。
どれくらいうまくいくのでしょうか? 論文には、まさにこの疑問に答える非常に見やすい表が載っています。ImageNet での最先端の結果や、同等の性能を示すネットワークとの比較で桁違いの改善が得られていることなど、結果が雄弁に物語っています。

それほど効率的ではないネットワーク
Run set
42
大きな問題
さて、これで各 EfficientNet の計算コストがおおよそどの程度かは把握できたはずです。
しかし、最も厄介な疑問にはまだ答えていません。なぜ複合スケーリングはうまく機能しなかったのでしょうか。
具体的には、たとえ精度が上がらなかったとしても、少なくともモデル間で一貫した性能は見られるはずでした。では、なぜ大きいモデルほど成績が悪くなったのでしょうか。考えられる理由をいくつか挙げます。
- ハイパーパラメータ:同じハイパーパラメータがすべてのモデルに適用できないことはよく知られています。もし可能なら、誰もが学習率やバッチサイズなどの「全球的に最適」な値だけを使えばよいはずです。より大きなモデルは、良好な性能を出すために、より高い/低い学習率を必要とする場合があるかもしれません。
- 過剰パラメータ化:私たちが使用した中で最大の EfficientNet、EfficientNet-B7 は 6000 万以上のパラメータを持ちます。ImageNette のような小規模データセットには多すぎるため、より大きなモデルは必要以上にパラメータを抱えていた可能性が高いでしょう。
- 正則化:過剰パラメータ化の問題を抑えるのにはおそらく有効だったでしょう。ただし、大きなモデルにだけ正則化を追加すると、公平な比較ではなくなってしまいます。
結論
おめでとうございます。これで、ネットワークを体系的にスケールする方法と、そのベストプラクティスを標準で実装した最先端モデル群という、2 つの強力な武器を手に入れました。
また、より小さなデータセットで EfficientNet モデルを試した結果も検証し、EfficientNet が主張する FLOPs 削減が実際に壁時計時間の短縮につながるかどうかを確認しました。
たとえ今後のディープラーニングのキャリアで EfficientNet を使わないと決めたとしても、もっと価値のある教訓を得られたはずです——最先端の結果が巨大でメモリを食うゴリアテのようなモデル群(大規模 GPU アレイという鎧をまとった巨人)に席巻されがちなこの分野でも、軽やかな革の投石紐と、小粒でも効く訓練テクニックを袋いっぱいに携えた若き羊飼いダビデの居場所は依然としてあり、不可能と思われていたことを成し遂げ得る、ということです。
もしかしたら、たまには少しだけ……効率的であることが報われるのかもしれません。
Add a comment
This is a pleasant read, however too general to be useful. There is no description of MBConv. and the main idea of EfficientNet which is to use different filter sizes. After reading the article, I still do not really know what EfficientNet is.
Reply