神经网络优化算法:梯度降低法、Momentum、RMSprop和Adam

最近回顾神经网络的知识,简单作一些整理,归档一下神经网络优化算法的知识。关于神经网络的优化,吴恩达的深度学习课程讲解得很是通俗易懂,有须要的能够去学习一下,本人只是对课程知识点作一个总结。吴恩达的深度学习课程放在了网易云课堂上,连接以下(免费):
https://mooc.study.163.com/smartSpec/detail/1001319001.htm算法

神经网络最基本的优化算法是反向传播算法加上梯度降低法。经过梯度降低法,使得网络参数不断收敛到全局(或者局部)最小值,可是因为神经网络层数太多,须要经过反向传播算法,把偏差一层一层地从输出传播到输入,逐层地更新网络参数。因为梯度方向是函数值变大的最快的方向,所以负梯度方向则是函数值变小的最快的方向。沿着负梯度方向一步一步迭代,便能快速地收敛到函数最小值。这就是梯度降低法的基本思想,从下图能够很直观地理解其含义。
网络

梯度降低法的迭代公式以下:函数

\[w=w-\alpha* dw \]

其中w是待训练的网络参数,\(\alpha\)是学习率,是一个常数,dw是梯度。以上是梯度降低法的最基本形式,在此基础上,研究人员提出了其余多种变种,使得梯度降低法收敛更加迅速和稳定,其中最优秀的表明即是Mommentum, RMSprop和Adam等。学习

Momentum算法

Momentum算法又叫作冲量算法,其迭代更新公式以下:优化

\[\begin{cases} v=\beta v+(1-\beta)dw \\ w=w-\alpha v \end{cases} \]

光看上面的公式有些抽象,咱们先介绍一下指数加权平均,再回过头来看这个公式,会容易理解得多。spa

指数加权平均

假设咱们有一年365天的气温数据\(\theta_1,\theta_2,...,\theta_{365}\),把他们化成散点图,以下图所示:
htm

这些数据有些杂乱,咱们想画一条曲线,用来表征这一年气温的变化趋势,那么咱们须要把数据作一次平滑处理。最多见的方法是用一个华东窗口滑过各个数据点,计算窗口的平均值,从而获得数据的滑动平均值。但除此以外,咱们还可使用指数加权平均来对数据作平滑。其公式以下:blog

\[\begin{cases} v_0=0 \\ v_k=\beta v_{k-1}+(1-\beta)\theta_k, \quad k=1,2,...,365 \end{cases} \]

v就是指数加权平均值,也就是平滑后的气温。\(\beta\)的典型值是0.9,平滑后的曲线以下图所示:
get

对于\(v_k=\beta v_{k-1}+(1-\beta)\theta_k\),咱们把它展开,能够获得以下形式:深度学习

\[\begin{split} v_k&=\beta v_{k-1}+(1-\beta)\theta_k \\ &=\beta^kv_0+\beta^{k-1}(1-\beta)\theta_1+\beta^{k-2}(1-\beta)\theta_2+\dots+\beta(1-\beta)\theta_{k-1}+(1-\beta)\theta_k \\ &=\beta^{k-1}(1-\beta)\theta_1+\beta^{k-2}(1-\beta)\theta_2+\dots+\beta(1-\beta)\theta_{k-1}+(1-\beta)\theta_k \end{split} \]

可见,平滑后的气温,是以往每一天原始气温的加权平均值,只是这个权值是随时间的远近而变化的,离今天越远,权值越小,且呈指数衰减。从今天往前数k天,它的权值为\(\beta^k(1-\beta)\)。当\(\beta=\frac{1}{1-\beta}\)时,因为\(\underset{\beta \rightarrow 1}{lim}\beta^k(1-\beta)=e^{-1}\),权重已经很是小,更久远一些的气温数据权重更小,能够认为对今天的气温没有影响。所以,能够认为指数加权平均计算的是最近\(\frac{1}{1-\beta}\)个数据的加权平均值。一般\(\beta\)取值为0.9,至关于计算10个数的加权平均值。可是按照原始的指数加权平均公式,还有一个问题,就是当k比较小时,其最近的数据太少,致使估计偏差比较大。例如\(v_1=0.9 v_0 + (1-0.9)\theta_1=0.1\theta_1\)。为了减少最初几个数据的偏差,一般对于k比较小时,须要作以下修正:

