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

训练流程中的功能组件 - 优化器

训练流程中的功能组件 - 优化器

flyfish

真实规律是y = 2x + 3,我们给数据加一点噪声。模型只有 2 个可学习参数:权重w和偏置b。训练的目标就是让模型自动学到 w,b
优化器主要是接收反向传播算出的梯度,按照自身算法规则更新模型的可学习参数(权重、偏置),驱动损失函数持续下降。

importtorch# --------------------------# 1. 准备训练数据# --------------------------# 生成100个x样本,从0到10均匀分布x=torch.linspace(0,10,100).reshape(-1,1)# 真实值 y = 2x + 3,加一点随机噪声模拟真实数据y_true=2*x+3+torch.randn_like(x)*0.5# --------------------------# 2. 初始化可学习参数 + 超参数# --------------------------# 随机初始化w和b,requires_grad=True 表示需要对它们求梯度w=torch.randn(1,requires_grad=True)b=torch.randn(1,requires_grad=True)learning_rate=0.01# 学习率epochs=200# 训练总轮数# --------------------------# 3. 训练循环(手动实现优化器)# --------------------------forepochinrange(epochs):# 1前向传播:输入x,算出预测值y_pred=w*x+b#2 计算损失:均方误差(预测值和真实值的差的平方,取平均)loss=torch.mean((y_pred-y_true)**2)# 3 反向传播:自动算出w和b的梯度,存在 w.grad 和 b.grad 里loss.backward()# ==================================================# 这里就是优化器的逻辑# ==================================================# 关闭梯度追踪,只做纯数值更新,避免生成计算图浪费资源withtorch.no_grad():# 核心更新公式:新参数 = 旧参数 - 学习率 × 梯度w-=learning_rate*w.grad b-=learning_rate*b.grad# 梯度清零:把w.grad和b.grad重置为0,避免下一轮累加旧梯度w.grad.zero_()b.grad.zero_()# ==================================================# 每20轮打印一次结果if(epoch+1)%40==0:print(f"轮次{epoch+1:3d}| 损失:{loss.item():.4f}| w={w.item():.4f}| b={b.item():.4f}")# 训练结束看最终结果print(f"\n训练完成:最终w={w.item():.4f},最终b={b.item():.4f}")print("真实值:w=2,b=3")

代码中,with torch.no_grad()里的两行 + 梯度清零,是最基础的随机梯度下降(SGD)优化器的功能。

