优化器是深度学习训练的核心组件,直接决定了模型能否有效收敛和达到好的性能。

优化器的核心作用是根据模型计算出的梯度,调整网络参数(权重和偏置),以最小化损失函数,本质是求解损失函数最小值的数值优化方法。

一、优化器的核心原理

在训练过程中,模型通过前向传播得到预测值,与真实标签计算出损失(Loss)。

优化器的工作流程如下:

  1. 计算梯度:通过反向传播(Backward Propagation)计算损失函数对每个参数的梯度(Gradient),梯度表示参数变化对损失的影响方向和大小。
  2. 更新参数:根据梯度信息,按照特定的更新规则调整参数。核心公式可简化为:新参数 = 旧参数 - 学习率 × 梯度

其中,学习率(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),选择效果最好的。

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)

五、优化器选择建议

  1. 优先尝试 Adam:对于绝大多数任务(图像分类、目标检测、NLP 等),Adam 的收敛速度和稳定性都优于 SGD,且无需复杂调参,适合快速验证模型效果。
  2. 追求极致性能用 SGD + Momentum:如果需要模型达到更高的精度(如竞赛场景),可尝试 SGD+Momentum,但需要耐心调整学习率和学习率衰减策略。
  3. 稀疏数据用 AdaGrad/RMSprop:处理文本、推荐系统等稀疏数据时,自适应学习率的优化器效果更好。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