首页 > 数据库 > 数据库开发技术 > 神经网络中的梯度累积及其工作原理
在内存限制的情况下,始终建议使用小批量来训练神经网络。因为大批量会导致训练失败。
尽管如此,还有一种称为梯度累积(Gradient Accumulation)的技术,它让我们可以逻辑上增加批量大小,而无需明确增加批量大小。
有困惑?没关系,接下来我们就来详细了解这个问题。但在此之前,我们必须对以下知识有个大致了解。
神经网络中的主要内存开销来自反向传播(Backpropagation)。
这是因为,在反向传播期间,我们必须将每层的激活项存储在内存中。毕竟,它们是用来计算梯度的。
网络越大,在内存中必须存储的激活项就越多。
此外,在内存限制的情况下,较大的批次大小将导致:
这可能会导致资源消耗超过可用资源量,从而导致训练失败。但是通过减少批量大小,我们可以限制内存使用的同时正常训练网络。
假设我们正在小批量上训练神经网络:
我们按如下方式训练网络:
梯度累积修改了反向传播的最后一步,即权重更新。
更具体地说,我们不需要每次都更新每个小批量的权重,而是可以这样做:
这种技术之所以有效,是因为跨多个小批量累积梯度会产生相同的梯度总和,就像我们同时处理它们一样。
因此,从逻辑上讲,使用梯度累积,我们可以模拟更大的批量大小,而无需明确增加批量大小。
例如,假设我们要使用 64 的批次大小。但是,当前内存只能支持 16 的批次大小。
不用担心!我们可以这样做:
因此,实际上我们使用了 16*8(=128)的批量大小,而不是我们最初计划的 64。
很酷吧?
在 PyTorch 中,典型的训练循环实现如下:
但是,正如前面所讨论的,如果需要,我们只能在几次迭代后更新权重。
因此,我们必须继续积累梯度,这正是 loss.backward() 所做的。
此外,由于 optimizer.zero_grad() 清除了梯度,所以我们必须在更新权重后才执行它。
这个想法实现如下:
if 条件为真时,我们才会更新权重。这样,我们就可以在内存受限的环境中优化神经网络训练。
Notes:必须要注意的是,梯度累积并不是在内存受限的情况下改善运行时间的补救措施。
其实通过实验我们也能够验证这一点:
两者的运行时间几乎相同。相反,它的目标是减少总体内存使用量。
当然,我们确实只是在几次迭代后才更新权重。因此,这会比每次迭代都更新要快一点。
然而,我们仍然需要在小批量上处理和计算梯度,这是这里的核心操作。
尽管如此,好消息是,即使您不受内存限制,您仍然可以使用梯度累积。
这难道不是一个很酷的技术吗?
案例的实现脚本笔者已整理好,需要的朋友请关注我,后台回复“梯度累积”关键字即可免费领取。
推荐阅读👇👇👇
10个Python自动化脚本,简化日常工作任务,看看有没有适合你的!
- END -
🌟 喜欢这篇文章吗?给个赞支持一下吧!🌟
如果你发现今天的内容对你有帮助,不妨点个赞并关注我,第一时间接收更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。你的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!

👇👇👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!
原文作者:数据派探险家;如有侵权,请联系管理员删除。