优化器(Optimizer)是机器学习模型训练过程中最关键的组件之一,它决定了模型参数如何根据损失函数的反馈进行调整。简单来说,优化器就是模型训练的"导航系统",告诉参数应该往哪个方向移动、移动多少距离才能更快更好地达到最优解。
在实际训练过程中,优化器主要完成三个核心任务:
以最简单的线性回归为例,没有优化器时我们只能手动调整权重参数,而优化器的引入让这个过程自动化、智能化。现代深度学习框架中的优化器还能处理以下复杂情况:
关键理解:优化器不是直接减少损失值,而是通过智能调整参数来间接优化模型表现。就像汽车导航不会直接移动车辆,而是告诉驾驶员何时转向。
**SGD(随机梯度下降)**是最基础的优化器实现:
python复制# SGD参数更新公式
param -= learning_rate * gradient
其特点是:
实际应用中会发现SGD存在明显缺陷:
Momentum引入了物理中的动量概念:
python复制velocity = momentum * velocity - learning_rate * gradient
param += velocity
这相当于给参数更新增加了"惯性",使得:
Adam则进一步结合了动量与自适应学习率:
python复制m = beta1*m + (1-beta1)*gradient # 一阶矩估计
v = beta2*v + (1-beta2)*gradient**2 # 二阶矩估计
param -= learning_rate * m / (sqrt(v) + epsilon)
其核心优势在于:
下表对比了几种典型优化器的特性:
| 优化器 | 是否需要调参 | 内存占用 | 适合场景 |
|---|---|---|---|
| SGD | 学习率敏感 | 低 | 凸优化 |
| Momentum | 动量系数敏感 | 中 | 深层网络 |
| Adam | 参数鲁棒 | 高 | 默认首选 |
计算机视觉任务通常:
自然语言处理则更常见:
经验法则:当不确定时,先用Adam作为baseline,再根据训练曲线调整。对于特别大的模型或batch size,考虑LAMB等专用优化器。
学习率是优化器最重要的超参数之一,建议采用以下策略:
一个典型的学习率warmup实现:
python复制def warmup_lr(step, warmup_steps, base_lr):
return base_lr * min(step / warmup_steps, 1.0)
在ResNet50训练CIFAR-10时,我们对比了不同优化器的表现:
SGD with Momentum:
Adam:
AdamW:
发现AdamW表现最好,但SGD经过精细调参也能接近这个水平。
常见优化相关问题及解决方法:
损失震荡剧烈:
训练停滞不前:
验证集表现波动大:
现代框架中的优化器实现通常包含以下核心组件:
python复制optimizer = Adam([
{'params': model.features.parameters(), 'lr': 1e-4},
{'params': model.classifier.parameters(), 'lr': 1e-3}
])
python复制# Adam状态初始化
self.state[p] = {
'step': 0,
'exp_avg': torch.zeros_like(p),
'exp_avg_sq': torch.zeros_like(p)
}
python复制optimizer.zero_grad() # 清空梯度
loss.backward() # 计算梯度
optimizer.step() # 执行更新
在自定义优化器时需要注意:
虽然Adam系列仍是当前主流,但一些新兴技术值得关注:
Lion优化器(2023年提出):
Sophia(2023年):
Prodigy(2024年):
实际应用中发现,这些新优化器在小规模任务上优势不明显,但在超大规模模型训练中可能带来显著提升。一个实用的建议是:当使用超过1B参数的模型时,值得尝试这些最新优化器。