前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习入门系列】梯度下降法

【机器学习入门系列】梯度下降法

原创
作者头像
张耀琦
修改于 2017-06-19 11:09:30
修改于 2017-06-19 11:09:30
3K1
举报
文章被收录于专栏:张耀琦的专栏张耀琦的专栏

作者介绍:张耀琦,现腾讯即通应用部iOS工程师一枚;数学出身,CSDN博客专家(YoferZhang的专栏);目前爱好钻研机器学习

什么是梯度下降法?学习速率的引入;如何调整学习速率;Adagrad算法介绍;用泰勒展开式对梯度下降法进行数学理论支持

引用课程:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html

什么是Gradient Descent(梯度下降法)?

在第二篇文章中有介绍到梯度下降法的做法,传送门:【机器学习入门系列】Regression 回归:案例研究

Review: 梯度下降法

在回归问题的第三步中,需要解决下面的最优化问题:

这里的parameters是复数,即 $\theta$ 指代一堆参数,比如上篇说到的 $w$ 和 $b$。

我们要找一组参数 $\theta$ ,让损失函数越小越好,这个问题可以用梯度下降法解决:

假设 $\theta$ 有里面有两个参数 ${\theta{1}, \theta{2}}$

随机选取初始值

这里可能某个平台不支持矩阵输入,看下图就好。

然后分别计算初始点处,两个参数对 $L$ 的偏微分,然后 $\theta^{0}$ 减掉 $\eta$ 乘上偏微分的值,得到一组新的参数。同理反复进行这样的计算。黄色部分为简洁的写法,$\nabla L(\theta)$即为梯度

$\eta$叫做Learning rates(学习速率)

上图举例将梯度下降法的计算过程进行可视化。

Tip1:调整 learning rates(学习速率)

小心翼翼地调整 learning rate

举例:

上图左边黑色为损失函数的曲线,假设从左边最高点开始,如果 learning rate 调整的刚刚好,比如红色的线,就能顺利找到最低点。如果 learning rate 调整的太小,比如蓝色的线,就会走的太慢,虽然这种情况给足够多的时间也可以找到最低点,实际情况可能会等不及出结果。如果 learning rate 调整的有点大,比如绿色的线,就会在上面震荡,走不下去,永远无法到达最低点。还有可能非常大,比如黄色的线,直接就飞出去了,update参数的时候只会发现损失函数越更新越大。

虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。

解决方法就是上图右边的方案,将参数改变对损失函数的影响进行可视化。比如 learning rate 太小(蓝色的线),损失函数下降的非常慢;learning rate 太大(绿色的线),损失函数下降很快,但马上就卡住不下降了;learning rate特别大(黄色的线),损失函数就飞出去了;红色的就是差不多刚好,可以得到一个好的结果。

自适应 learning rate

举一个简单的思想:随着次数的增加,通过一些因子来减少 learning rate

  • 通常刚开始,初始点会距离最低点比较远,所以使用大一点的 learning rate
  • update好几次参数之后呢,比较靠近最低点了,此时减少 learning rate
  • 比如 $\eta^{t} = \eta / \sqrt{t+1}$,$t$ 是次数。随着次数的增加,$\eta^{t}$ 减小

但 learning rate 不能是 one-size-fits-all ,不同的参数需要不同的 learning rate

Adagrad 算法

Adagrad 是什么?

每个参数的学习率都把它除上之前微分的均方根。解释:

普通的梯度下降为:

$w$ 是一个参数

Adagrad 可以做的更好:

