最近在做基于交通卡口数据的套牌车判别项目。利用卷积神经网络做时序数据的分类。
训练过程中尝试设置不同的batch_size ,并观察到了一些细微的变化。
a、设置超大batch_size的时候,机器罢工了
b、设置较大batch_size的时候,训练超快,但是最后的精度不高
c、设置较小batch_size的时候,训练较慢,过程中波动较大,但是最后的精度会稍微高一点。
那么这是全部吗?
batch_size 指定了每批次训练的样本量。
当batch_size设置较小,极端情况比如batch_size=1,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。
横冲直撞,各自为政就一定不好吗? 它能带来有更多起伏、更随机的权重更新。这有两个积极的作用,一是能帮助训练“跳出”之前可能卡住它的局部最小值,二是能让训练在“平坦”的最小值结束,着通常会带来更好的泛化性能。
当batch_size设置过大,内存装载不了这么多数据。极端情况就是全量数据。在合理范围内,增大batch_size会得到以下收益:
a、充分利用内存,并行化效率提高了
b、跑完一次epoch所需迭代次数降低了,训练速度加快了
c、在一定范围内,batch_size越大,其确定的下降方向越准,训练的震荡越小
对应上述三点,有可能发生以下灾难:
a、内存装不下
b、精度达不到小batch_size的高度,或者需要更长时间的训练
c、确定的下降方向随机性较低了,可能基本不再变化
那大也大不得,小也小不得,应该怎么办呢?
很多文章建议在开始的时候,大胆的尝试很小的batch_size,比如16,8,甚至是1。(2的幂次)
当然,不同的情况下,应该会有不同的选择,这是一个变量,抓住不变的那就是要去找到某种感觉。
正所谓,调参调参,你不调,怎么会“参”透其中玄机呢?
不说了,调参去了~
领取专属 10元无门槛券
私享最新 技术干货