关于梯度下降与Momentum通俗易懂的解释

sgd与momentum都是常见的梯度优化方法。本文想从代码方面对这两种方法进行总结。

关于理论。建议参考:
https://www.cnblogs.com/jungel24/p/5682612.html
这篇博文写的很好。很形象。本文也是建立在它的基础上写的,同时代码参考:
https://github.com/hsmyy/zhihuzhuanlan
?。交代完毕,开始学习之旅。
之前在学习无论是ML,DL的时候,总是理论优先,很多都是知道是那么回事,但是从没想过如何用代码实现。随着学习的深入,越来越觉得越是基础的东西,越要注意。所以这篇博客就是我的一个学习方法的改进,本文会在上面代码的基础上代码总结。

我写的和原链接不同。手法方面没有那么好看,但是更容易理解,特别是momentum部分,很不一样,很适合初学者,因为没有太多的包装。也是因为我没有养成好的coding习惯导致的。。。但是正确性是可以保证的,我都亲自运行过。

1.gd

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,7,500)
y = (x-1)**2
#g(x)为导数
def g(x):
    return 2*x-2
plt.plot(x,y)

在这里插入图片描述

def gradient_descent(x0,step,epoch):
    x = x0
    for i in range(epoch):
        print('epoch:{},x= {},gradient={}'.format(i,x,g(x)))
        x-=step*g(x)
        if abs(g(x))<=1e-6:#注意这里别忘了取绝对值了,我一开始就忘了。
            return x
    return x

主体构建完毕。接下来:

gradient_descent(4,0.1,20)

初始点选为4,学习率为。0.1,迭代20次:
在这里插入图片描述
可以看到,最后已经十分接近于解析解1了,同时梯度也很接近于0.很棒。
倘若我们把学习率加大呢?

gradient_descent(4,5,20)

在这里插入图片描述
可以看到是越来越偏的。

2.momentum

为了更好的看出来sgd的问题所在,与momentum的强大之处:我们这次采用二元函数:
z=x**2 + 50*y**2。我们现在就可以假设loss function为上面的函数,x,y则为自变量,想用梯度下降法找到最优解。显然这个函数在(0,0)处有最优解,那么来看看梯度下降如何处理:
先来看看图象长什么样:

import numpy as np
import pylab as plt

f(x)就是上面的函数,

def 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值