$\sigma^{t$:之前参数的所有微分的均方根,对于每个参数都是不一样的。

Adagrad举例

下图是一个参数的更新过程

将 Adagrad 的式子进行化简:

Adagrad 存在的矛盾?

在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。

下图是一个直观的解释:

下面给一个正式的解释:

比如初始点在 $x{0}$,最低点为 $-\frac{b}{2a}$,最佳的步伐就是 $x{0}$ 到最低点之间的距离 $| x{0} + \frac{b}{2a} |$,也可以写成 $\frac{| 2ax{0} + b|}{2a}$。而刚好 $ |2ax{0} + b|$ 就是方程绝对值在$x{0}$这一点的微分。

这样可以认为如果算出来的微分越大,则距离最低点越远。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比较好的。

结论1-1:梯度越大,就跟最低点的距离越远。

这个结论在多个参数的时候就不一定成立了。

多参数下结论不一定成立

对比不同的参数

上图左边是两个参数的损失函数,颜色代表损失函数的值。如果只考虑参数 $w{1}$,就像图中蓝色的线,得到右边上图结果;如果只考虑参数 $w{2}$,就像图中绿色的线,得到右边下图的结果。确实对于a和b,结论1-1是成立的,同理c和b也成立。但是如果对比a和c,就不成立了,c比a大,但c距离最低点是比较近的。

所以结论1-1是在没有考虑跨参数对比的情况下,才能成立的。所以还不完善。

之前说到的最佳距离$\frac{| 2ax_{0} + b|}{2a}$,还有个分母 $2a$ 。对function进行二次微分刚好可以得到:

所以最好的步伐应该是:

一次微分/二次微分

即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分:

Adagrad 进一步的解释

再回到之前的 Adagrad

对于$\sqrt{\sum^{t}_{i=0} (g^{i})^{2} }$ 就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)

Tip2:Stochastic Gradient Descent(随机梯度下降法)

之前的梯度下降:

而Stochastic Gradient Descent(更快):

损失函数不需要处理训练集所有的数据,选取一个例子 $x^{n}$

此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失函数$L^{n}$,就可以赶紧update 梯度。

对比:

常规梯度下降法走一步要处理到所有二十个examples,但Stochastic 此时已经走了二十步(没处理一个example就更新)

Tip3:Feature Scaling(特征缩放)

比如有个function:

两个输入的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。

为什么要这样做?

上图左边是$x{1}$的scale比 $x{2}$要小很多,所以当$w{1}$ 和 $w{2}$做同样的变化时,$w{1}$对y的变化影响是比较小的,$x{2}$对y的变化影响是比较大的。

坐标系中是两个参数的error surface(现在考虑左边蓝色),因为$w{1}$对y的变化影响比较小,所以$w{1}$对损失函数的影响比较小,$w{1}$对损失函数有比较小的微分,所以$w{1}$方向上是比较平滑的。同理$x{2}$对y的影响比较大,所以$x{2}$对损失函数的影响比较大,所以在$x_{2}$方向有比较尖的峡谷。

上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。

对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。

怎么做 scaling?

方法非常多,这里举例一种常见的做法:

上图每一列都是一个例子,里面都有一组feature。

对每一个维度$i$(绿色框)都计算平均数,记做$m{i}$;还要计算标准差,记做$\sigma{i}$。

然后用第r个例子中的第i个输入,减掉平均数$m{i}$,然后除以标准差$\sigma{i}$,得到的结果是所有的维数都是0,所有的方差都是1

梯度下降的理论基础

问题

当用梯度下降解决问题:

每次更新参数 $\theta$,都得到一个新的 $\theta$,它都使得损失函数更小。即:

上述结论正确吗?

结论是不正确的。。。

数学理论

比如在$\theta^{0}$处,可以在一个小范围的圆圈内找到损失函数细小的$\theta^{1}$,不断的这样去寻找。

接下来就是如果在小圆圈内快速的找到最小值?

Taylor Series(泰勒展开式)

先介绍一下泰勒展开式

定义

若$h(x)$在$x = x_{0}$点的某个领域内有无限阶导数(即无限可微分,infinitely differentiable),那么在此领域内有:

当$x$很接近$x{0}$时,有$h(x) \approx h(x{0}) + h'(x{0})(x - x{0})$

式1-1就是函数$h(x)$在$x = x_{0}$点附近关于$x$的幂函数展开式,也叫泰勒展开式

举例:

图中3条蓝色线是把前3项作图,橙色线是 $sin(x)$。

多变量泰勒展开式

下面是两个变量的泰勒展开式

利用泰勒展开式简化

回到之前如何快速在圆圈内找到最小值。基于泰勒展开式,在$(a,b)$ 点的红色圆圈范围内,可以将损失函数用泰勒展开式进行简化:

将问题进而简化为下图:

