精华内容
下载资源
问答
  • 尽可能地设大batchsize 在合理范围内,增大batch size的好处 1)内存利用率提高了,大矩阵乘法的并行化效率提高。 2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。 3)在...

    只做记录,原文:https://blog.csdn.net/wydbyxr/article/details/84855489
    尽可能地设大batchsize

    在合理范围内,增大batch size的好处

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

    盲目增大 Batch_Size 有何坏处

    1)Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
    2)太大的batch size 容易陷入sharp minima,泛化性不好。
    3)Batch_Size 太小 收敛太慢,算法在 200 epoch 内不收敛。

    不同的梯度下降算法下,不同Batch_Size设置的影响

    样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点,从而有机会去寻找更优的最优点。
    因此,与之相反的,当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。
    总结一下,batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。
    使用更大的方差来试探最优点的质量。
    所以在小batch size时,逐渐减少learning rate的神经网络玩的就是退火算法。
    不同的batch size不仅仅会影响你的收敛速度,还经常影响你最终收敛时的准确率。
    工程上实验验证 batch size 越大,比如1000 对 100的效果要差。即发现batch 太多大, 训练一点效果没。

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

    batch_size与2的倍数

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

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

    cpu是非常讨厌16,32,64…… 这样大小的数组的,gpu没有类似的问题(gpu 上最好都是 32 倍数,和 wrap 一致,可见cuda gpu的文档),但我还是要劝大家,超参的选取随意点。

    batch size与BN

    batch size大了则一个epoch update数量少的这个缺点,在bn面前似乎也没太多存在感了。
    不过bn的坏处就是不能用太小的batch size,要不然mean和variance就偏了。所以现在一般是显存能放多少就放多少。而且实际调起模型来,真的是数据分布和预处理更为重要,数据不行的话 玩再多花招也没用。
    如果用了batchnorm,batch size别太小(BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize 太小时效果不佳、对 RNN 等动态网络无法有效应用 BN 等)。

    设置多大的batch_size(未整理,凑合着看吧)

    Large Batch
    Large Batch在 keypoints上也是有用的,大概能提到0.4到0.3的点的AP。
    在利用 ImageNet 训练 AlexNet 模型时,其中每 GPU 的最优批量大小为 512。如果我们希望使用大量 GPU 并保证每 GPU 皆拥有理想的执行效率,则应当将批量大小设定为 16 x 512 = 8192。

    Train的batch是多少?
    我们训练的时候根据输入图像的尺寸不同,batch_size在20到64之间。

    SGD 算法的 batch size 并不能无限制地增大。
    SGD 采用较大的 batch size 时,如果还是使用同样的 epochs 数量进行运算,则准确度往往低于 batch size 较小的场景 ; 而且目前还不存在特定算法方案能够帮助我们高效利用较大的 batch size。

    对于大批量训练场景,我们需要确保使用较大的 batch size 训练能够在相同 epochs 前提下获得与较小的 batch size 相近的测试准确度。这里我们之所以保持 epochs 数量不变,是因为从统计学角度来讲,一个 epoch 代表着算法与整体数据集接触一次 ; 而从计算角度来讲,固定 epochs 数量意味着保证浮点运算次数不变。

    Batch_Size 既然 Full Batch Learning 并不适用大数据集,那么走向另一个极端怎么样?所谓另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

    batch_size设的大一些,收敛得快,也就是需要训练的次数少,准确率上升得也很稳定,但是实际使用起来精度不高。
    batch_size设的小一些,收敛得慢,而且可能准确率来回震荡,所以还要把基础学习速率降低一些;但是实际使用起来精度较高。一般我只尝试batch_size=64或者batch_size=1两种情况。
    Batch Size 的影响,目前可以实验证实的是:batch size 设置得较小训练出来的模型相对大 batch size 训练出的模型泛化能力更强,在测试集上的表现更好,而太大的 batch size 往往不太 Work,而且泛化能力较差。但是背后是什么原因造成的,目前还未有定论,持不同看法者各持己见。

    Batch size设置以喂饱你的硬件为主要标准。只要显卡塞得下,首先挑大的。
    当感觉训练时噪音不够时,比如收敛碰到鞍点或者局部最小值时,调小batch size。(很少会碰到)
    当感觉训练时噪音太大时,调大batch size到喂饱硬件(因为2很少碰到,这也很少做),再不行就调小learning rate,也可以直接调小learning rate。
    综合起来用就是常见的带learning rate下降的sgd。开始时依赖batch带来的噪音快速下降,接下来使用较低的learning rate消除这些噪音寻求稳定收敛。一般而言只要batch不太大,样本里的噪音总是够用的。
    full batch是特殊的mini batch。
    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开始收敛)。就像lecunnote里说的一样,随机梯度下降不能像full batch那样明显的保证收敛。

    可能因为我调参的能力比较有限,确实batchsize太小会出现网络收敛不稳定,最后结果比较差的情况,这个在ImageNet和其他数据库上都遇到过,而batchsize太大确实也会影响随机性的引入。目前一般调ImageNet的时候,大家都喜欢把显存占满,不过小一些的库,个人感觉还是应该大大小小都尝试一下。

    展开全文
  • batch size设置技巧 谈谈batchsize参数

    万次阅读 多人点赞 2019-03-30 20:57:00
    深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别: (1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练; (2)iteration:...

    深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别:

    (1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
    (2)iteration:1个iteration等于使用batchsize个样本训练一次;
    (3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

    举个例子,训练集有1000个样本,batchsize=10,那么:
    训练完整个样本集需要:
    100次iteration,1次epoch。

    1.当数据量足够大的时候可以适当的减小batch_size,由于数据量太大,内存不够。但盲目减少会导致无法收敛,batch_size=1时为在线学习,也是标准的SGD,这样学习,如果数据量不大,noise数据存在时,模型容易被noise带偏,如果数据量足够大,noise的影响会被“冲淡”,对模型几乎不影响。2.batch的选择,首先决定的是下降方向,如果数据集比较小,则完全可以采用全数据集的形式。这样做的好处有两点,

     1)全数据集的方向能够更好的代表样本总体,确定其极值所在。
    

    2)由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。

    3.增大batchsize的好处有三点:

         1)内存的利用率提高了,大矩阵乘法的并行化效率提高。
    
         2)跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快。
    
         3)一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小。
    

    4.盲目增大的坏处有三点:

    1)当数据集太大时,内存撑不住。

         2)跑完一次epocffe-master/tools/extra/parse_log.sh  caffe-master/tools/extra/extract_seconds.py和h(全数据集)所需迭代次数减少了,但要想达到相同的      精度,时间开销太大,参数的修正更加缓慢。
    
         3)batchsize增大到一定的程度,其确定的下降方向已经基本不再变化。
    

    总结:

         1)batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。
    
         2)随着batchsize增大,处理相同的数据量的速度越快。
    
         3)随着batchsize增大,达到相同精度所需要的epoch数量越来越多。
    
         4)由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
    
         5)由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
    
         6)过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。
    
         7)具体的batch size的选取和训练集的样本数目相关。
    

    还有一个代码上的细节:就是代码实现上选取一个batch的时候似乎是按着数据库的图片顺序选取输入图片的,所以在生成数据库的时候切记要shuffle一下图片顺序。caffe中ImageDataLayer有shuffle参数,生成lmdb时也有shuffle参数不必手动。

    显存占用不是和batch size简单成正比

    增大batch size能减缓梯度震荡,需要更少的迭代优化次数,收敛的更快,但是每次迭代耗时更长。
    https://zhuanlan.zhihu.com/p/31558973

    要想收敛到同一个最优点,使用整个样本集时,虽然迭代次数少,但是每次迭代的时间长,耗费的总时间是大于使用少量样本多次迭代的情况的。
    实际上,工程上在使用GPU训练时,跑一个样本花的时间与跑几十个样本甚至几百个样本的时间是一样的!当然得益于GPU里面超多的核,超强的并行计算能力啦。因此,在工程实际中,从收敛速度的角度来说,小批量的样本集是最优的,也就是我们所说的mini-batch。这时的batch size往往从几十到几百不等,但一般不会超过几千。

    样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点。
    与之相反的,当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。

    batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。
    对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。
    GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优

    展开全文
  • 深度学习中学习率和batchsize对模型准确率的影响

    千次阅读 多人点赞 2020-11-07 23:40:27
    本内容来自其他的人解析,参考链接在...学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响,因此这一次来详述它们对模型性能的影响。 2. 学习率如何影响模型性.

    本内容来自其他的人解析,参考链接在最后的注释。

    1. 前言

    目前深度学习模型多采用批量随机梯度下降算法进行优化,随机梯度下降算法的原理如下:
    在这里插入图片描述
    n是批量大小(batchsize),η是学习率(learning rate)。可知道除了梯度本身,这两个因子直接决定了模型的权重更新,从优化本身来看它们是影响模型性能收敛最重要的参数。

    学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响,因此这一次来详述它们对模型性能的影响。

    2. 学习率如何影响模型性能?

    通常我们都需要合适的学习率才能进行学习,要达到一个强的凸函数的最小值,学习率的调整应该满足下面的条件,i代表第i次更新。
    在这里插入图片描述
    第一个式子决定了不管初始状态离最优状态多远,总是可以收敛。第二个式子约束了学习率随着训练进行有效地降低,保证收敛稳定性,各种自适应学习率算法本质上就是不断在调整各个时刻的学习率。

    学习率决定了权重迭代的步长,因此是一个非常敏感的参数,它对模型性能的影响体现在两个方面,第一个是初始学习率的大小,第二个是学习率的变换方案。

    2.1、初始学习率大小对模型性能的影响

    初始的学习率肯定是有一个最优值的,过大则导致模型不收敛,过小则导致模型收敛特别慢或者无法学习,下图展示了不同大小的学习率下模型收敛情况的可能性,图来自于cs231n。
    在这里插入图片描述
    那么在不考虑具体的优化方法的差异的情况下,怎样确定最佳的初始学习率呢?

    通常可以采用最简单的搜索法,即从小到大开始训练模型,然后记录损失的变化,通常会记录到这样的曲线。
    在这里插入图片描述
    随着学习率的增加,损失会慢慢变小,而后增加,而最佳的学习率就可以从其中损失最小的区域选择。

    有经验的工程人员常常根据自己的经验进行选择,比如0.1,0.01等。

    随着学习率的增加,模型也可能会从欠拟合过度到过拟合状态,在大型数据集上的表现尤其明显,笔者之前在Place365上使用DPN92层的模型进行过实验。随着学习率的增强,模型的训练精度增加,直到超过验证集。
    在这里插入图片描述

    2.2、学习率变换策略对模型性能的影响

    学习率在模型的训练过程中很少有不变的,通常会有两种方式对学习率进行更改,一种是预设规则学习率变化法,一种是自适应学习率变换方法

    2.2.1 预设规则学习率变化法

    常见的策略包括fixed,step,exp,inv,multistep,poly,sigmoid等,集中展示如下:
    在这里插入图片描述
    笔者之前做过一个实验来观察在SGD算法下,各种学习率变更策略对模型性能的影响,具体的结果如下:
    在这里插入图片描述

    从结果来看:

    • step,multistep方法的收敛效果最好,这也是我们平常用它们最多的原因。虽然学习率的变化是最离散的,但是并不影响模型收敛到比较好的结果。
    • 其次是exp,poly。它们能取得与step,multistep相当的结果,也是因为学习率以比较好的速率下降,虽然变化更加平滑,但是结果也未必能胜过step和multistep方法,在这很多的研究中都得到过验证,离散的学习率变更策略不影响模型的学习。
    • inv和fixed的收敛结果最差。这是比较好解释的,因为fixed方法始终使用了较大的学习率,而inv方法的学习率下降过程太快。

    从上面的结果可以看出,对于采用非自适应学习率变换的方法,学习率的绝对值对模型的性能有较大影响,研究者常使用step变化策略。

    目前学术界也在探索一些最新的研究方法,比如cyclical learning rate,示意图如下:
    在这里插入图片描述
    实验证明通过设置上下界,让学习率在其中进行变化,可以在模型迭代的后期更有利于克服因为学习率不够而无法跳出鞍点的情况。

    确定学习率上下界的方法则可以使用LR range test方法,即使用不同的学习率得到精度曲线,然后获得精度升高和下降的两个拐点,或者将精度最高点设置为上界,下界设置为它的1/3大小。

    在这里插入图片描述
    SGDR方法则是比cyclical learning rate变换更加平缓的周期性变化方法,如下图,效果与cyclical learning rate类似。
    在这里插入图片描述

    2.2.2 自适应学习率变化法

    自适应学习率策略以Adagrad,Adam等为代表。

    原理上各种改进的自适应学习率算法都比SGD算法更有利于性能的提升,但实际上精细调优过的SGD算法可能取得更好的结果,在很多的论文中都得到过验证,我们在实验中也多次证明过这一点,如下图。
    在这里插入图片描述

    2.3、小结

    不考虑其他任何因素,学习率的大小和迭代方法本身就是一个非常敏感的参数。如果经验不够,还是考虑从Adam系列方法的默认参数开始,如果经验丰富,可以尝试更多的实验配置。

    3. Batchsize如何影响模型性能?

    3.1 谈谈深度学习中的 Batch_Size

    Batch_Size(批尺寸)是机器学习中一个重要参数。

    首先,为什么需要有 Batch_Size 这个参数?
    Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 ( **Full
    Batch Learning)**的形式,这样做有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确的朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用Rprop只基于梯度符号并且针对性单独更新各权值。

    对于更大的数据集,以上 2 个好处又变成了 2 个坏处:其一,随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。其二,以 Rprop 的方式迭代,会由于各个 Batch之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来RMSProp的妥协方案。

    既然 Full Batch Learning 并不适用大数据集,那么走向另一个极端怎么样?

    所谓另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(OnlineLearning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

    在这里插入图片描述
    可不可以选择一个适中的 Batch_Size 值呢?

    当然可以,这就是批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少的更多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一模一样的。

    在合理范围内,增大 Batch_Size 有何好处?

    • 内存利用率提高了,大矩阵乘法的并行化效率提高。
    • 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
    • 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

    盲目增大 Batch_Size 有何坏处?

    • 内存利用率提高了,但是内存容量可能撑不住了。
    • 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    • Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

    大的batchsize导致模型泛化能力下降?

    在一定范围内,增加batchsize有助于收敛的稳定性,但是随着batchsize的增加,模型的性能会下降,如下图:
    在这里插入图片描述
    这是研究者们普遍观测到的规律,虽然可以通过一些技术缓解。这个导致性能下降的batch size在上图就是8000左右。

    那么这是为什么呢?

    研究表明大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,**后者具有更好的泛化能力。**两者的区别就在于变化的趋势,一个快一个慢,如下图,造成这个现象的主要原因是小的batchsize带来的噪声有助于逃离sharp minimum。
    在这里插入图片描述
    Hoffer等人的研究表明,大的batchsize性能下降是因为训练时间不够长,本质上并不少batchsize的问题,在同样的epochs下的参数更新变少了,因此需要更长的迭代次数。

    3.2 小结

    batchsize在变得很大(超过一个临界点)时,会降低模型的泛化能力。在此临界点之下,模型的性能变换随batch size通常没有学习率敏感。

    4 学习率和batchsize的关系

    通常当我们增加batchsize为原来的N倍时,要保证经过同样的样本后更新的权重相等,按照线性缩放规则,学习率应该增加为原来的N倍。但是如果要保证权重的方差不变,则学习率应该增加为原来的sqrt(N)倍,目前这两种策略都被研究过,使用前者的明显居多。

    从两种常见的调整策略来看,学习率和batchsize都是同时增加的。学习率是一个非常敏感的因子,不可能太大,否则模型会不收敛。同样batchsize也会影响模型性能,那实际使用中都如何调整这两个参数呢?

    研究表明,衰减学习率可以通过增加batchsize来实现类似的效果,这实际上从SGD的权重更新式子就可以看出来两者确实是等价的,文中通过充分的实验验证了这一点。

    研究表明,对于一个固定的学习率,存在一个最优的batchsize能够最大化测试精度,这个batchsize和学习率以及训练集的大小正相关。

    对此实际上是有两个建议:

    • 如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。
    • 尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。

    参考

    【AI不惑境】学习率和batchsize如何影响模型的性能?
    谈谈深度学习中的 Batch_Size

    展开全文
  • CNN基础——如何设置BatchSize

    万次阅读 2021-05-13 11:37:53
    3.5 Batch_Size 3.5.1 为什么需要 Batch_SizeBatch的选择,首先决定的是下降的方向。 如果数据集比较小,可采用全数据集的形式,好处是: 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值...

    目录

    1、什么是BatchSize

    2、 为什么需要 Batch_Size?

    3、 如何设置Batch_Size 的值?

    4、在合理范围内,增大Batch_Size有何好处?

    5、 盲目增大 Batch_Size 有何坏处?

    6、调节 Batch_Size 对训练效果影响到底如何?

    7、为什么说Batch size的增大能使网络的梯度更准确?


    1、什么是BatchSize

    Batch一般被翻译为批量,设置batch_size的目的让模型在训练过程中每次选择批量的数据来进行处理。一般机器学习或者深度学习训练过程中的目标函数可以简单理解为在每个训练集样本上得到的目标函数值的求和,然后根据目标函数的值进行权重值的调整,大部分时候是根据梯度下降法来进行参数更新的。

    Batch Size的直观理解就是一次训练所选取的样本数。
    Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如你GPU内存不大,该数值最好设置小一点。

    2、 为什么需要 Batch_Size?

    在没有使用Batch Size之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输入网络中,然后计算它们的梯度进行反向传播,由于在计算梯度时使用了整个数据库,所以计算得到的梯度方向更为准确。但在这情况下,计算得到不同梯度值差别巨大,难以使用一个全局的学习率,所以这时一般使用Rprop这种基于梯度符号的训练算法,单独进行梯度更新。
    在小样本数的数据库中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的数据库,一次性把所有数据输进网络,肯定会引起内存的爆炸。所以就提出Batch Size的概念。

    3、 如何设置Batch_Size 的值?

    ​ 假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。此时,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

    ​ 既然 Batch_Size 为全数据集或者Batch_Size = 1都有各自缺点,那么如何设置一个合适的BatchSize呢? 这个和样本还有一定的关系,样本量少的时候会带来很大的方差,而这个大方差恰好会导致我们在梯度下降到很差的局部最优点(只是微微凸下去的最优点)和鞍点的时候不稳定,一不小心就因为一个大噪声的到来导致炸出了局部最优点。
    与之相反的,当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了,从而导致神经网络收敛到很差的点上,跟出了bug一样的差劲。

    batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。
    对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。
    所以设置BatchSize要注意一下几点:

         1)batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。

         2)随着batchsize增大,处理相同的数据量的速度越快。

         3)随着batchsize增大,达到相同精度所需要的epoch数量越来越多。

         4)由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。

         5)由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

         6)过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。

         7)具体的batch size的选取和训练集的样本数目相关。

         8)GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优

        我在设置BatchSize的时候,首先选择大点的BatchSize把GPU占满,观察Loss收敛的情况,如果不收敛,或者收敛效果不好则降低BatchSize,一般常用16,32,64等。

    4、在合理范围内,增大Batch_Size有何好处?

    1. 内存利用率提高了,大矩阵乘法的并行化效率提高。
    2. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
    3. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

    5、 盲目增大 Batch_Size 有何坏处?

    1. 内存利用率提高了,但是内存容量可能撑不住了。
    2. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    3. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

    6、调节 Batch_Size 对训练效果影响到底如何?

    1. Batch_Size 太小,模型表现效果极其糟糕(error飙升)。
    2. 随着 Batch_Size 增大,处理相同数据量的速度越快。
    3. 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
    4. 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
    5. 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

    7、为什么说Batch size的增大能使网络的梯度更准确?

    1. 梯度的方差表示:


      由于样本是随机选取的,满足独立同分布,所以所有样本具有相同的方差
      所以上式可以简化成:

    1. 可以看出当Batch size为m时,样本的方差减少m倍,梯度就更准确了。

      假如想要保持原来数据的梯度方差,可以增大学习率lrlr

      这也说明batch size设置较大时,一般学习率要增大。但是lrlr的增大不是一开始就设置的很大,而是在训练过程中慢慢变大。

      一个具体例子分析:
      在分布式训练中,Batch size随着数据并行的workers增加而增大,假如baseline的Batch Size为BB,而学习率为lr,训练epoch为NN。假如保持baseline的lr,一般达不到很好的收敛速度和精度。
      原因:对于收敛速度,假如有KK个workers,则每个批次为KBKB,因此一个epoch迭代的次数为baseline的1k,而学习率lr不变,所以要达到与baseline相同的收敛情况,epoch要增大。而根据上面公式,epoch最大需要增大KNKN个epoch,但一般情况下不需要增大那么多。
      对于收敛精度,由于Batch size的使用使梯度更准确,噪声减少,所以更容易收敛。

    展开全文
  • 由于算力的限制,有时我们无法使用足够大的batchsize,此时该如何使用BN呢?本文将介绍两种在小batchsize也可以发挥BN性能的方法。 前言 BN(Batch Normalization)几乎是目前神经网络的必选组件,但是使用BN有两...
  • 谈谈batchsize参数

    千次阅读 2018-11-28 16:36:06
    1.当数据量足够大的时候可以适当的...但盲目减少会导致无法收敛,batch_size=1时为在线学习,也是标准的SGD,这样学习,如果数据量不大,noise数据存在时,模型容易被noise带偏,如果数据量足够大,noise的影响会被...
  • batch size 越大,学习率也要越大 如何理解深度学习分布式训练中的large ...如果保持baseline(小batchsize)的learning rate,一般不会有较好的收敛速度和精度。 原因如下: 对于收敛速度,假设k个worker,每次过的sa
  • 【深度学习】BatchSize设置

    千次阅读 2019-07-18 19:09:33
    Batch_size的使用意义及大小的选择 Batch_size不宜选的太小,太小了容易不收敛,或者需要经过很大的epoch才能收敛;也没必要选的太大,太大的话首先显存受不了,其次可能会因为迭代次数的减少而造成参数修正变的缓慢...
  • Epoch,Batchsize,Iterations,这三个都是深度学习训练模型时经常遇到的概念。你一定有过这样的时刻,面对这几个词傻傻分不清楚,这三个概念究竟是什么,它们又有什么区别? 梯度下降法 一切的一切,要从机器学习中...
  • 本文介绍了Batch Size对模型性能的影响。
  • 一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;batch size 如果过大,则可能会出现局部最优的情况。小的 bath size 引入的随机性更大,难以达到收敛,极少数情况下可能会效果变好。 ...
  • tensorrt在不同batchsize下的性能对比

    千次阅读 2021-01-19 14:57:46
    tensorrt利用GPU进行加速,天然的GPU是适合并行计算,因此加大batchsize是优化tensorrt常见的方式之一 tensorrt默认是batchsize=1,接下来做几个实验进行观察 模型是直接下载的这个网站的onnx文件 拿到onnx文件后...
  • batchsize的选择和学习率调整

    千次阅读 2021-04-14 19:07:38
    batchsize的选择和学习率调整 增大Batch_Size的好处: 数据的处理速度加快,跑完一次 epoch(全数据集)所需的时间减少。 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。尤其...
  • 神经网络中Batch Size的理解

    万次阅读 多人点赞 2018-09-09 14:57:33
    Batch Size定义:一次训练所选取的样本数。 Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如你GPU内存不大,该数值最好设置小一点。 为什么要提出Batch Size? 在没有使用...
  • 本人新手,刚开始学习神经网络,用cnn网络做一个二分类的任务,网络很浅,两层卷积和一层全连接,在调参过程中发现,一开始用较小的batchsize,训练集准确率一开始就是100%,而测试集效果很差,而且loss也比较大...
  • 神经网络中Epoch、Iteration、Batchsize相关理解和说明

    万次阅读 多人点赞 2017-11-21 22:59:49
    微信公众号 看了半年论文,对这三个概念总是模棱两可,不是很清楚。所以呢!我就花了半天时间,收集网上写的很好的关于这三个概念的介绍,把他们总结到一起,希望能对大家有帮助!...batchsize的正...
  • ...“ AI算法与图像处理 ”,选择加"星标"或“置顶” ...(因为反向的过程取决于模型的复杂度,与batchsize的大小关系不大,而正向则同时取决于模型的复杂度和batch size的大小。 而本次...
  • 深度学习中batch size的大小对训练过程的影响是什么样的? 有些时候不可避免地要用超大batch,比如人脸识别,可能每个batch要有几万甚至几十万张人脸图像,训练过程中超大batch有什么优缺点,如何尽可能地避免超大...
  • epoch、batchbatch size和mini-batch的区别

    千次阅读 多人点赞 2020-06-01 17:34:01
    epoch、batchbatch size和mini-batch都是深度学习中常见的名词,初学时经常混淆,在此整理。
  • 之前面试过程中被问到过两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可避免地要用超大batch,比如人脸识别,可能每个batch要有几万甚至几十万张人脸图像,训练过程中...
  • 小GPU内存用大batchsize的方法总结

    千次阅读 2020-07-28 16:09:52
    首先,我们要了解为什么我们要用到大的batchsize来训练我们的模型,这是因为大的batchsize可以让模型中的BN操作计算的不易受到个别数据噪声的影响,可以更快的收敛。 更详细的关于batchsize大小的影响可以去参考这一...
  • 深度学习 Epoch、Batchsize、Batchnumber、Iterations 理解 梯度下降法 首先让我们来回顾一下这个常见的不能再常见的算法。梯度下降法是机器学习中经典的优化算法之一,用于寻求一个曲线的最小值。所谓"梯度",即一...
  • 在深度学习进行分布式训练时,常常采用同步数据并行的方式,也就是采用大的batch size进行训练,但large batch一般较于小的baseline的batch size性能更差,请问如何理解调试learning rate能使large batch达到sma...
  • 在显存不足时,增加batch size的方法

    千次阅读 2020-12-05 01:49:22
    如何在显存不足的情况下,增加batch-size? 换言之,如何增加batch-size而无需扩大显存? 思路: 将batch数据,分为多个mini-batch,对mini-batch计算loss,再求和,进行反向传播。 这样内存只占用mini-batch...
  • batchsize大小对训练速度的影响

    千次阅读 2020-10-08 10:39:43
    1.batchsize越大 是不是训练越快? GPU :一块2080Ti 平台:pytorch cuda 图片数量:2700 batchsize 一个图片处理时间 GPU内存占用 GPU算力使用 一个epoch 所用时间 1 0.117s 2.5G 20% 2700 * 0.0117 = 318s ...
  • batchsize大小的影响

    千次阅读 2020-06-24 16:44:19
    batchsize越大,精度越高? batchsize越大,每次迭代能在更大的范围内找到最优的梯度更新方向? 答案:No. 需要选择合适的batchsize,大了或者小了都有缺点。 极限情况: batchsize= # samples:Full Batch Learning...
  • batchbatch size与epoch

    千次阅读 2019-01-10 10:24:45
    batch: 表示批次。设置过大的批次(batch)大小,可能会对训练时网络的准确性产生负面影响,因为它降低了梯度下降的随机性。 Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 ...
  • dataloader合理设置num_works和batchsize,避免爆内存1.内存2.显存总结 个人总结,禁止以任何形式的转载!! 1.内存 1)dataloader会开启num_works个进程,如图所示:(这里设置的是6) 2)以图片为例,每个worker...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 248,278
精华内容 99,311
关键字:

batchsize