几种加速梯度下降的方法

Mini-batch 小批量梯度下降法

梯度下降每次迭代都是基于损失函数梯度更新参数,对损失函数影响越大的参数更新幅度越大,对损失函数影响越小的参数更新幅度越小:

W : = W - \alpha \frac { d J} {d W }

损失函数需要计算所有样本的误差,将上式展开相当于:

W : = W - \frac { \alpha } { m } \sum _ { i = 1 } ^ { m } \left( \hat y^{(i)} - y^{(i)} \right) X

当样本数量比较大,即 m 比较大时,梯度下降的速度回很慢,为了解决这个问题,就有了批梯度下降.

批梯度下降是每次只用一部分数据计算梯度,然后更新参数.这样做的好处是只用一部分数据进行计算,所以更新参数的速度回大大加快.但是有的时候并不是总朝着梯度减小的方向迭代,这是因为只用了部分数据的原因,但是总体上是向着梯度减小的方向迭代的.

image

上图中蓝色为梯度下降,紫色为批梯度下降.

另外需要提的是,如果每次只用一个数据样本计算梯度被称为随机梯度下降.

动量(Momentum)梯度下降

在梯度下降的过程中,我们希望尽可能快的到达损失函数最低点,但不幸的是,梯度下降的方向总是会偏离中心的方向,这就导致梯度下降的曲线是"震动"的.

image

这种"震动",会导致我们不能使用过大的学习率.

动量梯度下降使用指数加权平均减小梯度的"震动",这样的话我们就可以使用较大的学习率,直指圆心.

v_{dW} = \beta v_{dW} + (1-\beta)dW

然后在用取指数加权平均后的梯度更新参数:

W = W - \alpha v _ { d W }

RMSprop

RMSprop的全称为Root Mean Square prop,意思是均方根传递.它和动量梯度下降的作用一样,也是防止梯度下降时在垂直方向震动的一种方法.

RMSprop先计算梯度平方的累积:

{s_{dw}} = \beta {s_{dw}} + (1 - \beta )d{W^2}

更新参数时除以它之前累积的梯度的平方根:

W = W - \alpha \frac{{dW}}{{\sqrt {{s_{dw}}} + \varepsilon }}

其中 \epsilon 的作用是为了防止分母为0.

我们可以想像一个特别病态的曲率图,梯度下降会在垂直方向上疯狂的震动.这时垂直方向上梯度会比水平方向上的梯度大的多.平方更加大他们的差距.

RMSprop计算梯度的时候除以梯度的平方会抑制所有方向上的梯度,当梯度越大抑制越大,这就保证了梯度下降过程中不会出现那种特别糟糕的情况.

Adam算法

Adam算法是结合动量梯度下降与RMSprop的集成算法.

我们首先可以计算得到Momentum和RMSProp的参数:

{v_{dw}} = {\beta _1}{v_{dw}} + (1 - {\beta _1})dW

{s_{dw}} = {\beta _2}{s_{dw}} + (1 - {\beta _2})d{W^2}

由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正

v_{dw}^c = \frac{{{v_{dw}}}}{{1 - \beta _1^t}}

s_{dw}^c = \frac{{{s_{dw}}}}{{1 - \beta _2^t}}

结合动量梯度下降与RMSprop更新参数:

W = W - \alpha \frac{{v_{dw}^c}}{{\sqrt {s_{dw}^c} + \varepsilon }}

Batch Norm

在机器学习中,通过归一化可以减少迭代的时间:

image

这是因为未经归一化损失函数的分布可能是一个椭圆形,这是因为各维度的数值可能差距很大,如果不走运迭代的路径恰好在椭圆的长轴上,那么距离最低点的距离会非常远,迭代次数会很多.

经过归一化后保证了从任何一个方向距离圆心都有相同的距离,所以迭代时间有保证.

在深度学习中,需要经过多层训练:

image

如果仅仅是对原始数据进行归一化,那么经过一层训练后,在各维度的数值又会呈现很大的差异,这时我们需要将每一层都进行归一化,这就是Batch Norm.

posted @ 2018-11-05 10:04:15
评论加载中...
发表评论