モメンタム付き勾配降下法シミュレーター 戻る
機械学習

モメンタム付き勾配降下法シミュレーター

機械学習の学習を支える最適化アルゴリズムを体験するツールです。学習率とモメンタム係数を変えると、通常の勾配降下法・モメンタム法・Nesterov加速勾配が細長い谷をどう降りていくかが、等高線上の軌跡と損失の収束曲線でリアルタイムに分かります。

パラメータ設定
学習率 η
1ステップで勾配方向にどれだけ進むか
モメンタム係数 γ
過去の速度をどれだけ引き継ぐか。0で通常GD相当
反復回数
最適化手法
勾配の使い方が異なる3つの更新則
損失曲面
谷の細長さ(条件数)を切り替え
計算結果
最終損失 f
最終 x
最終 y
反復回数
収束/発散
損失低減率 (%)
損失曲面の等高線と最適化軌跡

同心の楕円が損失 f の等高線、中央の点が最小値です。スタート地点 (−9, 4) から伸びる色付きの経路が更新の軌跡で、マーカーがその上を繰り返し進みます。

損失の収束曲線
手法の比較 — 最終損失
理論・主要公式

$$\text{GD: }\theta\leftarrow\theta-\eta\nabla f(\theta)$$

通常の勾配降下法。現在地 θ で勾配 ∇f を計算し、その逆向きに学習率 η だけ進む。

$$\text{Momentum: }v\leftarrow\gamma v-\eta\nabla f(\theta),\quad \theta\leftarrow\theta+v$$

モメンタム法。速度 v に過去の更新を γ の割合で残し、勾配で加速する。γ:モメンタム係数、η:学習率。

$$f(x,y)=\tfrac12\left(a\,x^{2}+b\,y^{2}\right),\quad \nabla f=(a\,x,\;b\,y)$$

本ツールの目的関数。Nesterov加速勾配は勾配を現在地ではなく先読み点 θ+γv で評価する点だけが異なる。条件数は b/a。

モメンタム付き勾配降下法とは

🙋
「勾配降下法」って、機械学習でよく聞きますけど、結局なにをしているんですか?
🎓
ざっくり言うと「坂道を下る」だけだよ。モデルの良し悪しを表す損失 f を地形だと思うと、いちばん低い谷底がベストなパラメータ。今いる場所の傾き(勾配 ∇f)を測って、その逆向きに学習率 η ぶん一歩進む。これを繰り返すと、だんだん谷底へ降りていく。式にすると θ ← θ − η∇f だね。左の手法を「通常の勾配降下」にして見てみて。
🙋
あ、軌跡がジグザグになりますね。まっすぐ谷底に行かないんですか?
🎓
そこがポイント。この「細長い谷」は縦方向(y)が急で横方向(x)がなだらかなんだ。通常GDは急な y 方向で行き過ぎて反対側へ、また戻って…と振動する。一方なだらかな x 方向はちょっとずつしか進まない。だから谷の壁を行ったり来たりしながら、ゆっくり横へ降りていく。これが「条件数の悪い」地形での勾配降下法の弱点なんだ。
🙋
なるほど…。じゃあ「モメンタム法」にすると何が変わるんですか?
🎓
坂道を「ボール」にして転がすイメージだよ。モメンタム法は速度 v を覚えていて、v ← γv − η∇f、θ ← θ + v と更新する。x 方向はずっと同じ向きの勾配だから速度がどんどん積み上がって加速する。y 方向は左右に振れるから、行きと戻りの速度が打ち消し合って振動が減衰する。手法をモメンタム法に切り替えてみて。軌跡のジグザグが一気に減って、損失曲線もすっと落ちるはずだ。
🙋
本当だ、滑らかになりました! Nesterov加速勾配というのもありますが、これはまた別物ですか?
🎓
考え方は同じで、勾配を測る「場所」だけが違う。通常のモメンタムは今いる場所で勾配を測るけど、Nesterovは「速度のぶん先に進んだらどこにいるか」を予測して、その先読み点で勾配を測る。先回りするから、谷底に近づいたとき早めにブレーキが効いて、行き過ぎが小さくなる。同じ η・γ でも Nesterov のほうが収束曲線がきれいなことが多いよ。実務では γ=0.9 に固定して、η を発散しない範囲でめいっぱい大きくする、というのが定番のチューニングだね。

よくある質問

モメンタム法は、勾配降下法に「速度」という記憶を加えた改良版です。更新式は v ← γv − η∇f、θ ← θ + v で、過去の更新方向 v を係数 γ(0〜0.99)で引き継ぎます。坂道を転がるボールのように、同じ向きの勾配が続く方向では速度が積み上がって加速し、左右に振動する方向では往復が打ち消し合って減衰します。これにより、細長い谷のような難しい地形でも通常の勾配降下法より速く・滑らかに最小値へ到達できます。
学習率 η は1ステップでどれだけ進むかを決めます。小さすぎると収束が遅く、大きすぎると最小値を飛び越えて発散します。本ツールの細長い谷(条件数20)では η を上げていくと、まず急な方向で振動が始まり、さらに上げると発散します。モメンタム係数 γ は過去の速度をどれだけ残すかで、0.9前後が定番です。γ を上げると加速しますが、上げすぎると行き過ぎ(オーバーシュート)が増えます。実務では γ=0.9 を固定し、η を発散しない範囲で最大に取るのが基本です。
通常のモメンタム法は現在地 θ で勾配を計算しますが、Nesterov加速勾配(NAG)は「速度のぶんだけ先に進んだ点」θ + γv で勾配を計算します。先読みすることで、最小値に近づきすぎたときに早めにブレーキをかけられ、オーバーシュートが小さくなります。本ツールで同じ η・γ でも Nesterov のほうが損失曲線の振動が小さく、より速く収束することが確認できます。多くの深層学習フレームワークが NAG をオプションで備えています。
損失曲面の「条件数」が違うためです。等方放物面(a=b=5)は条件数1で、どの方向も同じ曲率なので、勾配は常に最小値の方を向き、通常の勾配降下法でも素直に収束します。一方の細長い谷(a=1, b=20)は条件数20で、ある方向は急峻・別の方向はなだらかです。通常GDは急な方向で振動し、なだらかな方向はなかなか進みません。モメンタムはこの振動を打ち消し、なだらかな方向の前進を加速するので、条件数が大きいほど効果がはっきり表れます。

