{"notes":[{"id":"classic-cnns/wide-resnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Wide ResNet","subtitle":"深さより幅","author":"Z. Yuan","paperDate":"2016-05-23","publishedOn":"2024-02-14","world":"external/wide-resnet","paperTitle":"Wide Residual Networks","paperUrl":"https://arxiv.org/abs/1605.07146","bibliography":{"title":"Wide Residual Networks","authors":["Sergey Zagoruyko","Nikos Komodakis"],"url":"https://arxiv.org/abs/1605.07146","pdfUrl":"https://arxiv.org/pdf/1605.07146v4","codeUrl":null,"preprint":{"id":"1605.07146","submittedOn":"2016-05-23","url":"https://arxiv.org/abs/1605.07146"},"publication":{"venue":"BMVC","year":2016,"kind":"conference","url":"https://doi.org/10.5244/C.30.87"},"citation":"@misc{classiccnnswideresnet2016,\n  title = {{Wide Residual Networks}},\n  author = {Sergey Zagoruyko and Nikos Komodakis},\n  year = {2016},\n  eprint = {1605.07146},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1605.07146}\n}\n","citationPath":"/content/papers/citations/classic-cnns/wide-resnet.2e42de74f658.bib"},"thumbnail":{"src":"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png","width":1400,"height":500},"locale":"ja","path":"/content/papers/ja/classic-cnns/wide-resnet.ea87ec881366.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"どんどん細くなるresnet","text":"どんどん細くなるResNet","depth":3},{"id":"ショートカットが通りやすすぎる","text":"ショートカットが通りやすすぎる","depth":3},{"id":"細長いネットワークは速くもない","text":"細長いネットワークは速くもない","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"動かせるところ","text":"動かせるところ","depth":3},{"id":"wrn-n-k","text":"WRN-n-k","depth":3},{"id":"ブロックの中に何を置くか","text":"ブロックの中に何を置くか","depth":3},{"id":"dropoutをブロックに入れる","text":"dropoutをブロックに入れる","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"幅と深さをどう配分するか","text":"幅と深さをどう配分するか","depth":3},{"id":"1000層のresnetと比べる","text":"1000層のResNetと比べる","depth":3},{"id":"広いほうが速い","text":"広いほうが速い","depth":3},{"id":"dropoutの効果","text":"dropoutの効果","depth":3},{"id":"imagenetでは中央の層を広げる","text":"ImageNetでは中央の層を広げる","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/stochastic-depth","relation":"referenced","topic":""}]},{"id":"classic-cnns/resnet-v2","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ResNet v2","subtitle":"ショートカットはきれいに","author":"Z. Yuan","paperDate":"2016-03-16","publishedOn":"2024-01-11","world":"external/resnet-v2","paperTitle":"Identity Mappings in Deep Residual Networks","paperUrl":"https://arxiv.org/abs/1603.05027","bibliography":{"title":"Identity Mappings in Deep Residual Networks","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1603.05027","pdfUrl":"https://arxiv.org/pdf/1603.05027v3","codeUrl":null,"preprint":{"id":"1603.05027","submittedOn":"2016-03-16","url":"https://arxiv.org/abs/1603.05027"},"publication":{"venue":"ECCV","year":2016,"kind":"conference","url":"https://doi.org/10.1007/978-3-319-46493-0_38"},"citation":"@misc{classiccnnsresnetv22016,\n  title = {{Identity Mappings in Deep Residual Networks}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2016},\n  eprint = {1603.05027},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1603.05027}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet-v2.3d311a21e308.bib"},"thumbnail":{"src":"/content/papers/assets/7eda4acdde3019e92c5b44f59917b1e493a5b11b5b8a63280d03b15787934ef5.png","width":967,"height":469},"locale":"ja","path":"/content/papers/ja/classic-cnns/resnet-v2.0fddc9e6ebce.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"二つの恒等写像","text":"二つの恒等写像","depth":3},{"id":"ショートカットに何かを足すとどうなるか","text":"ショートカットに何かを足すとどうなるか？","depth":3},{"id":"加算の後のreluはどこに置くべきか","text":"加算の後のReLUはどこに置くべきか？","depth":3},{"id":"見方を変えるpre-activation","text":"見方を変える：pre-activation","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"深いほど差は大きくなる","text":"深いほど差は大きくなる","depth":3},{"id":"ほかの手法と比べる","text":"ほかの手法と比べる","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/highway-networks","relation":"referenced","topic":""},{"id":"classic-cnns/inception-v4","relation":"referenced","topic":""}]},{"id":"classic-cnns/stochastic-depth","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Stochastic Depth","subtitle":"今日はこの層がお休み","author":"Z. Yuan","paperDate":"2016-03-30","publishedOn":"2024-01-24","world":"external/stochastic-depth","paperTitle":"Deep Networks with Stochastic Depth","paperUrl":"https://arxiv.org/abs/1603.09382","bibliography":{"title":"Deep Networks with Stochastic Depth","authors":["Gao Huang","Yu Sun","Zhuang Liu","Daniel Sedra","Kilian Weinberger"],"url":"https://arxiv.org/abs/1603.09382","pdfUrl":"https://arxiv.org/pdf/1603.09382v3","codeUrl":null,"preprint":{"id":"1603.09382","submittedOn":"2016-03-30","url":"https://arxiv.org/abs/1603.09382"},"publication":{"venue":"ECCV","year":2016,"kind":"conference","url":"https://doi.org/10.1007/978-3-319-46493-0_39"},"citation":"@misc{classiccnnsstochasticdepth2016,\n  title = {{Deep Networks with Stochastic Depth}},\n  author = {Gao Huang and Yu Sun and Zhuang Liu and Daniel Sedra and Kilian Weinberger},\n  year = {2016},\n  eprint = {1603.09382},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1603.09382}\n}\n","citationPath":"/content/papers/citations/classic-cnns/stochastic-depth.3716109ef477.bib"},"thumbnail":{"src":"/content/papers/assets/620e6ddf909f1f405e38b6055bd732ae4c4b7c208f147e00b870a56642020c02.png","width":963,"height":339},"locale":"ja","path":"/content/papers/ja/classic-cnns/stochastic-depth.c2443e395971.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"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":"1200層","text":"1200層","depth":3},{"id":"imagenetでは勝てなかった","text":"ImageNetでは勝てなかった","depth":3},{"id":"勾配は本当に強くなるのか","text":"勾配は本当に強くなるのか？","depth":3},{"id":"生存確率はいくつにすべきか","text":"生存確率はいくつにすべきか？","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/resnet","relation":"referenced","topic":""},{"id":"classic-cnns/resnet-v2","relation":"referenced","topic":""},{"id":"classic-cnns/densenet","relation":"referenced","topic":""}]}],"text":"2016年の前半、ResNetの層数はひたすら増え続けていました。\n\nResNetの著者らは残差ユニットをpre-activationに改め、CIFAR-10で1001層のネットワークを学習させました。同じ時期のStochastic Depthも、ネットワークを1202層まで積み上げています。\n\n\n> [!TIP]\n> \n> この2本はどちらもノートがあるので、先に読んでおくとよいでしょう。\n> \n> - **[[16.03] ResNet v2：ショートカットはきれいに](/blog/papers/classic-cnns/resnet-v2)**\n> - **[[16.03] Stochastic Depth：今日はこの層がお休み](/blog/papers/classic-cnns/stochastic-depth)**\n\n\n層を増やせば成績は確かに良くなりますが、コストもどんどん高くなります。pre-activation ResNetを110層から1001層にすると、CIFAR-10の誤り率は6.37%から4.92%に下がります。層数は9倍になったのに、誤り率の減少は1.5ポイントに届かず、学習時間も長くなります。\n\nフランス国立土木学校（École des Ponts ParisTech）のSergey ZagoruykoとNikos Komodakisは、別の方向から考えました。ResNetは、本当にこんなに細くなければいけないのでしょうか？\n\n彼らはネットワークを広く、浅くしました。\n\n## 問題の定義\n\n### どんどん細くなるResNet\n\nResNetの著者らは設計にあたって細長いネットワークを好み、節約したパラメータをより多くの層に回しました。その後のボトルネックブロックは、まず$1\\times1$畳み込みで次元を下げ、$3\\times3$畳み込みを済ませてから元に戻すので、各ブロックはさらに細くなりました。\n\nCIFAR用のResNetを見ると、三つのステージのチャネル数は16、32、64しかありません。それ以前のVGGやInceptionは、チャネル数がどれもこれよりずっと多くなっていました。\n\n### ショートカットが通りやすすぎる\n\n著者らは、恒等ショートカットのおかげでResNetは1000層規模まで学習できるものの、それは同時にResNetの弱点でもあると指摘します。\n\n勾配はショートカットをたどってそのまま戻っていけます。残差分岐の重みを通るよう強制する仕組みは、どこにもありません。学習の結果、役に立つことを学ぶのはごく一部のブロックだけかもしれませんし、多くのブロックがそれぞれほんの少しずつしか貢献しないかもしれません。著者らは、この現象をdiminishing feature reuseと呼んでいます。\n\n著者らはStochastic Depthを裏付けとして挙げます。学習中に残差ブロックを丸ごとランダムに無効にすると、ネットワークはかえって良くなります。著者らの見方では、これは多くのブロックがもともと大した仕事をしていないことを示しています。\n\n### 細長いネットワークは速くもない\n\nGPUは大きなテンソルを一度に処理するのが得意ですが、細長いネットワークは小さな畳み込みの長い列なので、1層ずつ順番に計算するしかありません。著者らは要旨で、正解率をほんの少し上げるたびに層数をほぼ倍にしなければならず、学習もどんどん遅くなると述べています。\n\nでは、同じパラメータは深くするのに使うべきなのか、広くするのに使うべきなのか。ResNetは結局どれくらい広くあるべきなのか。著者らはそれを確かめようとしました。\n\n## 問題の解決\n\n### 動かせるところ\n\n著者らはResNet v2のpre-activationブロック、つまり各畳み込みの前にBNとReLUを置くブロックを出発点にします。残差ブロックの表現力を高めるには、おおまかに三つのやり方があります。\n\n1. ブロックの中に畳み込みを何層か追加する。\n2. 畳み込みを広くして、チャネルを増やす。\n3. 畳み込みカーネルを大きくする。\n\n三つ目は最初に除外します。VGGやInceptionシリーズの研究で、$3\\times3$のような小さなカーネルが効果的なことはすでに示されているからです。残る二つには、著者らがそれぞれ係数を一つずつ割り当てます。**深化係数$l$**は1ブロックに含まれる畳み込みの層数、**拡幅係数$k$**はチャネル数を何倍にするかです。元のブロックは$l=2$、$k=1$です。\n\n[![4種類の残差ブロックの模式図。各図とも左が灰色のショートカット、右が残差分岐で、両者は下で加算される。(a)basic：conv3x3が2つ。(b)bottleneck：conv1x1、conv3x3、conv1x1で、中央のconv3x3は幅が狭い。(c)basic-wide：幅の広いconv3x3が2つ。(d)wide-dropout：幅の広い2つのconv3x3のあいだにdropoutが1層挟まっている](/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png)](/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png)\n\n*原論文Figure 1。[**v4 PDFの2ページ**](https://arxiv.org/pdf/1605.07146v4#page=2)から抜粋。論文で使う4種類の残差ブロックです。各畳み込みの前にはBNとReLUがありますが、図では省略されています。*\n\n図のブロックの幅はチャネル数を表します。(a)は元の基本ブロックで、(c)は構造は同じまま、2層の畳み込みがどちらも広くなっています。(b)のボトルネックはResNetがネットワークを細くするための道具で、この論文が調べる「広くする」方向とは逆なので、著者らは検討から外し、以降はすべて基本ブロックから出発します。(d)は2層の畳み込みのあいだにdropoutを入れたもので、後で取り上げます。\n\n### WRN-n-k\n\nネットワークの骨格はResNet v2のCIFAR用の設計をそのまま使い、拡幅係数$k$だけを加えています。\n\n| グループ | 出力サイズ | 内容 |\n| --- | --- | --- |\n| conv1 | $32\\times32$ | $3\\times3$畳み込み、16チャネル |\n| conv2 | $32\\times32$ | $N$個のブロック、それぞれ$3\\times3$畳み込み2層、$16k$チャネル |\n| conv3 | $16\\times16$ | $N$個のブロック、$32k$チャネル |\n| conv4 | $8\\times8$ | $N$個のブロック、$64k$チャネル |\n| avg-pool | $1\\times1$ | $8\\times8$の平均プーリング、続いて分類層 |\n\n*表：原論文Table 1をもとに整理。conv3とconv4の最初の層が特徴マップを半分に縮小します。$k=1$なら元のpre-activation ResNetです。*\n\n著者らはネットワークを**WRN-$n$-$k$**と表記します。$n$は畳み込み層の総数、$k$は拡幅係数です。公式のコードでは$n=6N+4$でなければならないので、WRN-28-10は各グループ$N=4$個のブロックで、チャネル数を10倍にしたネットワークです。\n\n$k$はパラメータ数に2乗で効いてきます。入力も出力も$C$チャネルの$3\\times3$畳み込み1層には$9C^2$個の重みがあり、チャネル数を2倍にすると重みは4倍になります。上の表のとおりにいくつかネットワークを組んで、パラメータを数えてみましょう。\n\n```python\nimport torch.nn as nn\n\nclass Block(nn.Module):\n    \"\"\"BN-ReLU-conv3×3-BN-ReLU-conv3×3。形状が変わるときはショートカットに1×1畳み込みを使う\"\"\"\n    def __init__(self, cin, cout, stride):\n        super().__init__()\n        self.body = nn.Sequential(\n            nn.BatchNorm2d(cin), nn.ReLU(), nn.Conv2d(cin, cout, 3, stride, 1, bias=False),\n            nn.BatchNorm2d(cout), nn.ReLU(), nn.Conv2d(cout, cout, 3, 1, 1, bias=False))\n        self.shortcut = (nn.Identity() if cin == cout and stride == 1\n                         else nn.Conv2d(cin, cout, 1, stride, bias=False))\n\n    def forward(self, x):\n        return self.shortcut(x) + self.body(x)\n\ndef wrn(n, k, num_classes=10):\n    N = (n - 4) // 6                       # 各グループのブロック数\n    widths = [16 * k, 32 * k, 64 * k]\n    layers, cin = [nn.Conv2d(3, 16, 3, 1, 1, bias=False)], 16\n    for width, stride in zip(widths, (1, 2, 2)):\n        for i in range(N):\n            layers.append(Block(cin, width, stride if i == 0 else 1))\n            cin = width\n    layers += [nn.BatchNorm2d(cin), nn.ReLU(), nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(cin, num_classes)]\n    return nn.Sequential(*layers)\n\nfor n, k in [(40, 1), (40, 2), (40, 4), (16, 8), (22, 8), (28, 10)]:\n    params = sum(p.numel() for p in wrn(n, k).parameters())\n    print(f\"WRN-{n}-{k}：各グループ{(n - 4) // 6}ブロック、チャネル{16*k}/{32*k}/{64*k}、パラメータ{params / 1e6:.1f}M\")\n```\n\n```text\nWRN-40-1：各グループ6ブロック、チャネル16/32/64、パラメータ0.6M\nWRN-40-2：各グループ6ブロック、チャネル32/64/128、パラメータ2.2M\nWRN-40-4：各グループ6ブロック、チャネル64/128/256、パラメータ8.9M\nWRN-16-8：各グループ2ブロック、チャネル128/256/512、パラメータ11.0M\nWRN-22-8：各グループ3ブロック、チャネル128/256/512、パラメータ17.2M\nWRN-28-10：各グループ4ブロック、チャネル160/320/640、パラメータ36.5M\n```\n\nこれらの数字は、論文の表のパラメータ数と一致します。同じ40層で$k$を1から2、さらに4にすると、パラメータは0.6Mから2.2M、8.9Mになり、毎回およそ4倍です。逆に見ると、WRN-16-8はたった16層なのに、パラメータはすでに40層のWRN-40-4より多くなっています。\n\n### ブロックの中に何を置くか\n\nNiNのように$1\\times1$畳み込みを混ぜるべきでしょうか？著者らはブロックの構造を$B(M)$と書きます。$M$はブロック内の各畳み込み層のカーネルサイズです。たとえば$B(3,3)$は元の基本ブロック、$B(3,1,3)$は2層の$3\\times3$のあいだに$1\\times1$を1層挟んだものです。\n\nこの実験はどれも$k=2$で、層数を調整してパラメータ数を近づけ、CIFAR-10でそれぞれ5回学習させた中央値をとっています。\n\n| ブロック | 深さ | パラメータ | 1エポック（秒） | CIFAR-10誤り率 |\n| --- | ---: | ---: | ---: | ---: |\n| $B(1,3,1)$ | 40 | 1.4M | 85.8 | 6.06% |\n| $B(3,1)$ | 40 | 1.2M | 67.5 | 5.78% |\n| $B(1,3)$ | 40 | 1.3M | 72.2 | 6.42% |\n| $B(3,1,1)$ | 40 | 1.3M | 82.2 | 5.86% |\n| **$B(3,3)$** | 28 | 1.5M | 67.5 | **5.73%** |\n| $B(3,1,3)$ | 22 | 1.1M | 59.9 | 5.78% |\n\n*表：原論文Table 2から抜粋。*\n\n$B(3,3)$が最も良いものの、差はわずかです。$B(3,1)$と$B(3,1,3)$はパラメータが少なめで、成績はほぼ同じです。ここから著者らは、パラメータ数が近いブロックは性能もほぼ同じだと判断し、以降は$3\\times3$畳み込みに統一しています。\n\n1ブロックには何層置けばよいのでしょうか？著者らはWRN-40-2の総層数とパラメータ数（2.2M）を固定し、各ブロックの層数$l$だけを変えました。\n\n| $l$ | 1 | 2 | 3 | 4 |\n| --- | ---: | ---: | ---: | ---: |\n| CIFAR-10誤り率 | 6.69% | **5.43%** | 5.65% | 5.93% |\n\n*表：原論文Table 3から抜粋。*\n\n総層数が固定なので、$l$が大きいほどブロックは少なくなり、残差接続も減ります。著者らは、$l=3$、$l=4$で悪くなるのは、残差接続が減ってネットワークが最適化しにくくなるからだと推測しています。1層だけの$l=1$は、さらにはっきり悪くなります。ちょうど良いのは2層、つまり元の$B(3,3)$です。\n\nひととおり試してみると、ブロック内部の設計はどれも振り出しに戻り、動かせるのは幅$k$だけになりました。\n\n### dropoutをブロックに入れる\n\n広くするとパラメータが急増するので、正則化が必要になります。BN自体にも正則化の効果はありますが、通常は大量のデータ拡張と組み合わせる必要があり、著者らはそれに頼りたくありませんでした。\n\nそこで、ブロック内の2層の畳み込みのあいだ、ReLUの後にdropoutを1層加えます。Figure 1(d)の形です。コードで書くと、先ほどの`Block`の2つ目のReLUの後に`nn.Dropout`を1層足すことになります。\n\n```python\n        self.body = nn.Sequential(\n            nn.BatchNorm2d(cin), nn.ReLU(), nn.Conv2d(cin, cout, 3, stride, 1, bias=False),\n            nn.BatchNorm2d(cout), nn.ReLU(), nn.Dropout(0.3),   # 2層の畳み込みのあいだ\n            nn.Conv2d(cout, cout, 3, 1, 1, bias=False))\n```\n\nResNet v2でも残差ブロックの中でdropoutを試していますが、そちらはショートカット上に置いたもので、結果は悪化しました。ここでのdropoutは残差分岐にしか触れず、ショートカットはきれいなままです。確率は交差検証で決め、CIFARでは0.3、SVHNでは0.4です。\n\n## 考察\n\nImageNetを除き、すべての実験でpre-activation ResNetを基準にしています。CIFAR-10とCIFAR-100は$32\\times32$のカラーの小さな画像で、どちらも学習用5万枚、テスト用1万枚、クラス数はそれぞれ10と100です。データ拡張は水平反転とランダムクロップだけです。SVHNはストリートビューに写った家の番地の数字で、約60万枚あり、データ拡張は一切しません。\n\n### 幅と深さをどう配分するか\n\n| 深さ | $k$ | パラメータ | CIFAR-10 | CIFAR-100 |\n| ---: | ---: | ---: | ---: | ---: |\n| 40 | 1 | 0.6M | 6.85% | 30.89% |\n| 40 | 2 | 2.2M | 5.33% | 26.04% |\n| 40 | 4 | 8.9M | 4.97% | 22.89% |\n| 40 | 8 | 35.7M | 4.66% | – |\n| 28 | 10 | 36.5M | **4.17%** | 20.50% |\n| 28 | 12 | 52.5M | 4.33% | **20.43%** |\n| 22 | 8 | 17.2M | 4.38% | 21.22% |\n| 22 | 10 | 26.8M | 4.44% | 20.75% |\n| 16 | 8 | 11.0M | 4.81% | 22.07% |\n| 16 | 10 | 17.1M | 4.56% | 21.59% |\n\n*表：原論文Table 4から抜粋。CIFARのテスト誤り率で、画像はZCA白色化で前処理しています。*\n\nまず深さを固定して見ます。40層、22層、16層のネットワークは、$k$が大きいほど誤り率がおおむね低くなります。唯一の小さな例外は22層で$k=8$から$k=10$にしたときで、CIFAR-10は4.38%から4.44%にわずかに上がりますが、CIFAR-100はまだ下がっています。\n\n次に幅を固定して見ます。$k=8$では、深さを16層から22層に増やすと良くなりますが、40層まで増やすとかえって悪くなり、WRN-40-8はWRN-22-8に負けています。WRN-40-8のパラメータは35.7Mあり、著者らは、深さと幅を両方増やしてパラメータがある程度以上に多くなると、より強い正則化が必要になると考えています。\n\n### 1000層のResNetと比べる\n\n続いて、当時最強だった細長いネットワークと真っ向から比べます。この実験では一般的な平均／標準偏差による正規化に切り替えていて、ResNetシリーズの論文の前処理と同じです。dropoutもどれも使っていません。\n\n| ネットワーク | 深さ-$k$ | パラメータ | CIFAR-10 | CIFAR-100 |\n| --- | --- | ---: | ---: | ---: |\n| 元のResNet | 110 | 1.7M | 6.43% | 25.16% |\n| 元のResNet | 1202 | 10.2M | 7.93% | 27.82% |\n| Stochastic Depth | 1202 | 10.2M | 4.91% | – |\n| pre-act ResNet | 164 | 1.7M | 5.46% | 24.33% |\n| pre-act ResNet | 1001 | 10.2M | 4.92%（4.64%） | 22.71% |\n| WRN | 40-4 | 8.9M | 4.53% | 21.18% |\n| WRN | 16-8 | 11.0M | 4.27% | 20.43% |\n| WRN | 28-10 | 36.5M | **4.00%** | **19.25%** |\n\n*表：原論文Table 5から抜粋。括弧内はResNet v2がバッチサイズ64で学習した結果で、ほかの数字はすべてバッチサイズ128です。*\n\nWRN-40-4とResNet-1001はパラメータ数がほぼ同じ（8.9Mと10.2M）で、層数は25分の1しかないのに、両方のデータセットで勝っています。ここから著者らは、このパラメータ規模では、深くしても広くした場合以上の正則化効果は得られないと考えています。\n\nWRN-28-10のパラメータはResNet-1001の3.6倍です。当時は、深さには正則化の効果があり、幅は過学習しやすいと広く考えられていたので、その説に従えば過学習するはずです。実際には、同じバッチサイズで比べると、CIFAR-10で0.92ポイント、CIFAR-100で3.46ポイント上回りました。\n\n### 広いほうが速い\n\n[![棒グラフで、縦軸は時間（ms）。左の青い2本は細長いネットワークで、164層が85 ms、1000層が512 ms。右の赤い3本は広いネットワークで、WRN-40-4が68 ms、WRN-16-10が164 ms、WRN-28-10が312 ms。各棒の横にCIFAR-10のテスト誤り率が書かれている](/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png)](/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png)\n\n*原論文Figure 4。[**v4 PDFの12ページ**](https://arxiv.org/pdf/1605.07146v4#page=12)から抜粋。バッチサイズ32で、順伝播と逆伝播を1回行う時間です（Titan X、cuDNN v5）。横軸のラベルは深さ、または深さ-$k$です。*\n\n青は細長いネットワーク、赤は広いネットワークです。1000層の細長いResNetは1バッチに512 msかかります（1000層が一列に並んで順番待ちでは、速くなりようがありません）。正解率がほぼ同じWRN-40-4は68 msで済み、7倍以上速くなっています。最も正確なWRN-28-10はパラメータが何倍も多いのに、それでも1000層のネットワークより1.6倍速いのです。\n\n差は、先ほど触れたGPUの特性から来ています。広い畳み込み層は大きなテンソルを一度に処理するので、GPUの並列計算をフルに使えます。細長いネットワークは1000層の小さな畳み込みが一列に並んでいて、どの層も前の層の計算が終わるのを待たなければなりません。\n\n### dropoutの効果\n\n| 深さ | $k$ | dropout | CIFAR-10 | CIFAR-100 | SVHN |\n| ---: | ---: | :---: | ---: | ---: | ---: |\n| 16 | 4 | | 5.02% | 24.03% | 1.85% |\n| 16 | 4 | ✓ | 5.24% | 23.91% | 1.64% |\n| 28 | 10 | | 4.00% | 19.25% | – |\n| 28 | 10 | ✓ | **3.89%** | **18.85%** | – |\n| 52 | 1 | | 6.43% | 29.89% | 2.08% |\n| 52 | 1 | ✓ | 6.28% | 29.78% | 1.70% |\n\n*表：原論文Table 6から抜粋。平均／標準偏差による前処理で、CIFARの数字は5回の中央値です。*\n\nCIFARでの改善は大きくありません。WRN-28-10にdropoutを加えると、誤り率はCIFAR-10で0.11ポイント、CIFAR-100で0.4ポイント下がります。パラメータの少ないWRN-16-4では、CIFAR-10でむしろわずかに悪くなりました。\n\nSVHNでは効果がはっきりしていて、広いネットワークも細いネットワークも0.2〜0.4ポイント改善しています。SVHNではデータ拡張を一切していないので、著者らは、ここではBNが過学習していると考えています。dropoutがないと、学習損失は非常に低いところまで下がります。\n\n著者らはまた、最初に学習率を下げた後、損失と検証誤り率が突然そろって上がり、次に学習率を下げるまで高い値で振動することにも気づきました。原因はweight decayだと突き止めましたが、weight decayを小さくすると正解率がはっきり落ちてしまいます。dropoutは、多くの場合この現象を部分的に解消してくれます。\n\n著者らは各データセットでの単一モデルの最良結果もまとめています。dropoutを加えたWRN-40-10はCIFAR-10とCIFAR-100で3.8%と18.3%、dropoutを加えたWRN-16-8はSVHNで1.54%を達成しました。\n\n### ImageNetでは中央の層を広げる\n\nImageNetでは、著者らはまずResNet-18やResNet-34のような基本ブロックのネットワークを1.5〜3倍に広げました。ここでも広げることは効果があり、パラメータ数が近いネットワークなら、深さが倍違っても正解率はほぼ同じでした。ただ、これらのネットワークはパラメータが数千万から1億を超え、それでもずっとパラメータの少ないボトルネック型のネットワークにはかないません。たとえば2倍に広げたWRN-34は86.0Mのパラメータでtop-1誤り率23.39%ですが、ResNet-101は44.5Mのパラメータだけで22.44%を達成しています。\n\n著者らは、ボトルネックがもともとImageNetに向いているのか、このタスクにはより深いネットワークが必要なのか、そのどちらかだろうと推測しています。そこでResNet-50から出発し、ボトルネックの中央にある$3\\times3$畳み込みだけを2倍に広げて、WRN-50-2-bottleneckを作りました。\n\n| ネットワーク | Top-1誤り率 | Top-5誤り率 | パラメータ | 1バッチの時間（ms） |\n| --- | ---: | ---: | ---: | ---: |\n| ResNet-50 | 24.01% | 7.02% | 25.6M | 49 |\n| ResNet-101 | 22.44% | 6.21% | 44.5M | 82 |\n| ResNet-152 | 22.16% | 6.16% | 60.2M | 115 |\n| **WRN-50-2-bottleneck** | **21.9%** | **6.03%** | 68.9M | 93 |\n| pre-ResNet-200 | 21.66% | 5.79% | 64.7M | 154 |\n\n*表：原論文Table 8から抜粋。ILSVRC-2012検証セット、シングルクロップで、時間はバッチサイズ16で計測しています。*\n\nWRN-50-2はたった50層でResNet-152を上回り、速度でも勝っています。200層のpre-activation ResNetと比べると誤り率はわずかに高いものの、1バッチ93 msで済み、相手は154 msかかります。著者らは、さらに大きなボトルネック型のネットワークはGPU 8枚のマシンがないと学習できないため、それ以上は試していないと率直に書いています。\n\nこのネットワークが、torchvisionの`wide_resnet50_2`です。ResNet-50と最後のブロックを取り出して比べてみましょう。\n\n```python\nfrom torchvision.models import resnet50, wide_resnet50_2\n\nfor name, build in [(\"ResNet-50\", resnet50), (\"Wide ResNet-50-2\", wide_resnet50_2)]:\n    model = build(weights=None)\n    last = model.layer4[-1]\n    widths = (last.conv1.in_channels, last.conv2.in_channels, last.conv3.out_channels)\n    params = sum(p.numel() for p in model.parameters())\n    print(f\"{name}：最後のブロック{widths[0]}-{widths[1]}-{widths[2]}、パラメータ{params / 1e6:.1f}M\")\n```\n\n```text\nResNet-50：最後のブロック2048-512-2048、パラメータ25.6M\nWide ResNet-50-2：最後のブロック2048-1024-2048、パラメータ68.9M\n```\n\nブロックの入力と出力は2048チャネルのままで、中央の層だけが512から1024になっています。パラメータ数も論文の表と同じです。\n\n著者らはさらに、34層を2倍に広げたWRN-34-2でCOCO 2016物体検出チャレンジに参加し、単一モデルで35.2 mAPを達成して、ResNet-152やInception-v4をバックボーンとするモデルを上回りました。\n\n## 結論\n\n冒頭の問いに戻りましょう。ResNetは、本当にこんなに細くなければいけないのでしょうか？この論文の答えは「いいえ」です。CIFARでは、同じパラメータなら深さより幅に回したほうが効果的で、16層のWRNが1000層のResNetに勝ち、学習も何倍も速くなります。1000層のResNetには、どうやらサボっている層が少なくないようです。\n\nこの結論は主にCIFARから得られたものです。ImageNetでは、著者らは50層までしか試していません。理由はごく現実的で、より大きなネットワークの学習にはGPU 8枚のマシンが必要だったからです。\n\nその後、WRNはCIFARで最もよく使われるバックボーンの一つになりました。たとえば半教師あり学習の[FixMatch](https://arxiv.org/abs/2001.07685)はWRN-28-2を使っています。今度論文でこの名前を見かけたら、28層で幅を2倍にしたネットワークだとわかるはずです。\n","imageSizes":{"/content/papers/assets/eb123078c88654918b04d17b5ebccd1009fc7fbc33305ebd9ba853f2ad2cc024.png":{"width":1400,"height":500},"/content/papers/assets/a243b50be60b82d957c92fa85eab5061afe10a86de40a8855c992996066803b0.png":{"width":459,"height":542}}}
