Exploding Gradient
勾配爆発では、誤差逆伝播中に勾配が指数関数的に増大し、極端な重み更新、損失の急増、NaN値を引き起こします。原因、兆候、対処法について解説します。
勾配爆発は、逆伝播で計算された勾配が、深層型またはリカレント型のニューラルネットワークを逆方向に伝わるにつれて指数関数的に増大する学習上の障害です。勾配降下法がモデルの重みに非常に大きな更新を適用し、損失関数の値が急増するか、NaNまたはinfになり、学習が発散します。これは勾配消失問題とは正反対の現象です。Pascanu, Mikolov, and Bengioはリカレントニューラルネットワークにおける両方の問題を分析し、勾配爆発への対策として勾配ノルムクリッピングを提案しており、この手法は現在も深層学習のトレーニングにおける標準的な対策となっています。
勾配爆発が起きる理由#
連鎖律により、初期レイヤーに届く勾配は、後続のレイヤーごと、またはリカレントネットワークでは時間ステップごとの因子の積になります。これらの因子が一貫して1より大きいと、積は深さに応じて指数関数的に増大します。たとえば、1.5という因子が30レイヤーにわたって繰り返されると、信号は約190,000倍になります。よくある原因には、不適切な重みの初期化、高すぎる学習率、正規化されていない入力、リカレントモデルでの長いシーケンス、混合精度学習でのオーバーフローがあります。混合精度学習では、65,504を超えるFP16値はinfになります。損失曲線が突然急上昇するかNaNになる、勾配ノルムのログがステップ間で桁違いに増加する、重みがNaNになる、といった兆候が見られます。
予防と緩和#
最新の学習パイプラインの多くは、これらの対策をいくつか組み合わせています。
- 勾配クリッピング: すべての勾配のグローバルL2ノルムがしきい値を超えたとき、すべての勾配を同じ係数で縮小します。更新の方向は維持し、長さだけを制限します。
- バッチ正規化: バッチ正規化とレイヤー正規化は各レイヤーの活性化値を再スケーリングし、レイヤー間で信号のスケールを安定させ、損失ランドスケープを滑らかにします。
- 慎重な初期化: Xavier(Glorot)初期化とHe初期化は、レイヤー間で活性化値の分散がほぼ一定に保たれるように、初期重みをスケーリングします。
- 残差接続: スキップ接続により、各ブロックを迂回する恒等写像の経路が勾配に与えられます。そのため、バックワード信号は1つの長い積ではなく、複数の経路の和になります。
- 学習率ウォームアップ: 小さな学習率から始め、最初の数ステップで徐々に引き上げることで、重みとオプティマイザーの統計量が安定していない間に大きな更新が起きるのを防ぎます。
以下のコードでは、入力をそれぞれ1.5倍に増幅する30層のスタックを構築し、PyTorchで生成された勾配をクリッピングします。
import torch
from torch import nn
torch.manual_seed(0)
# 30 stacked linear layers, each initialized to amplify its input by 1.5x
layers = [nn.Linear(64, 64, bias=False) for _ in range(30)]
for layer in layers:
nn.init.orthogonal_(layer.weight, gain=1.5)
model = nn.Sequential(*layers)
loss = model(torch.randn(8, 64)).pow(2).mean()
loss.backward()
# clip_grad_norm_ rescales all gradients in place and returns their norm before clipping
norm_before = nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
norm_after = nn.utils.get_total_norm([p.grad for p in model.parameters()])
print(f"Gradient norm before clipping: {norm_before:.2e}, after: {norm_after:.2f}")クリッピング前の勾配ノルムは9.90e+10ですが、クリッピング後は1.00です。そのため、クリッピング前の勾配がどれほど大きくても、次のオプティマイザーのステップは上限内に収まります。
Ultralytics YOLO26の学習では、各ステップでこの対策を実行します。トレーナーは混合精度勾配のスケーリングを解除し、グローバルノルムを10.0にクリッピングします。それでもinfまたはNaN値が含まれる更新は、勾配スケーラーがスキップします。カスタムトレーナーでは上限を変更できます。たとえば、RT-DETRでは0.1に引き下げられます。
勾配爆発と勾配消失#
どちらの問題も、逆伝播におけるレイヤーごとの因子の積が原因です。因子が1より大きいと勾配爆発が起こり、不安定な更新、数値オーバーフロー、発散につながります。通常はクリッピングで対処します。因子が1より小さいと勾配はゼロに近づき、初期レイヤーが学習を停止します。通常はReLUなどの非飽和活性化関数、残差接続、LSTMなどのゲート付きリカレントユニットで対処します。正規化と慎重な初期化は、どちらの問題にも有効です。
実際のアプリケーション#
大規模言語モデルは長いテキストシーケンスを使って数十万ステップにわたり学習するため、損失の急上昇が既知の危険要因です。そこで、学習レシピでは勾配をクリッピングします。GPT-3はAdamを使用して学習され、グローバル勾配ノルムは1.0にクリッピングされました。
コンピュータビジョンでは、深い物体検出ネットワークを、高い学習率と混合精度を使ってCOCO規模のデータセットで学習するため、クリッピングと損失スケーリングによって、まれな極端なバッチが重みを破損するのを防ぎます。Transformerベースの検出器は、デコーダーのクロスアテンションを介した勾配が急増する可能性があるため、より影響を受けやすくなります。そのため、RT-DETRやDINOなどのDETR系モデルでは、通常、最大ノルムを0.1にしてクリッピングします。










