本文链接:https://blog.csdn.net/wydbyxr/article/details/84855489
尽可能地设大batchsize    "Large Batch

Large Batch在 keypoints上也是有用的,大概能提到0.4到0.3的点的AP。"

在利用 ImageNet 训练 AlexNet 模型时,其中每 GPU 的最优批量大小为 512。如果我们希望使用大量 GPU 并保证每 GPU 皆拥有理想的执行效率,则应当将批量大小设定为 16 x 512 = 8192。        
        
"Train的batch是多少?
1
2
3
我们训练的时候根据输入图像的尺寸不同,batch_size在20到64之间。"

SGD 算法的 batch size 并不能无限制地增大。SGD 采用较大的 batch size 时,如果还是使用同样的 epochs 数量进行运算,则准确度往往低于 batch size 较小的场景 ; 而且目前还不存在特定算法方案能够帮助我们高效利用较大的 batch size。        
        
        
对于大批量训练场景,我们需要确保使用较大的 batch size 训练能够在相同 epochs 前提下获得与较小的 batch size 相近的测试准确度。这里我们之所以保持 epochs 数量不变,是因为从统计学角度来讲,一个 epoch 代表着算法与整体数据集接触一次 ; 而从计算角度来讲,固定 epochs 数量意味着保证浮点运算次数不变。        
1
2
3
4
Batch_Size    既然 Full Batch Learning 并不适用大数据集,那么走向另一个极端怎么样?所谓另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

在合理范围内,增大batch size    "好处
1
1)内存利用率提高了,大矩阵乘法的并行化效率提高。
2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。"    
“随着 Batch_Size 增大,处理相同数据量的速度越快。
随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。”    由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

"盲目增大 Batch_Size 有何坏处?
1
1)Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
2)太大的batch size 容易陷入sharp minima,泛化性不好"

Batch_Size 太小    收敛太慢,算法在 200 epoches 内不收敛。    
        
        
        
        
        
        
基于梯度下降的情况下    "样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点,或者炸下了马(此处请保持纯洁的心态!),从而有机会去寻找更优的最优点。
1
2
3
4
5
6
7
8
因此,与之相反的,当样本量很多时,方差很小(咦?最开始的时候好像在说标准差来着,反正方差与标准差就差个根号,没影响的哈~),对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。

小总结一下,batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。" “使用更大的方差来试探最优点的质量。
所以在小batch size时,逐渐减少learning rate的神经网络玩的就是退火算法。
不同的batch size不仅仅会影响你的收敛速度,还经常影响你最终收敛时的准确率。
工程上实验验证 batch size 越大,比如1000 对 100的效果要差。即发现batch 太多大, 训练一点效果没。”

"这之前我们的讨论是基于梯度下降的,而且默认是一阶的(即没有利用二阶导数信息,仅仅使用一阶导数去优化)。因此对于SGD(随机梯度下降)及其改良的一阶优化算法如Adagrad、Adam等是没问题的,但是对于强大的二阶优化算法如共轭梯度法、L-BFGS来说,如果估计不好一阶导数,那么对二阶导数的估计会有更大的误差,这对于这些算法来说是致命的。
1
因此,对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。

另外,听说GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优"    batch太大容易错事最有点,太小的话又会出现在局部最小点附近剃度下降特别慢,所以很多架构都有一个decay参数,在前期使用大的batch

如何选择batch size    "一般而言,根据你的GPU显存,设置为最大,而且一般要求是8的倍数(比如32,128),这样,GPU内部的并行运算效率最高。
1
那么怎么选择batch number呢?就像刚才说的,8的倍数,然后是稍微大一点(一般而言)。另外一个方法,就是选择一部分数据,跑几个batch看看你的loss是不是在变小,选择一个合适的就可以了。"    cpu有预取, gpu有合并访问, 不仅仅要求长度是2的次方, 内存地址也是有要求的

"batch_size设的大一些,收敛得快,也就是需要训练的次数少,准确率上升得也很稳定,但是实际使用起来精度不高。
1
batch_size设的小一些,收敛得慢,而且可能准确率来回震荡,所以还要把基础学习速率降低一些;但是实际使用起来精度较高。一般我只尝试batch_size=64或者batch_size=1两种情况。"

"我来简单说一下怎么操作吧,
1
Batch size设置以喂饱你的硬件为主要标准。只要显卡塞得下,首先挑大的。
当感觉训练时噪音不够时,比如收敛碰到鞍点或者局部最小值时,调小batch size。(很少会碰到)
当感觉训练时噪音太大时,调大batch size到喂饱硬件(因为2很少碰到,这也很少做),再不行就调小learning rate,也可以直接调小learning rate。
综合起来用就是常见的带learning rate下降的sgd。开始时依赖batch带来的噪音快速下降,接下来使用较低的learning rate消除这些噪音寻求稳定收敛。一般而言只要batch不太大,样本里的噪音总是够用的。
cpu是非常讨厌16,32,64…… 这样大小的数组的,gpu没有类似的问题(gpu 上最好都是 32 倍数,和 wrap 一致,可见cuda gpu的文档),但我还是要劝大家,超参的选取随意点。
"

"full batch是特殊的mini batch。
1
batch size越大每次迭代的梯度越接近样本的真实梯度。
小的batch size能有效避免样本中的冗余信息。
大的batch能更充分利用GPU。
batch的大小并没有固定模式,不需要非要2^n的size。
综合以上几点进行权衡,选择你的batch。"

就个人经验而论 batchsize越大越好1.震荡明显减少 2.收敛速度加快 3.同样学习率下大batch可以收敛到更好的水平。目前没发现什么大batch过早陷入局部最优的现象,在我这都是batch越大,精度越高,当然我还在继续实验观察    
        
