Adam オプティマイザ シミュレーター 戻る
機械学習

Adam オプティマイザ シミュレーター

深層学習の学習を支える定番アルゴリズム Adam を体験するツールです。学習率・β₁・β₂を変えると、一次モーメント(モメンタム)と二次モーメント(適応的学習率)の組み合わせが細長い谷をどう降りていくかが、等高線上の軌跡と損失の収束曲線でリアルタイムに分かります。

パラメータ設定
学習率 α
1ステップの基本的な歩幅。√v̂ で正規化される
一次モーメント減衰 β₁
勾配の平均をどれだけ引き継ぐか(モメンタム)
二次モーメント減衰 β₂
勾配2乗の平均をどれだけ引き継ぐか(適応的学習率)
反復回数
損失曲面
谷の細長さ(条件数)を切り替え
計算結果
最終損失 f
最終 x
最終 y
反復回数
収束判定
損失低減率 (%)
損失曲面の等高線と Adam の軌跡

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

損失の収束曲線
最適化経路の比較 — Adam vs 通常GD
理論・主要公式

$$m_t=\beta_1 m_{t-1}+(1-\beta_1)g_t,\qquad v_t=\beta_2 v_{t-1}+(1-\beta_2)g_t^2$$

一次モーメント m(勾配 g の指数移動平均)と二次モーメント v(勾配2乗の指数移動平均)。β₁・β₂ は減衰率。

$$\hat m_t=\frac{m_t}{1-\beta_1^t},\ \hat v_t=\frac{v_t}{1-\beta_2^t},\qquad \theta_t=\theta_{t-1}-\frac{\alpha\,\hat m_t}{\sqrt{\hat v_t}+\varepsilon}$$

バイアス補正後の m̂・v̂ で更新する。パラメータごとの √v̂ による割り算こそが、Adam を「適応的」にしている核心部分。

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

本ツールの目的関数。条件数は b/a。細長い谷では b/a=20 で、方向ごとに勾配スケールが大きく異なる。

Adam オプティマイザとは

🙋
深層学習の入門書を読むと、必ず「とりあえず Adam を使え」と書いてあります。Adam って結局なにをしているオプティマイザなんですか?
🎓
ざっくり言うと、Adam は「モメンタム」と「適応的学習率」の2つの良いとこ取りなんだ。名前の Adam も Adaptive Moment Estimation(適応的モーメント推定)の略でね。勾配降下法に、過去の勾配の平均(一次モーメント m)で進む向きを安定させる仕掛けと、過去の勾配2乗の平均(二次モーメント v)でパラメータごとに歩幅を調整する仕掛け、この2つを同時に組み込んだものだよ。左の手法はそのまま、まずデフォルトで動かしてみて。
🙋
軌跡が、ほとんどまっすぐ谷底に向かってますね。前に見た通常の勾配降下法はこの細長い谷でジグザグになっていたのに。
🎓
そこが Adam の強みだよ。この谷は y 方向が急で x 方向がなだらかだろう。通常GDは全パラメータに同じ学習率を使うから、y 方向で行き過ぎて振動し、x 方向はなかなか進まない。Adam は二次モーメント v で「y 方向は勾配が大きいから歩幅を小さく、x 方向は勾配が小さいから歩幅を大きく」と各方向を自動で調整する。だから条件数の悪い地形でもまっすぐ降りられるんだ。下の「比較」グラフを見ると、同じステップ数でも通常GDとの差がはっきり出るよ。
🙋
β₁ と β₂ という値がありますが、これは何ですか? デフォルトの 0.9 と 0.999 を変えるとどうなるんでしょう。
🎓
β₁ は一次モーメント、つまり勾配の平均をどれだけ過去から引き継ぐかの減衰率で、0.9 が定番。β₂ は二次モーメント、勾配2乗の平均の減衰率で 0.999 が定番だ。β₂ のほうが 1 に近いのは、歩幅の基準になる v はゆっくり変化させたいから。β₁ を下げるとモメンタムが弱まって反応が機敏になり、上げると慣性が強くなる。実務ではこの2つはほとんど触らず、デフォルトのまま使うことが多いよ。
🙋
公式に「バイアス補正」という割り算 m̂=m/(1−β₁ᵗ) が出てきます。これは何のためにあるんですか?
🎓
いい質問だ。m と v は最初 0 から始めるよね。すると 1 ステップ目の m は (1−β₁) しか勾配を取り込めず、本来の平均より 0 寄りに小さく出てしまう。これが「初期バイアス」。m̂=m/(1−β₁ᵗ) は、その縮みを正確に打ち消す割り算なんだ。t=1 では 1/(1−β₁)=10 倍に拡大して帳尻を合わせ、t が大きくなると β₁ᵗ がほぼ 0 になって補正係数は 1、つまり何もしなくなる。だから「バイアス補正は学習の最初の数ステップで一番効く」と覚えておくといい。これがないと序盤の歩みが極端に遅くなるんだ。
🙋
なるほど。じゃあ学習率 α は、通常GDのときと同じ感覚で選べばいいんですか?
🎓
それが少し違うんだ。Adam の更新量は α·m̂/(√v̂+ε) で、√v̂ で割って正規化しているから、1ステップの実効的な歩幅はだいたい α 程度に収まる。だから Adam は通常GDより学習率に鈍感で、深層学習では α=0.001 がほぼ標準の出発点になっている。本ツールの単純な2次関数では α をもっと大きく取れるけど、上げすぎれば最小値付近で振動し、さらに上げれば発散する。「まず α=0.001、遅ければ上げ、暴れたら下げる」が現場の鉄則だよ。

よくある質問

Adam(Adaptive Moment Estimation)は、モメンタムと適応的学習率を組み合わせた最適化アルゴリズムです。勾配の指数移動平均である一次モーメント m が「進む向き」を、勾配の2乗の指数移動平均である二次モーメント v が「各パラメータごとの歩幅」を決めます。更新式は θ ← θ − α·m̂/(√v̂+ε) で、m̂・v̂ はバイアス補正後の値です。条件数の悪い地形やスパースな勾配でも安定して速く収束するため、深層学習のデフォルトオプティマイザとして広く使われています。
β₁ は一次モーメント(勾配の平均)の減衰率で、既定値は0.9。β₂ は二次モーメント(勾配2乗の平均)の減衰率で、既定値は0.999です。どちらも指数移動平均の「過去をどれだけ残すか」を決めます。問題は、m と v を0で初期化するため、最初の数ステップでは平均が0側に強く偏ってしまうこと。バイアス補正 m̂=m/(1−β₁ᵗ)、v̂=v/(1−β₂ᵗ) はこの偏りを打ち消す割り算で、学習の初期ほど効果が大きく、t が進むと 1 に近づいてほぼ無効になります。
通常の勾配降下法は全パラメータに同じ学習率を使い、θ ← θ − α∇f と更新します。Adam はこれに2つの仕掛けを加えます。1つはモメンタム(一次モーメント m)で、過去の勾配を平均して進む向きを安定させます。もう1つは二次モーメント √v による割り算で、勾配が大きい方向は歩幅を自動的に小さく、勾配が小さい方向は歩幅を大きく取ります。これにより、細長い谷のように方向ごとに勾配スケールが大きく異なる問題でも、各パラメータに合った歩幅で素直に収束できます。
Adam の更新量は α·m̂/(√v̂+ε) で、√v̂ による正規化が効くため、1ステップの実効的な歩幅はおおよそ α 程度に収まります。このため Adam は通常GDより学習率に対して鈍感で、深層学習では α=0.001 が定番の出発点です。本ツールの2次関数では α を大きく取れますが、上げすぎると最小値付近で振動し、さらに上げると発散します。実務では α=0.001 から始め、学習が遅ければ数倍に上げ、損失が暴れたら下げる、という調整が基本です。

実世界での応用

ニューラルネットワークの学習:Adam は画像認識・自然言語処理・音声認識など、深層学習のあらゆる分野で最初に選ばれるオプティマイザです。Transformer の学習では β₂ を 0.98 に下げるなど分野特有のチューニングはあるものの、α=0.001・β₁=0.9・β₂=0.999 という「Adam の三点セット」は今も多くの実装のデフォルト値です。手動で学習率を方向ごとに調整する手間が要らないため、新しいモデルを試すときの第一候補になります。

スパースな勾配を持つ問題:推薦システムや単語埋め込みのように、多くのパラメータのうち一部しか毎回更新されない「スパースな勾配」の問題で、Adam は特に強さを発揮します。二次モーメント v が各パラメータごとに別々に蓄積されるため、たまにしか勾配が来ないパラメータには大きな歩幅を、頻繁に更新されるパラメータには小さな歩幅を自動で割り当てられるからです。これは元の Adam 論文でも主要な動機の一つとして挙げられています。

CAE・数値最適化の設計探索:構造最適化やトポロジー最適化、形状最適化でも、目的関数(重量・応力・コンプライアンス)を勾配で下げていく勾配法が使われます。設計変数のスケールがそろっていないと損失地形が細長い谷になり、収束が極端に遅くなります。Adam の「方向ごとに歩幅を適応させる」発想は、変数の正規化を自動で肩代わりしてくれるため、機械学習だけでなく工学設計の最適化でも有効です。

逆解析・パラメータ同定:実験データに合うように材料モデルや境界条件のパラメータを推定する逆問題でも、誤差を損失として最小化します。パラメータの感度が桁違いに異なる(ある係数は損失に敏感、別の係数は鈍感)ことが多く、固定学習率の勾配降下法では収束が難しくなります。Adam の適応的学習率は、こうした感度のばらつきを自動で吸収し、収束を安定させます。

よくある誤解と注意点

まず多いのが、「Adam はいつでも最良のオプティマイザだ」という思い込みです。Adam は収束が速く調整が楽ですが、汎化性能(学習データ以外でのモデルの性能)では、よくチューニングした SGD with momentum に劣る場合があることが知られています。画像認識のコンペティションでは、最終的に SGD で仕上げるチームも少なくありません。Adam は「速く・楽に・そこそこ良い解」にたどり着くのが得意なオプティマイザであって、「常に最高の解」を保証するものではない、と理解しておくべきです。

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

最後に、「学習率は大きいほど速く収束する」という誤解。√v̂ による正規化のおかげで Adam は通常GDより学習率に鈍感ですが、それでも限度はあります。本ツールの細長い谷で学習率 α を 1.0 まで上げると、Adam でも最小値付近で激しく振動したり、損失が発散したりします。バイアス補正で実効歩幅が拡大される序盤は特に不安定になりやすく、α が大きいときは発散のリスクが高まります。「発散したら、まず α を下げる」は Adam でも変わらない鉄則です。

使い方ガイド

  1. 学習率(Learning Rate)を0.001~0.1の範囲で設定し、勾配降下の歩幅を調整します
  2. β₁(モメンタム係数)を0.8~0.99で、β₂(適応的学習率の指数平均係数)を0.999~0.9999で指定し、AdamのハイパーパラメータをTensorFlow・PyTorch仕様に合わせます
  3. 反復ステップ数を100~10000に設定後、シミュレーションを実行して損失曲線・パラメータ軌跡をリアルタイム表示し、最終損失値と収束速度を比較評価します

具体的な計算例

Rosenbrock関数(f=(1-x)²+100(y-x²)²)を最適化対象とした場合、初期点(x₀=-1.5, y₀=2.5)から学習率0.002、β₁=0.9、β₂=0.999で5000ステップ実行すると、最終損失は0.0045程度、最終座標(x≈0.998, y≈0.996)に到達し、損失低減率は99.8%を達成します。同じ条件でβ₁=0.99に変更すると振動が増加し収束が遅延します。

実務での注意点