不考虑s的话,可以看出剩下的部分就是两个向量$(\Delta \theta{1}, \Delta \theta{2})$ 和 $(u, v)$的内积,那怎样让它最小,就是和向量 $(u, v)$ 方向相反的向量

然后将u和v带入。

发现最后的式子就是梯度下降的式子。但这里用这种方法找到这个式子有个前提,泰勒展开式给的损失函数的估算值是要足够精确的,而这需要红色的圈圈足够小(也就是学习率足够小)来保证。所以理论上每次更新参数都想要损失函数减小的话,即保证式1-2 成立的话,就需要学习率足够足够小才可以。

所以实际中,当更新参数的时候,如果学习率没有设好,是有可能式1-2是不成立的,所以导致做梯度下降的时候,损失函数没有越来越小。

式1-2只考虑了泰勒展开式的一次项,如果考虑到二次项(比如牛顿法),在实际中不是特别好,会涉及到二次微分等,多很多的运算,性价比不好。

梯度下降的限制

  • 容易陷入局部极值
  • 还有可能卡在不是极值,但微分值是0的地方
  • 还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
1 条评论
热度
最新
那些彩虹色的图是如何画出来的?
那些彩虹色的图是如何画出来的?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
机器学习入门系列04,Gradient Descent(梯度下降法)
引用课程:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html 先看这里,可能由于你正在查看这个平台行间公式不支持很多的渲染,所以最好在我
MelonTeam
2018/01/04
7350
机器学习入门系列04,Gradient Descent(梯度下降法)
还不了解梯度下降法?看完这篇就懂了!
那么其实可以总结出关于“如何找到函数f(x)”的方法论。可以看作是机器学习的“三板斧”:
木东居士
2019/12/10
2.6K0
还不了解梯度下降法?看完这篇就懂了!
理解梯度下降法
最优化问题在机器学习中有非常重要的地位,很多机器学习算法最后都归结为求解最优化问题。在各种最优化算法中,梯度下降法是最简单、最常见的一种,在深度学习的训练中被广为使用。在本文中,SIGAI将为大家系统的讲述梯度下降法的原理和实现细节问题。
SIGAI学习与实践平台
2018/08/07
9050
理解梯度下降法
机器学习入门:梯度下降算法(上)
一个人 被困在山上,需要从山上下来 (i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。
小言从不摸鱼
2024/09/10
1120
机器学习入门:梯度下降算法(上)
梯度下降法的理解及实现 (一)
我们的目的的一步步的走向最低点,也就是损失函数的最小值。图中损失函数的导数可以代表方向,当初始点在左侧时,导数为负,w_i+1会向右移动(也就是向最低点移动);当初始点在右侧时导数为正,w_i+1会向左移动。无论初始点在哪里都会得到一个局部最小值。
生信编程日常
2020/11/12
8970
梯度下降法的理解及实现 (一)
一文读懂机器学习梯度下降法
我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!
商业新知
2019/05/05
1K0
一文读懂机器学习梯度下降法
Python3入门机器学习(六)- 梯度下降法
以下是定义了一个损失函数以后,参数theta对应的损失函数J的值对应的示例图,我们需要找到使得损失函数值J取得最小值对应的theta(这里是二维平面,也就是我们的参数只有一个)
Meet相识
2018/09/12
1.1K0
Python3入门机器学习(六)- 梯度下降法
梯度下降法
梯度下降法(Gradient Descent)不是一种机器学习算法,而是是一种基于搜索的最优化方法,作用是最小化一个损失函数,例如在线性回归过程中,可以用梯度下降法来最小化损失函数,同样的,也可以用梯度上升法来最大化一个效用函数。
Hsinyan
2022/06/19
6960
梯度下降法
深入浅出--梯度下降法及其实现
本文将从一个下山的场景开始,先提出梯度下降算法的基本思想,进而从数学上解释梯度下降算法的原理,最后实现一个简单的梯度下降算法的实例!
desperate633
2018/08/23
1K0
机器学习10:梯度优化与L正则化稀疏性
在用梯度下降法求解优化问题时,最重要的操作就是计算目标函数的梯度。对于一些比较复杂的机器学习模型,如深度神经网络,目标函数的梯度公式也非常复杂,很容易写错。因此,在实际应用中,写出计算梯度的代码之后,通常需要验证自己写的代码是否正确。
用户5473628
2019/08/08
2.2K0
梯度下降法原理与python实现
梯度下降法(Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。 本文将从最优化问题谈起,回顾导数与梯度的概念,引出梯度下降的数据推导;概括三种梯度下降方法的优缺点,并用Python实现梯度下降(附源码)。 1 最优化问题 最优化问题是求解函数极值的问题,包括极大值和
用户1432189
2019/03/04
2.1K0
梯度下降法原理与python实现
梯度下降法学习笔记
梯度下降法是一个经典的优化算法,在机器学习领域非常常见,很多机器学习算法最后都归结为求解最优化问题。在各种最优化算法中,梯度下降法是最简单、最常见的一种,在深度学习的训练中被广为使用。
EmoryHuang
2022/10/31
7150
梯度下降法学习笔记
春节充电系列:李宏毅2017机器学习课程学习笔记03之梯度下降
【导读】我们在上一节的内容中已经为大家介绍了台大李宏毅老师的机器学习课程的regression问题,其中简要提及了梯度下降(gradient descent),这一节将主要针对梯度下降问题展开分析。本文内容涉及机器学习中梯度下降的若干主要问题:调整学习率、随机梯度下降、feature scaling、以及如何直观的理解梯度下降。话不多说,让我们一起学习这些内容吧。 春节充电系列:李宏毅2017机器学习课程学习笔记01之简介 春节充电系列:李宏毅2017机器学习课程学习笔记02之Regression 课件网址
WZEARW
2018/04/13
7110
春节充电系列:李宏毅2017机器学习课程学习笔记03之梯度下降
通俗易懂讲解梯度下降法!
知乎 | https://zhuanlan.zhihu.com/p/335191534
Datawhale
2022/01/05
1.7K0
通俗易懂讲解梯度下降法!
批量梯度下降法(BGD)、随机梯度下降法(SGD)和小批量梯度下降法(MBGD)
在机器学习中,对于很多监督学习模型,需要对原始的模型构建损失函数,接下来便是通过优化算法对损失函数进行优化,以便找到最优的参数。 梯度下降法作为机器学习中较常使用的优化算法,在其求解过程中,只需要求解损失函数的一阶导数,计算的代价比较小。 基本思想可以理解为:我们从山上的某一点出发,找一个最抖的坡走一步(也就是找梯度方向),到达一个点之后,再找最陡的坡,再走一步,直到不断的走,走到最低点(最小花费函数收敛点)
全栈程序员站长
2022/09/30
3.7K0
批量梯度下降法(BGD)、随机梯度下降法(SGD)和小批量梯度下降法(MBGD)
通俗易懂讲解梯度下降法!
前言:本篇文章用讲解+实战的形式,浅显易懂讲解“梯度下降”,拥有高中数学知识即可看懂。
算法进阶
2022/06/02
3170
通俗易懂讲解梯度下降法!
机器学习入门 6-2 模拟实现梯度下降法
本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍模拟实现梯度下降算法。
触摸壹缕阳光
2019/11/13
5540
机器学习入门 6-2 模拟实现梯度下降法
机器学习入门 6-3 线性回归中的梯度下降法
本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍在线性回归中使用梯度下降法。
触摸壹缕阳光
2019/11/13
1K0
Python机器学习算法入门之梯度下降法实现线性回归
專 欄 ❈ ZZR,Python中文社区专栏作者,OpenStack工程师,曾经的NLP研究者。主要兴趣方向:OpenStack、Python爬虫、Python数据分析。 Blog:http://skydream.me/ CSDN:http://blog.csdn.net/titan0427/article/details/50365480 ❈—— 1. 背景 文章的背景取自An Introduction to Gradient Descent and Linear Regression
Python中文社区
2018/01/31
1.9K0
Python机器学习算法入门之梯度下降法实现线性回归
随机梯度下降法介绍及其参数讲解「建议收藏」
简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。如图所示,黑线标注的路线所指的方向并不是真正的地方。
全栈程序员站长
2022/09/09
1.9K0
随机梯度下降法介绍及其参数讲解「建议收藏」
相关推荐
机器学习入门系列04,Gradient Descent(梯度下降法)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档