{"notes":[{"id":"lightweight/fasternet","category":"lightweight","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"FasterNet","subtitle":"FLOPsは嘘をつく","author":"Z. Yuan","paperDate":"2023-03-07","publishedOn":"2025-10-23","world":"external/fasternet","paperTitle":"Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks","paperUrl":"https://arxiv.org/abs/2303.03667","bibliography":{"title":"Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks","authors":["Jierun Chen","Shiu-hong Kao","Hao He","Weipeng Zhuo","Song Wen","Chul-Ho Lee","S.-H. Gary Chan"],"url":"https://arxiv.org/abs/2303.03667","pdfUrl":"https://arxiv.org/pdf/2303.03667v3","codeUrl":null,"preprint":{"id":"2303.03667","submittedOn":"2023-03-07","url":"https://arxiv.org/abs/2303.03667"},"publication":{"venue":"CVPR","year":2023,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2023/html/Chen_Run_Dont_Walk_Chasing_Higher_FLOPS_for_Faster_Neural_Networks_CVPR_2023_paper.html"},"citation":"@misc{lightweightfasternet2023,\n  title = {{Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks}},\n  author = {Jierun Chen and Shiu-hong Kao and Hao He and Weipeng Zhuo and Song Wen and Chul-Ho Lee and S.-H. Gary Chan},\n  year = {2023},\n  eprint = {2303.03667},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2303.03667}\n}\n","citationPath":"/content/papers/citations/lightweight/fasternet.7a313d25fdbe.bib"},"thumbnail":{"src":"/content/papers/assets/f7b24b9388f5bb090f5420a96d640e9f851fd40becb24e6bb9b31ba1ebee4b71.png","width":1012,"height":500},"locale":"ja","path":"/content/papers/ja/lightweight/fasternet.578c1f43f6a3.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"遅延はflopsをflopsで割ったもの","text":"遅延はFLOPsをFLOPSで割ったもの","depth":3},{"id":"depthwise畳み込みはどこが遅いのか","text":"depthwise畳み込みはどこが遅いのか","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"部分畳み込みpconv","text":"部分畳み込みPConv","depth":3},{"id":"さらに11畳み込みをつなぐ","text":"さらに1×1畳み込みをつなぐ","depth":3},{"id":"fasternet","text":"FasterNet","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"検出とセグメンテーション","text":"検出とセグメンテーション","depth":3},{"id":"アブレーション","text":"アブレーション","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/mobilenet-v2","relation":"referenced","topic":""},{"id":"lightweight/shufflenet","relation":"referenced","topic":""},{"id":"lightweight/ghostnet","relation":"referenced","topic":""}]},{"id":"lightweight/mobilenet-v2","category":"lightweight","legacyPath":"lightweight/1801-mobilenet-v2","legacySlug":"1801-mobilenet-v2","legacyPaths":[],"title":"MobileNet-V2","subtitle":"ボトルネック内の鍛錬","author":"Z. Yuan","paperDate":"2018-01-13","publishedOn":"2024-06-27","paperTitle":"MobileNetV2: Inverted Residuals and Linear Bottlenecks","paperUrl":"https://arxiv.org/abs/1801.04381","bibliography":{"title":"MobileNetV2: Inverted Residuals and Linear Bottlenecks","authors":["Mark Sandler","Andrew Howard","Menglong Zhu","Andrey Zhmoginov","Liang-Chieh Chen"],"url":"https://arxiv.org/abs/1801.04381","pdfUrl":"https://arxiv.org/pdf/1801.04381","codeUrl":null,"preprint":{"id":"1801.04381","submittedOn":"2018-01-13","url":"https://arxiv.org/abs/1801.04381"},"publication":{"venue":"CVPR","year":2018,"kind":"conference","url":"https://arxiv.org/abs/1801.04381"},"citation":"@misc{lightweightmobilenetv22018,\n  title = {{MobileNetV2: Inverted Residuals and Linear Bottlenecks}},\n  author = {Mark Sandler and Andrew Howard and Menglong Zhu and Andrey Zhmoginov and Liang-Chieh Chen},\n  year = {2018},\n  eprint = {1801.04381},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1801.04381}\n}\n","citationPath":"/content/papers/citations/lightweight/mobilenet-v2.a882707cbaa2.bib"},"thumbnail":{"src":"/content/papers/assets/e6bbfb346bb449f83897d76b69c3711d2e9937d40320a7aab0f3843653a688c0.jpg","width":2332,"height":1324},"locale":"ja","path":"/content/papers/ja/lightweight/mobilenet-v2.eeba5dab1f42.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"線形ボトルネック","text":"線形ボトルネック","depth":3},{"id":"残差ネットワーク","text":"残差ネットワーク","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"逆向残差","text":"逆向残差","depth":3},{"id":"拡張ボトルネック論文付録-a","text":"拡張ボトルネック（論文付録 A）","depth":3},{"id":"モデルアーキテクチャ","text":"モデルアーキテクチャ","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"画像分類性能","text":"画像分類性能","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/mobilenet-v1","relation":"background","topic":"モバイル向けの効率的な畳み込み"},{"id":"lightweight/mobilenet-v3","relation":"next","topic":"モバイル向けの効率的な畳み込み"}]},{"id":"lightweight/shufflenet","category":"lightweight","legacyPath":"lightweight/1707-shufflenet","legacySlug":"1707-shufflenet","legacyPaths":[],"title":"ShuffleNet","subtitle":"チャネルシャッフルネットワーク","author":"Z. Yuan","paperDate":"2017-07-04","publishedOn":"2024-06-26","paperTitle":"ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices","paperUrl":"https://arxiv.org/abs/1707.01083","bibliography":{"title":"ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices","authors":["Xiangyu Zhang","Xinyu Zhou","Mengxiao Lin","Jian Sun"],"url":"https://arxiv.org/abs/1707.01083","pdfUrl":"https://arxiv.org/pdf/1707.01083","codeUrl":null,"preprint":{"id":"1707.01083","submittedOn":"2017-07-04","url":"https://arxiv.org/abs/1707.01083"},"publication":{"venue":"CVPR","year":2018,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2018.00716"},"citation":"@misc{lightweightshufflenet2017,\n  title = {{ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices}},\n  author = {Xiangyu Zhang and Xinyu Zhou and Mengxiao Lin and Jian Sun},\n  year = {2017},\n  eprint = {1707.01083},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1707.01083}\n}\n","citationPath":"/content/papers/citations/lightweight/shufflenet.1e5a6869f5a9.bib"},"thumbnail":{"src":"/content/papers/assets/6d0c746d403d2823809ffbd52c9b3614cc2063afee07608d6d0cb26b11fc3ac8.jpg","width":1746,"height":678},"locale":"ja","path":"/content/papers/ja/lightweight/shufflenet.a2a84a45d0c4.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"計算量と速度の不一致","text":"計算量と速度の不一致","depth":3},{"id":"大量の-1x1-畳み込み","text":"大量の 1x1 畳み込み","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"グループ畳み込み","text":"グループ畳み込み","depth":3},{"id":"チャネルシャッフル","text":"チャネルシャッフル","depth":3},{"id":"シャッフルモジュールの配置位置","text":"シャッフルモジュールの配置位置","depth":3},{"id":"モデルアーキテクチャ","text":"モデルアーキテクチャ","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"グループ畳み込みの効果","text":"グループ畳み込みの効果","depth":3},{"id":"チャネルシャッフルの効果","text":"チャネルシャッフルの効果","depth":3},{"id":"他のモデルとの比較","text":"他のモデルとの比較","depth":3},{"id":"実際の推論速度の評価","text":"実際の推論速度の評価","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/ghostnet","relation":"comparison","topic":"畳み込みとチャネルの計算コスト削減"},{"id":"lightweight/pp-lcnet","relation":"comparison","topic":"畳み込みとチャネルの計算コスト削減"}]},{"id":"lightweight/ghostnet","category":"lightweight","legacyPath":"lightweight/1911-ghostnet","legacySlug":"1911-ghostnet","legacyPaths":[],"title":"GhostNet","subtitle":"特徴マップのゴースト","author":"Z. Yuan","paperDate":"2019-11-27","publishedOn":"2024-07-23","paperTitle":"GhostNet: More Features from Cheap Operations","paperUrl":"https://arxiv.org/abs/1911.11907","bibliography":{"title":"GhostNet: More Features from Cheap Operations","authors":["Kai Han","Yunhe Wang","Qi Tian","Jianyuan Guo","Chunjing Xu","Chang Xu"],"url":"https://arxiv.org/abs/1911.11907","pdfUrl":"https://arxiv.org/pdf/1911.11907","codeUrl":"https://github.com/huawei-noah/ghostnet","preprint":{"id":"1911.11907","submittedOn":"2019-11-27","url":"https://arxiv.org/abs/1911.11907"},"publication":{"venue":"CVPR","year":2020,"kind":"conference","url":"https://arxiv.org/abs/1911.11907"},"citation":"@misc{lightweightghostnet2019,\n  title = {{GhostNet: More Features from Cheap Operations}},\n  author = {Kai Han and Yunhe Wang and Qi Tian and Jianyuan Guo and Chunjing Xu and Chang Xu},\n  year = {2019},\n  eprint = {1911.11907},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1911.11907}\n}\n","citationPath":"/content/papers/citations/lightweight/ghostnet.4dd65d9540bb.bib"},"thumbnail":{"src":"/content/papers/assets/22fa9d36b042deb7995e9695a803de3a973542f58cd9cd48e37ef13167df2222.jpg","width":972,"height":904},"locale":"ja","path":"/content/papers/ja/lightweight/ghostnet.f5ba6d0291df.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"モデルアーキテクチャ","text":"モデルアーキテクチャ","depth":3},{"id":"モジュール構成","text":"モジュール構成","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"imagenet-での性能","text":"ImageNet での性能","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"lightweight/shufflenet","relation":"comparison","topic":"畳み込みとチャネルの計算コスト削減"},{"id":"lightweight/pp-lcnet","relation":"comparison","topic":"畳み込みとチャネルの計算コスト削減"}]}],"text":"軽量ネットワークを設計する人が最もよく見る数字は、FLOPsです。MobileNet、ShuffleNet、GhostNetと続くなかで、誰もがあの手この手で浮動小数点演算量を減らそうとしてきました。最もよく使われる道具は、depthwise畳み込みとグループ畳み込みです。\n\n\n> [!TIP]\n> \n> これらは、先に私たちのノートで読めます。\n> \n> - **[[18.01] MobileNet-V2：ボトルネック内の鍛錬](/blog/papers/lightweight/mobilenet-v2)**\n> - **[[17.07] ShuffleNet：チャネルシャッフルネットワーク](/blog/papers/lightweight/shufflenet)**\n> - **[[19.11] GhostNet：特徴マップのゴースト](/blog/papers/lightweight/ghostnet)**\n\n\nでも、FLOPsが減れば、ネットワークは必ず速く動くのでしょうか？香港科技大学のJierun Chenらがひととおり測ってみたところ、答えはしばしば「いいえ」でした。たとえばCycleMLP-B1のFLOPsはResNet-50の半分しかないのに、CPU上ではかえって遅く、116.1 ms対73.0 msです。この論文のタイトルは「Run, Don't Walk」で、歩数を節約するより速く走ろう、という意味です。\n\n## 問題の定義\n\n### 遅延はFLOPsをFLOPSで割ったもの\n\nこの二つの語は、大文字か小文字かが1文字違うだけです。FLOPsは浮動小数点演算の回数、FLOPSは1秒あたりに何回の浮動小数点演算ができるか、つまりハードウェアが実際に出す速度です。遅延は両者の商です。\n\n$$\n\\text{Latency}=\\frac{\\text{FLOPs}}{\\text{FLOPS}} .\n$$\n\nFLOPsだけを減らしても、FLOPSがそれ以上に落ちれば、遅延はかえって長くなります。著者らはIntel CPU上で、よく使われるネットワークをまとめて測りました。\n\n[![2枚の図。(a)横軸はFLOPs（G）、縦軸はCPU上の実際のFLOPS（G/s）。オレンジの星印のFasterNetが一番上にあり、約37から64まで上がっていく。ResNet50は約56の1点。PVT、PoolFormer、MobileViT、EdgeNeXtはおよそ13〜43のあいだにある。MobileNetV2、GhostNet、ShuffleNetV2、MobileFormer、CycleMLPは大半が30以下で、MobileFormerとGhostNetが最も低く、1桁から十数しかない。(b)横軸はFLOPs、縦軸はCPU遅延（ms）。右が全範囲、左は1.8 GFLOPs以下の部分を拡大したもの。同じFLOPsなら、FasterNetのオレンジ線はいつも一番下にあり、CycleMLPの2点が一番上で、約116 msと186 ms](/content/papers/assets/20f1c9a908d887f3d0a9df04a50fcc019d38cf455e2b89451d3b2c8469b91f94.png)](/content/papers/assets/20f1c9a908d887f3d0a9df04a50fcc019d38cf455e2b89451d3b2c8469b91f94.png)\n\n*原論文Figure 2。[**v3 PDFの2ページ**](https://arxiv.org/pdf/2303.03667v3#page=2)から抜粋、CC BY 4.0。(a)CPU上のFLOPSとFLOPsの関係。(b)CPU遅延とFLOPsの関係です。*\n\n左図の縦軸は、1秒あたりに実際に行った演算の量です。速いとうたう多くのネットワークは、FLOPSがResNet-50より低く、ハードウェアの演算能力を使いきれていません。\n\nこの現象は、ShuffleNet V2が2018年にすでに指摘していて、FLOPsと速度が一致しないことを示していました。それでもその後の軽量ネットワークは、depthwise畳み込みを使い続けました。より良い代わりがずっとなかったからです。\n\n### depthwise畳み込みはどこが遅いのか\n\n入力は$c\\times h\\times w$の特徴マップで、3×3カーネルの一辺は$k=3$です。通常の畳み込みのFLOPsは$h\\times w\\times k^2\\times c^2$です。depthwise畳み込みは各チャネルが自分のカーネルだけを使うので、FLOPsは$h\\times w\\times k^2\\times c$に下がり、$c$分の1になります。\n\n問題は、depthwise畳み込みが空間方向の演算しかしないため、単独で使うと正解率が大きく落ちることです。そのため実際にはチャネル数を広げるのが普通で、MobileNet-V2の逆残差ブロックは6倍に広げています。チャネルが$c$から$c'$になると、メモリアクセス量は次のようになります。\n\n$$\nh\\times w\\times 2c' + k^2\\times c' \\approx h\\times w\\times 2c' ,\n$$\n\n入力を1回読み、出力を1回書く、そのほぼすべてが特徴マップの運搬です。通常の畳み込みのアクセス量は約$h\\times w\\times 2c$で、かえって少ないのです。\n\n演算が少なく運搬が多いと、数を1つ運ぶたびに数回しか演算しないので、ハードウェアはずっとメモリを待ち続けることになります。\n\n## 問題の解決\n\n### 部分畳み込みPConv\n\n著者らは、特徴マップの異なるチャネルどうしがよく似ていることに気づきました。事前学習済みのResNet-50の中間層の特徴マップを描くと、多くのチャネルがとてもよく似て見えます。これほど重複しているなら、空間方向の畳み込みをすべてのチャネルで行う必要はありません。\n\n[![3種類の畳み込みの模式図。(a)通常の畳み込み：直方体の入力と一列に並んだカーネルを畳み込み、同じ大きさの出力を得る。(b)depthwiseまたはグループ畳み込み：入力がチャネル方向に破線で多数の薄片に切られ、各薄片にそれぞれ小さなカーネルが1つずつ対応する。(c)部分畳み込み：入力の先頭の一部のチャネルだけが破線で囲まれ、少数のカーネルと畳み込まれる。残りのチャネルは1本の矢印に沿って、そのまま出力につながる](/content/papers/assets/f7b24b9388f5bb090f5420a96d640e9f851fd40becb24e6bb9b31ba1ebee4b71.png)](/content/papers/assets/f7b24b9388f5bb090f5420a96d640e9f851fd40becb24e6bb9b31ba1ebee4b71.png)\n\n*原論文Figure 1。[**v3 PDFの1ページ**](https://arxiv.org/pdf/2303.03667v3#page=1)から抜粋、CC BY 4.0。*\n\n部分畳み込み（Partial Convolution、PConv）は、先頭の$c_p$個のチャネルにだけ通常の3×3畳み込みを行い、残りのチャネルはそのまま出力にコピーします。先頭の連続した部分を選ぶのは、メモリアクセスを連続に保つためです。デフォルトは$c_p = c/4$で、FLOPsは次のとおりです。\n\n$$\nh\\times w\\times k^2\\times c_p^2 ,\n$$\n\n通常の畳み込みの1/16しかありません。メモリアクセス量は約$h\\times w\\times 2c_p$で、通常の畳み込みの1/4です。\n\n私たちのCPUで測ってみましょう。3種類の演算子をそれぞれ10層重ね、入力は192×28×28です。さらに、MobileNet-V2の使い方を模して、チャネルを6倍に広げたdepthwise畳み込みの組も加えます。\n\n```python\nimport time\nimport torch\nimport torch.nn as nn\n\ntorch.set_num_threads(1)                                   # 論文と同じく、CPUはシングルスレッドだけを使う\nc, h, w = 192, 28, 28                                      # 第2ステージでよくある特徴マップのサイズ\ncp = c // 4                                                # PConvは1/4のチャネルだけを畳み込む\n\nclass PConv(nn.Module):\n    def __init__(self, c, cp):\n        super().__init__()\n        self.cp = cp\n        self.conv = nn.Conv2d(cp, cp, 3, padding=1, bias=False)\n\n    def forward(self, x):\n        x1, x2 = torch.split(x, [self.cp, x.shape[1] - self.cp], dim=1)\n        return torch.cat((self.conv(x1), x2), 1)           # 残り3/4のチャネルはそのまま\n\n# (演算子, 入力チャネル数, FLOPs, メモリアクセス量)。FLOPsは積和の回数、アクセス量は特徴マップの読み書きと重みの読み込みの要素数\nops = {\n    \"Conv 3×3\": (nn.Conv2d(c, c, 3, padding=1, bias=False), c, h * w * 9 * c * c, h * w * 2 * c + 9 * c * c),\n    \"DWConv 3×3\": (nn.Conv2d(c, c, 3, padding=1, groups=c, bias=False), c, h * w * 9 * c, h * w * 2 * c + 9 * c),\n    \"PConv 3×3\": (PConv(c, cp), c, h * w * 9 * cp * cp, h * w * 2 * cp + 9 * cp * cp),\n    \"DWConv ×6\": (nn.Conv2d(6 * c, 6 * c, 3, padding=1, groups=6 * c, bias=False), 6 * c,\n                  h * w * 9 * 6 * c, h * w * 2 * 6 * c + 9 * 6 * c),\n}\nwith torch.no_grad():\n    for name, (op, cin, flops, mem) in ops.items():\n        x = torch.randn(1, cin, h, w)\n        net = nn.Sequential(*[op] * 10)                    # 同じ層を10回重ねる\n        for _ in range(20):\n            net(x)                                         # ウォームアップ\n        t = time.perf_counter()\n        for _ in range(200):\n            net(x)\n        ms = (time.perf_counter() - t) / 200 * 1000\n        total = flops * 10\n        print(f\"{name:<10}  FLOPs {total / 1e6:6.1f}M  1要素のアクセスあたり積和 {flops / mem:5.1f}回  \"\n              f\"遅延 {ms:5.2f} ms  FLOPS {total / ms / 1e6:4.1f} G/s\")\n```\n\n```\nConv 3×3    FLOPs 2601.1M  1要素のアクセスあたり積和 411.0回  遅延 32.83 ms  FLOPS 79.2 G/s\nDWConv 3×3  FLOPs   13.5M  1要素のアクセスあたり積和   4.5回  遅延  0.83 ms  FLOPS 16.4 G/s\nPConv 3×3   FLOPs  162.6M  1要素のアクセスあたり積和 169.3回  遅延  2.72 ms  FLOPS 59.8 G/s\nDWConv ×6   FLOPs   81.3M  1要素のアクセスあたり積和   4.5回  遅延 10.29 ms  FLOPS  7.9 G/s\n```\n\nこれはIntel i9-13900Kで実行した結果です。マシンが変われば数字も変わりますが、傾向はほぼ同じはずです。\n\nまずFLOPSの列を見てください。通常の畳み込みは1要素アクセスするごとに411回の積和を行い、ハードウェアを最も使いきっています。depthwise畳み込みは4.5回しか行わず、FLOPSは5分の1ほどに落ちます。PConvは1要素あたり169回で、FLOPSは通常の畳み込みのおよそ4分の3です。\n\n公平を期して言えば、同じ192チャネルで同じく10層重ねた場合、幅を広げないdepthwise畳み込みが実は最も速く、わずか0.83 msです。FLOPsが圧倒的に少ないからです。ただ、実際にはこのまま単体で使われることはありません。チャネルを6倍に広げると、FLOPsはPConvの半分しかないのに、遅延はPConvの4倍近くになります。\n\n論文では2080Ti、i9-9900X、Cortex-A72で同じ実験を行っていて、4種類の特徴マップサイズで平均すると、PConvのFLOPsは通常の畳み込みの1/16、FLOPSはdepthwise畳み込みの10.5倍（GPU）、6.2倍（CPU）、22.8倍（ARM）です。\n\n### さらに1×1畳み込みをつなぐ\n\nPConvはチャネルの4分の1しか見ていないので、残りの情報は後ろの1×1畳み込みで補います。二つを合わせた受容野はT字のような形になります。中心の位置はすべてのチャネルを見ていて、周りの8つの位置は$c_p$個のチャネルしか見ていません。\n\n著者らは事前学習済みのResNet-18で、この形が妥当かを調べました。各3×3カーネルについて、9つの位置それぞれの重みの大きさを計算し、どの位置が最大かを見ます。4つのステージのどれでも、最大になる頻度が最も高いのは中央の位置でした。中心はもともと周りより重要なので、中心に少し多めに演算を割くのは理にかなっています。\n\nでは、なぜT字形の畳み込みを直接使わないのでしょうか？分けたほうが安く済むからです。T字形の畳み込みのFLOPsは$h\\times w\\times(k^2 c_p c + c(c-c_p))$、PConvと1×1畳み込みに分けると$h\\times w\\times(k^2 c_p^2 + c^2)$です。$c_p = c/4$のとき、前者は$3c^2$、後者は$1.5625c^2$しかありません。\n\n著者らは、この組み合わせが通常の畳み込みの代わりになるかも検証しています。事前学習済みのResNet-50の各ステージの最初の3×3畳み込みから入力と出力を取り出し、小さなネットワークにそれをまねるよう学習させました。4つのステージで平均したテスト損失は、depthwise畳み込み＋1×1が0.0148、グループ畳み込み＋1×1が0.0133、PConv＋1×1が0.0123で、元の通常の畳み込みに最も近くなりました。\n\n### FasterNet\n\n[![上半分はFasterNetの全体構造。入力はEmbedding層を通り、続いて4つのステージがある。各ステージはいくつかのFasterNet Blockからなり、ステージのあいだはMerging層でつながる。特徴マップはh/4×w/4からh/32×w/32まで縮み、最後にグローバルプーリング、1×1畳み込み、全結合層を経て出力される。下半分の左は部分畳み込みの拡大図で、入力の先頭c_p個のチャネルだけがc_p個のk×kカーネルと掛け合わされ、残りのチャネルはIdentityの矢印でそのまま出力につながる。右はFasterNet Blockで、PConv 3×3、1×1畳み込み、BNとReLU、もう1つの1×1畳み込みが順に並び、最後に入力と足し合わされる](/content/papers/assets/25dba5e2fc3ece26c7c5fd70741eb94aaf914907a40406aabfb39756ab3f1144.png)](/content/papers/assets/25dba5e2fc3ece26c7c5fd70741eb94aaf914907a40406aabfb39756ab3f1144.png)\n\n*原論文Figure 4。[**v3 PDFの5ページ**](https://arxiv.org/pdf/2303.03667v3#page=5)から抜粋、CC BY 4.0。*\n\nFasterNetの骨格はとても素朴です。stemはストライド4の4×4畳み込みで、ステージのあいだはストライド2の2×2畳み込みでダウンサンプリングします。各ブロックはPConvに1×1畳み込みを2つつないだもので、あいだでチャネルを2倍に広げ、最後に残差を足します。\n\n細かい点が二つあります。一つは、正規化と活性化関数を中央の層の後にだけ置き、ブロック全体で1組しかないことです。著者らは、多く置きすぎると特徴の多様性が下がり、速度も落ちると考えています。もう一つは、正規化にBatchNormを使うことで、推論時には隣の畳み込みに統合できます。\n\n後半の2つのステージはメモリアクセスが少なく、FLOPSが高いので、著者らはブロックと演算を後ろに多く配分しています。たとえばT0の4つのステージのブロック数は1、2、8、2です。ファミリー全体は小さいものから順にT0、T1、T2、S、M、Lで、小さなモデルはGELU、大きなモデルはReLUを使います。\n\n## 考察\n\n### ImageNet\n\n著者らは3種類のデバイスで速度を測っています。GPUは2080Tiでバッチ32のスループット、CPUはi9-9900X、ARMはCortex-A72で、どちらもシングルスレッド、バッチ1の遅延です。以下に、正解率が近いモデルをいくつかの組で抜き出します。\n\n| モデル | FLOPs | GPU（枚／秒） | CPU（ms） | ARM（ms） | Top-1 |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| MobileViT-XXS | 0.42G | 2,393 | 30.8 | 348 | 69.0% |\n| MobileNetV2 | 0.31G | 4,198 | 12.2 | 442 | 72.0% |\n| ShuffleNetV2 ×1.5 | 0.30G | 4,878 | 12.1 | 266 | **72.6%** |\n| **FasterNet-T0** | 0.34G | **6,807** | **9.2** | **143** | 71.9% |\n| ResNet-50 | 4.11G | 959 | 73.0 | 1,131 | 78.8% |\n| **FasterNet-T2** | 1.91G | **1,991** | **33.5** | **497** | **78.9%** |\n| Swin-T | 4.51G | 609 | 122.2 | 1,424 | 81.3% |\n| ConvNeXt-T | 4.47G | 657 | 86.3 | 1,889 | **82.1%** |\n| **FasterNet-S** | 4.56G | **1,029** | **71.2** | **1,103** | 81.3% |\n| Swin-B | 15.47G | 237 | 349.2 | OOM | 83.5% |\n| ConvNeXt-B | 15.38G | 253 | 257.1 | OOM | **83.8%** |\n| **FasterNet-L** | 15.52G | **323** | **219.5** | OOM | 83.5% |\n\n*表：原論文Table 3から抜粋。MobileViTの入力は256×256、ほかは224×224です。OOMはメモリ不足です。*\n\nどの組でも、FasterNetは3種類のデバイスすべてで最も速くなっています。いちばん見ごたえがあるのは最後の組で、FasterNet-LとConvNeXt-B、Swin-BのFLOPsはほぼ同じで、どれも15.4G〜15.5G前後なのに、GPUのスループットは28%〜36%多く、CPU時間も15%〜37%短くなっています。FLOPsは同じでも速度は違う。これが、この論文全体の言いたいことです。\n\n正解率のほうは、よく見る必要があります。要旨はT0がMobileViT-XXSより2.9ポイント正確だと述べていて、それは事実ですが、同じ組のMobileNetV2とShuffleNetV2はどちらもT0より正確です。FasterNet-SはSwin-Tと同じ81.3%で、ConvNeXt-Tより0.8低くなっています。FasterNet-Lは論文ではConvNeXt-Bと「同等」とされていますが、実際には0.3低いのです。FasterNetが手に入れたのは速度で、正解率はおおむね横ばい、ときには少し負けています。\n\n### 検出とセグメンテーション\n\nCOCOではMask R-CNNを12エポック学習させています。FasterNet-Sのbox APは39.9、ResNet-50は38.0で、GPUの遅延はほぼ同じです（54.3 ms対54.9 ms）。FasterNet-Lは44.0、PVT-Largeは42.9で、遅延は152.2 msから93.8 msに下がります。\n\n### アブレーション\n\n| 設定 | GPU（枚／秒） | CPU（ms） | ARM（ms） | Top-1 |\n| --- | ---: | ---: | ---: | ---: |\n| T0、$c_p = c/4$（デフォルト） | 6,807 | 9.2 | 143 | 71.9% |\n| T0\\*、$c_p = c/2$ | 6,626 | 9.6 | 145 | 71.7% |\n| T0\\*、$c_p = c/8$ | 6,204 | 8.9 | 140 | 71.3% |\n| T0、BatchNormの代わりにLayerNorm | 5,515 | 10.7 | 159 | 71.9% |\n| T0、GELUの代わりにReLU | 6,929 | 8.2 | 114 | 71.3% |\n| T2、ReLUの代わりにGELU | 1,985 | 35.4 | 557 | 78.7% |\n\n*表：原論文Table 5から抜粋。T0\\*は幅と深さを調整して複雑さをそろえた版です。T2はデフォルトでReLUを使うので、ここではGELUに替えたものと比べています。*\n\n$c_p$は1/4が最もバランスが良く、大きすぎると通常の畳み込みに退化し、小さすぎると空間的な特徴をとらえられません。LayerNormとBatchNormの正解率は同じですが、LayerNormは畳み込みに統合できないので、GPUのスループットが2割少なくなります。活性化関数は、小さなモデルではGELUのほうが正確で、大きなモデルではReLUのほうが良く、著者らは、小さなモデルのほうがGELUの非線形性を必要としているのだろうと推測しています。\n\n著者らは付録で二つの限界にも触れています。PConvのストライドは1でなければならず、そうでないと畳み込んだチャネルと手つかずのチャネルの位置がそろわないので、ダウンサンプリングは別の層に任せる必要があります。また、FasterNetは小さな畳み込みだけでできているので受容野が限られ、著者らは受容野の拡大を今後の課題としています。\n\n## 結論\n\n遅延はFLOPsをFLOPSで割ったもの。この論文で最も覚えておきたいのは、この式です。分子を減らすことばかり考えていると、分母がそれ以上に速く落ちて、ネットワークはかえって遅くなります。depthwise畳み込みがまさにそうで、演算は節約できても、時間はすべてメモリの運搬に費やされます。\n\nPConvは、ちょっと照れくさくなるほどシンプルです。チャネルの4分の1を切り出して畳み込み、また元に戻すだけなので、数行で自分のネットワークに持ち込めます。\n\n最後に、速度は必ず自分のデバイスで測ってください。論文で使われたのは2080Ti、i9-9900X、Cortex-A72で、私たちがi9-13900Kで測った結果は、傾向は同じでも、数字はかなり違いました。スマートフォンのNPUや別の推論フレームワークに替えれば、どちらが速いかもひっくり返るかもしれません。論文の表だけで結論を出さないようにしましょう。\n","imageSizes":{"/content/papers/assets/20f1c9a908d887f3d0a9df04a50fcc019d38cf455e2b89451d3b2c8469b91f94.png":{"width":2083,"height":650},"/content/papers/assets/f7b24b9388f5bb090f5420a96d640e9f851fd40becb24e6bb9b31ba1ebee4b71.png":{"width":1012,"height":500},"/content/papers/assets/25dba5e2fc3ece26c7c5fd70741eb94aaf914907a40406aabfb39756ab3f1144.png":{"width":1767,"height":742}}}