它做两件事:

  1. 参数更新(对应PyTorch的optimizer.step()
    按照固定公式新参数 = 旧参数 - 学习率 × 梯度,逐个更新所有可学习参数。
    梯度告诉我们参数往哪个方向调能让损失变小,学习率控制调多大幅度。

  2. 梯度清零(对应PyTorch的optimizer.zero_grad()
    PyTorch 默认会累加梯度,每轮更新完必须手动清零,否则下一轮的梯度会叠加上旧值,导致更新完全错误。

优化器就是参数更新规则的封装。

使用PyTorch自带的torch.optim实现

importtorch# 数据和参数初始化和上面完全一样x=torch.linspace(0,10,100).reshape(-1,1)y_true=2*x+3+torch.randn_like(x)*0.5w=torch.randn(1,requires_grad=True)b=torch.randn(1,requires_grad=True)learning_rate=0.01epochs=200# SGD优化器:把所有参数交给它管理optimizer=torch.optim.SGD([w,b],lr=learning_rate)forepochinrange(epochs):y_pred=w*x+b loss=torch.mean((y_pred-y_true)**2)# 对应手动的 w.grad.zero_(); b.grad.zero_()optimizer.zero_grad()# 反向传播算梯度loss.backward()# 对应手动的 w -= lr*w.grad; b -= lr*b.gradoptimizer.step()if(epoch+1)%40==0:print(f"轮次{epoch+1:3d}| 损失:{loss.item():.4f}| w={w.item():.4f}| b={b.item():.4f}")

省去了逐个参数手写更新、逐个清零的麻烦
可以把epoch加大看效果

轮次40|损失:0.8172|w=2.2211|b=1.5349轮次80|损失:0.6443|w=2.1822|b=1.7936轮次120|损失:0.5282|w=2.1504|b=2.0055轮次160|损失:0.4503|w=2.1243|b=2.1792轮次200|损失:0.3979|w=2.1029|b=2.3215

在单轮训练迭代中,优化器的执行逻辑:

  1. 接收梯度输入:获取由反向传播算法计算得到的损失函数对各参数的一阶导数(梯度)∇L(θ)\nabla L(\boldsymbol{\theta})L(θ),该信息指明了参数空间中损失上升最快的方向与速率。
  2. 计算参数更新量:基于当前梯度、历史梯度状态与预设超参数,计算每个参数的更新方向与步长,生成参数更新向量Δθ\Delta\boldsymbol{\theta}Δθ。这是优化器的核心功能,不同优化算法的差异均体现于此:
    基础随机梯度下降(SGD)仅以全局学习率对梯度做线性缩放,即Δθ=−η⋅∇L(θ)\Delta\boldsymbol{\theta} = -\eta \cdot \nabla L(\boldsymbol{\theta})Δθ=ηL(θ),所有参数共享统一的步长缩放系数;
    自适应优化器(如Adam)会额外维护每个参数的梯度一阶矩(动量)与二阶矩(波动幅度)统计量,为每个参数动态适配更新步长,在梯度波动剧烈的维度收窄步长以抑制震荡,在梯度平缓的维度放大步长以加速收敛。
  3. 执行参数更新与状态维护:按照θ←θ+Δθ\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \Delta\boldsymbol{\theta}θθ+Δθ更新所有可学习参数的数值;同时清零参数的梯度缓存,避免迭代间梯度累加导致更新偏差,并更新优化算法所需的历史状态变量,供后续迭代使用。
http://www.jsqmd.com/news/1175906/

相关文章:

  • 广州二手奢品红榜汇总,奢二网可回收老铺黄金 - 每日生活报
  • windows网络适配器驱动开发-网环元素管理
  • 2026年独立站一件代发怎么选美国海外仓:五大测评维度深度解析 - 科技焦点
  • 清华求真书院预科班有哪些考核环节(二)
  • Mineradio:从音源聚合到粒子渲染的全链路实现
  • 从安装到精通:lisa.py完整使用手册,让AI成为你的调试助手
  • ChatGPT提示词工程实战指南:从入门到精通的5层递进式提问框架,附可立即套用的36个模板
  • 从论文到代码:Neural Scene Flow Fields核心算法原理与PyTorch实现详解
  • BUUCTF[2019红帽杯]easyRE
  • 西安学历提升机构收费明细:钱要花在明处 - 最新政策解读
  • 解锁MLX框架潜力:Gemma-4-12B-Coder高级推理技巧(温度调节/最大 tokens 设置全攻略)
  • Amaro版本管理:如何在不同TypeScript版本间无缝切换?
  • LRS2数据集实战:IP_LAP训练前的数据准备与预处理全攻略
  • PicoServer的哲学:不是框架,是胶水
  • Rider 2024.2 + EmmyLua 1.5.0:Unity C#与Lua双模式调试的3种连接策略对比
  • vLLM部署Kimi-K2.5-W4A8完整教程:从环境搭建到服务上线
  • ChatGPT自动生成客服QA的7种致命错误(附审计清单+合规校验脚本)
  • 独立开发技术栈怎么选
  • 分治算法
  • 西安成人学历机构避坑指南:这6类承诺别信 - 最新政策解读
  • 为什么选择ReactPrimer?这款组件原型工具如何提升你的开发效率
  • M87生成艺术作品赏析:24个惊艳案例带你领略AI美学新高度
  • AI+城市配送网络:多级仓储+动态路由+需求预测
  • HNU-2026操作系统-学习感悟与总结
  • 2026年7月最新沈阳卡地亚官方售后热线及客户服务网点地址 - 卡地亚服务中心
  • Saucer线程安全机制与协程支持:编写高效异步桌面应用的最佳实践
  • Word 2019 自定义样式集成自动目录:3步解决非标准标题识别难题
  • 北京恒略房产合同纠纷律师咨询电话16601232889同微信 - 北京普法者
  • FeedFlow深度评测:为什么这款开源RSS阅读器值得取代你的新闻App?
  • 为什么选择FeedFlow?5个让你告别信息过载的理由