在数据很庞大的时候(在机器学习深度学习中,几乎任何时候都是),我们需要使用 epochs,batch size,iterations(迭代)这些术语,在这种情况下,一次性将数据输入计算机是不可能的。因此,为了解决这个问题,我们需要把数据分成小块,一块一块的传递给计算机,在每一步的末端更新神经网络的权重,拟合给定的数据。
梯度的含义是斜率或者斜坡的倾斜度。 下降的含义是代价函数的下降。
算法是迭代的,意思是需要多次使用算法获取结果,以得到最优化结果。
梯度下降的迭代性质能使欠拟合的图示演化以获得对数据的较佳拟合。
梯度下降中有一个称为学习率的参量。如上图左所示,刚开始学习率更大,因此下降步长更大。随着点下降,学习率变得越来越小,从而下降步长也变小。同时,代价函数也在减小,或者说代价在减小,有时候也称为损失函数或者损失,两者都是一样的。(损失/代价的减小是一件好事)
每次的参数更新有两种方式。
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
基本上现在的梯度下降都是基于mini-batch的,所以深度学习框架的函数中经常会出现batch_size,就是指这个。
主要的思想就是每次训练使用batch_size个数据进行参数寻优,一批中的数据共同决定了本次梯度的方向。
batch_size(块大小)数值意思是:一个 batch 中的样本总数,一次喂进网络的样本数。
注意:batch_size 和 number of batches 是不同的。
1个iteration等于使用batch_size个样本训练一次。每一次迭代都是一次权重更新,每一次权重更新需要batch_size个数据进行Forward运算得到损失函数,再BP算法更新参数。
Numbers of iterations = All/batch_size
既把全部样本数据,按照batch_size大小,分成了iterations块,进行训练,迭代更新权重
迭代次数,每次迭代更新一次网络结构的参数。
迭代是重复反馈的动作,神经网络中我们希望通过迭代进行多次的训练以到达所需的目标或结果。
每一次迭代得到的结果都会被作为下一次迭代的初始值。
一个迭代 = 一个(batch_size)数据正向通过(forward)+ 一个(batch_size)数据反向(backward)
前向传播:构建由(x1,x2,x3)得到Y(hwb(x))的表达式
反向传播:基于给定的损失函数,求解参数的过程
epochs被定义为向前和向后传播中所有批次的单次训练迭代。这意味着1个周期是整个输入数据的单次向前和向后传递。简单说,epochs指的就是训练过程中全部样本数据将被“轮”多少次,就这样。
注意,每次epoch之后,需要对总样本shuffle
,再进入下一轮训练。
为什么要使用多于一个 epoch?
在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但是请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降,优化学习过程和图示。因此仅仅更新权重一次或者说使用一个 epoch 是不够的。
随着 epoch 数量增加,神经网络中的权重的更新次数也增加,曲线从欠拟合变得过拟合。
那么,几个 epoch 才是合适的呢?
不幸的是,这个问题并没有正确的答案。对于不同的数据集,答案是不一样的。但是数据的多样性会影响合适的 epoch 的数量。比如,只有黑色的猫的数据集,以及有各种颜色的猫的数据集。
ϵ(0,1),是一个确定步长大小的正标量(一般设置的很小,如0.001),表示沿着梯度的方向一步迈多大。
随机梯度下降(SGD)学习过程有时会很慢。比如在穿越山谷时,使用SGD则会在山谷壁来回的摆动(如下图)。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。
v表示动量,超参数α
α [0,1) 决定了之前梯度的贡献衰减得有多快。
References:
https://blog.csdn.net/qingdujun/article/details/80638500
[1] 怎么选取训练神经网络时的Batch size?
[2] 梯度下降优化算法综述
[3] Ian, Goodfellow, Yoshua, Bengio. 深度学习[M]. 北京:人民邮电出版社, 2017.
训练集有1000个样本,batchsize=10,那么:
训练完整个样本集需要:100次iteration,100=1000/10。
想要训练多少轮,epoch就是多少,例如像训练5轮,epoch=5
具体的计算公式为:
one epoch = numbers of iterations = N = 训练样本的数量/batch_size
100人要进大厅,需要通过旋转门,All=100
旋转门一次只能进5个人,batch_size=5,一小批通过算迭代1次;
全部人都进去需要 All/batch_size=100/5 =20次,需要迭代iterations=20,
全部人都通过了就是一次epoch;
如果这100人是一群小孩,闲着没事,所有人,按上面模式分批,在旋转门来回穿行10次当游戏,那epoch=10。