当前位置:

首页 > 编程开发 > Python中PyTorch如何实现梯度累积_在小批量上叠加梯度实现大Batch

Python中PyTorch如何实现梯度累积_在小批量上叠加梯度实现大Batch

梯度累积通过多次小批量反向传播累加梯度,仅在累积步数达到时调用优化器更新参数。需将损失除以累积步数,避免梯度膨胀。训练全程保持梯度计算模式,禁用`torch.no_grad()`。混合精度训练需手动`unscale_`梯度后再裁剪。

梯度累积为什么不能直接改 batch_size

显存不够用,想上大 batch 又怕 OOM,很多人第一反应是去调 DataLoader 的 batch_size——这条路走不通。PyTorch 的 optimizer.step() 每调一次,梯度就被清空,参数也更新一次。你要是强行塞更大的 batch,要么显存爆掉,要么新梯度把旧梯度覆盖掉,根本谈不上“累积”。

真正有效的做法是:分多次小 batch 做 backward,但只在第 N 次时调用 optimizer.step() 和 optimizer.zero_grad()。这里有几个关键点:

  • 每次 loss.backward() 默认会把梯度累加到 .grad 上——前提是没清理过梯度。
  • optimizer.zero_grad() 只能在累积开始前或 step 完成后调用,中间绝对不能清。
  • loss 必须除以累积步数,否则梯度量级会随着步数线性膨胀,后果很严重。

torch.no_grad() 不参与梯度累积,别误用

代码里最容易踩的坑,是在累积循环里混进 torch.no_grad()。比如有人为了“省显存”,对 validation 做了 no_grad,结果顺手套到了 train loop 里——这样一来,所有 backward() 全部失效,model.parameters()[0].grad 始终是 None。

梯度累积必须全程在梯度计算模式下进行:

  • 确保 model.train() 已经调用。
  • 不要用 with torch.no_grad(): 包裹任何训练步骤。
  • 只有评估、推理、EMA 更新这些非训练逻辑才用 no_grad。

典型错误现象是报 RuntimeError: element 0 of tensors does not require grad and does not ha ve a grad_fn——基本就是某处意外禁用了梯度,排查的时候优先看 no_grad 的位置。

手动控制 optimizer.step() 和 zero_grad() 的时机

核心就三件事:累 loss、累梯度、按周期更新。不需要额外库,也不需要什么钩子,纯靠 if 判断步数就能搞定。

假设目标等效 batch 是 64,当前 GPU 能跑 8:

accumulation_steps = 64 // 8  # = 8
for i, (x, y) in enumerate(dataloader):
    pred = model(x)
    loss = criterion(pred, y) / accumulation_steps  # 关键:缩放 loss
    loss.backward()  # 梯度自动累加
if (i + 1) % accumulation_steps == 0:
    optimizer.step()      # 更新参数
    optimizer.zero_grad() # 清空梯度,准备下一轮累积
  • loss / accumulation_steps 必须做,否则梯度相当于放大了 8 倍。
  • zero_grad() 放在 step() 后面,而不是前面;否则刚算完就清空,等于白干。
  • 注意 i + 1:step 是在 batch 结束后触发,不是开头。
  • 如果 dataloader 长度不能被整除,最后一组不足 accumulation_steps 的 batch 也要 step,否则会漏更新。

混合精度训练(torch.cuda.amp)下梯度累积要多一步

用 autocast + GradScaler 时,scaler.scale(loss).backward() 会把梯度乘上 scale 值再累加。好在 scaler.step(optimizer) 内部会自动处理 unscale,但前提是梯度确实被累积了。

容易漏的关键点:

  • 必须用 scaler.unscale_(optimizer) 手动 unscale 梯度,再做梯度裁剪(如 torch.nn.utils.clip_grad_norm_),否则裁剪的是放大后的梯度。
  • scaler.step() 只应在累积完成时调用,且需传入 optimizer。
  • 别忘了 scaler.update(),否则 scale 值不会自适应调整。

常见错误现象:NaN loss 或训练不稳定,大概率是没 unscale 就裁剪,或者 scaler.update() 被跳过了。

梯度累积本身不改变模型行为,但它把“更新频率”和“数据吞吐节奏”解耦了。实际调试时,最容易被忽略的是 loss 缩放和 zero_grad 的位置——这两处一出错,整个累积就失效,而且很难一眼看出来。

本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

Java测试中怎么使用Mockito模拟依赖对象
Java测试中怎么使用Mockito模拟依赖对象

详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

链表删除节点的时间复杂度是多少及其详细分析
链表删除节点的时间复杂度是多少及其详细分析

详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

codex如何配置模型参数及文件设置教程
codex如何配置模型参数及文件设置教程

想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

Claude Code AI编程工具实力揭秘与编程助手实测
Claude Code AI编程工具实力揭秘与编程助手实测

通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

winforms教程自学入门与基础开发步骤详解
winforms教程自学入门与基础开发步骤详解

本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

Cursor自动补全设置教程教你快速开启代码补全功能
Cursor自动补全设置教程教你快速开启代码补全功能

详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

pandas的数据格式怎么转换和设置方法教程
pandas的数据格式怎么转换和设置方法教程

详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。