动量梯度下降(Gradient descent with momentum)详解

动量梯度下降(Gradient descent with momentum)详解

关于动量梯度下降,其作用普通的梯度下降是差不多的。但是在普通的梯度下降中,如果遇到了比较复杂的情况,就会出现:如果学习率过大,摆动过大,误差较大;如果学习率过小,又会使得迭代次数增加,学习时间会很长。在神经网络模型中就常常会遇到上面这些情况的,总是会出现解一种在小范围震荡而很难达到最优解的情况。
而动量梯度则可以比较好的避免上述问题。它的过程类似于一个有质量的小球在函数曲线上向下滚落。当球滚到最低点后,由于具有惯性还会继续上升一段,然后再滚落回来,再经过最低点上去…最终小球就停留到最低点处。而且由于小球具有惯性这一点,当函数曲线或曲面比较陡峭复杂时,它便可以越过这些而尽快地达到最低点。

算法原理
一般在其它文章中会讲到指数加权平均数的概念。不过兔兔觉得在这里即使不讲这一概念,应该也是可以的。
我们还是以一元函数求最小值为例。
对于一个一元函数f(x),其导数为f’(x),我们设初始值为x0,根据之前讲过的普通的梯度下降公式,有迭代公式:x0=x0-f’(x0)。迭代多次便可以得到极小值点x0。
在动量梯度下降中,我们同样随机选一个初始值x0。这里除了之前用到的学习率alpha,还需要引入另一个参数beta,通常beta=0.9,类似于小球滚落时受到的摩擦阻力(有的文章会讲到beta与指数加权平均数的关系,不过这里即使不了解这里概念也是可以的)。
(1)令v=β.x0+(1-β).f’(x0)
(2)x0=x0-α.v 此时第一次更新x0
(3)v=β. v +(1-β).f’(x0)
(4)x0=x0-α.v
第一步主要是由x0初始化v,之后就是步骤3,4一直交替操作。其中式子3是每次更新v,等式右边的v是上一步得到的v,等式左边是新得到的v,然后在下一步操作中再代入等式右侧。所以式子可以写成
v(i+1)=β .v(i) +(1-β).f’(x(i))
式子4 是更新x0,更新后的x0需要代入下一次循环中的式子(3)右侧以及式子(4)的右侧。

算法实现
我们以函数f(x)=sin(x)为例。其导数是cos(x)。

import numpy as np
import matplotlib.pyplot as plt
def f(x):
    return np.sin(x)
def df(x):
    return np.cos(x)
x0=1 #初始化x0为1
alpha=0.7
beta=0.9
v=x0 #初始时令v=x0
for i in range(80):
    x=np.arange(-5,5,0.1)
    y=f(x)
    plt.plot(x,y,color='blue') #画函数曲线
    plt.scatter(x0, f(x0), color='red') #画出极小值点对于再函数曲线上的点
    v=beta*v+(1-beta)*df(x0) #更新v
    x0=x0-alpha*v #更新x0
    plt.pause(0.2)

运行结果如下
图1
可以看到小球在不断震荡,最终下降到最低点。如果小球位置很高,摩擦力比较小,小球是可以越过几个”山包“并在其中一个山谷里面震荡并达到,感兴趣的同学们可以试一下的。而且关于参数alpha 与 beta对小球梯度下降的影响,同学们也是可以尝试一下的。

总结
动量梯度下降作为一种梯度下降算法,能够比较好的解决普通的梯度下降所产生的问题,在很多模型中都是可以采用的,而且有时也是可以产生很好的效果的。



  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值