Momentum 與 Adam
Momentum
傳統梯度下降在狹長山谷中會劇烈震盪。Momentum 加入「慣性」:
$$v_{t+1} = \beta v_t + \nabla L(w_t)$$ $$w_{t+1} = w_t - \eta v_{t+1}$$
Adam
Adam = Momentum + RMSProp,是目前最常用的最佳化器。
Vibe Prompt
「比較 SGD、Momentum、Adam 在 f(x,y)=x²+10y² 上的收斂速度,畫出三個最佳化器的參數軌跡。」
import numpy as np
def adam(grad, w0, lr=0.1, beta1=0.9, beta2=0.999, eps=1e-8, steps=100):
w = w0.copy()
m = np.zeros_like(w)
v = np.zeros_like(w)
history = [w.copy()]
for t in range(1, steps+1):
g = grad(w)
m = beta1 * m + (1-beta1) * g
v = beta2 * v + (1-beta2) * g*g
m_hat = m / (1-beta1**t)
v_hat = v / (1-beta2**t)
w = w - lr * m_hat / (np.sqrt(v_hat) + eps)
history.append(w.copy())
return w, history