TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

ResNet: 残差接続が深いネットワークの学習を可能にした理由とバッチ正規化

状態:ドラフト(2026-10-13)、一部実測。 4節の実験はノートPCのCPU(Python 3.9、PyTorch 2.8)で直接動かした値です(code/02_residual.py、約7分)。論文の数値は原文を開き、条件とともに転記しました。 作成ルール:実測データが基本であり、測定できなかったものは「未実測」と表記します。

目次

1. 深さのパラドックス

パート1のAlexNetは8層でした。層をさらに深くすればより複雑なパターンを学習できるため、性能も向上するはずです。しかし2015年、Heらは逆の現象を報告しました。畳み込みを単純に積み上げたネットワーク(plain)において、ImageNet検証用トップ1エラー(10パッチの平均)は以下のようになりました。

ネットワーク 18層 34層
単純な積み上げ 27.94% 28.54%(より悪い)
ResNet(残差接続) 27.88% 25.03%

(論文の表2)重要な点は、34層のplainが 学習エラーさえも 18層より高かったということです。テスト時のみ悪いのであれば過学習(暗記)ですが、学習データに対しても悪いのであれば「最適化ができていない」ことになります。

おかしな話です。34層のネットワークは18層のネットワークを模倣できるはずです。18層目をそのままコピーし、残りの16層を「入力をそのまま出力する層(恒等写像)」にすればよいからです。したがって、深いネットワークは少なくとも浅いネットワークと同等の性能を発揮するはずです。しかし、勾配降下法はその解を見つけられませんでした。複数の層による非線形変換が正確に恒等写像となるように重みを調整することは、想像以上に難しいのです。

2. 残差接続:差分だけを学ばせよ

그냥 쌓기 vs 잔차 연결 그냥 쌓은 블록 층(가중치 W₁) 층(가중치 W₂) y = F(x) 기울기는 W₂, W₁ 을 차례로 곱하며 지나가야 한다 잔차 블록 층(가중치 W₁) 층(가중치 W₂) + 지름길 (항등) y = x + F(x) ∂y/∂x = 1 + ∂F/∂x 「1」 덕분에 기울기가 지름길로 그대로 내려간다 F 가 0 이면 블록은 아무것도 안 하는 항등 함수다. 깊게 쌓아도 「적어도 얕은 망만큼」에서 출발한다.
図:単純に積み上げたブロックと残差ブロックの比較。残差ブロックには入力を出力に足し合わせるショートカットが存在する

ResNetの考え方は一言で表せます。ブロックに出力 H(x) 全体を学習させるのではなく、 入力に加える差分 F(x) = H(x) − x のみを学習させます。

그냥 쌓은 블록:   y = F(x)
잔차 블록:        y = x + F(x)        (F = 합성곱 두세 층)

このようにすると、恒等写像が容易になります。 F の重みを0付近にしておくだけで y = x になります。深く積み上げても「不要なブロックは何も行わない」状態から出発できます。ショートカット(skip connection)の計算は足し算が1回だけであるため、パラメータも時間もほとんど増加しません。

勾配の流れ

逆伝播において何が起きているかを確認すると、この設計がなぜ機能するのかがより明確になります。単純に積み上げたネットワークにおいて、前方層の勾配は後方層の微分を かけ合わせることで 得られます。かけ合わせる値が1より少しずつ小さいと勾配が0に消滅し(消失)、少しずつ大きいと爆発します。

残差ブロックをL個積み上げると、同じ著者らによる後続の論文(Identity Mappings, 2016)で示されている通り、以下のようになります。

x_L = x_l + Σ_{i=l..L-1} F(x_i)

∂E/∂x_l = ∂E/∂x_L · ( 1 + ∂/∂x_l Σ F(x_i) )

カッコ内の 1 が核心です。損失の勾配 ∂E/∂x_L がいかなる重みも経由せずに前方層までそのまま伝播します。第2項がミニバッチ全体で正確に−1になる可能性は低いため、重みがどれほど小さくても勾配が消失しないと論文では説明されています。掛け算の連鎖が足し算の連鎖に置き換わったのです。

この論文では、足し算の後に活性化関数を置かない「事前活性化」の順序(正規化 → ReLU → 畳み込み)を採用してショートカットを完全にクリーンに保ち、CIFAR-10において 1001層 のネットワークを学習させて4.62%のエラーを達成しました(ミニバッチ64、5回の中央値。ミニバッチ128の場合は4.92%)。同深度の元の順序のResNetは7.61%でした。

3. バッチ正規化

ResNetのブロックには、畳み込みごとに バッチ正規化(Batch Normalization, BN)が付随します。ミニバッチ内でチャネルごとに平均を引き、標準偏差で割った後、学習される2つのパラメータ(γ、β)によって再びスケールとシフトを行います。

x̂ = (x − 배치평균) / √(배치분산 + ε)
y  = γ · x̂ + β

推論時はバッチ統計量の代わりに、学習中に収集した移動平均を使用します。

