勾配クリッピング こうばいくりっぴんぐ
勾配クリッピングGradient Clipping勾配爆発RNNLSTM学習安定化
勾配クリッピングについて教えて
勾配クリッピングとは
勾配クリッピング(Gradient Clipping) は、バックプロパゲーションで計算された勾配が一定の閾値を超えた場合に、強制的に縮小して安定範囲に収める技術です。特に勾配爆発(Exploding Gradient) への対処として使われます。
代表的な手法はノルムクリッピング(Norm Clipping) で、勾配ベクトルのL2ノルムが閾値 max_norm を超えた場合に、比率を保ちながらスケールダウンします。勾配の方向(どの方向にパラメータを動かすか)は変えずに、大きさだけを制限するため、学習の方向性は保ちつつ安定性を確保できます。
RNNやLSTMでは長いシーケンスを処理するため勾配爆発が起きやすく、勾配クリッピングはRNN系モデルでほぼ必須の技術となっています。また最近では大規模言語モデル(LLM)の学習でも標準的に使用されています。
ノルムクリッピングの計算
# PyTorchでの勾配クリッピング
import torch
optimizer.zero_grad()
loss.backward()
# 勾配クリッピング(パラメータ更新前に適用)
torch.nn.utils.clip_grad_norm_(
model.parameters(),
max_norm=1.0 # 勾配ノルムの上限(よく使われる値: 0.1〜5.0)
)
optimizer.step()
処理の流れ:
- 全パラメータの勾配ベクトルを連結して1つのベクトルを作る
- そのL2ノルムを計算:
g_norm = √(Σ grad²) g_norm > max_normなら全勾配をmax_norm / g_norm倍にスケールダウン
歴史と背景
- 1991年:勾配爆発問題がRNNで報告される
- 2013年:Pascanuら「On the difficulty of training recurrent neural networks」でクリッピングを体系化
- 2017年以降:Transformerの大規模学習でも標準採用(GPT・BERTなど)
- 現在:LLMの学習では
max_norm=1.0が一般的な設定値
勾配クリッピングの種類
| 種類 | 内容 | 特徴 |
|---|---|---|
| ノルムクリッピング | 全勾配のL2ノルムを閾値以下に制限 | 方向を保ちながら縮小。最もよく使われる |
| 値クリッピング | 各勾配要素の値を[-c, c]に制限 | シンプルだが方向が変わる場合がある |
max_normの設定目安
| モデル・タスク | 推奨 max_norm |
|---|---|
| RNN / LSTM | 1.0〜5.0 |
| Transformer(テキスト) | 1.0 |
| 大規模言語モデル | 1.0 |
| CNN(画像分類) | 通常不要 |
関連用語
- 勾配消失 / 勾配爆発 — 勾配クリッピングが対処する問題
- LSTM — 勾配クリッピングが特に重要なRNNアーキテクチャ
- RNN(再帰型ニューラルネットワーク) — 勾配爆発が起きやすいモデル
- Adam — 勾配クリッピングと組み合わせて使う最適化手法