当前位置: 首页 > news >正文

batchsize大小对模型训练的影响

        从纯GPU算力的角度来说,batchsize大小的区别并不大,输入数据就那些,计算量是确定的。不同的batchsize大小影响反向传播和dataloader的次数,这部分消耗的时间也是很大的

基本结论

        batch size过小,花费时间多,同时梯度震荡严重,不利于收敛;

        batch size过大,不同batch的梯度方向没有任何变化,容易陷入局部极小值。

迭代速度

      可见当batchsize增大到一定程度之后,再增大所带来的时间减少就会很小了,甚至消耗时间会增多

     完成每个epoch运算的所需的全部时间主要卡在:

        ①load数据的时间    ②每个epoch的iter数量。

      因此对于每个epoch,不管是纯计算时间还是全部时间,大体上还是大batch能够更节约时间一点,但随着batch增大,iter次数减小,完成每个epoch的时间更取决于加载数据所需的时间,此时也不见得大batch能带来多少的速度增益了。

 梯度平滑程度

 

        现在绝大多数的框架在进行mini-batch的反向传播的时候,默认都是将batch中每个instance的loss平均化之后在进行反向传播所以相对大一点的batch size能够防止loss震荡的情况发生。从这两张图中可以看出batch size越小,相邻iter之间的loss震荡就越厉害,相应的,反传回去的梯度的变化也就越大,也就越不利于收敛。

       同时很有意思的一个现象,batch size为1的时候,loss到后期会发生爆炸,这主要是lr=0.02设置太大,所以某个异常值的出现会严重扰动到训练过程。这也是为什么对于较小的batchsize,要设置小lr的原因之一,避免异常值对结果造成的扰巨大扰动而对于较大的batchsize,要设置大一点的lr的原因则是大batch每次迭代的梯度方向相对固定,大lr可以加速其收敛过程。

 收敛速度

       从表中可以看出,在minst数据集上,从整体时间消耗上来看(考虑了加载数据所需的时间),同样的参数策略下 (lr = 0.02, momentum=0.5 ),要模型收敛到accuracy在98左右,batchsize在 6 - 60 这个量级能够花费最少的时间,而batchsize为1的时候,收敛不到98;batchsize过大的时候,因为模型收敛快慢取决于梯度方向和更新次数,所以大batch尽管梯度方向更为稳定,但要达到98的accuracy所需的更新次数并没有量级上的减少,所以也就需要花费更多的时间,当然这种情况下可以配合一些调参策略比如warmup LR,衰减LR等等之类的在一定程度上进行解决(这个先暂且按下不表),但也不会有本质上的改善。

       不过单纯从计算时间上来看,大batch还是可以很明显地节约所需的计算时间的,原因前面讲过了,主要因为本次实验中纯计算时间中,反向占的时间比重远大于正向。

相关文章:

  • Pytorch混合精度(FP16FP32)(AMP自动混合精度)/半精度 训练(一) —— 原理(torch.half)
  • CUDA编程(一) —— 相关概念基础知识
  • CUDA编程(二) —— CUDA编程模型
  • Python Fastai框架
  • ubuntu安装docker
  • Linux(ubuntu)(十三) —— (系统)服务管理 (systemctlservicechkconfig)服务的运行级别(Runlevel)
  • linux 文件/目录名 颜色
  • nvcc(CUDA编译器)
  • docker使用GPU(nvidia-docker)
  • Pytorch分布式训练/多卡训练(二) —— Data Parallel并行(DDP)(2.3)(torch.multiprocessing(spawn) Apex)
  • OpenStack
  • Python logging日志模块
  • CUDA编程(三) —— 编程实践
  • Python函数传参(*星号)
  • Python调用函数带括号和不带括号的区别
  • [译]如何构建服务器端web组件,为何要构建?
  • 2017年终总结、随想
  • 4个实用的微服务测试策略
  • exif信息对照
  • happypack两次报错的问题
  • Java到底能干嘛?
  • JS 面试题总结
  • python学习笔记-类对象的信息
  • SpriteKit 技巧之添加背景图片
  • Wamp集成环境 添加PHP的新版本
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 服务器从安装到部署全过程(二)
  • 工作手记之html2canvas使用概述
  • 关于for循环的简单归纳
  • 容器服务kubernetes弹性伸缩高级用法
  • 用 Swift 编写面向协议的视图
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​iOS实时查看App运行日志
  • # Apache SeaTunnel 究竟是什么?
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (floyd+补集) poj 3275
  • (备忘)Java Map 遍历
  • (动态规划)5. 最长回文子串 java解决
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三)模仿学习-Action数据的模仿
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转载)从 Java 代码到 Java 堆
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 指南:抽象化实现的基类
  • .NET下ASPX编程的几个小问题
  • /var/log/cvslog 太大
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @RestControllerAdvice异常统一处理类失效原因