优化算法

返回机器学习

训练神经网络的本质是找到使损失函数最小的参数 θ。优化算法决定了如何利用梯度信息更新参数——速度、稳定性、对学习率的敏感度因算法而异。


梯度下降基础

参数更新:θ ← θ - η · ∇L(θ)

η:学习率(步长)
∇L(θ):损失函数对参数的梯度

三种变体

变体每步使用数据特点
批量梯度下降(BGD)全量训练集梯度精确,速度慢,内存大
随机梯度下降(SGD)单个样本更新频繁,噪声大,可能逃出局部最优
小批量梯度下降(Mini-batch GD)32~512 样本实际使用的标准形式

主流优化器对比

SGD + Momentum

加入动量,积累梯度方向,加速收敛并减少震荡:

  • β 通常取 0.9
  • 收敛后效果可媲美 Adam,但调参复杂

AdaGrad

自适应调整每个参数的学习率,历史梯度大的参数学习率小:

  • 适合稀疏特征(NLP 早期常用)
  • 缺点:学习率单调递减,后期接近停止更新

RMSProp

AdaGrad 的改进,用指数移动平均代替累积梯度:

Adam(最常用)

结合 Momentum 和 RMSProp,带偏差修正:

默认参数:

AdamW

Adam + 权重衰减(L2 正则),解决 Adam 中 L2 正则失效的问题。大模型训练标配:

optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=3e-4,
    weight_decay=0.01,  # 权重衰减直接应用于参数,而非梯度
)

各优化器适用场景

场景推荐优化器
大模型预训练/微调AdamW
计算机视觉训练SGD + Momentum(精调后效果更好)
快速实验、不确定最优 lrAdam
稀疏特征(词向量)AdaGrad / Adam
强化学习Adam / RMSProp

学习率调度

固定学习率很少是最优的,常用调度策略:

策略说明适用
Warmup + Cosine Decay线性预热 → 余弦衰减到 0大模型训练标配
Step Decay每隔 N epoch 乘以衰减系数CNN 训练
ReduceLROnPlateau验证集不改善时自动降低 lr通用
Cyclic LR周期性升降,帮助逃离局部最优ResNet 等
from transformers import get_cosine_schedule_with_warmup
 
scheduler = get_cosine_schedule_with_warmup(
    optimizer,
    num_warmup_steps=500,
    num_training_steps=total_steps,
)

梯度问题与解决方案

梯度消失

深层网络反向传播时梯度趋近于零,网络无法学习:

解决方案说明
ReLU 激活梯度不饱和(>0 时梯度恒为 1)
残差连接(ResNet)梯度直接跨层流动
Batch Normalization稳定层间分布

梯度爆炸

梯度过大导致参数更新震荡:

# 梯度裁剪(Gradient Clipping)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

实用调参建议

# Adam/AdamW 经验学习率范围
学习率参考:
  大模型微调:1e-5 ~ 5e-5
  从头训练小模型:1e-3 ~ 3e-4
  CNN1e-3SGD),3e-4(Adam)
 
# 批量大小与学习率线性缩放
# batch_size × 8 时,lr 也 × 8(Linear Scaling Rule)
lr = base_lr * (batch_size / 256)
 
# 权重衰减
AdamW weight_decay = 0.01 ~ 0.1(大模型常用 0.1

相关文档