基于动量(momentum)的梯度下降法

批梯度下降:

    1)采用所有数据来梯度下降,在样本量很大的时,学习速度较慢,因为处理完全部数据,我们仅执行了一次参数的更新。

    2)在学习过程中,我们会陷入损失函数的局部最小值,而永远无法达到神经网络获得最佳结果的全局最优值。这是因为我们计算的梯度大致相同。

       所以,我们实际上需要的是一些嘈杂的渐变。方向值的这种小偏差将使梯度跳出损失函数的局部最小值,并朝着全局最小值继续更新。

    3)鞍点:损失函数存在梯度为 $0$ 的区域,那么当参数位于这些区域时,没有办法再继续更新了。

随机梯度下降:

    1)由于在处理每个数据实例之后执行更新,因此随机梯度下降可能会导致学习更快。

    2)在批次梯度下降中,我们对梯度求平均以得到一个最终梯度,在随机梯度下降中,我们使用每个单个梯度来更新权重。这些梯度可能非常嘈杂,

       并且其方向和值存在很大差异。换句话说,在这种情况下,我们会有很多噪音。但这其实也是它的一个优点,有利于避免训练过程中的局部最小值。

    3)随机梯度下降无法解决损失函数的整体最小值。由于嘈杂,将很难找到并保持在全局最小值。

小批梯度下降:

    1)就计算效率而言,此技术介于之前介绍的两种技术之间。

    2)朝着全局最小值收敛更稳定,因为我们计算了小批量 $m$ 个样本的平均梯度,从而减少了噪声。

    3)与随机梯度下降相比,我们执行权重更新的频率更高,因此可以更快地学习。

    4)小批量梯度下降中引入了一个新的超参数 $m$,称为批次大小。已经表明,学习率之后的批次大小是神经网络整体性能的第二重要的超参数。因此,

       需要花一些时间并尝试许多不同的批次大小,直到找到与其他参数(例如学习率)最匹配的最终批次大小。

阅读下面内容之前,可先去阅读指数加权移动平均

     

红色表示 SGD 的收敛路径,棕色表示批梯度下降的收敛路径。普通的 GD 算法就是计算出每一时刻最陡的下降趋势(梯度),SGD 在随机挑选的某一分量的

梯度方向进行收敛。从图中可以看出,损失函数从某一点开始的梯度下降过程是及其曲折的。并不是直接走向中心点,而是需要浪费很多时间折来折去,这

样的速度就会变慢,有没有办法解决这个问题呢?

可以使用动量梯度下降法来解决这个问题,参数更新公式为:

$$v_{dW} = eta cdot v_{dW} + (1 - eta) cdot dW \
v_{db} = eta cdot v_{db} + (1 - eta) cdot db \
Rightarrow left{egin{matrix}
W = W - alpha cdot v_{dW} \ 
b = b - alpha cdot v_{db}
end{matrix} ight.$$

在这个公式中,并不是直接减去 $alpha cdot dW$ 和 $alpha cdot db$,而是计算出了一个 $v_{dW}$ 和 $v_{db}$。

使用这个公式,可以将之前的 $dW$ 和 $db$ 都联系起来,不再是每一次梯度都是独立的情况。其中 $eta$ 是可以自行设置的超参数,一般情况下默认为 $0.9$,

也可以设置为其他数值。$eta$ 代表了现在的 $v_{dW}$ 和 $v_{db}$ 与之前的 $frac{1}{1 - eta}$ 个 $v_{dW}$ 和 $v_{db}$ 有关。

原文地址:https://www.cnblogs.com/yanghh/p/14061089.html