実世界での応用

ニューラルネットワークの学習:深層学習の重みは数百万〜数十億のパラメータを持ち、その損失地形は本ツールの谷よりはるかに複雑で、細長く曲がりくねっています。SGD(確率的勾配降下法)にモメンタムを組み合わせた「SGD with momentum」は、画像認識のResNetなど多くの定番モデルの学習で使われてきた基本中の基本です。モメンタムがないと振動で学習が遅く、ノイズの多いミニバッチ勾配にも振り回されやすくなります。

Adam など現代の最適化アルゴリズムの土台:現在広く使われる Adam・RMSProp・AdamW といった最適化手法も、内部にモメンタム(一次モーメントの指数移動平均)を持っています。本ツールで体験する「速度を貯めて加速し、振動を減衰させる」考え方は、これら最新アルゴリズムの中核そのものです。モメンタムの直感を持っておくと、学習がうまくいかないときのハイパーパラメータ調整がぐっと楽になります。

CAE・数値最適化の設計探索:構造最適化やトポロジー最適化、形状最適化でも、目的関数(重量・応力・コンプライアンス)を勾配で下げていく勾配法が使われます。設計変数のスケールがそろっていないと損失地形が細長い谷になり、収束が極端に遅くなります。モメンタムや変数の正規化(スケーリング)で条件数を改善するという発想は、機械学習だけでなく工学設計の最適化でも共通です。

逆解析・パラメータ同定:実験データに合うように材料モデルや境界条件のパラメータを推定する逆問題でも、誤差を損失として勾配降下で最小化します。観測ノイズや感度の偏りで損失地形が病的になりやすく、モメンタムや学習率スケジュールが収束の安定に効きます。本ツールの「発散」表示は、学習率を取りすぎたときに実際の逆解析でも起こる典型的な失敗です。

よくある誤解と注意点

まず多いのが、「学習率は大きいほど速く収束する」という誤解です。確かに小さすぎる η は収束を遅くしますが、大きすぎる η は最小値を飛び越えて損失が逆に増え、最後は発散します。本ツールの細長い谷では、η を最大の0.5に上げるとわずか数ステップで損失が爆発し、判定が「発散」になります。モメンタムを足すと実効的な歩幅がさらに大きくなるため、γ が大きいときは η をむしろ控えめにする必要があります。「発散したら、まず η を下げる」が鉄則です。

次に、「モメンタムは万能で、振動は必ず消える」という思い込み。モメンタムは振動を「減衰」させますが、γ を上げすぎると今度はモメンタムそのものが行き過ぎ(オーバーシュート)を生みます。最小値を勢いよく通り過ぎ、反対側まで行ってから戻ってくる、という別種の振動が出るのです。γ=0.99 のような極端な値では、収束までに余計な遠回りが増えることがあります。Nesterov加速勾配が先読みでブレーキをかけるのは、まさにこのオーバーシュートを抑えるための工夫です。

最後に、「収束したら損失はゼロになるはず」という誤解。本ツールの目的関数は最小値が原点で f=0 ですが、反復回数が有限なら最終損失は厳密にはゼロになりません。収束判定は「最終損失が初期損失の1%未満」という相対的な基準で行っています。実際の機械学習では、そもそも損失の最小値がゼロとは限らず(データのノイズや表現力の限界がある)、「これ以上下がらない平坦な底」に達したかどうかで収束を判断します。損失の絶対値ではなく、減り方が止まったかを見るのが実務の感覚です。

使い方ガイド

  1. 学習率(η)を0.01~0.1の範囲で設定し、モメンタム係数(γ)を0.0~0.99で調整します
  2. 反復ステップ数を100~10000の間で選択し、「シミュレート」ボタンをクリックして勾配降下法・モメンタム法・Nesterov加速勾配の3手法を同時実行します
  3. リアルタイムで損失関数の軌跡が描画され、最終損失f、最終座標(x,y)、収束判定、損失低減率(%)がそれぞれ表示されます

具体的な計算例

Rosenbrock関数f(x,y)=(1-x)²+100(y-x²)²において、η=0.001、γ=0.9、ステップ数5000回の設定で実行した場合、標準的な勾配降下法は最終損失f=0.85に対し、モメンタム法ではf=0.12、Nesterov法ではf=0.08まで低減されます。同じ条件でη=0.0001では収束が遅延し、最終損失f=2.3程度に留まります。学習率が大きすぎる(η=0.1)と振動が激化してf値が発散する傾向を観測できます。

実務での注意点

  1. 深層学習で入力層から隠れ層のウェイト更新時、γ=0.9~0.95の高いモメンタム係数は局所最適値脱出に有効ですが、バッチ正規化層直後では過度な加速が不安定化を招きます
  2. 自然言語処理の言語モデル微調整ではη=0.00001程度の極小学習率とγ=0.99を組み合わせると、損失振動を防ぎながら5000ステップで損失低減率95%以上を達成できます
  3. 画像分類タスク(ResNet学習)でNesterov法を使用する場合、γ=0.9設定下でη=0.01~0.001の範囲が推奨され、γ>0.95では最終損失が逆に増加する過剰加速状態に陥ります