How Efficient Is EfficientNet?
この記事では、Weights & Biases を使って、より小規模な ImageNet に似たデータセット上で EfficientNet ファミリを評価します。これはこの記事の翻訳版です。誤訳があればコメント欄でお知らせください。
Created on August 26|Last edited on August 26
Comment

さて、扱っているデータセットが1,400万枚もの画像を含むことを考えると(おそらく最後の家族旅行で撮った枚数よりは多いでしょう)、"Efficient" の呼び名はやや大げさに受け取って構いません。しかし EfficientNet ファミリが特別なのは、同程度の計算コストで他のアーキテクチャを簡単に上回る性能を発揮する点です。
この記事では、EfficientNetファミリを支える基本原則について説明します。主に、compound scaling(複合スケーリング)と呼ばれる手法を取り上げます。これは、手元にある、あるいは増やせる計算資源に合わせてニューラルネットワークを効率的に拡張するための技術です。
また、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 です。パラメータ数が増えるという明白な理由だけでなく、基盤となる畳み込みの CUDA カーネルが複数のフィルタに対して並列化するよう最適化されているため、これもまた効果的です。
チャネル数を減らした場合とほぼ同じ速度で、より良い性能が得られます。
ProGAN における漸進的な画像リサイズによる解像度のスケーリング
画像サイズは非常に単純な概念で、特定のモデルや論文を挙げるほどの独自の発想ではありません。直感的には、画像のサイズや解像度を大きくすることでネットワークに与えられる情報量が増えます。より多くの入力情報を用いることでモデルはより良い予測が可能になりますが、もちろん計算量が増えるという代償があります。
近年、漸進的リサイズはコンピュータビジョンの様々なタスクでかなり一般的な手法になりつつあります。私が知る限り、これを最初に効果的に用いたのはNVIDIAの研究です。 ProGAN モデルでは、訓練が進むにつれて段階的に画像サイズを大きくしていきます。念のため述べると、EfficientNet と compound scaling は漸進的リサイズとは無関係ですが、それでも指摘しておく価値があると思いました。
アーキテクチャをスケールさせた際の収益逓減
個別に見れば、深さ・幅・解像度を増やせば確かにネットワークは改善します。しかし古いことわざにあるように、良いこともいつかは終わりを迎えます。
ある時点で、深さ・幅・解像度を増やすことで得られる性能向上は頭打ちになります。そしてこれらの次元を拡大することに伴う計算コストを考えると、ある閾値を超えた後はそれ以上続ける価値がほとんどありません。
こちらは、この考え方を強調したEfficientNet論文中の図をご覧ください。

3つのプロットは、ImageNet 上の Top‑1 正解率で測ったモデルの性能が、幅(左)、深さ(中央)、解像度(右)をスケールさせるとどう変化するかを示しています。いずれも当初は性能が向上しますが、次第に頭打ちになります。
しかし、それらのプロットを並べてしばらく眺めると、より優れたネットワークのスケーリング方法があることに気づきます。3つの主要なスケーリングパラメータのうちどれか一つだけを大きく増やすのではなく、幅・深さ・解像度を同等にスケールさせるのです。
これは、各ハイパーパラメータを少しずつ(ただし過度にならない程度に)スケールすると、性能が大きく向上する領域を効果的に辿ることになり、結果として性能の頭打ちに到達するまでにより長い時間がかかる、という理由で成り立ちます。
一見すると「ふーん、まあそんなもんか」といった反応になりそうですが、よく考えてみると、この均等なスケーリングの考え方は非常に深い意味を持っています。
こう言い換えましょう。今日の多くのディープラーニングは、モデル内で計算資源をどこに割り当てるかに帰着します。ここでは「計算資源」を FLOPs(浮動小数点演算回数)とモデルのパラメータ数で測定します。
FLOPs の数は、標準的なツールを用いて算出できる計算量の直接的な指標です。またご存知の通り、パラメータ数を増やすことは方法を問わず無償ではありません。だからこそ、単に思いつく限り層を増やせばよい、というわけにはいかないのです。

