Batch size and epochs 参数设置

Batch的含义:

引用自:http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。

第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。

另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。

为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

基本上现在的梯度下降都是基于mini-batch的,所以Keras的模块中经常会出现batch_size,就是指这个。

顺便说一句,Keras中用的优化器SGD是stochastic gradient descent的缩写,但不代表是一个样本就更新一回,还是基于mini-batch的。

epochs的含义:

指的是训练过程中,训练数据将被跑几轮。

Keras中,batch_size 和 epochs参数值的影响:

(以下内容,参考自知乎:https://www.zhihu.com/question/32673260)

在训练时, 需要指定最小批次:batch_size, 以及迭代次数:epochs。 这两个参数可以显著的影响训练收敛的速度及准确度。设置不当的话,很可能会导致训练不收敛,或者要训练很久才会收敛。

分别说明:

batch_size: 

batch_size比较大的情况下,训练容易陷入局部最优解(local minimize)的情况,同时对机器内存(以及显存)的配置要求比较高。好处是收敛速度比较快(存疑)。
batch_size比较小的情况下,收敛的速度会慢一些, 甚至有可能会不收敛。 但是训练引入的随机性比较大,相当程度上可避免出现局部最优解(local minimize), 对硬件配置要求相对较低。

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

那么怎么选择batch size呢?可以选择8的倍数,然后是稍微大一点(一般而言)。另外一个方法,就是选择一部分数据,跑几个batch看看loss是不是在变小, 选择一个合适的就可以了。

Leave a Reply

Your email address will not be published.