pytorch 梯度累积(gradient accumulation)

这篇具有很好参考价值的文章主要介绍了pytorch 梯度累积(gradient accumulation)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

梯度累积 - gradient accumulation

在深度学习训练的时候,数据的batch size大小受到GPU内存限制,batch size大小会影响模型最终的准确性和训练过程的性能。在GPU内存不变的情况下,模型越来越大,那么这就意味着数据的batch size只能缩小,这个时候,梯度累积(Gradient Accumulation)可以作为一种简单的解决方案来解决这个问题。

梯度累积(Gradient Accumulation)是一种不需要额外硬件资源就可以增加批量样本数量(Batch Size)的训练技巧。这是一个通过时间换空间的优化措施,它将多个Batch训练数据的梯度进行累积,在达到指定累积次数后,使用累积梯度统一更新一次模型参数,以达到一个较大Batch Size的模型训练效果。累积梯度等于多个Batch训练数据的梯度的平均值

所谓梯度累积过程,其实很简单,我们梯度下降所用的梯度,实际上是多个样本算出来的梯度的平均值,以batch_size=128为例,你可以一次性算出128个样本的梯度然后平均,我也可以每次算16个样本的平均梯度,然后缓存累加起来,算够了8次之后,然后把总梯度除以8,然后才执行参数更新。当然,必须累积到了8次之后,用8次的平均梯度才去更新参数,不能每算16个就去更新一次,不然就是batch_size=16了。

传统的深度学习

for i, (inputs, labels) in enumerate(trainloader):
    optimizer.zero_grad()                   # 梯度清零
    outputs = net(inputs)                   # 正向传播
    loss = criterion(outputs, labels)       # 计算损失
    loss.backward()                         # 反向传播,计算梯度
    optimizer.step()                        # 更新参数
    if (i+1) % evaluation_steps == 0:
        evaluate_model()

具体流程:

  1. optimizer.zero_grad(),将前一个batch计算之后的网络梯度清零
  2. 正向传播,将数据和标签传入网络,过infer计算得到预测结果
  3. 根据预测结果与label,计算损失值
  4. loss.backward() ,利用损失进行反向传播,计算参数梯度
  5. optimizer.step(),利用计算的参数梯度更新网络参数

简单的说就是进来一个batch的数据,计算一次梯度,更新一次网络。

梯度累积方式

for i, (inputs, labels) in enumerate(trainloader):
    outputs = net(inputs)                   # 正向传播
    loss = criterion(outputs, labels)       # 计算损失函数
    loss = loss / accumulation_steps        # 梯度均值,损失标准化
    loss.backward()                         # 梯度均值累加,反向传播,计算梯度
    
	# 累加到指定的 steps 后再更新参数
	if (i+1) % accumulation_steps == 0:     
        optimizer.step()                    # 更新参数
        optimizer.zero_grad()               # 梯度清零
        if (i+1) % evaluation_steps == 0:
            evaluate_model()

具体流程:

  1. 正向传播,将数据传入网络,得到预测结果
  2. 根据预测结果与label,计算损失值
  3. 利用损失进行反向传播,计算参数梯度
  4. 重复1-3,不清空梯度,而是将梯度累加
  5. 梯度累加达到固定次数之后,更新参数,然后将梯度清零

梯度累积时,每个batch 仍然正常前向传播以及反向传播,但是反向传播之后并不进行梯度清零,因为 PyTorch 中的backward() 执行的是梯度累加的操作,所以当我们调用N次 loss.backward() 后,这N个batch 的梯度都会累加起来。但是,我们需要的是一个平均的梯度,或者说平均的损失,所以我们应该将每次计算得到的 loss除以 accum_steps。

        总结来讲,梯度累积就是每计算一个batch的梯度,不进行清零,而是做梯度的累加,当累加到一定的次数(accumulation_steps)之后,再更新网络参数,然后将梯度清零。
        通过这种参数延迟更新的手段,可以实现与采用大batch size相近的效果。在平时的实验过程中,我一般会采用梯度累加技术,大多数情况下,采用梯度累加训练的模型效果,要比采用小batch size训练的模型效果要好很多。

注意事项:

  • 一定条件下,batchsize越大训练效果越好,梯度累加则实现了batchsize的变相扩大,如果accumulation_steps为8,则batchsize '变相' 扩大了8倍,是实验室解决显存受限的一个不错的trick,使用时需要注意,学习率也要适当放大文章来源地址https://www.toymoban.com/news/detail-611633.html

