Mobile wallpaper
432 字
2 分鐘

Optimizers

2026-02-28

SGD (Stochastic Gradient Descent)#

通常指 mini-batch SGD

θθηL(θ)\theta \leftarrow \theta - \eta \nabla L(\theta)

其中 η\eta 是學習率, 每次只隨機抽一筆樣本來估計梯度, 樣本算出的梯度是有雜訊的估計, 但期望值等於真實梯度, 且雜訊有助於脫離saddle point

在訓練初期收斂進展快, 但是因為收斂路徑會震盪所以通常需要搭配 LR decay 使用

SGD with Momentum#

讓更新方向帶有慣性(梯度的指數移動平均), 把過去的梯度累積起來。

vt=βvt1+L(θt)v_t = \beta v_{t-1} + \nabla L(\theta_t)θt+1=θtηvt\theta_{t+1} = \theta_t - \eta v_t

β\beta 通常設 0.9, 有效步長最多可放大約 11β\frac{1}{1-\beta} 倍, 可以加快在非凸優化問題的收斂速度

RMSProp#

把梯度的 RMS 放到分母做自適應 LR

vt=βvt1+(1β)(L)2v_t = \beta v_{t-1} + (1-\beta)(\nabla L)^2θt+1=θtηvt+ϵL\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t}+\epsilon}\nabla L

β\beta 通常取 0.9

Adam#

Momentum + 自適應 LR

維護兩個指數移動平均(一階矩, 二階矩)

mt=β1mt1+(1β1)Lm_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla L vt=β2vt1+(1β2)(L)2v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla L)^2

因為 m0,v0m_0, v_0 初始化為 0, 前幾步會偏向 0, 所以要做偏差校正:

m^t=mt1β1t,v^t=vt1β2t\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \qquad \hat{v}_t = \frac{v_t}{1-\beta_2^t}

最後更新:

θt+1=θtηm^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

梯度長期偏大的參數 v^\sqrt{\hat v} 大, 步伐自動縮小; 梯度稀疏或很小的參數, 步伐自動放大

預設超參數通常用 β1=0.9\beta_1 = 0.9β2=0.999\beta_2 = 0.999ϵ=108\epsilon = 10^{-8}η=103\eta = 10^{-3}

AdamW#

在 Adam 裡, L2 正則項被加進梯度後, 也會被 v^\sqrt{\hat v} 除掉, 導致梯度大的參數反而被 decay 得少:

θt+1=θtηEMA(L+λθt)m^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\overbrace{\text{EMA}(\nabla L + \lambda\theta_t)}^{\hat m_t}}{\sqrt{\hat v_t}+\epsilon}

AdamW 把 weight decay 從梯度裡拿出來

θt+1=θtη(m^tv^t+ϵ+λθt)\theta_{t+1} = \theta_t - \eta\left(\frac{\hat m_t}{\sqrt{\hat v_t}+\epsilon} + \lambda \theta_t\right)

Reference#

Optimizers
https://blog.cyberangel.work/posts/ml-optimizer/
作者
Ethan Lai
發布於
2026-02-28
許可協議
CC BY-NC-SA 4.0

評論區

目錄