Skip to content

优化器

优化器决定如何用梯度更新参数。不同的优化器收敛速度和效果差异巨大。

最简单的优化器,每步沿负梯度方向移动:

wt+1=wtαL(wt)w_{t+1} = w_t - \alpha \nabla L(w_t)
import torch
import torch.nn as nn
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练循环
for epoch in range(100):
optimizer.zero_grad()
loss = nn.MSELoss()(model(x), y)
loss.backward()
optimizer.step()

加入动量项,像球滚下山坡,累积速度:

vt=βvt1+(1β)L(wt)v_t = \beta v_{t-1} + (1-\beta)\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)

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

optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

Adam 的改进版,将权重衰减和梯度更新分离,效果更好:

optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
优化器特点适用场景
SGD简单稳定,收敛慢需要精细调参时
SGD+Momentum加速收敛,减少震荡图像分类
Adam自适应学习率,收敛快大多数场景
AdamWAdam + 正确的权重衰减Transformer 训练首选
from torch.optim.lr_scheduler import CosineAnnealingLR
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001)
scheduler = CosineAnnealingLR(optimizer, T_max=100)
for epoch in range(100):
optimizer.zero_grad()
loss = loss_fn(model(x), y)
loss.backward()
optimizer.step()
scheduler.step() # 每个 epoch 更新学习率