元の論文による説明(2015)。 Ioffe・Szegedyは、学習中に前方の層の重みが変化すると、後方の層が受ける入力の分布が常に変化し(「内部共変量シフト」)、そのため学習率を小さくせざるを得ないと考察しました。正規化によって分布を固定すれば、大きな学習率を使用できるというわけです。その効果は絶大でした。同等の精度(検証72.2%)に到達するまでに、Inceptionは3,100万ステップかかったのに対し、BNを導入したバージョンは210万ステップでした(論文の「14倍少ないステップ」)。BNネットワーク6個のアンサンブルは、ImageNet検証用トップ5エラー4.9%、テスト4.82%でした。

後の研究による説明(2018)。 Santurkarらは、BNの効果は分布の安定化とはほとんど関係がないと反論しました。BN層の背後に意図的に時間経過に伴って変化するノイズを加えて分布を揺らしても性能はほとんど変わらず、BNが内部共変量シフトを軽減していない可能性を示す測定結果も提示しました。代わりに、BNは 損失地形を滑らかにし (損失と勾配のリプシッツ性を改善)、勾配がより信頼性の高い方向を指し示すようにすることを理論と実験によって示しました。

「なぜ機能するのか」についての説明が後に覆った好例です。実務上の結論は変わりません。BNは大きな学習率と深いネットワークの学習を容易にしてくれます。ただし、以下の実験のように BN単体では深さの問題は解決されません。

4. 実際にやってみる:単純な積み上げ vs 残差、正規化の有無

畳み込みの代わりに幅32の全結合層を用いたおもちゃの実験(トイ・プロブレム)です。2次元の点を2つの渦に分類するタスク(512個の点)をSGD+モーメンタムで500ステップ学習させました。ネットワークごとに学習率0.01・0.03・0.1の中から最適なものを選び(単一の学習率に固定すると、どのネットワークに有利な値を選んだかによって結論が左右されてしまうため)、3つのシードの中央値を使用しています。残差ブロックは、2番目の層の重みを0から開始して最初は恒等写像になるようにしました。

ネットワーク 深さ 開始時の第1層の勾配 最終損失 学習精度
単純な積み上げ 4 3.1×10⁻² 0.000 1.000
単純な積み上げ 16 1.2×10⁻² 0.028 0.996
単純な積み上げ 64 9.5×10⁻³ 0.692 0.520
残差 4 3.2×10⁻² 0.000 1.000
残差 16 4.1×10⁻² 0.577 0.855
残差 64 3.5×10⁻² 0.692 0.520
単純な積み上げ + BN 4 3.4×10⁻¹ 0.000 1.000
単純な積み上げ + BN 16 1.4 0.000 1.000
単純な積み上げ + BN 64 1.1×10⁴ 0.489 0.588
残差 + BN 4 3.2×10⁻² 0.000 1.000
残差 + BN 16 4.1×10⁻² 0.000 1.000
残差 + BN 64 3.5×10⁻² 0.000 1.000

(実測 2026-10-13、ノートPCのCPU。精度0.5はコイントスレベル。損失0.692 ≈ ln 2 は「何も学習できていない」状態。)

読み方です。

トイ・プロブレムであるため、実際のImageNetの規模に一般化することはできません。ただし、「深さ + ショートカット + 正規化」の役割分担は論文と同様の傾向を示しています。

5. 論文の数値

項目 値(論文) 条件
ILSVRC 2015分類1位 トップ5エラー 3.57% ImageNetテストサーバー、深さの異なる6つのモデルのアンサンブル
ResNet-152単体モデル トップ5 4.49% 検証セット
計算量 ResNet-152 113億 FLOPs、VGG-19 196億 積和算基準
CIFAR-10 110層 6.43%(5回中の最高、平均6.61)、1202層 7.93% 1202層は学習エラー0.1%未満 — 過学習
COCO検出 mAP@[.5,.95] 21.2 → 27.2(相対28%) Faster R-CNNのバックボーンをVGG-16 → ResNet-101、COCO検証セット

152層のほうがVGG-19(19層)よりも計算量が少ないのは、 ボトルネックブロック のおかげです。1×1畳み込みでチャネル数を削減し、3×3で計算を行った後、1×1で再び拡張します。コストの高い3×3はチャネル数が少ない状態で動作します。ResNet-50/101/152はこのブロックを使用しています。

最後の行は、本記事の範囲を超えた重要性を持ちます。分類用に学習したバックボーンを検出器に組み込むだけで、検出性能が大幅に向上しました。以降、ほとんどの検出・セグメンテーションモデル(パート5・6・8)がResNet系のバックボーンを起点としています。

6. 制限事項

7. 我々のプロジェクトとのつながり

次の記事は、解像度を維持する構造であるU-NetとHRNetについてです。ボールのような小さな物体の位置をピクセル単位で特定しなければならない際、パート1のプーリングがなぜ問題になるのか、そしてどのようにそれを回避するのかを見ていきます。

TTの一言。 深層ネットに「全部描き直して」ではなく「直すところだけ教えて」と言ったら、64層も学習できました。足し算1つのパワーです。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます