「Adam」「1次・2次モーメント」「m と v」「学習率」が、勾配をどう使って前提を直しているのか分からない。
勾配(差異)をそのまま使わず、勾配の移動平均 m(向き)と勾配²の移動平均 v(ブレ)を貯めて、m / √v でパラメータを更新する。安定した方向には大きく、ブレる方向には控えめに直す適応的な更新。
予算のローリング修正そのもの。今月の予実差異(勾配)だけを見て予算を激変させると、たまたまのブレに振り回される。そこで直近数ヶ月の差異の移動平均 m で「だいたいどっちにズレ続けているか(向き)」を掴み、その方向に前提を寄せる。
さらに差異のブレの大きさ v(勾配²の移動平均=分散の目安)を見て、毎月乱高下する科目ほど更新を小さく、安定してズレ続けている科目ほど思い切って直す。m / √v がその「向き ÷ ブレ」。ブレが大きいほど分母が大きくなり、慎重になる。
学習率は1周ごとの修正幅で、期末(学習終盤)に近づくほど小さく絞って微調整に切り替える(linear decay)。今期の予算を毎月少しずつ実績に馴染ませ、来期の見積り精度を上げていくのと同じ運用。
同じ差異の系列でも、単純更新(赤)は毎月の差異の大小にそのまま振り回されてギザギザ。 一方 Adam(緑)は差異の移動平均で「ズレ続けている向き」だけを拾い、ブレを √v で割って滑らかに前提を寄せます。 慣性 β1 を上げるほど過去を重く見て、もっとなだらかに。今月の単発のブレで予算を激変させない=予算のローリング修正そのものです。
⚠️ m̂・v̂ のバイアス補正や eps は計算上の工夫。「移動平均で滑らかに、ブレるほど慎重」の直感に絞った例示。
この簿記アナロジーが、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 = 0m が差異の移動平均(向き)、v が差異²の移動平均(ブレ)。m/√v で「ブレる科目は控えめ」に更新=予算のローリング修正。
出典: karpathy / microgpt.py (本体は原文ママ、コメントのみ日本語に補足)