Machine Learning

深度学习中的epochs,batch_size,iterations详解

关于epoch、batch_size、iteration之前一直有点难以理解,尤其是epoch和iteration这两个概念。

深度学习框架中涉及很多参数,如果一些基本的参数如果不了解,那么你去看任何一个深度学习框架是都会觉得很困难,下面介绍几个新手常问的几个参数。

1、batch


要说batch_size,就不得不提深度学习的优化算法之一—梯度下降。梯度下降大致可以分为以下三种:

  • 批量梯度下降算法(BGD,Batch gradient descent algorithm)
  • 随机梯度下降算法(SGD,Stochastic gradient descent algorithm)
  • 小批量梯度下降算法(MBGD,Mini-batch gradient descent algorithm)

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

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

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

基本上现在的梯度下降都是基于mini-batch的,所以深度学习框架的函数中经常会出现batch_size,就是指这个。

2、iterations


iterations(迭代):每迭代一次权重也更新一次,每一次权重更新需要batch_size个数据进行Forward运算得到损失函数,再BP算法更新参数。1个iteration等于使用batchsize个样本训练一次。

迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练来训练模型,从而达到所需的目标或结果。

每一次迭代得到的结果都会被作为下一次迭代的初始值。

一个迭代 = 一个(batchsize)数据正向通过(forward)+ 一个(batch_size)数据反向(backward)

前向传播:构建由(x1,x2,x3)得到输出hwb(x)的表达式

反向传播:基于给定的损失函数,求解参数的过程

3、epochs


epochs被定义为所有批次(所有样本)向前和向后传播一次的单次训练迭代。这意味着1个周期是整个输入数据的单次向前和向后传递。简单说,epochs指的就是在训练过程中数据将被“轮”多少次。

当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch。(也就是说,所有训练样本在神经网络中都进行了一次正向传播 和一次反向传播 )
再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。
然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成多个Batch 来进行训练。

举个例子

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

具体的计算公式为: 
one epoch = numbers of iterations = N = 训练样本的数量/batch_size

例如在某次模型训练过程中,总的样本数是100000,batch_size=512,epochs=2,其对应的伪代码如下:

data = 
batch_size = 512
for i in range(epochs):
   for j in range(int(data_length / batch_size - 1)):
        x_data = data[begin:end, ]
        y_data = data[begin:end, ]
        mode.train(x_data, y_data)
   begin += batch_size
   end += batch_size

其中iterations = data_length / batchsize