优化算法
→ 返回机器学习
训练神经网络的本质是找到使损失函数最小的参数 θ。优化算法决定了如何利用梯度信息更新参数——速度、稳定性、对学习率的敏感度因算法而异。
梯度下降基础
参数更新:θ ← θ - η · ∇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(精调后效果更好) |
| 快速实验、不确定最优 lr | Adam |
| 稀疏特征(词向量) | 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
CNN:1e-3(SGD),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)