batch_size对于卷积神经网络训练的影响

版权声明:转载请注明出处http://blog.csdn.net/xuaho0907 https://blog.csdn.net/xuaho0907/article/details/88027224

学习卷积神经网络之前,听前辈们说过一些关于一次喂入的训练数据集对收敛的影响。

当时也半懂不懂的一只耳朵进一只耳朵出就没怎么当回事就过去了。

现在真正走到这一步的时候才发现这还是个不小的坑。

于是赶紧google了一波并记录下来。

------------------------------------先来看一个栗子-----------------------------------------

测试背景:20000张猫狗图片,epochs=200

环境1:GTX950M(2G),batch_size=40

环境2:GTX1070(8G),batch_size=125

因为是在两台不同的电脑上训练的,一台是我的笔记本一台台式机。年少无知的我这就奇了怪了,差距还不小,难道训练结果好坏还分显卡?我寻思着也不对呀,硬件层面的计算工作怎么可能会影响算法结果的好坏呢?

毕竟也是接受过九年义务教育的共产主义接班人,那就采用单一变量原则吧,我把两边的代码统一了,先从最可疑的batch_size开始查起,果不其然,问题果然在batch_size这里:

“一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;batch size 如果过大,则可能会出现局部最优的情况。小的 bath size 引入的随机性更大,难以达到收敛,极少数情况下可能会效果变好。”

由于学习理论部分的时候,没彻底掌握明白,我又去翻了翻相关资料,发现batch_size的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 ( Full Batch Learning )的形式,这样做有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。

总结:在合理范围内,增大 Batch_Size 有何好处

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


盲目增大 Batch_Size 有何坏处

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

由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

猜你喜欢

转载自blog.csdn.net/xuaho0907/article/details/88027224
今日推荐