ニューラルネットワーク

勾配消失 / 勾配爆発 こうばいしょうしつ / こうばいばくはつ

勾配消失勾配爆発バックプロパゲーション深層学習残差接続学習の不安定化
勾配消失 / 勾配爆発について教えて

簡単に言うとこんな感じ!

深いニューラルネットを学習するとき、エラー情報(勾配)が逆向きに伝わるんだけど、層を重ねるうちにどんどん0に近づいて(消失)または爆発的に大きくなって(爆発)学習できなくなる問題だよ!電話ゲームで最初の人の声が最後まで届かなくなるイメージだね。


勾配消失 / 勾配爆発とは

勾配消失(Vanishing Gradient)勾配爆発(Exploding Gradient) は、深層ニューラルネットワークの学習における2つの重大な問題です。どちらもバックプロパゲーション(誤差逆伝播法) で勾配が層を逆向きに伝播する過程で起きます。

バックプロパゲーションでは、勾配は各層の微分値(ヤコビアン)を掛け合わせながら伝播します。もしこの値が1より小さい値の積なら指数関数的に0に向かって消失し、1より大きい値の積なら指数関数的に発散(爆発)します。

  • 勾配消失:浅い層の重みがほとんど更新されず、学習が止まったように見える
  • 勾配爆発:重みが極端に大きくなり、損失がNaN(数値計算の失敗)になる

特にSigmoid・tanhなどの活性化関数は勾配が最大でも0.25・1.0と小さいため、層数が増えると勾配消失が起きやすいことが知られています。


原因と対処法

問題主な原因対処法
勾配消失Sigmoid/tanh活性化関数、深いネットReLU使用、残差接続、適切な初期化
勾配爆発大きい重み初期値、長いRNN系列勾配クリッピング、適切な初期化
両方不適切な重み初期化Xavier/He初期化
# 勾配消失を確認するコード例
import torch

# 勾配のノルムを確認
for name, param in model.named_parameters():
    if param.grad is not None:
        grad_norm = param.grad.norm().item()
        if grad_norm < 1e-7:
            print(f"勾配消失の疑い: {name}, ノルム={grad_norm:.2e}")
        elif grad_norm > 100:
            print(f"勾配爆発の疑い: {name}, ノルム={grad_norm:.2e}")

歴史と背景

  • 1991年:Hochreiterが卒業論文で勾配消失問題を初めて定式化
  • 1997年LSTMが提案され、RNNの勾配消失問題に対処
  • 2010年:ReLUの有効性が再認識され、CNNの勾配消失問題が大幅に緩和
  • 2015年ResNetの残差接続により、超深層CNNの学習が現実的に

活性化関数と勾配消失の関係

活性化関数最大勾配勾配消失のリスク
Sigmoid0.25高い(数層でほぼ消失)
tanh1.0中程度
ReLU1.0(正の入力)低い(Dead ReLU問題はあり)
Leaky ReLU1.0非常に低い
GELU約1.0低い

関連用語