到了这里,关于pytorch 梯度累积(gradient accumulation)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于num_steps_all = len(train_loader) // configs.gradient_accumulation_steps * configs.epochs的理解,文心一言

    当然可以,我会尽量用简单的语言来解释这行代码。 这行代码计算的是在整个训练过程中,模型参数会更新的总次数。 len(train_loader) :这表示你的训练数据被分成了多少份(或称为“批次”)。想象一下你有100张纸,每张纸上写了一些训练数据,那么这里的 len(train_loader) 就

    2024年02月03日
    浏览(32)
  • 梯度下降算法(Gradient descent)

         首先,我们需要明确梯度下降就是求一个函数的最小值,对应的梯度上升就是求函数最大值。简而言之: 梯度下降的目的就是求函数的极小值点, 例如在最小化损失函数或是线性回归学习中都要用到梯度 下降算法。       ##梯度下降算法作为很多算法的一个关键环节

    2024年01月16日
    浏览(50)
  • Policy Gradient策略梯度算法详解

    Policy Gradient策略梯度(PG),是一种基于策略的强化学习算法,不少帖子会讲到从基于值的算法(Q-learning/DQN/Saras)到基于策略的算法难以理解,我的理解是两者是完全两套思路,在学习一种的时候先不要考虑另一种,更容易接受算法基本思想,了解了算法原理推导过程之后再

    2024年02月07日
    浏览(43)
  • 策略梯度算法(Policy gradient,PG)

    强化学习 有三个组成部分:演员,环境和奖励函数, 演员是我们的智能体,环境就是对手,奖励就是没走出一步环境给我们的reward,环境和奖励是我们无法控制的,但是我们可以调整演员的策略,演员的策略决定了演员的动作,即给定一个输入,它会输出演员现在应该要执

    2023年04月08日
    浏览(85)
  • 集成学习算法梯度提升(gradient boosting)的直观看法

    reference: Intuitive Ensemble Learning Guide with Gradient Boosting 梯度提升算法的核心思想:使用前一个模型的残差作为下一个模型的目标。 使用单个机器学习模型可能并不总是适合数据。优化其参数也可能无济于事。一种解决方案是将多个模型组合在一起以拟合数据。本教程以梯度提

    2023年04月09日
    浏览(56)
  • 飞控学习笔记-梯度下降算法(gradient descent algorithm)

    笔记来源于文章:An_efficient_orientation_filter_for_inertial_and_inertial_magnetic_sensor_arrays 共轭: 四元数叉乘: 式(6)为方向余弦矩阵 欧拉角等式: w:角速度

    2024年02月16日
    浏览(40)
  • 随机梯度下降算法SGD(Stochastic gradient descent)

    SGD是什么 SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这

    2024年02月11日
    浏览(37)
  • 【基础理论】图像梯度(Image Gradient)概念和求解

    什么是图像梯度?以及图像梯度怎么求解? 图像梯度是指图像某像素在x和y两个方向上的变化率(与相邻像素比较),是一个二维向量,由2个分量组成X轴的变化、Y轴的变化 。其中: X轴的变化是指当前像素右侧(X加1)的像素值减去当前像素左侧(X减1)的像素值。 Y轴的变

    2024年02月16日
    浏览(35)
  • 机器学习之SGD(Stochastic Gradient Descent,随机梯度下降)

    SGD(Stochastic Gradient Descent,随机梯度下降)是深度学习中最基本的优化算法之一。它是一种迭代式的优化方法,用于训练神经网络和其他机器学习模型。以下是关于SGD优化器的重要信息: 基本原理 :SGD的基本思想是通过不断调整模型参数来最小化损失函数。它每次迭代时从

    2024年02月11日
    浏览(43)
  • 大模型高效训练基础知识:梯度检查点(Gradient Checkpointing)

    prerequiste: 大模型训练基础知识:梯度累积(Gradient Accumulationn) 梯度检查点(Gradient Checkpointing) 如今(2023年)大模型的参数量巨大,即使将batch_size设置为1并使用梯度累积的方式更新,也仍然会OOM。原因是通常在计算梯度时,我们需要将所有前向传播时的激活值保存下来,

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包