深度学习中的优化器
·
优化器是深度学习训练的核心组件,直接决定了模型能否有效收敛和达到好的性能。
优化器的核心作用是根据模型计算出的梯度,调整网络参数(权重和偏置),以最小化损失函数,本质是求解损失函数最小值的数值优化方法。
一、优化器的核心原理
在训练过程中,模型通过前向传播得到预测值,与真实标签计算出损失(Loss)。
优化器的工作流程如下:
- 计算梯度:通过反向传播(Backward Propagation)计算损失函数对每个参数的梯度(Gradient),梯度表示参数变化对损失的影响方向和大小。
- 更新参数:根据梯度信息,按照特定的更新规则调整参数。核心公式可简化为:
新参数 = 旧参数 - 学习率 × 梯度
其中,学习率(Learning Rate)控制每一步参数更新的幅度,是优化器中最重要的超参数之一。
二、常见优化器分类及对比
不同优化器的核心区别在于梯度的利用方式和参数更新规则。以下是 PyTorch 中最常用的优化器。
| 优化器 | 中文名称 | 核心特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| SGD | 随机梯度下降 | 随机梯度下降,每次用一个 Batch 的梯度更新 | 简单、稳定、内存占用小 | 收敛慢,易陷入局部最优,学习率难调整 | 基础模型、大规模数据、需要稳定训练时 |
| SGD + Momentum | 动量随机梯度下降 | 引入动量(模拟惯性),积累历史梯度方向 | 加速收敛,减少震荡 | 仍需手动调整学习率 | 多数场景,尤其是 SGD 收敛慢的情况 |
| AdaGrad | 自适应梯度下降 | 自适应学习率,对高频参数减小学习率 | 适合稀疏数据,无需手动调学习率 | 学习率后期衰减至 0,导致训练停滞 | 稀疏数据(如 NLP 文本分类) |
| RMSprop | 均方根传播优化器 | 改进 AdaGrad,用指数移动平均替代累计梯度 | 解决学习率衰减问题,收敛稳定 | 仍需手动设置动量等参数 | 多数深度学习场景,尤其是 CNN、RNN |
| Adam | 自适应动量估计优化器 | 结合 Momentum(动量)和 RMSprop(自适应学习率) | 收敛快、稳定,无需复杂调参 | 训练初期可能波动,内存占用略高 | 绝大多数场景(默认首选),如 CNN、Transformer |
三、PyTorch 中优化器的使用步骤
所有优化器在 PyTorch 中都通过torch.optim模块实现,使用流程高度统一,以代码中的 SGD 为例:
1. 导入优化器模块
import torch.optim as optim # 也可直接from torch import optim
2. 初始化优化器
需传入两个核心参数:
- 待优化参数:模型的可训练参数,通过
model.parameters()获取。 - 超参数:最关键的是学习率(
lr),不同优化器有额外超参数。
# 1. SGD优化器(你代码中使用的)
optimizer = optim.SGD(
params=prayer.parameters(), # 模型的所有可训练参数
lr=1e-2, # 学习率:控制更新幅度
momentum=0.9 # 可选:动量,加速收敛(你的代码未使用,可添加)
)
# 2. Adam优化器(更常用,推荐优先尝试)
optimizer = optim.Adam(
params=prayer.parameters(),
lr=1e-3, # Adam默认lr=1e-3,通常比SGD小
betas=(0.9, 0.999) # 可选:动量相关的两个超参数,默认即可
)
3. 训练循环中使用优化器
优化器必须在每个 Batch 的训练中执行以下三步,这是固定流程:
for data in train_dataloader:
imgs, targets = data
outputs = prayer(imgs)
loss = loss_fn(outputs, targets)
# 优化器三步曲
optimizer.zero_grad() # 1. 清空上一步的梯度(梯度会累积,必须清空)
loss.backward() # 2. 反向传播计算当前梯度
optimizer.step() # 3. 根据梯度更新参数
四、关键超参数调整技巧
优化器的性能很大程度上依赖超参数,尤其是学习率(lr)。
1. 学习率(lr)
optimizer = optim.SGD(prayer.parameters(), lr=1e-2, momentum=0.9, weight_decay=1e-4)
- 作用:决定参数更新的 “步长”,过大导致训练震荡不收敛,过小导致收敛过慢。
- 调整技巧:
- 初始值选择:SGD 通常用
1e-2 ~ 1e-3,Adam 通常用1e-3 ~ 1e-4。 - 学习率衰减:训练后期逐渐减小学习率(如
torch.optim.lr_scheduler),避免错过最优值。 - 网格搜索:对关键模型,尝试 3-5 个不同学习率(如
1e-4, 5e-4, 1e-3),选择效果最好的。
- 初始值选择:SGD 通常用
2. 动量(Momentum)
- 作用:模拟物理中的惯性,积累之前的梯度方向,加速收敛并减少震荡。
- 调整技巧:默认设置为
0.9即可,多数场景无需修改。
3. 权重衰减(Weight Decay)
- 作用:等价于 L2 正则化,通过给参数添加惩罚项,防止过拟合。
- 调整技巧:在优化器中通过
weight_decay参数设置,常用值为1e-4 ~ 1e-2。
optimizer = optim.SGD(prayer.parameters(), lr=1e-2, momentum=0.9, weight_decay=1e-4)
五、优化器选择建议
- 优先尝试 Adam:对于绝大多数任务(图像分类、目标检测、NLP 等),Adam 的收敛速度和稳定性都优于 SGD,且无需复杂调参,适合快速验证模型效果。
- 追求极致性能用 SGD + Momentum:如果需要模型达到更高的精度(如竞赛场景),可尝试 SGD+Momentum,但需要耐心调整学习率和学习率衰减策略。
- 稀疏数据用 AdaGrad/RMSprop:处理文本、推荐系统等稀疏数据时,自适应学习率的优化器效果更好。
更多推荐



所有评论(0)