\[v_k=\frac{\beta v_{k-1}+(1-\beta)\theta_k}{1-\beta^k} \]

\(1-\beta^k\)是全部权重的和,这至关于对权重作了一个归一化处理。下面的图中,紫色的线就是没有作修正的结果,修正以后就是绿色曲线。两者在前面几个数据点之间相差较大,后面则基本重合了。

回看Momentum算法

如今再回过头来看Momentum算法的迭代更新公式:

\[\begin{cases} v=\beta v+(1-\beta)dw \\ w=w-\alpha v \end{cases} \]

\(dw\)是咱们计算出来的原始梯度,\(v\)则是用指数加权平均计算出来的梯度。这至关于对原始梯度作了一个平滑,而后再用来作梯度降低。实验代表,相比于标准梯度降低算法,Momentum算法具备更快的收敛速度。为何呢?看下面的图,蓝线是标准梯度降低法,能够看到收敛过程当中产生了一些震荡。这些震荡在纵轴方向上是均匀的,几乎能够相互抵消,也就是说若是直接沿着横轴方向迭代,收敛速度能够加快。Momentum经过对原始梯度作了一个平滑,正好将纵轴方向的梯度抹平了(红线部分),使得参数更新方向更多地沿着横轴进行,所以速度更快。

RMSprop算法

对于上面的这个椭圆形的抛物面(图中的椭圆表明等高线),沿着横轴收敛速度是最快的,因此咱们但愿在横轴(假设记为w1)方向步长大一些,在纵轴(假设记为w2)方向步长小一些。这时候能够经过RMSprop实现,迭代更新公式以下:

\[\begin{cases} s_1=\beta_1 s_1+(1-\beta_1)dw_1^2 \\ s_2=\beta_2 s_2+(1-\beta_2)dw_2^2 \end{cases} \]

\[\begin{cases} w_1=w_1-\alpha \frac{dw_1}{\sqrt{s_1+\epsilon}} \\ w_2=w_2-\alpha \frac{dw_2}{\sqrt{s_2+\epsilon}} \end{cases} \]

观察上面的公式能够看到,s是对梯度的平方作了一次平滑。在更新w时,先用梯度除以\(\sqrt{s_1+\epsilon}\),至关于对梯度作了一次归一化。若是某个方向上梯度震荡很大,应该减少其步长;而震荡大,则这个方向的s也较大,除完以后,归一化的梯度就小了;若是某个方向上梯度震荡很小,应该增大其步长;而震荡小,则这个方向的s也较小,归一化的梯度就大了。所以,经过RMSprop,咱们能够调整不一样维度上的步长,加快收敛速度。把上式合并后,RMSprop迭代更新公式以下:

\[\begin{cases} s=\beta s+(1-\beta)dw^2 \\ w=w-\alpha\frac{dw}{\sqrt{s+\epsilon}} \end{cases} \]

\(\beta\)的典型值是0.999。公式中还有一个\(\epsilon\),这是一个很小的数,典型值是\(10^{-8}\)

Adam算法

Adam算法则是以上两者的结合。先看迭代更新公式:

\[\begin{cases} v=\beta_1 v+(1-\beta_1)dw \\ s=\beta_2 s+(1-\beta_2)dw^2 \\ w=w-\alpha\frac{v}{\sqrt{s+\epsilon}} \end{cases} \]

典型值:\(\beta_1=0.9, \quad \beta_2=0.999, \quad \epsilon=10^{-8}\)。Adam算法至关于先把原始梯度作一个指数加权平均,再作一次归一化处理,而后再更新梯度值。

相关文章
相关标签/搜索