ITPub博客

首页 > 数据库 > 数据库开发技术 > 神经网络中的梯度累积及其工作原理

神经网络中的梯度累积及其工作原理

原创 数据库开发技术 作者:jackzhang 时间:2024-06-23 06:30:00 0 删除 编辑

在内存限制的情况下,始终建议使用小批量来训练神经网络。因为大批量会导致训练失败。

尽管如此,还有一种称为梯度累积(Gradient Accumulation)的技术,它让我们可以逻辑上增加批量大小,而无需明确增加批量大小。

有困惑?没关系,接下来我们就来详细了解这个问题。但在此之前,我们必须对以下知识有个大致了解。

为什么神经网络在训练过程中会发生爆炸?

神经网络中的主要内存开销来自反向传播(Backpropagation)。

这是因为,在反向传播期间,我们必须将每层的激活项存储在内存中。毕竟,它们是用来计算梯度的。

网络越大,在内存中必须存储的激活项就越多。

此外,在内存限制的情况下,较大的批次大小将导致:

  • 存储许多激活项
  • 使用这些激活项来计算梯度

这可能会导致资源消耗超过可用资源量,从而导致训练失败。但是通过减少批量大小,我们可以限制内存使用的同时正常训练网络。

什么是梯度累积,它如何在内存限制下增加批量大小?

假设我们正在小批量上训练神经网络:

我们按如下方式训练网络:

  • 在每个小批量上:
    • 存储激活的同时运行前向传播。
    • 在反向传播过程中:
      • 计算损失
      • 计算梯度
      • 更新权重

梯度累积修改了反向传播的最后一步,即权重更新。

更具体地说,我们不需要每次都更新每个小批量的权重,而是可以这样做:

  • 在小批量上运行前向传递。
  • 计算网络中权重的梯度值。
  • 暂时不要更新权重。
  • 在下一个小批量上运行前向传递。
  • 计算权重的梯度值并将其添加到步骤 2 中获得的梯度中。
  • 重复步骤 3-5,获取更多小批量。
  • 仅在处理几个小批次后更新权重。

这种技术之所以有效,是因为跨多个小批量累积梯度会产生相同的梯度总和,就像我们同时处理它们一样。

因此,从逻辑上讲,使用梯度累积,我们可以模拟更大的批量大小,而无需明确增加批量大小。

例如,假设我们要使用 64 的批次大小。但是,当前内存只能支持 16 的批次大小。

不用担心!我们可以这样做:

  • 我们可以使用大小为 16 的批量。
  • 我们可以从每个小批量中累积梯度。
  • 我们只能每 8 个小批次更新一次权重。

因此,实际上我们使用了 16*8(=128)的批量大小,而不是我们最初计划的 64。

很酷吧?

实现案例

在 PyTorch 中,典型的训练循环实现如下:

  • 清除梯度
  • 运行前向传球
  • 计算损失
  • 计算梯度
  • 更新权重

但是,正如前面所讨论的,如果需要,我们只能在几次迭代后更新权重。

因此,我们必须继续积累梯度,这正是 loss.backward() 所做的。

此外,由于 optimizer.zero_grad() 清除了梯度,所以我们必须在更新权重后才执行它。

这个想法实现如下:

  • 首先,我们定义acc_steps — 我们想要更新权重的小批量的数量。
  • 接下来,我们进行前向传球。
  • 接下来,我们计算损失和梯度。
  • 正如前面所讨论的,我们暂时不会更新权重,而是让梯度累积更多的小批量。
  • 仅当 if 条件为真时,我们才会更新权重。
  • 更新后,我们清除累积的梯度。

这样,我们就可以在内存受限的环境中优化神经网络训练。


Notes:必须要注意的是,梯度累积并不是在内存受限的情况下改善运行时间的补救措施。

其实通过实验我们也能够验证这一点:

两者的运行时间几乎相同。相反,它的目标是减少总体内存使用量。

当然,我们确实只是在几次迭代后才更新权重。因此,这会比每次迭代都更新要快一点。

然而,我们仍然需要在小批量上处理和计算梯度,这是这里的核心操作。

尽管如此,好消息是,即使您不受内存限制,您仍然可以使用梯度累积。

  • 指定你的典型批次大小。
  • 执行前向传播。
  • 计算损失和梯度。
  • 经过多次迭代后更新权重。

这难道不是一个很酷的技术吗?

案例的实现脚本笔者已整理好,需要的朋友请关注我,后台回复“梯度累积”关键字即可免费领取。


推荐阅读👇👇👇

Python开发技巧:使用显式打包简化导入

如何评估顺序分类数据的相关性?

Python OOP 中最常见的 20 种魔术方法

关于 Pandas 的 Inplace 操作你可能有所误解

10个Python自动化脚本,简化日常工作任务,看看有没有适合你的!

- END -

🌟 喜欢这篇文章吗?给个赞支持一下吧!🌟

如果你发现今天的内容对你有帮助,不妨点个赞并关注我,第一时间接收更多关于Python、数据分析和机器学习的深入分析和最新趋势。我们一起探索数据的力量,解锁AI的潜能。你的每一次互动都是对我的极大鼓励,也是我们共同成长的动力!

👇👇👇 关注并开启星标提醒,让知识与技能的火花不断在你的职业道路上燃烧吧!

原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55941