【深度学习】调参小结(一)BatchSize对学习效果的影响

昨天跑seq2seq的模型中遇到一些问题,总结一下。
本来以为模型已经收敛了,因为loss在震荡,后来发现我理解错了,因为我所看到的震荡其实是不同batch之间loss不同导致的,纵向来看,每个epoch同一个batch的loss仍在下降,所以其实没有必要缩小learning rate,例如将learning rate从0.01缩小到0.001,对于一个仍在准确逼近的模型可能会使模型收敛的速度减慢十倍,所以在更改参数前要先观察下loss的变化趋势。
而假如已经略有震荡了,learning rate的调整还是得视情况而定,减小会影响收敛速度,不变又会有震荡带来的副作用。
另外,我查了一些loss震荡资料,尽管事实上loss并没有震荡,除了更改learning rate以外还可以调整batch_size。我将batch_size从32扩大到了128(32倍数的原因是为了让系统更快的处理,与内存、处理器读取机制有关),调整后每个batch的loss也上升了,这个也很好理解。
值得注意的一点,无论是learning rate还是batch_size与模型结构本身都是无关的,所以理所当然可以修改,为了更快的逼近最优值。
至于batch_size如何影响loss,参考了https://blog.csdn.net/u013250416/article/details/78843254这篇博客后,大概如下:

这个参数的选取有两个极端,一个是1,也就是每次只训练一个样本。

这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元,非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,难以达到收敛。

第二个极端batch_size为全数据集(Full Batch Learning):

好处:

1.由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。

2.由于不同权重的梯度值差别巨大,因此选择一个全局的学习率很困难。Full Batch Learning可以使用Rprop只基于梯度符号并且针对性单独更新各权值。

坏处:

1.随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。

2.以Rprop的方式迭代,会由于各个Batch之间的采样差异性,各次梯度修正值相互抵消,无法修正。

在合理范围内,增大Batch_size的好处:

1.提高了内存利用率以及大矩阵乘法的并行化效率。

2.减少了跑完一次epoch(全数据集)所需要的迭代次数,加快了对于相同数据量的处理速度。

盲目增大Batch_size的坏处:

1.提高了内存利用率,但是内存容量可能不足。

2.跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加,从而对参数的修正也就显得更加缓慢。

3.Batch_size增大到一定程度,其确定的下降方向已经基本不再变化。

另外seq2seq模型事实上是一个映射的无限拟合,最优结果就是可以给出数据集中的input seq得出准确的output seq,而对于数据集外的数据实际上效果较差。

你可能感兴趣的:(深度学习,深度学习,调参)