当前位置: 首页 > news >正文

2025-05-28 Python深度学习8——优化器

文章目录

  • 1 工作原理
  • 2 常见优化器
    • 2.1 SGD
    • 2.2 Adam
  • 3 优化器参数
  • 4 学习率
  • 5 使用最佳实践

本文环境:

  • Pycharm 2025.1
  • Python 3.12.9
  • Pytorch 2.6.0+cu124

​ 优化器 (Optimizer) 是深度学习中的核心组件,负责根据损失函数的梯度来更新模型的参数,使模型能够逐步逼近最优解。在 PyTorch 中,优化器通过torch.optim模块提供。

​ Pytorch 链接:https://docs.pytorch.org/docs/stable/optim.html。

1 工作原理

​ 优化器的工作流程如下:

  1. 计算损失函数的梯度 (通过backward()方法)。
  2. 根据梯度更新模型参数 (通过step()方法)。
  3. 清除之前的梯度 (通过zero_grad()方法)。
result_loss.backward()  # 计算梯度
optim.step()           # 更新参数
optim.zero_grad()      # 清除梯度

2 常见优化器

​ PyTorch 提供多种优化器,以 SGD 和 Adam 为例。

2.1 SGD

​ 基础优化器,可以添加动量 (momentum) 来加速收敛。

image-20250528111156055
参数类型默认值作用使用建议
paramsiterable-待优化参数必须传入model.parameters()或参数组字典,支持分层配置
lrfloat1e-3学习率控制参数更新步长,SGD常用0.01-0.1,Adam常用0.001
momentumfloat0动量因子加速梯度下降(Adam内置动量,无需单独设置)
dampeningfloat0动量阻尼抑制动量震荡(仅当momentum>0时生效)
weight_decayfloat0L2正则化防止过拟合,AdamW建议0.01-0.1
nesterovboolFalseNesterov动量改进版动量法(需momentum>0)
maximizeboolFalse最大化目标默认最小化损失,True时改为最大化
foreachboolNone向量化实现CUDA下默认开启,内存不足时禁用
differentiableboolFalse可微优化允许优化器步骤参与自动微分(影响性能)
fusedboolNone融合内核CUDA加速,支持float16/32/64/bfloat16

2.2 Adam

image-20250528111450759
  • 特点:自适应矩估计,结合了动量法和 RMSProp 的优点。
  • 优点:通常收敛速度快,对学习率不太敏感。
参数名称类型默认值作用使用建议
paramsiterable-需要优化的参数(如model.parameters()必须传入,支持参数分组配置
lrfloat1e-3学习率(控制参数更新步长)推荐0.001起调,CV任务可尝试0.0001-0.01
betas(float, float)(0.9, 0.999)梯度一阶矩(β₁)和二阶矩(β₂)的衰减系数保持默认,除非有特殊需求
epsfloat1e-8分母稳定项(防止除以零)混合精度训练时可增大至1e-6
weight_decayfloat0L2正则化系数推荐0.01-0.1(使用AdamW时更有效)
decoupled_weight_decayboolFalse启用AdamW模式(解耦权重衰减)需要权重衰减时建议设为True
amsgradboolFalse使用AMSGrad变体(解决收敛问题)训练不稳定时可尝试启用
foreachboolNone使用向量化实现加速(内存消耗更大)CUDA环境下默认开启,内存不足时禁用
maximizeboolFalse最大化目标函数(默认最小化)特殊需求场景使用
capturableboolFalse支持CUDA图捕获仅在图捕获场景启用
differentiableboolFalse允许通过优化器步骤进行自动微分高阶优化需求启用(性能下降)
fusedboolNone使用融合内核实现(需CUDA)支持float16/32/64时启用可加速

3 优化器参数

​ 所有优化器都接收两个主要参数:

  1. params:要优化的参数,通常是model.parameters()
  2. lr:学习率(learning rate),控制参数更新的步长。

​ 其他常见参数:

  • weight_decay:L2 正则化系数,防止过拟合。
  • momentum:动量因子,加速 SGD 在相关方向的收敛。
  • betas(Adam 专用):用于计算梯度及其平方的移动平均的系数。

4 学习率

​ 学习率是优化器中最重要的超参数之一。

  • 太大:可能导致震荡或发散。
  • 太小:收敛速度慢。
  • 常见策略:
    • 固定学习率 (如代码中的 0.01)。
    • 学习率调度器 (Learning Rate Scheduler) 动态调整。

5 使用最佳实践

  1. 梯度清零:每次迭代前调用optimizer.zero_grad(),避免梯度累积。
  2. 参数更新顺序:先backward()step()
  3. 学习率选择:可以从默认值开始 (如 Adam 的 0.001),然后根据效果调整。
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10(root='./dataset',  # 保存路径train=False,  # 是否为训练集transform=torchvision.transforms.ToTensor(),  # 转换为张量download=True  # 是否下载
)dataloader = DataLoader(dataset, batch_size=1)class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10))def forward(self, x):return self.model(x)loss = nn.CrossEntropyLoss()
model = MyModel()
torch.optim.Adam(model.parameters(), lr=0.01)
optim = torch.optim.SGD(model.parameters(), lr=0.01)for epoch in range(20):running_loss = 0.0# 遍历dataloader中的数据for data in dataloader:# 获取数据和标签imgs, targets = data# 使用模型对数据进行预测output = model(imgs)# 计算预测结果和真实标签之间的损失result_loss = loss(output, targets)# 将梯度置零optim.zero_grad()# 反向传播计算梯度result_loss.backward()# 更新模型参数optim.step()running_loss += result_lossprint(f'第 {epoch + 1} 轮的损失为 {running_loss}')

相关文章:

  • 破能所,入不二
  • GNU AS汇编器的.align对齐
  • 端午节互动网站
  • 力扣 215 .数组中的第K个最大元素
  • AMBA-AHB总线是怎么不依赖三态总线的?
  • 11.14 LangGraph检查点系统实战:AI Agent会话恢复率提升287%的企业级方案
  • 【网络编程】十八、Reactor模式
  • 2025年05月28日Github流行趋势
  • 农业光合参数反演专栏
  • kubernate解决 “cni0“ already has an IP address different from 10.244.0.1/24问题
  • Caddy如何在测试环境中使用IP地址配置HTTPS服务
  • bug: uniCloud 查询数组字段失败
  • HTTP Accept简介
  • linux系统(centos7为例)将jar配置成服务操作教程
  • 浏览器之禁止打开控制台【F12】
  • 网页前端开发(基础进阶1)
  • Transformer核心技术解析LCPO方法:精准控制推理长度的新突破
  • 计算机内存管理全解析:从基础原理到前沿技术(含分页/分段/置换算法/大页/NVM/CXL等技术详解
  • LVS的DR模式部署
  • Linux文件权限相关
  • 培训学校 网站费用/合肥网站外包
  • .red域名做网站好不好/网页制作软件推荐
  • 网站流量好难做/百度推广业务员电话
  • 右键网站 选择添加ftp站点/域名查询万网
  • 做调研的网站有哪些/百度seo查询系统
  • 如何在已建设好的网站做修改/百度推广排名怎么做的