{"notes":[{"id":"classic-cnns/stochastic-depth","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Stochastic Depth","subtitle":"今日はこの層がお休み","author":"Z. Yuan","paperDate":"2016-03-30","publishedOn":"2026-03-04","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":null,"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.9ec5945686f4.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":""}]},{"id":"classic-cnns/resnet","category":"classic-cnns","legacyPath":"classic-cnns/1512-resnet","legacySlug":"1512-resnet","legacyPaths":[],"title":"ResNet","subtitle":"畳み込みネットワーク 100 層","author":"Z. Yuan","paperDate":"2015-12-10","publishedOn":"2024-08-08","paperTitle":"Deep Residual Learning for Image Recognition","paperUrl":"https://arxiv.org/abs/1512.03385","bibliography":{"title":"Deep Residual Learning for Image Recognition","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1512.03385","pdfUrl":"https://arxiv.org/pdf/1512.03385","codeUrl":null,"preprint":{"id":"1512.03385","submittedOn":"2015-12-10","url":"https://arxiv.org/abs/1512.03385"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2016.90"},"citation":"@misc{classiccnnsresnet2015,\n  title = {{Deep Residual Learning for Image Recognition}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2015},\n  eprint = {1512.03385},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.03385}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet.cf4014e8baae.bib"},"thumbnail":{"src":"/content/papers/assets/b8fe87fe757249ea6d7bb667fef3196754b9f80e28bf842a69b540ca94585d08.jpg","width":1224,"height":408},"locale":"ja","path":"/content/papers/ja/classic-cnns/resnet.c2822db52f83.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":3},{"id":"討論","text":"討論","depth":2},{"id":"resnet-18-vs-resnet-34","text":"ResNet-18 vs ResNet-34","depth":3},{"id":"より深いボトルネックアーキテクチャ","text":"より深いボトルネックアーキテクチャ","depth":3},{"id":"imagenet-でのパフォーマンス","text":"ImageNet でのパフォーマンス","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"background","topic":"深い畳み込みネットワークの学習"},{"id":"classic-cnns/densenet","relation":"next","topic":"深い畳み込みネットワークの学習"}]},{"id":"classic-cnns/resnet-v2","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ResNet v2","subtitle":"ショートカットはきれいに","author":"Z. Yuan","paperDate":"2016-03-16","publishedOn":"2026-02-14","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":null,"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.2eccc1d938b8.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/densenet","category":"classic-cnns","legacyPath":"classic-cnns/1608-densenet","legacySlug":"1608-densenet","legacyPaths":[],"title":"DenseNet","subtitle":"すべて繋げる","author":"Z. Yuan","paperDate":"2016-08-25","publishedOn":"2024-07-02","paperTitle":"Densely Connected Convolutional Networks","paperUrl":"https://arxiv.org/abs/1608.06993","bibliography":{"title":"Densely Connected Convolutional Networks","authors":["Gao Huang","Zhuang Liu","Laurens van der Maaten","Kilian Q. Weinberger"],"url":"https://arxiv.org/abs/1608.06993","pdfUrl":"https://arxiv.org/pdf/1608.06993","codeUrl":null,"preprint":{"id":"1608.06993","submittedOn":"2016-08-25","url":"https://arxiv.org/abs/1608.06993"},"publication":{"venue":"CVPR","year":2017,"kind":"conference","url":"https://arxiv.org/abs/1608.06993"},"citation":"@misc{classiccnnsdensenet2016,\n  title = {{Densely Connected Convolutional Networks}},\n  author = {Gao Huang and Zhuang Liu and Laurens van der Maaten and Kilian Q. Weinberger},\n  year = {2016},\n  eprint = {1608.06993},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1608.06993}\n}\n","citationPath":"/content/papers/citations/classic-cnns/densenet.6f28153b67f7.bib"},"thumbnail":{"src":"/content/papers/assets/4f073a0fd1fc5b7415ca19c48934d180f9043fddc08301819a50ceb1b0ebfc69.jpg","width":1184,"height":828},"locale":"ja","path":"/content/papers/ja/classic-cnns/densenet.dfcad0329b64.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":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/resnet","relation":"background","topic":"深い畳み込みネットワークの学習"}]}],"text":"とても深いネットワークの学習には、一つのジレンマがあります。\n\n浅いネットワークでは、信号は順方向にも逆方向にもスムーズに流れ、学習も速いのですが、表現力は限られます。深いネットワークは表現力が高い反面、勾配が消え、前の層で計算した特徴が何層もの重みで洗い流され、学習時間も深さとともに長くなります。152層のResNetは、GPUを何枚も使っても、ImageNetでの学習に何週間もかかります。\n\nでは、学習時には浅いネットワークを、テスト時には深いネットワークを使えたらどうでしょうか？\n\n矛盾しているように聞こえます。2016年3月、コーネル大学のGao Huang、Yu Sun、Daniel Sedra、Kilian Q. Weinbergerと、清華大学のZhuang Liuがこの論文を公開し、のちにECCV 2016で発表しました。彼らのやり方はこうです。ネットワークはこれまでどおり深く作りますが、学習時にはミニバッチごとに一部の残差ブロックをランダムに取り除き、ショートカットだけを残します。\n\n## 問題の定義\n\n著者らは、とても深いネットワークが抱える三つの問題を挙げています。\n\n1. **勾配消失**：勾配は逆向きに伝わるあいだに小さな重みを何度も掛けられ、前の方の層に届くころにはとても小さくなっています。\n2. **順方向の特徴が少しずつ失われる**：入力の特徴や前の層で計算した特徴が、ランダムに初期化された重みを何度も掛けられ、後ろの方では「洗い流されて」しまうので、後ろの層は意味のある勾配の方向を見つけにくくなります。\n3. **学習時間が長すぎる**：順伝播と逆伝播の時間は、どちらも深さに比例します。\n\nResNetとHighway Networksはショートカットで最初の二つの問題に対処し、特徴と勾配が重み層を迂回できるようにしました。三つ目の問題は残っています。ネットワークが深ければ深いほど、1ステップごとに計算する層も多くなります。\n\n学習時には「平均すると」少し浅く、テスト時には深さをすべて保てるネットワークにする方法はないでしょうか？\n\n\n> [!TIP]\n> \n> ResNetの残差ブロックは、先に私たちのノートで確認できます。\n> \n> - **[[15.12] ResNet：畳み込みネットワーク 100 層](/blog/papers/classic-cnns/resnet)**\n\n\n## 問題の解決\n\n### ブロックをランダムに欠席させる\n\n著者らが使うのは、ResNetの元の残差ブロックそのものです。$\\ell$番目のブロックの出力は次のとおりです。\n\n$$\nH_\\ell = \\mathrm{ReLU}\\big(f_\\ell(H_{\\ell-1}) + \\mathrm{id}(H_{\\ell-1})\\big)\n$$\n\n$f_\\ell$は「畳み込み、BN、ReLU、畳み込み、BN」、$\\mathrm{id}$は恒等ショートカットです。\n\n確率的深さで増えるのは、ベルヌーイ確率変数$b_\\ell \\in \\{0, 1\\}$一つだけです。\n\n$$\nH_\\ell = \\mathrm{ReLU}\\big(b_\\ell\\, f_\\ell(H_{\\ell-1}) + \\mathrm{id}(H_{\\ell-1})\\big)\n$$\n\n$b_\\ell = 1$のときは、元の残差ブロックそのものです。$b_\\ell = 0$のときは残差分岐がまるごと消え、$\\mathrm{ReLU}(H_{\\ell-1})$が残ります。\n\nここで細かい点が一つあります。$H_{\\ell-1}$は前のブロックの最後のReLUの出力なので、もともと負にはなりません（最初のブロックの入力も、「畳み込み、BN、ReLU」の出力です）。そのため$\\mathrm{ReLU}(H_{\\ell-1}) = H_{\\ell-1}$となり、欠席したブロックはちょうど恒等写像になって、信号はそのまま次のブロックへ渡ります。\n\n$b_\\ell = 1$となる確率を$p_\\ell$と書き、著者らはこれを**生存確率**と呼んでいます。ミニバッチごとに抽選し直し、欠席に当たったブロックは、そのステップでは一切計算しません。順伝播も逆伝播もせず、重みも更新しません。\n\n### 前の層ほどよく出席する\n\n各ブロックの生存確率はどう決めればよいでしょうか。最も簡単なのは、すべて同じにすることです。著者らが勧めるのは線形減衰で、入力側を$p_0 = 1$、最後のブロックを$p_L$とし、そのあいだは比例して減らしていきます。\n\n$$\np_\\ell = 1 - \\frac{\\ell}{L}(1 - p_L)\n$$\n\n[![上半分は1.0、0.9、0.8、0.7、0.6、0.5と書かれた棒の列で、青い部分が生存確率を表し、左から右へだんだん短くなる。横の小さなアイコンが、activeとinactiveの二つのブロックの状態を説明している。下半分は花の写真がInputで、その後に5つの残差ブロックf1〜f5と、あいだのH1〜H4が続く。f3とf5には赤い×印が付いていて、今回はスキップされたことを示す](/content/papers/assets/620e6ddf909f1f405e38b6055bd732ae4c4b7c208f147e00b870a56642020c02.png)](/content/papers/assets/620e6ddf909f1f405e38b6055bd732ae4c4b7c208f147e00b870a56642020c02.png)\n\n*原論文Fig. 2。[**v3 PDFの5ページ**](https://arxiv.org/pdf/1603.09382v3#page=5)から抜粋。$p_0 = 1$、$p_L = 0.5$のときの線形減衰。最初のブロックの入力は、常に存在する$H_0$とみなします。*\n\n著者らの理由はこうです。前の方の層は低レベルの特徴を抽出し、それを後ろのすべての層が使うので、より安定して出席すべきだ。後の実験でも、線形減衰は一定の確率より良い結果でした。しかも結果は$p_L$にあまり敏感でないので、論文全体を通して$p_L = 0.5$を使っています。\n\nCIFARの実験でよく使われる110層ResNetを例にとると、残差ブロックは$L = 54$個です。\n\n```python\nimport torch\n\nL, p_L = 54, 0.5                                  # ResNet-110：残差ブロック54個\np = torch.tensor([1 - l / L * (1 - p_L) for l in range(1, L + 1)])\nprint(\"最初の三つのブロックの生存確率：\", [f\"{v:.3f}\" for v in p[:3]], \"、最後の三つ：\", [f\"{v:.3f}\" for v in p[-3:]])\nprint(\"期待深度：\", round(p.sum().item(), 2), \"、式 (3L-1)/4 =\", (3 * L - 1) / 4)\n\ntorch.manual_seed(0)\nactive = torch.bernoulli(p.expand(10000, L)).sum(dim=1)   # ミニバッチ10000個分を抽選する\nprint(\"実際のサンプリング：平均\", round(active.mean().item(), 2), \"ブロック、最少\", int(active.min()), \"、最多\", int(active.max()))\nprint(\"ありうるサブネットワークの数：2^54 =\", f\"{2 ** L:.3e}\")\n```\n\n```text\n最初の三つのブロックの生存確率： ['0.991', '0.981', '0.972'] 、最後の三つ： ['0.519', '0.509', '0.500']\n期待深度： 40.25 、式 (3L-1)/4 = 40.25\n実際のサンプリング：平均 40.25 ブロック、最少 28 、最多 51\nありうるサブネットワークの数：2^54 = 1.801e+16\n```\n\n学習時に1回あたり使うブロックは平均で約40個だけで、テスト時は54個すべてです。期待深度は$\\sum_\\ell p_\\ell = (3L-1)/4$で、およそ$3L/4$です。計算しなくて済む4分の1が、そのまま学習時間の節約になります。抽選されるネットワークの深さも毎回大きく違い、28ブロックから51ブロックまであります。特に短いネットワークを通る更新もあり、前の方の層へ勾配が届く経路もより直接的になります。\n\n### テスト時には生存確率を掛ける\n\nテスト時には、ネットワーク全体の容量を使うために、すべてのブロックが出席します。しかし学習時には、$f_\\ell$は全体の$p_\\ell$の割合の更新にしか現れず、次の層の重みはこの割合に合わせて調整されています。そこでテスト時には、各ブロックの出力にその生存確率を掛けます。\n\n$$\nH_\\ell^{\\text{Test}} = \\mathrm{ReLU}\\big(p_\\ell\\, f_\\ell(H_{\\ell-1}^{\\text{Test}}; W_\\ell) + H_{\\ell-1}^{\\text{Test}}\\big)\n$$\n\nブロックを一つ書いて、学習時とテスト時の出力を比べてみましょう。わかりやすくするため、ここでは残差関数に線形層を1つ使い、最後のReLUもひとまず省きます。\n\n```python\nimport torch\nimport torch.nn as nn\n\nclass StochasticDepthBlock(nn.Module):\n    def __init__(self, f, p):\n        super().__init__()\n        self.f, self.p = f, p                      # p：このブロックの生存確率\n\n    def forward(self, x):\n        if self.training:\n            if torch.rand(()) < self.p:            # 生存：通常どおり残差を計算する\n                return x + self.f(x)\n            return x                               # 生存しない：ブロック全体が恒等写像になる\n        return x + self.p * self.f(x)              # テスト：生存確率を掛ける\n\ntorch.manual_seed(0)\nblock = StochasticDepthBlock(nn.Linear(4, 4), p=0.6)\nx = torch.randn(1, 4)\n\nblock.train()\nwith torch.no_grad():\n    outs = torch.stack([block(x) for _ in range(20000)])\nblock.eval()\nwith torch.no_grad():\n    test = block(x)\n\nprint(\"学習時の出力の種類：\", torch.unique(outs.round(decimals=4), dim=0).shape[0], \"通り\")\nprint(\"学習時の出力の平均：\", [f\"{v:.3f}\" for v in outs.mean(0).squeeze()])\nprint(\"テスト時の出力：    \", [f\"{v:.3f}\" for v in test.squeeze()])\n```\n\n```text\n学習時の出力の種類： 2 通り\n学習時の出力の平均： ['-0.479', '0.711', '-1.017', '1.223']\nテスト時の出力：     ['-0.479', '0.713', '-1.017', '1.223']\n```\n\n学習時、このブロックの出力は、残差ありと残差なしの2通りしかありません。2万回の平均は、テスト時に$p = 0.6$を掛けた出力とほぼ同じです。\n\n\n> [!NOTE]\n> \n> 今のライブラリの多くは、inverted dropoutと同じように、この補正を学習時に移しています。生存したときに残差を生存確率で割っておけば、テスト時には何も変える必要がありません。たとえばtorchvisionの`torchvision.ops.stochastic_depth`では、引数`p`は「捨てられる」確率で、生存したときに入力を$1-p$で割ります。どちらのやり方も期待値は同じなので、コードを読むときは`p`がどちらを指しているかに注意してください。\n\n\n### なぜ効くのか？\n\n著者らは三つの理由を挙げています。\n\n- **学習が速くなる**：スキップされたブロックは計算しなくてよいので、順伝播と逆伝播の時間は、完全な深さではなく期待深度に従います。\n- **勾配が強くなる**：学習時のネットワークが短くなり、勾配が通る層の数が減るので、前の方の層が受け取る勾配が大きくなります。\n- **暗黙のアンサンブル**：54個のブロックがそれぞれ出席か欠席かなので、組み合わせは全部で$2^{54}$通りあります。ミニバッチごとに、重みを共有するサブネットワークを一つ抽選して更新し、テスト時には上の式でそれらを一つのネットワークにまとめます。ResNetの論文の記録破りの成績も、深さの異なるResNetのアンサンブルによるものでした。\n\nこのアンサンブルという見方はdropoutによく似ています。違いは、dropoutがネットワークを**細く**するのに対し、確率的深さはネットワークを**浅く**することです。著者らは、dropoutはbatch normalizationと組み合わせると効果が落ちることが多いとも述べています。BNを入れた110層ResNetでさまざまなdropout率を試してもほとんど改善しませんでしたが、確率的深さは同じネットワークでも効果がありました。\n\n## 考察\n\n### 誤り率と学習時間\n\n| 手法 | CIFAR-10+ | CIFAR-100+ | SVHN | ImageNet |\n| --- | ---: | ---: | ---: | ---: |\n| Highway Network | 7.60 | 32.24 | – | – |\n| Gen. Pool | 6.05 | 28.02 | 1.69 | – |\n| ResNet、固定深度 | 6.41 | 27.76 | 1.80 | 21.78 |\n| ResNet、確率的深さ | **5.25** | **24.98** | 1.75 | 21.98 |\n\n*表：原論文Table 1の一部の行を抜粋。テスト誤り率（%）で、「+」は標準的なデータ拡張を使ったことを表します。「固定深度」は、Heらの実験を著者ら自身が再現したものです。*\n\nCIFAR-10では110層ResNetを使い、500エポック学習させます。固定深度の誤り率は6.41%、確率的深さを加えると5.25%に下がり、相対的に18%の改善です。学習とネットワークの設定はまったく同じで、違いは学習時にブロックをランダムにスキップするかどうかだけです。CIFAR-100では同じネットワークで、27.76%から24.98%に下がりました。\n\n[![2枚の学習曲線。左がCIFAR-10、右がCIFAR-100での110層ResNet。赤線が固定深度のテスト誤り率、青線が確率的深さのテスト誤り率で、残りの2本の細い線は両者の学習損失。250エポック目に学習率が下がった後、青線は赤線よりはっきり低い。左図には6.41%と5.25%、右図には27.88%と24.98%が記されている](/content/papers/assets/757bc4adb848efac2620e3a37c465e58ddc4a4c93e54f3b664bcea91cab64ffe.png)](/content/papers/assets/757bc4adb848efac2620e3a37c465e58ddc4a4c93e54f3b664bcea91cab64ffe.png)\n\n*原論文Fig. 3。[**v3 PDFの8ページ**](https://arxiv.org/pdf/1603.09382v3#page=8)から抜粋。CIFAR-10（左）とCIFAR-100（右）のテスト誤り率と学習損失で、丸印は検証誤り率が最も低かったエポックです。*\n\n学習率が最初に下がった後、固定深度のテスト誤り率はほぼ止まりますが、確率的深さはまだ下がり続けます。著者らは、確率的深さのテスト誤り率は変動がやや大きいことにも気づき、学習中に深さが変わり続けるためだろうと推測しています。\n\nデータ拡張を使わない場合も、確率的深さはCIFAR-10とCIFAR-100の両方で約15%の相対的な改善を示しました。13.63%から11.66%へ、44.74%から37.8%へ下がっています。SVHNでは152層のネットワークを使い、固定深度は学習の第2段階で過学習し始めて誤り率1.80%、確率的深さは1.75%でした。\n\n学習時間の比較です。\n\n| | CIFAR-10+ | CIFAR-100+ | SVHN |\n| --- | ---: | ---: | ---: |\n| 固定深度 | 20時間42分 | 20時間51分 | 33時間43分 |\n| 確率的深さ | 15時間7分 | 15時間20分 | 25時間33分 |\n\n*表：原論文Table 2から抜粋。$p_L = 0.5$の線形減衰です。*\n\nどの組でも約4分の1の時間を節約していて、先ほど計算した期待深度と一致します。\n\n### 1200層\n\nResNetの論文は1202層のネットワークを試し、過学習してテスト誤り率7.93%と、110層より悪い結果になりました。著者らは同じ1202層ネットワークでこの実験をやり直し、300エポック学習させ、最初の10エポックは学習率0.01でウォームアップしました。\n\n固定深度の1202層ネットワークの誤り率は6.67%で、やはり110層の6.41%より悪くなります。確率的深さに替えると誤り率は4.91%で、固定深度の1202層より相対的に27%改善し、確率的深さの110層（5.25%）よりも良く、過学習の兆候もありません。著者らによれば、1000層を超えるネットワークが、より浅いネットワークよりさらにテスト誤り率を下げられることを示したのは、これが初めてです。\n\n\n> [!TIP]\n> \n> 同じ月、ResNetの著者らは別の道を進み、残差ユニットをpre-activationに作り替えて、1001層のResNetでCIFAR-10の4.92%（バッチサイズ64では4.62%）を達成しました。\n> \n> - **[[16.03] ResNet v2：ショートカットはきれいに](/blog/papers/classic-cnns/resnet-v2)**\n\n\n### ImageNetでは勝てなかった\n\nImageNetでは152層のResNetを使います。固定深度は90エポック学習して誤り率23.06%、確率的深さは90エポック目で23.38%と、少し悪い結果でした。著者らは、確率的深さの検証誤り率がまだはっきり下がり続けていることに気づきました。計算を25%節約できるので、30エポック多く学習させても、合計時間は固定深度の90エポックとほぼ同じです。追加で学習させると、確率的深さは21.98%になりました。ところが固定深度もさらに30エポック走らせると、21.78%に達しました。\n\nつまりこの設定では、確率的深さは正解率の面での利点をもたらしませんでした。著者らは匿名の査読者の言葉を引いています。ImageNetのモデルとCIFARのモデルは、まだ異なる段階にある。ImageNetに必要なモデルの複雑さは152層のResNetをはるかに超えるかもしれず、確率的深さが効果を見せるのは、もっと大きなモデルになってからかもしれない、と。\n\n### 勾配は本当に強くなるのか？\n\n[![折れ線グラフで、横軸はエポック（0〜500）、縦軸は最初の畳み込み層の平均勾配の大きさ（単位は10のマイナス5乗）。赤線が固定深度、青線が確率的深さ。2本の破線が250エポック目と375エポック目の学習率の低下を示し、勾配はこの2か所で大きく下がる。青線は常に赤線より上にあり、学習率が下がった後は差がよりはっきりする](/content/papers/assets/6e62eb722549bcdd22e104076055f0d6e70ad5e66c660f0e827fcfa67318c9a1.png)](/content/papers/assets/6e62eb722549bcdd22e104076055f0d6e70ad5e66c660f0e827fcfa67318c9a1.png)\n\n*原論文Fig. 7。[**v3 PDFの12ページ**](https://arxiv.org/pdf/1603.09382v3#page=12)から抜粋。CIFAR-10での、最初の残差ブロックの最初の畳み込み層の、エポックごとの平均勾配の大きさです。破線は学習率を10で割った時点です。*\n\n2回の大きな低下は、学習率のスケジュールによるものです。確率的深さの勾配は常に大きく、学習率が下がった後は差がよりはっきりします。これは、勾配消失を和らげるという著者らの主張を支持しています。\n\n### 生存確率はいくつにすべきか？\n\n[![左図：CIFAR-10での110層ResNetのテスト誤り率が、生存確率p_Lに応じてどう変わるか。実線が線形減衰、破線が一定の確率、赤い破線が固定深度の6.41%。線形減衰の曲線はp_Lが0.5付近で最も低く約5.25%で、1.33xの高速化と記されている。p_Lが0.2でもまだ固定深度に近く、1.67xと記されている。一定の確率の曲線は大部分で高めだが、p_Lが約0.8のところでだけ線形減衰を下回り、p_Lが0.5のところに2xと記されている。右図：ヒートマップで、縦軸はp_L（1.0〜0.5）、横軸はネットワークの深さ（20〜110層）、マス目の中はテスト誤り率。20層ではp_Lが0.9〜0.7のあいだなら固定深度より良く、それより小さいと悪くなる。110層ではp_Lが0.5のとき最も良い。最も低い値はおおむね対角線に沿って並ぶ](/content/papers/assets/1f923643ee1fd74e75ef508bccb935e721a1b51f610ca3dcbac82168dc0573ad.png)](/content/papers/assets/1f923643ee1fd74e75ef508bccb935e721a1b51f610ca3dcbac82168dc0573ad.png)\n\n*原論文Fig. 8。[**v3 PDFの13ページ**](https://arxiv.org/pdf/1603.09382v3#page=13)から抜粋。左：さまざまな$p_L$での110層ResNetのCIFAR-10テスト誤り率。右：さまざまな$p_L$とネットワークの深さでのテスト誤り率で、$p_L = 1$の行が固定深度です。*\n\n$p_L$はこの手法の唯一のハイパーパラメータです。左図から次のことがわかります。\n\n1. $p_L$を適切に設定すれば、どちらの規則も固定深度より良い結果になります。\n2. 大半の$p_L$では、線形減衰のほうが一定の確率より良い結果になります。\n3. 線形減衰は$p_L$にあまり敏感でなく、$p_L$が0.4〜0.8のあいだならどれも良い結果になります。\n4. $p_L = 0.2$でも、線形減衰の誤り率は固定深度と同程度で、学習時間は40%短くなります。\n\n右のヒートマップは深さも加えたものです。20層のネットワークでは、少しだけスキップする（$p_L$が0.9〜0.7）と固定深度より良くなりますが、それ以上スキップすると悪くなり、$p_L = 0.5$では誤り率が8.31%から9.39%に上がります。110層のネットワークでは$p_L = 0.5$が最も良い結果です。成績の最も良いマス目はおおむね対角線に沿っていて、ネットワークが深いほど、より積極的なスキップに耐えられます。確率的深さが固定深度をはっきり上回るにはネットワークが十分に深い必要がありますが、浅めのネットワークでも、控えめにスキップすれば効果があります。\n\n## 結論\n\n確率的深さは学習の方法で、テスト時のネットワークは変えません。学習時に残差ブロックをランダムにスキップして期待深度を約4分の3にし、テスト時には生存確率を使ってすべてのブロックをまとめます。実験では、CIFARとSVHNの誤り率がどちらも下がり、学習時間は約4分の1短くなり、1202層のネットワークも過学習しなくなりました。一方、ImageNetの152層ResNetでは、正解率の面での利点は見られませんでした。\n\nいくつかのライブラリでは、DropPathという名前で登場します。この論文のGao Huang、Zhuang Liu、Kilian Q. Weinbergerは数か月後にDenseNetを提案し、その論文の冒頭で確率的深さを引用しています。層をランダムにスキップしても学習できるのなら、残差ネットワークの多くの層の寄与は実は小さい、というわけです。\n\n\n> [!TIP]\n> \n> DenseNetについては、私たちのノートをどうぞ。\n> \n> - **[[16.08] DenseNet：すべて繋げる](/blog/papers/classic-cnns/densenet)**\n\n\n確率的深さの使い方は簡単です。学習時には各残差分岐にランダムな0か1を掛け、テスト時にはそれを生存確率に置き換えます。今のライブラリの多くは、torchvisionの`stochastic_depth`のように学習時に生存確率で割る形に変えているので、テスト時には何も変える必要がありません。\n\n著者らは当時、確率的深さがImageNetで効果を見せるのは、もっと大きなモデルになってからかもしれないと推測していました。その後、[ConvNeXt](/blog/papers/classic-cnns/convnext)や[DINOv2](/blog/papers/contrastive-learning/dinov2)といった大きなモデルの学習レシピには、実際にどれも確率的深さが入っています。\n","imageSizes":{"/content/papers/assets/620e6ddf909f1f405e38b6055bd732ae4c4b7c208f147e00b870a56642020c02.png":{"width":963,"height":339},"/content/papers/assets/757bc4adb848efac2620e3a37c465e58ddc4a4c93e54f3b664bcea91cab64ffe.png":{"width":965,"height":372},"/content/papers/assets/6e62eb722549bcdd22e104076055f0d6e70ad5e66c660f0e827fcfa67318c9a1.png":{"width":756,"height":345},"/content/papers/assets/1f923643ee1fd74e75ef508bccb935e721a1b51f610ca3dcbac82168dc0573ad.png":{"width":973,"height":422}}}
