前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 6-2 模拟实现梯度下降法

机器学习入门 6-2 模拟实现梯度下降法

作者头像
触摸壹缕阳光
发布2019-11-13 18:42:15
5090
发布2019-11-13 18:42:15
举报

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍模拟实现梯度下降算法。

梯度下降法的模拟

这里需要注意,当达到导数整整等于0的时候,我们需要终止梯度下降算法,但是此时有两个问题:

  1. eta设置的不合适;
  2. 求导时候浮点精度的问题。

上面这两个问题可以使得求到最小值theta的点达不到导数整整等于0的情况,当然在计算机编程中对于浮点数使用"=="进行判断本身也是比较危险的,这是因为计算机计算浮点数是有误差的,很可能永远达不到你需要的精度。

使用上面通过导数等于0的方式终止梯度下降算法是不可取的。我们应用梯度下降法的求解损失函数最小值的时候,每次都是在梯度下降,也就是损失函数值变小,因此理论上每一次求到一个新的theta之后,对于这个新的theta,损失函数的值都应该比上一个theta对应的损失函数的值要小,如果小的这部分已经达到了我们精度要求。换句话说,使用梯度下降算法,每一次损失函数都会小一点,直到这一次比上一次损失函数值小的差距连1e-8精度都没有达到,我们此时就可以认定我们基本上已经到达最小值了。因为theta值再往前走一步,两次theta值对应的损失函数值再小也不会超过1e-8这么小的值,在这种情况下,我们就可以退出循环。我们定义epsilon为两次梯度下降损失函数值的最小差距,此时指定1e-8。

eta值对梯度下降法的影响

从图示可以看出:

  1. 刚开始的更新幅度比较大,因为刚开始的时候梯度本身比较陡,虽然eta的取值是一样的,但是eta乘上一个绝对值比较大的导数得到的结果也就比较大,因此刚开始参数更新的幅度比较大;
  2. 越到后面我们的梯度越平缓,此时eta乘上的是非常小的梯度值得到的结果也就比较小,因此后面参数更新的幅度就比较平缓;

直到最终,根据两次参数更新对应的损失函数值之间的差距比给定的epslion还要小的话,就退出整个循环;

使用len(theta_history)查看梯度下降法更新的次数,此时输出结果为46,由于起始点也在theta_history中,因此此时梯度下降法更新迭达了45次。

下面看看其他的eta值对梯度下降法的影响,为了方便,下面将梯度下降法进行封装:

代码语言:javascript
复制
eta = 1.1theta_history = []gradient_descent(0, eta)plot_theta_history()len(theta_history)

此时如果执行上面的程序,虽然没有抛出异常,但是程序会一直执行,也就是说此时程序是一个死循环。这是因为在gradient_descent函数中有一个(while True),在梯度下降法的过程,J(theta)值不断的增大至无穷。在Python中无穷减去无穷被定义为nan而不是0。所以上面gradient_descent函数中的跳出循环语句永远不会被触发执行,进入一个死循环,为了避免这种情况我们需要修改gradient_descent函数。

下面在gradient_descent函数中加了一个n_iters参数,让程序不会无限的循环下去,也就是指定最大的迭代次数。

此时看出eta取0.8可以,但是取1.1时候太大,这并不能说明eta的取值范围是[0,1]。eta值取多少合适是和损失函数怎样的有关,损失函数在theta这一点相应的导数值是多少相关的,而不是说有一个固定的标准,正因为如此,eta是一个超参数,因为在一些特殊的情况下,可能需要对eta的取值进行一下网格的搜索。不过普遍来讲,把eta设置为0.01相对是一个保险的数值,对于大多数函数使用梯度下降法,eta为0.01都是足以胜任的。如果发生异常,可以绘制一下theta_history,看看是不是发生了学习率多大这样的情况。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档