ResNet効果検証プロジェクト - 勾配消失とスキップ接続の実証実験
はじめに
深層学習の発展において、ResNet(Residual Network) は非常に革命的な存在でした。
本記事では、Resnetの論文 (参考文献 Deep Residual Learning for Image Recognition:http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html )を参考にResNet論文当時の技術水準に合わせて比較実験を行い、勾配消失問題の再現と、それをスキップ接続で解決するResNetの効果を実証しました。
このプロジェクトは ResNet論文の要点整理記事 をベースに、Github上でプロジェクト(https://github.com/masararutaru/Resnet) を作り、前回同様主にCursorとChatGPTを用いました。
本記事は、以前書いた PyTorch基礎記事 の続編として位置づけています。
また、論文の読み方は 落合陽一式の論文まとめフォーマット に従い、別途「ResNet論文まとめ記事」を作成しました。
実験概要
比較対象モデル
-
SimpleCNN_CIFAR10
- 浅い3層CNN
- ベースラインモデル
-
DeepCNN_CIFAR10
- 深い10層CNN
- ResNetなし
- 勾配消失問題の再現用
-
ResNet_CIFAR10
- 深い10層CNN
- スキップ接続あり
- 勾配消失を回避し学習を成立させる
技術レベルをResNet論文当時に統一
- BatchNorm除去
- 学習率スケジューリング無効
- Weight Decay = 0
実験環境
ハードウェア環境
- GPU: なし(CPU環境)
- PyTorch: 2.8.0+cpu
- CUDA: 利用不可
- 実行環境: Windows 10 (Git Bash)
学習条件
- エポック数: 20
- バッチサイズ: 128
- 学習率: 0.001
- オプティマイザ: SGD (momentum=0.9, weight_decay=0.0)
- 損失関数: CrossEntropyLoss
- 学習率スケジューラー: 無効(step_size=0)
- シード値: 42(再現性確保)
データローダー設定
- num_workers: 2
- pin_memory: True(CPU環境のため実質効果なし)
データセット(CIFAR-10)
- クラス数: 10クラス
- 画像サイズ: 32×32ピクセル
- チャンネル数: 3(RGB)
- 訓練データ: 50,000枚
- テストデータ: 10,000枚
前処理
-
訓練時:
- RandomCrop(32, padding=4)
- RandomHorizontalFlip()
- ToTensor()
- Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2470, 0.2435, 0.2616])
-
テスト時:
- ToTensor()
- Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2470, 0.2435, 0.2616])
実装
モデル概要
# SimpleCNN_CIFAR10 (3層)
Conv(3→32) → ReLU → Pool → Conv(32→64) → ReLU → Pool → Conv(64→128) → ReLU → FC
# DeepCNN_CIFAR10 (10層、BatchNormなし)
Conv(3→64) → ReLU → Conv×4(64→64) → ReLU → Pool → Conv×3(64→128) → ReLU → Pool → Conv×2(128→256) → ReLU → FC
# ResNet_CIFAR10 (10層、スキップ接続あり)
Conv(3→64) → ResBlock×2(64→64) → ResBlock×2(64→128) → ResBlock×2(128→256) → FC
DeepCNNの学習失敗パターン
- 損失が 2.3026(log(10)) に張り付き
- 精度が 10%固定(ランダム予測レベル)
- 20エポックを通じて全く改善なし
勾配消失の分析
初期化直後の予測
Softmax出力: [0.1076, 0.0987, 0.0978, ...]
予測クラス: すべてクラス0
学習後の予測
Softmax出力: [0.1046, 0.0992, 0.0986, ...]
予測クラス: すべてクラス0
➡ 初期化直後と学習後がほぼ同じ
➡ 重みが更新されず、勾配消失が起きている
技術的考察
勾配消失の原因
-
深い層での予測値の標準偏差の減少
- conv1: std ≈ 0.11
- conv10: std ≈ 0.012
-
ReLUの特性
- 負の値が0になるため、勾配が途中で消える
-
初期化の限界
- Kaiming初期化でも深いネットでは不十分
ResNetの解決策
-
スキップ接続で勾配を直接伝播
- 勾配が消えにくくなる
-
恒等写像の学習
- 恒等マッピングを学習可能
- 深い層でも安定した学習が可能
まとめ
今回の実験で以下を実証しました:
-
勾配消失問題の再現
- DeepCNNで10%精度に停滞
-
スキップ接続の効果
- ResNetで83.98%精度を達成
-
技術的革新の証明
- 浅いCNN(70.75%)を超える性能を示した
おわりに
- 本記事では、ResNetの効果を数値で実証しました。
- ResNetは「勾配消失を避けるためのスキップ接続」というシンプルなアイデアで、深層学習を根本から変えた技術であることを再確認しました。
このプロジェクトは落合陽一式の論文まとめフォーマットに従ってまとめた
ResNet論文の要点整理記事 をベースにしています。
参考文献