我们在训练神经网络的时候,batch_size的大小会对最终的模型效果产生很大的影响。一定条件下,batch_size设置的越大,模型就会越稳定。batch_size的值通常设置在 8-32 之间,但是当我们做一些计算量需求大的任务(例如语义分割、GAN等)或者输入图片尺寸太大的时候,我们的batch size往往只能设置为2或者4,否则就会出现 “CUDA OUT OF MEMORY” 的不可抗力报错。

那么如何在有限的计算资源的条件下,训练时采用更大的batch size呢?这就是梯度累加(Gradient Accumulation)技术了。

常规训练过程

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()

使用梯度累加的训练过程

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

就是加了个if

注意这里的loss每次要除以accumulation_step,所以当累加到一定步数optimizer更新的值其实是这些累加值的均值。其实就相当于扩大了batch_size,让更新的loss更加平稳。一个batch的数据最后算的loss也是这个batch的数据个数的均值。

  总结来讲,梯度累加就是每计算一个batch的梯度,不进行清零,而是做梯度的累加(平均),当累加到一定的次数之后,再更新网络参数,然后将梯度清零。

通过这种参数延迟更新的手段,可以实现与采用大batch_size相近的效果。知乎上有人说

"在平时的实验过程中,我一般会采用梯度累加技术,大多数情况下,采用梯度累加训练的模型效果,要比采用小batch_size训练的模型效果要好很多"。

Gradient Accumulation 梯度累加 (Pytorch)相关推荐

  1. 梯度累加(Gradient Accumulation)

    受显存限制,运行一些预训练的large模型时,batch-size往往设置的比较小1-4,否则就会'CUDA out of memory',但一般batch-size越大(一定范围内)模型收敛越稳定效 ...

  2. pytorch 梯度累积(gradient accumulation)

    梯度累积 - gradient accumulation 在深度学习训练的时候,数据的batch size大小受到GPU内存限制,batch size大小会影响模型最终的准确性和训练过程的性能.在GP ...

  3. 通俗理解深度学习梯度累加(Gradient Accumulation)的原理

    首先你得明白什么是梯度,可以看我之前写的一篇博客 : 微分与梯度的概念理解 本质上,梯度是一种方向导数,是一个矢量,因此这里的梯度累加并不是简单的相加,而是类似于初高中物理学的力的合成,梯度作为一种方 ...

  4. Pytorch分布式训练/多卡训练(二) —— Data Parallel并行(DDP)(2.2)(代码示例)(BN同步主卡保存梯度累加多卡测试inference随机种子seed)

    DDP的使用非常简单,因为它不需要修改你网络的配置.其精髓只有一句话 model = DistributedDataPrallel(model, device_ids=[local_rank], ou ...

  5. pytorch DDP加速之gradient accumulation设置

    pytorch DDP 参考:https://zhuanlan.zhihu.com/p/250471767 GPU高效通信算法-Ring Allreduce: https://www.zhihu.co ...

  6. PyTorch 笔记(13)— autograd(0.4 之前和之后版本差异)、Tensor(张量)、Gradient(梯度)

    1. 背景简述 torch.autograd 是 PyTorch 中方便用户使用,专门开发的一套自动求导引擎,它能够根据输入和前向传播过程自动构建计算图,并执行反向传播. 计算图是现代深度学习框架 P ...

  7. 梯度累积(Gradient Accumulation)

    随着深度学习模型参数量的增加,现有GPU加载一个深度模型(尤其是预训练模型)后,剩余显存无法容纳很多的训练数据,甚至会仅能容纳一条训练数据. 梯度累积(Gradient Accumulation)是一 ...

  8. pytorch多gpu DataParallel 及梯度累加解决显存不平衡和显存不足问题

      最近在做图像分类实验时,在4个gpu上使用pytorch的DataParallel 函数并行跑程序,批次为16时会报如下所示的错误:   RuntimeError: CUDA out of mem ...

  9. 【计数网络】梯度累加增加LCFCN的BatchSize

    LCFCN是一个以分割网络为基础的专用于计数的网络. LCFCN模型由于loss的特殊性 batch size 目前只能为1 LCFCN代码 https://github.com/ElementAI/ ...

最新文章

  1. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...
  2. 在Struts 2中实现文件上传
  3. 在vue中给列表中的奇数行添加class
  4. O(logn*2^logn)和O(n*logn)算法
  5. python sanic openapi_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  6. 为SAP UI5正名 - 它也支持双向绑定
  7. Linux学习命令总结个人及个人心得
  8. WEB前端开发职业学习路线初级完整版
  9. UVA10751 Chessboard【数学水题】
  10. STVD ERROR:misplaced local declaration
  11. 计算机等级考试攻略:四级网络工程师
  12. 用importREC修复Import表
  13. 【串口服务器】的桥接模式
  14. 使用GLSurfaceView实现涂鸦画板功能
  15. 一文带你走进网络编程
  16. 李沐的深度学习笔记来了!
  17. 如何用css只做一个div鼠标点击变色
  18. Linux部署dns服务器(dnsmasq方式)
  19. Java基础公元纪年法换算天干地支纪年法
  20. creo绘图属性模板_Proecreo完整制作工程图格式和模板

热门文章

  1. 熊猫儿 | 燕赵风云,风云燕赵
  2. 宝藏网站!机器学习概念可视化;LeetCode面试必看清单;104个Python数据科学实战项目;必应超清壁纸;前沿论文 | ShowMeAI资讯日报
  3. Python自动化课之Day2篇
  4. html5无法播放腾讯视频教程,电脑中无法打开腾讯视频的解决方法
  5. ​内嵌物理知识神经网络(PINN)是个坑吗?
  6. 异步电机变压变频控制(Asynchronous VVVF)-恒压频比控制Simulink仿真
  7. 服务器维修故障诊断思路大全
  8. 云闪付怎么对接三方php,第三方支付-银联云闪付开发教程
  9. Java bin 目录下的小工具使用与学习
  10. android和rtos相互切换,通用操作系统与实时操作系统(RTOS)比较