6

对常见的优化算法的总结

 2 years ago
source link: https://ylhao.github.io/2018/05/19/181/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这篇文章会依次介绍以下几种优化算法:

  1. Momentum
  2. RMSProp

Gradient Descent with Momentum

首先介绍动量梯度下降法(Gradient Descent with Momentum)。基本上动量梯度下降法的优化速度要快于传统的梯度下降法。其基本思想就是在每次训练时,对参数(权重 ωω 和 偏置 bb)的梯度进行指数加权平均,然后用得到的梯度值更新参数。

原始的梯度下降算法如上图蓝色折线所示。在梯度下降过程中,梯度下降的振荡较大,此时每一点处的梯度只与当前方向有关,产生类似折线的效果,前进缓慢。而如果对梯度进行指数加权平均,这样使当前梯度不仅与当前方向有关,还与之前的方向有关,这样处理让梯度前进方向更加平滑,减少振荡,能够更快地到达最小值处。

Momentum 算法每次迭代的参数更新过程如下:

  1. 计算 dωdω 和 dbdb。
  2. 计算 dωdω 和 dbdb 的指数加权平均。
    (1)Vdω=β⋅Vdω+(1−β)dωVdω=β⋅Vdω+(1−β)dω
    (2)Vdb=β⋅Vdb+(1−β)dbVdb=β⋅Vdb+(1−β)db
  3. 使用以下方式更新参数。
    (1)ω=ω−αVdwω=ω−αVdw
    (2)b=b−αVdbb=b−αVdb

初始时,一般设置 Vdb=0,Vdω=0Vdb=0,Vdω=0,通常设置 β=0.9β=0.9,另外,关于偏移校正,可以不使用。

这里根据上图对 Gradient Descent with Momentum 算法做一个更形象化的解释,我们可以发现梯度下降法在垂直方向上摆动剧烈,而 Momentum 算法计算的是梯度的指数加权平均,既然是”平均“,那就会在一定程度上减轻梯度下降法在垂直方向上剧烈摆动的情况,所以我们可以观察到 Momentum 算法对应的红线在垂直方向上摆动就不那么剧烈了。能够用更少的步数更快的到达最小值处。

RMSprop

RMSprop 是另外一种优化梯度下降速度的算法。

RMSprop 算法每次迭代的参数更新过程如下:

  1. 计算 dωdω 和 dbdb。
  2. 计算 SdωSdω 和 SdbSdb。
    (1)Sdω=β⋅Sdω+(1−β)d2ωSdω=β⋅Sdω+(1−β)dω2
    (2)Sdb=β⋅Sdb+(1−β)d2bSdb=β⋅Sdb+(1−β)db2
  3. 使用以下方式更新参数。
    (1)ω=ω−αdω√Sdω+εω=ω−αdωSdω+ε
    (2)b=b−αdb√Sdb+εb=b−αdbSdb+ε

我们以下图为例简单的介绍一下 RMSProp 算法的思想。为了便于叙述和理解,我们假设神经网络中只有两个参数 ωω 和 bb,并假设水平方向代表参数 ww 的方向而垂直方向代表参数 bb 的方向,从图中我们可以看出,使用梯度下降法时,在垂直方向上振荡较大,也就是 dbdb 比较大,而在水平方向上振荡较小,也就是 dωdω 较小。因此在上述过程中 SdbSdb 较大,而 SdωSdω 较小。在更新参数的过程中,我们将 SdbSdb 和 SdωSdω 放在分母的位置上,这样就使得在垂直方向上的振荡程度相对于在水平方向的变化程度要小了一些。比如说原来在水平方向上前进了 3 步的距离,在垂直方向上了 10 次,现在可能就是在水平方向上前进了 3 步的距离,在垂直方向上却只振荡了 6 次。

用一句话概括就是,在要消除摆动的维度中,通常梯度是大的,我们通过以上更新参数的方式来消除摆动。

Adam 算法每次迭代的参数更新过程如下:

  1. 计算 dωdω 和 dbdb。
  2. 计算 dωdω 和 dbdb 的指数加权平均。
    (1)Vdω=β1⋅Vdω+(1−β1)dωVdω=β1⋅Vdω+(1−β1)dω
    (2)Vdb=β1⋅Vdb+(1−β1)dbVdb=β1⋅Vdb+(1−β1)db
  3. 计算 SdωSdω 和 SdbSdb。
    (1)Sdω=β2⋅Sdω+(1−β2)d2ωSdω=β2⋅Sdω+(1−β2)dω2
    (2)Sdb=β2⋅Sdb+(1−β2)d2bSdb=β2⋅Sdb+(1−β2)db2
  4. 进行偏移校正。
    (1)Vcorrectdω=Vdω1−β22Vdωcorrect=Vdω1−β22
    (2)Vcorrectdb=Vdb1−β22Vdbcorrect=Vdb1−β22
    (3)Scorrectdω=Sdω1−β22Sdωcorrect=Sdω1−β22
    (4)Scorrectdb=Sdb1−β22Sdbcorrect=Sdb1−β22
  5. 使用以下方式更新参数。
    (1)ω=ω−αVcorrectdω√Scorrectdω+εω=ω−αVdωcorrectSdωcorrect+ε
    (2)b=b−αVcorrectdb√Scorrectdb+εb=b−αVdbcorrectSdbcorrect+ε

实际上 Adam 算法就是 Momentum 和 RMSprop 两种算法的结合,Adam 算法结合了动量梯度下降和 RMSprop 各自的优点,使得神经网络训练速度大大提高。

  1. β1β1:0.90.9
  2. β2β2:0.9990.999
  3. εε:10−810−8
  1. 深度学习工程师微专业 —— 吴恩达
  2. 吴恩达《优化深度神经网络》精炼笔记(2)– 优化算法

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以在文章下方的评论区进行评论,也可以邮件至 [email protected]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK