← STEP 6・訓練+推論 に戻る

Adam オプティマイザ ― 予算のローリング修正

記事で詰まったところ

「Adam」「1次・2次モーメント」「m と v」「学習率」が、勾配をどう使って前提を直しているのか分からない。

機械学習ではこう言う

勾配(差異)をそのまま使わず、勾配の移動平均 m(向き)と勾配²の移動平均 v(ブレ)を貯めて、m / √v でパラメータを更新する。安定した方向には大きく、ブレる方向には控えめに直す適応的な更新。

予算のローリング修正

予算のローリング修正そのもの。今月の予実差異(勾配)だけを見て予算を激変させると、たまたまのブレに振り回される。そこで直近数ヶ月の差異の移動平均 m で「だいたいどっちにズレ続けているか(向き)」を掴み、その方向に前提を寄せる。

さらに差異のブレの大きさ v(勾配²の移動平均=分散の目安)を見て、毎月乱高下する科目ほど更新を小さく、安定してズレ続けている科目ほど思い切って直す。m / √v がその「向き ÷ ブレ」。ブレが大きいほど分母が大きくなり、慎重になる。

学習率は1周ごとの修正幅で、期末(学習終盤)に近づくほど小さく絞って微調整に切り替える(linear decay)。今期の予算を毎月少しずつ実績に馴染ませ、来期の見積り精度を上げていくのと同じ運用。

言葉の対応表

microGPT(機械学習)
会計・簿記の言葉
勾配 p.grad
今月の予実差異
1次モーメント m
直近の差異の移動平均(ズレ続けている向き)
2次モーメント v
差異のブレ(分散)の大きさ
m / √v の更新
ブレる科目ほど控えめに、安定なら大きく直す
学習率 decay
期末に近づくほど微調整へ絞る

触って確かめる

毎月の予実差異(勾配)
0
単純更新(今月の差異だけで直す)Adam(移動平均で滑らかに)

同じ差異の系列でも、単純更新(赤)は毎月の差異の大小にそのまま振り回されてギザギザ。 一方 Adam(緑)は差異の移動平均で「ズレ続けている向き」だけを拾い、ブレを √v で割って滑らかに前提を寄せます。 慣性 β1 を上げるほど過去を重く見て、もっとなだらかに。今月の単発のブレで予算を激変させない=予算のローリング修正そのものです。

⚠️ m̂・v̂ のバイアス補正や eps は計算上の工夫。「移動平均で滑らかに、ブレるほど慎重」の直感に絞った例示。

実際のコード(microgpt.py L177-181)

この簿記アナロジーが、Karpathy のオリジナル200行のどの行に当たるか。

m[i] = beta1 * m[i] + (1 - beta1) * p.grad      # 差異の移動平均(向き)
v[i] = beta2 * v[i] + (1 - beta2) * p.grad ** 2 # 差異²の移動平均(ブレ)
m_hat = m[i] / (1 - beta1 ** (step + 1))        # 立ち上がりのバイアス補正
v_hat = v[i] / (1 - beta2 ** (step + 1))
p.data -= lr_t * m_hat / (v_hat ** 0.5 + eps_adam)  # 向き ÷ ブレ で更新
p.grad = 0

m が差異の移動平均(向き)、v が差異²の移動平均(ブレ)。m/√v で「ブレる科目は控えめ」に更新=予算のローリング修正。

出典: karpathy / microgpt.py (本体は原文ママ、コメントのみ日本語に補足)