2.1 mini-batch 梯度下降法(mini-batch gradient descent)
我们知道,向量化可以让我们有效的对所有的m个训练样例进行计算,允许我们处理整个训练集,而无需某个明确的公式,所以我们要把训练样本放到巨大的矩阵x当中去。向量化能够让我们相对较快的处理m个样本,但如果是很大的话,处理速度仍然缓慢。mini-batch要做的就是将整个训练集分割为小一点的子训练集。比如,我们的整个训练集有50万个样本,我们取1000个子训练集,如下图所示:
我们接下来用如下图的伪代码来解释其原理:
这就是使用mini-batch 梯度下降法训练的一步,一次遍历训练集只让我们做一次梯度下降。
2.2 理解mini-batch 梯度下降法
使用batch梯度下降法时,每次迭代都需要历遍整个训练集,可以预期每次迭代的成本都会下降,所以如果成本函数J是迭代的一个函数,它应该会随着每次迭代而减少,如果不是这样,那肯定出了问题。使用mini-batch梯度下降法时,成本函数并不是每次迭代都是下降的,这是因为每次丢带都在训练不同的样本集,或者说在训练不同的mini-batch。我们来看一下他们的成本函数图,如下:
噪声产生的原因在于也许
x{1}
和
y{1}
是比较容易计算的mini-batch,而
x{2}
和
y{2}
是比较难运算的mini-batch。
其次我们需要决定的变量之一是mini-batch的大小。m就是训练集的大小,如果mini-batch的大小为m,其实就是batch梯度下降法,如果mini-batch为1 就是随机梯度下降法。如下所示:
if mini-batch size=m :batch gradient descent
if mini-batch size=1 :stochastic gradient descent
我们再来看看这三种情况下的成本函数优化情况。如下所示:
stochastic gradient descent :
每次迭代只对一个样本进行梯度下降,大部分时候,向着全局最小值靠近,有时候会远离最小值。平均来看,它最终会靠近最小值。其次需要注意的是:随机梯度下降法永远不会收敛,他只会在最小值附近波动。而且随机梯度下降法会失去所有向量化所带来的加速。
mini-batch gradient descent:
一方面可以大量向量化,另一方面不需要等待整个训练集被处理完就可以开始进行后续工作。
mini-batch size指导性原则:如果样本集较小,没必要使用mini-batch梯度下降法,以2000为基准。如果太大,则mini-batch大小为 26 到 29 之间。
2.3 指数加权平均(Exponentially weigthed averages)
我们先介绍一下指数加权平均的关键公式:
接着我们以某一个地区一年的气温作为例子来讲解这个公式。
如下:
我们通过下面一组操作,也就是移动加权平均的操作,如下所示:
解释一下, v1 表示经过计算后第一天的气温,而0.9是我设置的对应于公式中的超参数, θ1 表示第一天的实际气温,后面以此类推。经过这样的计算后,我们就可以得出经过指数加权平均后的气温走势图,如下红线所示:
我们可以通过调整超参数
β
的值,得到不同的经过指数加权平均之后的气温走势图,如下所示:
2.4 指数加权平均的偏差修正(Bias correction in Exponentially weigthed averages)
偏差修正是为了解决早起预测不准确的问题,我们依然以气温预测为例,如下所示:
上图中,紫色是没有加上偏差修正的计算结果,绿色是经过偏差修正之后得到的计算结果。他们的超参数
β
=0.98。我们来看看偏差修正做了什么。我们知道指数加权平均公式如下:
我们要在他的基础上再进行如下的计算:
由上可知,当t很小的时候, βt 接近于1, vt 会适当增大,当t很大的时候,分母接近于1,所以偏差修正几乎没什么用,故后面紫的线和绿色的线就重合了。这就是偏差修正。
2.5 动量梯度下降法(Gradient descent with momentum)
除了batch/mini-batch/stochastic gradient descent 梯度下降法,还有一种算法叫做momentum梯度下降法,运行速度几乎总是快于标准的梯度下降法,简而言之,基本的思想就是计算梯度的指数加权平均数,并利用该梯度更新权重 ,以下是batch/mini-batch gradient descent以及momentum梯度下降法优化走势图。
蓝线表示batch梯度下降法 ,红线是momentum梯度下降法 我们会发现梯度下降法需要很多计算步骤,慢慢摆动到最小值,这种上下波动减慢了梯度下降法的速度,导致我们无法使用更大的学习率,结果可能会偏离函数的范围,为了避免摆动过大,我们需要使用较小的学习率,另一个看待问题的角度是在纵轴上,我们希望慢一点,但是在横轴上,我们希望快一点,所以使用momentum梯度下降法,我们需要做的是,在每次迭代中,确切的说是在第t次迭代中,我么要计算微分dw,db,注意是利用现有的mini-batch计算dw,db,如果使用batch梯度下降法,则现在的mini-batch就是全部的batch,对于batch梯度下降法的效果是一样的。
momentum的算法流程如下:
momentum
compute dw,db on current mini-batch
2.6 RMSProp(root mean square prop)
除了momentum可以加快学习算法之外,均方根算法也可以加快学习算法。
算法流程如下:
on iteration t:
compute dw,db on current mini-batch
2.8 Adam 优化算法
Adam优化算法基本上就是将momentum和RMSprop结合在一起,我们来看看Adam算法的流程。
使用Adam算法首先需要初始化 vdw=0,Sdw=0,Vdb=0,Sdb=0
on iteration t: compute dw,db, using current mini-batch
2.8 学习率衰减(learning rate decay)
加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减,我们可以将学习率设置如下:
其中 decay_rate 为衰减率, epoch_num 为迭代的轮数, α0 为初始学习率。
还有下面的一些衰减公式:
也可以进行手动调试学习率。