{"notes":[{"id":"classic-cnns/inceptionnext","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"InceptionNeXt","subtitle":"十字に分ける","author":"Z. Yuan","paperDate":"2023-03-29","publishedOn":"2025-10-30","world":"external/inceptionnext","paperTitle":"InceptionNeXt: When Inception Meets ConvNeXt","paperUrl":"https://arxiv.org/abs/2303.16900","bibliography":{"title":"InceptionNeXt: When Inception Meets ConvNeXt","authors":["Weihao Yu","Pan Zhou","Shuicheng Yan","Xinchao Wang"],"url":"https://arxiv.org/abs/2303.16900","pdfUrl":"https://arxiv.org/pdf/2303.16900v3","codeUrl":"https://github.com/sail-sg/inceptionnext","preprint":{"id":"2303.16900","submittedOn":"2023-03-29","url":"https://arxiv.org/abs/2303.16900"},"publication":{"venue":"CVPR","year":2024,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2024/html/Yu_InceptionNeXt_When_Inception_Meets_ConvNeXt_CVPR_2024_paper.html"},"citation":"@misc{classiccnnsinceptionnext2023,\n  title = {{InceptionNeXt: When Inception Meets ConvNeXt}},\n  author = {Weihao Yu and Pan Zhou and Shuicheng Yan and Xinchao Wang},\n  year = {2023},\n  eprint = {2303.16900},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2303.16900}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inceptionnext.82116f5daa6e.bib"},"thumbnail":{"src":"/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png","width":1446,"height":786},"locale":"ja","path":"/content/papers/ja/classic-cnns/inceptionnext.b0d14cd72935.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"metanext","text":"MetaNeXt","depth":3},{"id":"どこが遅いのか","text":"どこが遅いのか","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"inception-depthwise畳み込み","text":"Inception depthwise畳み込み","depth":3},{"id":"十字形の受容野","text":"十字形の受容野","depth":3},{"id":"ネットワークを組む","text":"ネットワークを組む","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet-1k","text":"ImageNet-1K","depth":3},{"id":"metanextに注意は収まらない","text":"MetaNeXtに注意は収まらない","depth":3},{"id":"セマンティックセグメンテーション","text":"セマンティックセグメンテーション","depth":3},{"id":"アブレーション","text":"アブレーション","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"referenced","topic":""},{"id":"vision-transformers/poolformer","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v3","relation":"referenced","topic":""}]},{"id":"classic-cnns/convnext","category":"classic-cnns","legacyPath":"classic-cnns/2201-convnext","legacySlug":"2201-convnext","legacyPaths":[],"title":"ConvNeXt","subtitle":"卷積を再び偉大に","author":"Z. Yuan","paperDate":"2022-01-10","publishedOn":"2024-06-30","paperTitle":"A ConvNet for the 2020s","paperUrl":"https://arxiv.org/abs/2201.03545","bibliography":{"title":"A ConvNet for the 2020s","authors":["Zhuang Liu","Hanzi Mao","Chao-Yuan Wu","Christoph Feichtenhofer","Trevor Darrell","Saining Xie"],"url":"https://arxiv.org/abs/2201.03545","pdfUrl":"https://arxiv.org/pdf/2201.03545","codeUrl":"https://github.com/facebookresearch/ConvNeXt","preprint":{"id":"2201.03545","submittedOn":"2022-01-10","url":"https://arxiv.org/abs/2201.03545"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://arxiv.org/abs/2201.03545"},"citation":"@misc{classiccnnsconvnext2022,\n  title = {{A ConvNet for the 2020s}},\n  author = {Zhuang Liu and Hanzi Mao and Chao-Yuan Wu and Christoph Feichtenhofer and Trevor Darrell and Saining Xie},\n  year = {2022},\n  eprint = {2201.03545},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2201.03545}\n}\n","citationPath":"/content/papers/citations/classic-cnns/convnext.801b4060b807.bib"},"thumbnail":{"src":"/content/papers/assets/37882616c5c72df33699003256d14bf7c58c8ea5d1e9e4fb5b1c33268c9a6923.jpg","width":1224,"height":432},"locale":"ja","path":"/content/papers/ja/classic-cnns/convnext.4e647352c822.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"解決策","text":"解決策","depth":2},{"id":"ネットワークアーキテクチャの再設計","text":"ネットワークアーキテクチャの再設計","depth":3},{"id":"現代的なトレーニング技術の導入","text":"現代的なトレーニング技術の導入","depth":3},{"id":"マクロ設計","text":"マクロ設計","depth":3},{"id":"resnext-化","text":"ResNeXt 化","depth":3},{"id":"逆瓶頸","text":"逆瓶頸","depth":3},{"id":"大きな畳み込み核","text":"大きな畳み込み核","depth":3},{"id":"微細設計","text":"微細設計","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"モデル設定の概要","text":"モデル設定の概要","depth":3},{"id":"imagenet-上での性能","text":"ImageNet 上での性能","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"vision-transformers/convmixer","relation":"comparison","topic":"畳み込みによる画像パッチの混合"},{"id":"vision-transformers/caformer","relation":"comparison","topic":"畳み込みによる画像パッチの混合"},{"id":"reparameterization/replknet","relation":"comparison","topic":"大きなカーネルと簡潔な畳み込み骨格"}]},{"id":"vision-transformers/poolformer","category":"vision-transformers","legacyPath":"vision-transformers/2111-poolformer","legacySlug":"2111-poolformer","legacyPaths":[],"title":"PoolFormer","subtitle":"あなたが必要なのはフレームワーク！","author":"Z. Yuan","paperDate":"2021-11-22","publishedOn":"2024-07-10","paperTitle":"MetaFormer Is Actually What You Need for Vision","paperUrl":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html","bibliography":{"title":"MetaFormer Is Actually What You Need for Vision","authors":["Weihao Yu","Mi Luo","Pan Zhou","Chenyang Si","Yichen Zhou","Xinchao Wang","Jiashi Feng","Shuicheng Yan"],"url":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html","pdfUrl":"https://openaccess.thecvf.com/content/CVPR2022/papers/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.pdf","codeUrl":"https://github.com/sail-sg/poolformer","preprint":{"id":"2111.11418","submittedOn":"2021-11-22","url":"https://arxiv.org/abs/2111.11418"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2022/html/Yu_MetaFormer_Is_Actually_What_You_Need_for_Vision_CVPR_2022_paper.html"},"citation":"@misc{visiontransformerspoolformer2021,\n  title = {{MetaFormer Is Actually What You Need for Vision}},\n  author = {Weihao Yu and Mi Luo and Pan Zhou and Chenyang Si and Yichen Zhou and Xinchao Wang and Jiashi Feng and Shuicheng Yan},\n  year = {2021},\n  eprint = {2111.11418},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2111.11418}\n}\n","citationPath":"/content/papers/citations/vision-transformers/poolformer.f2f96629d283.bib"},"thumbnail":{"src":"/content/papers/assets/3cb141e9bb1247410c8214276b21b28ed1d536060d470406f1bfb0c88fe68df2.jpg","width":1498,"height":548},"locale":"ja","path":"/content/papers/ja/vision-transformers/poolformer.f4daa609b693.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"入力埋め込み-input-embedding","text":"入力埋め込み (Input Embedding)","depth":3},{"id":"token-mixer","text":"Token-Mixer","depth":3},{"id":"チャネル-mlp-channel-mlp","text":"チャネル MLP (Channel MLP)","depth":3},{"id":"token-mixer-は重要でない","text":"Token-Mixer は重要でない？","depth":3},{"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":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"vision-transformers/mlp-mixer","relation":"background","topic":"骨格とトークン混合の分離"},{"id":"vision-transformers/caformer","relation":"next","topic":"骨格とトークン混合の分離"}]},{"id":"classic-cnns/inception-v3","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Inception-v3","subtitle":"大きなカーネルの退場","author":"Z. Yuan","paperDate":"2015-12-02","publishedOn":"2023-11-15","world":"external/inception-v3","paperTitle":"Rethinking the Inception Architecture for Computer Vision","paperUrl":"https://arxiv.org/abs/1512.00567","bibliography":{"title":"Rethinking the Inception Architecture for Computer Vision","authors":["Christian Szegedy","Vincent Vanhoucke","Sergey Ioffe","Jonathon Shlens","Zbigniew Wojna"],"url":"https://arxiv.org/abs/1512.00567","pdfUrl":"https://arxiv.org/pdf/1512.00567v3","codeUrl":null,"preprint":{"id":"1512.00567","submittedOn":"2015-12-02","url":"https://arxiv.org/abs/1512.00567"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://openaccess.thecvf.com/content_cvpr_2016/html/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.html"},"citation":"@misc{classiccnnsinceptionv32015,\n  title = {{Rethinking the Inception Architecture for Computer Vision}},\n  author = {Christian Szegedy and Vincent Vanhoucke and Sergey Ioffe and Jonathon Shlens and Zbigniew Wojna},\n  year = {2015},\n  eprint = {1512.00567},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.00567}\n}\n","citationPath":"/content/papers/citations/classic-cnns/inception-v3.5636c0bddf2d.bib"},"thumbnail":{"src":"/content/papers/assets/c87d3d6fa9ea76d954eba2570f702150eca32d62c7cdb3d724075a4be9a63080.png","width":419,"height":358},"locale":"ja","path":"/content/papers/ja/classic-cnns/inception-v3.c3a126bf40a9.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"55を33の2層に分ける","text":"5×5を3×3の2層に分ける","depth":3},{"id":"さらに1nとn1に分ける","text":"さらに1×nとn×1に分ける","depth":3},{"id":"補助分類器の本当の役割","text":"補助分類器の本当の役割","depth":3},{"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":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/inception-v1","relation":"referenced","topic":""},{"id":"normalization/batchnorm","relation":"referenced","topic":""},{"id":"classic-cnns/convnext","relation":"referenced","topic":""}]}],"text":"ConvNeXt-Tの計算量は4.5 GMACs、ResNet-50は4.1 GMACsで、ほぼ同じです。ところがA100で学習すると、ResNet-50は毎秒969枚を処理できるのに、ConvNeXt-Tは575枚、およそ6割にとどまります。\n\n計算量は同程度なのに、なぜこれほど速度が違うのでしょうか。原因は7×7のdepthwise畳み込みです。各チャネルを別々に処理するため、積和演算は少なくても、転送するデータは多く、GPUは大半の時間をメモリ待ちに費やします。ConvNeXtはカーネルを3×3から7×7へ広げて精度を得た一方、この速度の問題も抱えました。\n\nこの研究はシンガポール国立大学、シンガポール経営大学、Sea AI Lab、Skywork AIによるものです。筆頭著者のWeihao YuはMetaFormerの著者でもあります。当時Transformerを「token mixerとMLP」という枠組みに分けた考え方を、今度はConvNeXtに適用します。\n\n\n> [!TIP]\n> \n> ConvNeXtとMetaFormerについては、先にこちらの2本を読めます。\n> \n> - **[[22.01] ConvNeXt：卷積を再び偉大に](/blog/papers/classic-cnns/convnext)**\n> - **[[21.11] PoolFormer：あなたが必要なのはフレームワーク！](/blog/papers/vision-transformers/poolformer)**\n\n\n[![原論文Figure 1。横軸はA100での学習スループット（枚／秒）、縦軸はImageNet top-1精度。ConvNeXt-T/k7は左上の約82.1%、575枚／秒にあり、カーネルを5×5、3×3に変えると右へ動き、精度は順に下がる。ResNet-50は右下にあり、速度は約970枚／秒だが精度は78%台。InceptionNeXt-Tは右上に位置し、赤い矢印がConvNeXt-T/k7の1.6倍の速度を示す。](/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png)](/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png)\n\n*Yuらの原論文Figure 1。[**PDF 1ページ**](https://arxiv.org/pdf/2303.16900v3#page=1)より。原図のキャプションは省略。*\n\nこの論文が目指すのは図の右上です。精度はConvNeXt-Tに並び、速度はResNet-50に近づけます。\n\n## 問題の定義\n\n### MetaNeXt\n\nまず著者はConvNeXtのブロックを抽象化します。\n\n[![原論文Figure 2。左から4つのブロックが並ぶ。MetaFormerには残差接続が2本あり、1本目がNormと破線枠のToken Mixer、2本目がNormとMLPを囲む。MetaNeXtには残差接続が1本だけあり、Token Mixer、Norm、MLPが同じ経路に並ぶ。ConvNeXtではToken Mixerが7×7のDWConvに置き換わる。InceptionNeXtのToken Mixerは破線枠で、入力をSplitで4分割し、3×3、1×11、11×1のDWConvとIdentityを通してConcatする。](/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png)](/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png)\n\n*Yuらの原論文Figure 2。[**PDF 2ページ**](https://arxiv.org/pdf/2303.16900v3#page=2)より。原図のキャプションは省略。*\n\n左端のMetaFormerには、token mixer用とMLP用の2本の残差接続があります。Transformerはこの構造です。ConvNeXtのブロックには残差接続が1本しかなく、空間方向の混合、正規化、MLPが同じ経路に並びます。著者はこの1本の残差を持つ枠組みをMetaNeXtと呼びます。ConvNeXtと今回のInceptionNeXtは、いずれもその実装で、違いはtoken mixerだけです。\n\n### どこが遅いのか\n\n著者はConvNeXt-Tで予備実験を行い、depthwise畳み込みだけを変え、ほかは固定しました。\n\n| depthwiseカーネル | 畳み込むチャネルの割合 | 学習（枚／秒） | 推論（枚／秒） | top-1 |\n| --- | ---: | ---: | ---: | ---: |\n| 7×7 | 1 | 575 | 2413 | 82.1% |\n| 5×5 | 1 | 675 | 2704 | 82.0% |\n| 3×3 | 1 | 798 | 2802 | 81.5% |\n| 3×3 | 1/4 | 871 | 2808 | 81.3% |\n| 3×3 | 1/8 | 901 | 2833 | 80.8% |\n| 3×3 | 1/16 | 916 | 2846 | 80.1% |\n\n*表：原論文Table 1の一部の行を抜粋。A100、バッチ128、TF32。*\n\nカーネルを7×7から3×3に縮めると、学習は39%速くなり、精度は0.6ポイント下がりました。次にShuffleNet V2にならい、一部のチャネルだけにdepthwise畳み込みを適用し、残りはそのまま通します。割合を1/4にすると学習はさらに速くなり、精度の追加低下は0.2ポイントで済みました。\n\nここから2つのことがわかります。大きなカーネルのdepthwise畳み込みが速度のボトルネックであること、そして1層のdepthwise畳み込みでは一部のチャネルだけを処理すればよいことです。ただしカーネルを縮めると受容野も狭くなります。失った0.6ポイントをどこから取り戻せばよいのでしょうか。\n\n## 問題の解決\n\n### Inception depthwise畳み込み\n\n著者はチャネルを4つに分け、それぞれ別の処理を行います。\n\n- 1つは3×3のdepthwise畳み込み\n- 1つは1×11の横長の畳み込み\n- 1つは11×1の縦長の畳み込み\n- 残りはそのまま通す\n\n3本の畳み込み分岐にはそれぞれ$C/8$チャネルを割り当て、残る$5C/8$はそのまま通し、最後に4つを連結します。$k\\times k$を$1\\times k$と$k\\times 1$に分けるのはInception-v3でも使われた手法で、名前もそこから来ています。\n\n\n> [!TIP]\n> \n> Inception-v3が大きなカーネルを分解した手法は、こちらで読めます。\n> \n> - **[[15.12] Inception-v3：大きなカーネルの退場](/blog/papers/classic-cnns/inception-v3)**\n\n\nパラメータ数はdepthwise畳み込みの$k^2C$から$(2k+9)C/8$になります。$2k$は2本の帯状カーネル、9は3×3によるものです。カーネルサイズへの依存は2乗から線形に変わります。論文に載っているPyTorchコードに沿って実装し、パラメータを数えてみます。\n\n```python\nimport torch\nimport torch.nn as nn\n\nclass InceptionDWConv2d(nn.Module):\n    def __init__(self, c, square=3, band=11, ratio=1/8):\n        super().__init__()\n        g = int(c * ratio)                                    # 各畳み込み分岐のチャネル数\n        self.hw = nn.Conv2d(g, g, square, padding=square // 2, groups=g)\n        self.w = nn.Conv2d(g, g, (1, band), padding=(0, band // 2), groups=g)\n        self.h = nn.Conv2d(g, g, (band, 1), padding=(band // 2, 0), groups=g)\n        self.split = (g, g, g, c - 3 * g)                     # 3×3、1×11、11×1、そのまま通す部分\n\n    def forward(self, x):\n        x_hw, x_w, x_h, x_id = torch.split(x, self.split, dim=1)\n        return torch.cat((self.hw(x_hw), self.w(x_w), self.h(x_h), x_id), dim=1)\n\nc = 96                                                        # InceptionNeXt-Tの第1ステージのチャネル数\nparams = lambda m: sum(p.numel() for p in m.parameters())\nprint(\"7×7 depthwise：\", params(nn.Conv2d(c, c, 7, padding=3, groups=c)))\nprint(\"3×3 depthwise：\", params(nn.Conv2d(c, c, 3, padding=1, groups=c)))\nprint(\"Inception depthwise：\", params(InceptionDWConv2d(c)))\n```\n\n```text\n7×7 depthwise： 4800\n3×3 depthwise： 960\nInception depthwise： 408\n```\n\nInception depthwise畳み込みは3×3 depthwiseよりもパラメータが少なくなります。チャネルの5/8では、そもそも畳み込みをしていないからです。\n\n### 十字形の受容野\n\nここまで読むと、少し損をしたようにも感じます。7×7カーネルなら各チャネルで7×7の領域全体を見られましたが、今は3×3の小さな正方形か、横線か、縦線しか見られません。\n\n[GitHubでも](https://github.com/sail-sg/inceptionnext/issues/3)、この「分解」が7×7と数学的に等価かという質問がありました。著者は等価ではなく、ここでのdecomposeは「置き換える」に近いと答えています。では、置き換えた後はどれほどの範囲を見られるのでしょうか。\n\n鍵はMLPです。depthwise畳み込みの後の1×1畳み込みがチャネルを混ぜるので、前のブロックで横長の処理をした特徴が、次のブロックでは縦長の処理に回ることがあります。ブロックを「空間畳み込みの後に1×1畳み込み」と簡略化し、勾配を逆伝播して中央の出力から見える入力位置を調べます。\n\n```python\ndef seen(blocks, make_mixer, size=33):\n    torch.manual_seed(0)\n    layers = []\n    for _ in range(blocks):                                   # 各ブロック：空間畳み込みの後に1×1畳み込みでチャネルを混合\n        layers += [make_mixer(), nn.Conv2d(c, c, 1)]\n    net = nn.Sequential(*layers)\n    x = torch.randn(1, c, size, size, requires_grad=True)\n    net(x)[0, :, size // 2, size // 2].sum().backward()       # 中央の出力から見える入力位置\n    grid = x.grad[0].abs().sum(0) > 0\n    rows, cols = grid.nonzero().T\n    return f\"見える位置は{int(grid.sum())}個、範囲は{int(rows.max() - rows.min() + 1)}×{int(cols.max() - cols.min() + 1)}\"\n\nfor blocks in (1, 2):\n    print(f\"{blocks}ブロックを積む\")\n    print(\"  7×7 depthwise：\", seen(blocks, lambda: nn.Conv2d(c, c, 7, padding=3, groups=c)))\n    print(\"  Inception depthwise：\", seen(blocks, lambda: InceptionDWConv2d(c)))\n```\n\n```text\n1ブロックを積む\n  7×7 depthwise： 見える位置は49個、範囲は7×7\n  Inception depthwise： 見える位置は25個、範囲は11×11\n2ブロックを積む\n  7×7 depthwise： 見える位置は169個、範囲は13×13\n  Inception depthwise： 見える位置は149個、範囲は21×21\n```\n\n1ブロックだけなら、Inception depthwiseの受容野は十字形です。中心の3×3と長さ11の2本の線で、計25位置になります。2ブロック目では横線と縦線が組み合わさり、11×11の領域全体に外側へ伸びる4本の腕を加えた、計149位置になります。7×7を2層積むと13×13の169位置で、数は近いものの、覆う範囲は狭くなります。\n\n### ネットワークを組む\n\n各ステージのブロック数とチャネル数はConvNeXtを引き継ぎ、4ステージ構成も同じです。違いは2つあります。正規化にはBatchNormを使います。速度重視のため、推論時にBNを畳み込みへ融合できることが利点です。最終ステージのMLPの拡張率は4から3へ下げ、節約したパラメータを分類ヘッドに回します。最小のAtto版では各分岐の割合を1/4に増やし、帯状カーネルの長さを9にします。\n\n## 考察\n\n### ImageNet-1K\n\n学習設定はDeiTとConvNeXtのレシピを引き継ぎ、300 epoch学習します。スループットはA100のTF32で測定します。\n\n| モデル | パラメータ数 | MACs | 学習（枚／秒） | 推論（枚／秒） | top-1 |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| RSB-ResNet-50 | 26M | 4.1G | 969 | 3149 | 79.8% |\n| ConvNeXt-T | 29M | 4.5G | 575 | 2413 | 82.1% |\n| InceptionNeXt-T | 28M | 4.2G | **901** | **2900** | **82.3%** |\n| ConvNeXt-S | 50M | 8.7G | 361 | 1535 | 83.1% |\n| InceptionNeXt-S | 49M | 8.4G | **521** | **1750** | **83.5%** |\n| ConvNeXt-B | 89M | 15.4G | 267 | 1122 | 83.8% |\n| InceptionNeXt-B | 87M | 14.9G | **375** | **1244** | **84.0%** |\n\n*表：原論文Table 4の一部の行を抜粋。RSB-ResNet-50は「ResNet strikes back」の新しいレシピで再学習したResNet-50。*\n\nInceptionNeXt-TはConvNeXt-Tより0.2ポイント高く、学習は57%、推論は20%速くなります。ResNet-50に対しては学習速度が93%、推論速度が92%です。「ResNet-50の速度」は少し楽観的な表現ですが、かなり近づいています。\n\nモデルが大きくなるほど加速率は下がります。学習の高速化はTで57%、Sで44%、Bで40%です。depthwise畳み込みの計算量はチャネル数に比例し、MLPはチャネル数の2乗に比例するためです。モデルが広くなるほどMLPに時間を使うので、token mixerだけを変えて節約できる割合が減ります。\n\n最小のAtto版では逆に学習が219%速くなりますが、精度はConvNeXt-Aより0.4ポイント低くなります。\n\n速度はハードウェアにも依存します。同じ表で2080TiのFP32を使った場合、Tの推論は39%速く、A100での20%より大きな改善です。その後RDNetの論文でも推論遅延が測定されました。バッチ128でInceptionNeXt-Tは132 ms、ConvNeXt-Tは150 msとなり、換算すると14%の高速化です。\n\n### MetaNeXtに注意は収まらない\n\nMetaNeXtはMetaFormerの簡略版なので、著者は1本の残差接続を持つブロックに自己注意を入れたMetaNeXt-Attnも試しました。しかし学習はうまくいかず、ImageNet精度は3.9%にとどまりました。同じ規模のDeiT-Sは79.8%です。\n\n残差接続を2本から1本にまとめると速度は上がりますが、token mixerを複雑にしすぎることはできません。この枠組みには畳み込みは収まっても、注意は収まりません。\n\n### セマンティックセグメンテーション\n\nADE20KでUperNetを接続し、160K回学習します。\n\n| サイズ | Swin | ConvNeXt | InceptionNeXt |\n| --- | ---: | ---: | ---: |\n| T | 45.8 | 46.7 | **47.9** |\n| S | 49.5 | 49.6 | **50.0** |\n| B | 49.7 | 49.9 | **50.6** |\n\n*表：原論文Table 6より。数値はmIoU。*\n\nTでの差は1.2で、分類の0.2よりずっと大きくなっています。ただしテスト方法を確認する必要があります。[GitHubの報告](https://github.com/sail-sg/inceptionnext/issues/10)では、InceptionNeXtを自分のセグメンテーションモデルに組み込んでもConvNeXtと同程度だったとされています。著者は、表ではConvNeXtにならってマルチスケールテストのmIoUを報告しており、シングルスケールでは両者は近いと回答しています。セグメンテーションの学習コードも公開されておらず、issueでは複数の利用者が公開を求めています。\n\n### アブレーション\n\nInceptionNeXt-Tを基準に、1か所ずつ変えます。\n\n| 変更 | 学習（枚／秒） | 推論（枚／秒） | top-1 |\n| --- | ---: | ---: | ---: |\n| 基準 | 901 | 2900 | 82.3% |\n| 横長カーネルを除去 | 947 | 3093 | 81.9% |\n| 縦長カーネルを除去 | 954 | 3173 | 81.9% |\n| 3×3の正方形を除去 | 940 | 3004 | 82.0% |\n| 2本の帯状カーネルを直列に接続 | 903 | 2971 | 82.1% |\n| 帯の長さを11から13に変更 | 896 | 2895 | 82.0% |\n| 分岐の割合を1/8から1/4に変更 | 834 | 2499 | 82.2% |\n| 分岐の割合を1/8から1/16に変更 | 936 | 3097 | 81.8% |\n| BatchNormをLayerNormに変更 | 721 | 2646 | 82.4% |\n\n*表：原論文Table 8の一部の行を抜粋。*\n\n最も重要なのは2本の帯状カーネルで、どちらを除いても0.4ポイント下がります。受容野を支えているのはこの2本です。3×3の正方形を除いた場合は0.3ポイントの低下で、速度をさらに重視するなら正方形なしの版を使えると著者は勧めています。分岐の割合を1/4に増やしても効果はなく、遅くなるだけです。1/16まで下げると0.5ポイント下がります。\n\nLayerNormは0.1ポイント高い一方、学習速度が2割落ちるため、著者はBatchNormを選びました。\n\n## 結論\n\nInceptionNeXtは7×7のdepthwise畳み込みを、小さな正方形、2本の帯状カーネル、大量の何も処理しないチャネルに置き換えます。ConvNeXt-Tの精度を保ち、学習速度をResNet-50に近づけました。\n\n使うのはPyTorch組み込みのdepthwise畳み込みだけで、独自演算子は不要です。timmにも`inception_next_tiny`などの事前学習済み重みがあります。自分のConvNeXt系モデルを速くしたいなら、token mixerを差し替えて試せます。\n\nセグメンテーションの表にある1.2ポイントの差については、まずシングルスケールかマルチスケールかを確認してから、バックボーンを替えるか決めましょう。\n","imageSizes":{"/content/papers/assets/1f6716ae5b81879c492b1f16031d8c3a3e65f652d97318b88209b2b60ec9d7c4.png":{"width":924,"height":666},"/content/papers/assets/1c7bbb1c754725c6cd60caf24d092587cc19bbcf03b619f64821ad4a7fb93429.png":{"width":1446,"height":786}}}