实验    这个做过几个实验,但是没有详细的做,主要是针对googlenet,alexnet以及vgg几个模型(实验结果就是batch为32的时候,alex开始收敛,但是googlenet不收敛;提高batch size,googlenet开始收敛)。就像lecun[note](http://cilvr.nyu.edu/lib/exe/fetch.php?media=deeplearning:dl-optimization.pdf)里说的一样,随机梯度下降不能像full batch那样明显的保证收敛。    
        
    可能因为我调参的能力比较有限,确实batchsize太小会出现网络收敛不稳定,最后结果比较差的情况,这个在ImageNet和其他数据库上都遇到过,而batchsize太大确实也会影响随机性的引入。目前一般调ImageNet的时候,大家都喜欢把显存占满,不过小一些的库,个人感觉还是应该大大小小都尝试一下。    
        
        
batch size与BN    "batch size大了一个epoch update数量少了的这个缺点在bn面前似乎也没太多存在感了。
1
2
3
4
5
6
7
8
不过bn的坏处就是不能用太小的batch size,要不然mean和variance就偏了。所以现在一般是显存能放多少就放多少。而且实际调起模型来,真的是数据分布和预处理更为重要,数据不行的话 玩再多花招也没用。"    另外如果用了batchnorm,batch size别太小

"BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize 太小时效果不佳、对 RNN 等动态网络无法有效应用 BN 等。
1
Batch Size 的影响,目前可以实验证实的是:batch size 设置得较小训练出来的模型相对大 batch size 训练出的模型泛化能力更强,在测试集上的表现更好,而太大的 batch size 往往不太 Work,而且泛化能力较差。但是背后是什么原因造成的,目前还未有定论,持不同看法者各持己见。"
————————————————
版权声明:本文为CSDN博主「whitenightwu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wydbyxr/article/details/84855489

batch_size 大小的设定,对训练的影响相关推荐

  1. 深入探讨!Batch 大小对训练的影响

    一.概要: 批训练(mini-batch)的训练方法几乎每一个深度学习的任务都在用,但是关于批训练的一些问题却仍然保留,本文通过对MNIST数据集的演示,详细讨论了batch_size对训练的影响,结 ...

  2. 【BATCH_SIZE大小设置影响测试结果】

    BATCH_SIZE大小设置会影响训练效果,这方面很多人已经介绍过原因了.但是,当我们训练完,BATCH_SIZE大小设置会影响到测试效果就感觉有些奇怪了.后来发现是没有设置随机数种子,加上torch ...

  3. 【记录】batch_size对cnn训练的影响

    在其他参数基本一致的情况下,单独调整batchsize,来查看一下对训练的影响. 记录下不同batch_size情况下在Epoch下loss的变化率 训练模型 下面是一个训练模型的summary,我将 ...

  4. batch size对训练的影响

    文章目录 一.batch size 二.batch size对训练的影响 1.训练时间 2.模型的影响 3.实战中的超参数 在不考虑bn的情况下,batch size大小决定了深度学习训练过程中完成每 ...

  5. BatchNormalization对cnn训练的影响

    在其他参数基本一致的情况下,单独调整batchsize,来查看一下对训练的影响. 记录下不同batch normalization位置情况下最终训练model在test集上测试的结果 训练模型 下面是 ...

  6. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  7. 谷歌浏览器移动端部分字体大小与设定大小不同

    问题描述:为了适配各种移动端设备,动态设置了viewport缩放,然后动态设置html的font-size大小,用rem布局.但是在谷歌浏览器中查看的时候出现了问题 1.这个没问题,font-size ...

  8. Batch Size 对训练的影响

    作者 陈志远@知乎  编辑 极市平台 侵删 来源 https://zhuanlan.zhihu.com/p/83626029 之前面试过程中被问到过两个问题: (1)深度学习中batch size的大 ...

  9. Batch Size对神经网络训练的影响

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Daryl Chang 来源丨CV技术指南 编辑丨极市平台 导 ...

最新文章

  1. mysql raiserror_RAISERROR在SQL Server数据库中的用法
  2. 如何使用第三方日志记录提供程序替代.NET Core中的内置程序
  3. hdu_2048 错排问题
  4. 如何获得完美的调色板?完美的配色素材专辑拿走!
  5. 单链表的读取、插入与删除
  6. VMware Workstation 激活密码
  7. 微信小程序生成海报图片导出相册
  8. 做Gabor滤波器图片
  9. android 主流分辨率是多少,android手机常用分辨率有哪些?
  10. Empty DataFrame
  11. Tilera平台使用体会
  12. 2、Android底层机制
  13. The harvester安装使用
  14. 项目中pom.xml文件变灰且中间有横杠改怎么解决?
  15. Python 搭建一个简易QQ机器人
  16. git第一次提交不能使用git commit -a -m
  17. java:定义USB接口
  18. Windows下 wget 的安装与使用
  19. Java操作Word转PDF(Word转图片)
  20. input值变化监听事件

热门文章

  1. 制作一个简单HTML电影网页设计(HTML+CSS)
  2. 提高代码速度的“正确姿势”
  3. 微信小程序——微信开发者工具添加less插件
  4. 王码五笔输入教程(转自电脑报)
  5. 估计的商是什么意思_《商》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  6. Mysql只看这一篇就够啦
  7. 《3D数学基础》提炼总结(一)3D数学和笛卡尔坐标系
  8. GO语言基础进阶教程:sync包——读写锁
  9. 车架号识别|Vin码识别介绍及APP嵌入集成解决方案
  10. 2020华数杯全国大学生数学建模竞赛C题-脱贫帮扶绩效评价体系的构建与探究(二)(附MATLAB和Python代码)