では、EfficientNet 論文の著者たちが本当に答えようとしている問いは、次のようなものです──与えられた予算でネットワークに x だけの FLOPs/パラメータを追加できるとしたら、どのように割り当てれば最も良い性能が得られるでしょうか?
彼らが導き出した答えは、コンパウンドスケーリングのためのアルゴリズムです。
まず最初に、深さ(depth)、幅(width)、解像度(resolution)をどのようにスケールするかを厳密に定義する必要があります。著者たちはこれを、3つの数値 w、d、r を使って説明しています。
まず基準となるネットワークを用意します。例えば入力が224×224の画像を受け取る ResNet18 を考えます。デフォルトのネットワークでは、深さ・幅・解像度を表す3つの数値はすべて最初は1です。ここで層数を36に増やす(つまり層数を2倍にする)とします。これは d=2 に相当します。同様に w を3に増やすと、各畳み込み層でフィルタ数を3倍にすることを意味します。解像度も同様の考え方です。例えば r=1.5 と設定すると入力画像サイズが224×1.5=336、すなわち336×336に変わることに相当します。
この単純な慣例は、EfficientNet 論文が導入する正確なコンパウンドスケーリング手法を説明する際に非常に役立ちます。ちょうど今から三行後にその手法を詳しく述べます。
あ、ちなみに、EfficientNet の物体検出向けバージョンがあるって話、しましたっけ?
私にはちょっと笑ってしまう名前ですが、EfficientDet(わかりますか?「Det」は detection の略です)と呼ばれています。
さて、ここまでで約束を守るために時間を稼ぎつつ話をつないでいただけなので、本題のコンパウンドスケーリングに移ります。
コンパウンドスケーリング
今必要なのは、先ほど話した3つの数値(w、d、r。私のように注意力が短い人のために念のため書いておくと)をどのように設定するかという方法です。
EfficientNet が推奨する手法は次のとおりです:
上の式では、それぞれの定数は、各次元をどれだけスケールするかを表しています。は、利用可能な追加の計算リソースの量を表す変数です。
うわ、なんだか不必要にややこしいですね。どうしてべき乗や指数の話まで出てくるんでしょう?もっと単純なアイデアのはずではなかったですか。
よく聞いてください。この記事を読んでいる人のうち約2%の人の常識がこれからひっくり返ります。
畳み込みニューラルネットワークで最もよく使われる演算は何でしょうか?その通り、畳み込みです。FLOPs の観点から見ると、畳み込みの計算コストは深さ d に対しては線形に増加しますが、幅 w と解像度 r に対しては二乗で増加します。つまり、深さを2倍にすれば計算量は2倍になりますが、幅や解像度を2倍にすると計算量は4倍になるということです。
数式をまとめると、畳み込みネットワークをパラメータでスケーリングするということは、この規則を適用すると、新しいネットワークの計算コストはおおよそとなります、これによってコストを明確に測定し、それに応じてネットワークをスケーリングするための簡潔な方法が得られます。
もしここまでの数式が難しかったら、直感的には、設定を0 に設定するとベースラインモデルになります。設定するとを1に設定すると、元のモデルに比べて計算コストがおおよそ2倍になり、モデルの総合的な容量(表現力)もおおよそ2倍になるモデルが得られます。を2にすると、計算コストがおおよそ2倍になり、全体的な表現力(容量)も二番目のモデルに比べておおよそ2倍になるモデルが得られます。そして同様に…
この複合スケーリングの見方のもう一つは、ネットワークの深さ・幅・解像度をスケーリングの各段階でそれぞれ一定の倍率(例えば1.5倍)で乗算していくものだと考えることです。はスケーリング手順の反復インデックスを表します。つまり、を設定するとネットワークを5回スケーリングした結果になります。
いいですね。ただひとつ小さな問題に気づいたかもしれません──では、これらのスケーリング定数(論文ではα、β、γと呼ばれているもの)はどうやって決めればよいのでしょうか?
論文では、著者らは小さなグリッドサーチ(いくつかの候補値を試してどれが有効かを確認すること)を行うことを提案しています。
もし興味があるなら、彼らが EfficientNet アーキテクチャで実験を行って得た具体的な数値(これについては後で詳しく説明します)は。
完璧です!これで分かりました正確にネットワークを厳密にどのようにスケーリングするか、という話です。しかし、ここでまだ触れていない非常に重要な点がもう一つあります──それはまさに EfficientNet 本体です!
EfficientNet アーキテクチャ
ここまでの話の要点はモデルのスケーリングです。しかしこれは、そもそもスケーリングを活かせる優れた初期モデルが存在することを前提としています。
この文脈での「良いモデル」とは、我々が基準にしてスケーリングを行うのが総FLOPsであるため、総FLOPsを最小限に抑えつつ高い性能を発揮できるモデルを指します。
彼らは可能だからという理由でアーキテクチャ検索を行います(この場合、スケーリング系列の中で最も小さいネットワークを見つけようとしているだけなので、それほど悪くないと思われます)そして、次のような構成を見つけ出します。

MBConv は、馴染みがなければ MobileNetV2 で導入された層です。それ以外に言えることはあまりありません。アーキテクチャ検索で見つかったモデルで、実際に性能が出ます。
次は何か?スケーリングです!
ベースラインとなるネットワークは、次の名で呼ばれます EfficientNetb0ベースとなる最初のスケール版で、容量がおよそ2倍になったものは EfficientNetb1 と呼ばれ、それがさらに7段階存在します。
どれほど効果があるのか?論文にはまさにその答えを示す非常に優れた表があります。ImageNetでの最先端性能や、同等の性能を持つ他のネットワークと比べて桁違いの改善を示す結果が含まれているので、そのまま結果をご覧ください。

それほど効率的でないネットワーク
Run set
42
見過ごされがちな問題
さて、これでおそらく各種 EfficientNet の計算コストがおおよそ把握できたはずです。
しかし、それでも最も不穏な疑問にはまだ答えていません:なぜコンパウンドスケーリングはうまくいかなかったのか?
具体的には、精度が上がらなくとも、少なくともモデル間で一貫した性能が見られるはずでした。では、なぜ大きいモデルの方が性能が悪くなったのでしょうか?考えられる理由をいくつか挙げます:
- ハイパーパラメータ:同じハイパーパラメータがすべてのモデルで通用するわけではないことはよく知られています。そうでなければ誰もがグローバルに「最適な」学習率やバッチサイズなどを使うだけでしょう。大きなモデルほど良い性能を出すために学習率を高くする/低くするなど、異なる設定が必要になる可能性があります。
- 過学習(パラメータ過剰):私たちが使用した最大の EfficientNet である EfficientNetb7 は6,000万を超えるパラメータを持ちます。ImageNette のような小さなデータセットにとってそれは非常に多く、より大きなモデルは必要以上に多くのパラメータを持っていた可能性が高いです。
- 正則化:過剰パラメータ問題の抑制にはおそらく有効だったでしょう。ただし正則化を大きなモデルにだけ適用すると不公平な比較になってしまいます。
結論
おめでとうございます。これで、ネットワークを体系的にスケールする方法と、その最良の手法を標準で実装した最先端モデル群という、二つの強力なツールを手に入れました。
また、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