最適化アルゴリズム

勾配クリッピング こうばいくりっぴんぐ

勾配クリッピングGradient Clipping勾配爆発RNNLSTM学習安定化
勾配クリッピングについて教えて

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

勾配が大きくなりすぎた(爆発しそうな)ときに、一定の値を超えないよう「バッサリ切る(クリッピング)」のが勾配クリッピングだよ。スピードが出すぎた車にリミッターをかけるイメージで、LSTMや大規模モデルの学習安定化に欠かせないんだ!


勾配クリッピングとは

勾配クリッピング(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. 全パラメータの勾配ベクトルを連結して1つのベクトルを作る
  2. そのL2ノルムを計算:g_norm = √(Σ grad²)
  3. g_norm > max_norm なら全勾配を max_norm / g_norm 倍にスケールダウン

歴史と背景

  • 1991年:勾配爆発問題がRNNで報告される
  • 2013年:Pascanuら「On the difficulty of training recurrent neural networks」でクリッピングを体系化
  • 2017年以降Transformerの大規模学習でも標準採用(GPTBERTなど)
  • 現在:LLMの学習では max_norm=1.0 が一般的な設定値

勾配クリッピングの種類

種類内容特徴
ノルムクリッピング全勾配のL2ノルムを閾値以下に制限方向を保ちながら縮小。最もよく使われる
値クリッピング各勾配要素の値を[-c, c]に制限シンプルだが方向が変わる場合がある

max_normの設定目安

モデル・タスク推奨 max_norm
RNN / LSTM1.0〜5.0
Transformer(テキスト)1.0
大規模言語モデル1.0
CNN(画像分類)通常不要

関連用語