Шаг 1 · первый момент (инерция)$$m_t=\beta_1 m_{t-1}+(1-\beta_1)\,g_t$$
Шаг 2 · второй момент (масштаб)$$v_t=\beta_2 v_{t-1}+(1-\beta_2)\,g_t^2$$
Шаг 3 · поправка смещения$$\hat{m}_t=\frac{m_t}{1-\beta_1^{\,t}}\qquad \hat{v}_t=\frac{v_t}{1-\beta_2^{\,t}}$$
Гиперпараметры по умолчанию$\eta=0{,}001$ (темп обучения, learning rate), $\beta_1=0{,}9$, $\beta_2=0{,}999$, $\epsilon=10^{-8}$. Все операции — поэлементные: у каждого веса свои $m$ и $v$.
ПримерПервый шаг, $g_1=0{,}5$, $m_0=v_0=0$: $m_1=0{,}05$, $v_1=0{,}00025$. Без поправки шаг был бы в $3{,}16$ раза больше: $0{,}05/\sqrt{0{,}00025}\approx3{,}16$, потому что $v$ занижен сильнее, чем $m$; с поправкой $\hat{m}_1=0{,}5$, $\hat{v}_1=0{,}25$, и $\hat{m}_1/\sqrt{\hat{v}_1}=1$. На первом шаге вес сдвигается ровно на $\eta$ — каким бы ни был масштаб градиента.
В кодеm = b1 * m + (1 - b1) * g
v = b2 * v + (1 - b2) * g ** 2
m_hat = m / (1 - b1 ** t)
v_hat = v / (1 - b2 ** t)
theta -= lr * m_hat / (np.sqrt(v_hat) + eps)
Числитель $\hat{m}_t$ — куда идти: инерция гасит шум градиента. Знаменатель $\sqrt{\hat{v}_t}$ — насколько большим будет шаг у каждого веса. AdamW — тот же Adam с отделённым от градиента затуханием весов (weight decay); им обучают современные LLM.