Skip to content

优化器

优化器决定如何用梯度更新模型参数。选对优化器,训练快几倍。

flowchart LR
A[SGD<br/>固定步长] --> B[SGD+Momentum<br/>累积速度]
B --> C[Adam<br/>自适应学习率]
C --> D[AdamW<br/>解耦权重衰减]

每步沿负梯度方向移动固定步长:

wt+1=wt−α∇L(wt)w_{t+1} = w_t - \alpha \nabla L(w_t)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

问题:学习率固定,收敛慢,容易被局部极小值困住。

加入动量项,像球滚下山坡,累积速度冲过局部极小值:

vt=βvt−1+∇L(wt)v_t = \beta v_{t-1} + \nabla L(w_t) wt+1=wt−αvtw_{t+1} = w_t - \alpha v_t
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

Adam 结合 Momentum 和 RMSprop,每个参数有独立的学习率:

mt=β1mt−1+(1−β1)∇L(wt)m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla L(w_t) vt=β2vt−1+(1−β2)(∇L(wt))2v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla L(w_t))^2 m^t=mt1−β1t,v^t=vt1−β2t\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} wt+1=wt−αm^tv^t+ϵw_{t+1} = w_t - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

Adam 的权重衰减和梯度更新耦合在一起,导致泛化性能下降。AdamW 将它们解耦:

# AdamW 的 weight_decay 是真正的 L2 正则化
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
from torch.optim.lr_scheduler import CosineAnnealingLR, LinearLR, SequentialLR
# Warmup + Cosine 衰减(Transformer 标配)
warmup = LinearLR(optimizer, start_factor=0.01, total_iters=100)
cosine = CosineAnnealingLR(optimizer, T_max=900)
scheduler = SequentialLR(optimizer, [warmup, cosine], milestones=[100])
for epoch in range(1000):
optimizer.step()
scheduler.step()
场景推荐原因
需要精细调参SGD+Momentum更可控
大多数场景Adam收敛快,调参少
Transformer 训练AdamW正确的权重衰减
大模型微调AdamW + warmup稳定训练