⑴ 梯度下降法是什么
梯度下降法(英语:Gradient descent)是一个一阶最优化算法,通常也称为最陡下降法。
要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。
梯度下降一般归功于柯西,他在 1847 年首次提出它。Hadamard在 1907 年独立提出了类似的方法。Haskell Curry在 1944 年首先研究了它对非线性优化问题的收敛性,随着该方法在接下来的几十年中得到越来越多的研究和使用,通常也称为最速下降。
梯度下降适用于任意维数的空间,甚至是无限维的空间。在后一种情况下,搜索空间通常是一个函数空间,并且计算要最小化的函数的Fréchet 导数以确定下降方向。
梯度下降适用于任意数量的维度(至少是有限数量)可以看作是柯西-施瓦茨不等式的结果。那篇文章证明了任意维度的两个向量的内(点)积的大小在它们共线时最大化。在梯度下降的情况下,当自变量调整的向量与偏导数的梯度向量成正比时。
修改
为了打破梯度下降的锯齿形模式,动量或重球方法使用动量项,类似于重球在被最小化的函数值的表面上滑动,或牛顿动力学中的质量运动在保守力场中通过粘性介质。具有动量的梯度下降记住每次迭代时的解更新,并将下一次更新确定为梯度和前一次更新的线性组合。
对于无约束二次极小化,重球法的理论收敛速度界与最优共轭梯度法的理论收敛速度界渐近相同。
该技术用于随机梯度下降,并作为用于训练人工神经网络的反向传播算法的扩展。
⑵ 梯度下降法是什么
梯度下降法(英语:Gradient descent)是一个一阶最优化算法,通常也称为最陡下降法,但是不该与近似积分的最陡下降法(英语:Method of steepest descent)混淆。
要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。
如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。
梯度下降算法使用当前位置的梯度迭代计算下一个点,然后对其进行缩放(按学习率)并从当前位置减去获得的值(迈出一步)。它减去该值,因为我们想要最小化函数(最大化它会增加)。
缺点
梯度下降法的缺点包括:
1、靠近局部极小值时速度减慢。
2、直线搜索可能会产生一些问题。
3、可能会“之字型”地下降。
⑶ 梯度下降法原理和步骤
一、梯度法思想
梯度法思想的三要素:出发点、下降方向、下降步长。
机器学习中常用的权重更新表达式为
:,这里的λ就是学习率,本文从这个式子出发来把机器学习中的各种“梯度”下降法阐释清楚。
机器学习目标函数,一般都是凸函数,什么叫凸函数?限于篇幅,我们不做很深的展开,在这儿我们做一个形象的比喻,凸函数求解问题,可以把目标损失函数想象成一口锅,来找到这个锅的锅底。非常直观的想法就是,我们沿着初始某个点的函数的梯度方向往下走(即梯度下降)。在这儿,我们再作个形象的类比,如果把这个走法类比为力,那么完整的三要素就是步长(走多少)、方向、出发点,这样形象的比喻,让我们对梯度问题的解决豁然开朗,出发点很重要,是初始化时重点要考虑的,而方向、步长就是关键。事实上不同梯度的不同就在于这两点的不同!
梯度方向是
,步长设为常数Δ,这时就会发现,如果用在梯度较大的时候,离最优解比较远,W的更新比较快;然而到了梯度较小的时候,也就是较靠近最优解的时候,W的更新竟然也保持着跟原来一样的速率,这样会导致W很容易更新过度反而远离了最优解,进而出现在最优解附近来回震荡。所以,既然在远离最优解的时候梯度大,在靠近最优解的时候梯度小,我们让步长随着这个律动,于是我我们就用λ|W|来代替Δ,最后得到了我们熟悉的式子:
所以说这时的λ是随着坡度的陡缓而变化的,别看它是个常数。
二、全量梯度下降法(Batch gradient descent)
全量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。
第二、随机梯度下降法(Stochastic Gradient Descent)
SGD一轮迭代只用一条随机选取的数据,尽管SGD的迭代次数比BGD大很多,但一次学习时间非常快。
SGD的缺点在于每次更新可能并不会按照正确的方向进行,参数更新具有高方差,从而导致损失函数剧烈波动。不过,如果目标函数有盆地区域,SGD会使优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,可能最终收敛于一个较好的局部极值点,甚至全局极值点。
缺点是,出现损失函数波动,并且无法判断是否收敛。
⑷ 神经网络算法-梯度下降GradientDescent
神经网络文章索引
上一篇神经网络结构中,我们介绍了神经元的结构,激活函数以及每个神经元激活值的算法,涉及到权重、偏置值等。
上一篇结尾提到,对于28*28的黑白手写图像识别,我们需要13002个权重和偏置数值,才能让我们的神经网络最后输出正确结果。
所谓的机器学习,就是寻找这13002个数值的过程。首先这里有两点需要注意:
在负无穷到正无穷之间,如何获得一万多个数字最佳的匹配值?这比在全世界挑选1万人让TA们一起相爱还要难。
我们的做法是用计算机强大运算速度,暴力解决问题。
好了,现在,暴力不是问题,要想出奇迹的关键就在于如何找到如何 优化的规律 。
要想做优化,首先要明确目标,找到当前神经网络和期望结果之间的差距。
从下图可以看到,随机设定的神经网络最终输出的是混乱的一层(被黄色线框标出),距离最右边我们期望只点亮神经元3的情况差距很大。
我们把混乱输出层的每个神经元与期望层每个对应神经元激活值相减,然后平方,再累加在一起,这就是方差cost代价,如下图,计算得到cost是3.37。
我们用这个cost来表示当前神经网络13002个设定值和期望设定值之间的差距,当然,这个cost等于0是差距最小,也就是最接近期望设定值。——当然这只是针对数字3的1张图片来说,我们需要的是针对0~9共10个数字的数万张图片,cost都能是最小。
从下图,我们来看一下神经网络的功能。它能利用13002个设定值经过3层神经元激活值的计算,把784个像素亮度变为10个数字(我们期望这10个数字中只有一个是1,其他都是0)。
这13002个权重和偏置数字,加上激活值的算法,就是神经网络的“想法”。
我们再来看看代价函数的情况,如下图,它是利用很多很多的训练图片(已经明确了对应的数字),把13002个数字变为1个cost代价数。
写成函数形式
我们假设最简单的情况,只有1个权重和1个偏置:
x和y是任意可能的数值,我们希望知道当x和y是什么数值的时候z最小。
每一组[x,y]都对应唯一的z,我们可以假想,有无数个[x,y,z]这样的位置点,在三维空间坐标中,它们就会组成一个面(曲面或平面),如下图。
从几何意义上看,我们就是要找到凹陷最低的那个位置点的x,y的值,因为那里z也就是cost代价最低。
假设上面的xyz绘制的cost曲面是个山地,你是一个旅行者,需要行走找到最低点的位置,你会怎么办?
没错,只要一直往下走,那么就能走到所在区域的最低点。——当然,如果山后面还有更深的山谷,那么你可能找到的只是局部最低点,而并非世界最低点。
实际上,对于复杂的超多维度来说,找到世界最低点几乎是不可能任务。我们唯一能做的就是多找几个局部最低点,然后选择其中最低的那个。
同样,如果我们落脚在[x',y'],那么可以尝试对比[x'+0.1,y'],[x'-0.1,y'],[x',y'-0.1],[x',y'+0.1],如果[x'+0.1,y']是最低的,那么我们就走到这里,然后继续尝试对比四周点的高度。这就是梯度下降的算法。
如下图,我们沿着虚线一步一步下山找到最低点。
首先快速的从下图了解几个基本概念。
下图的弧线表示的是某个函数y=f(x),比如抛物线方程y=x 2 。
曲线上任取两个点a,b,它们对应x和x+dx。(d是指德尔塔大写Δ,小写δ)
ab两点对应的y的差是dy。
现在直线ab看上去是曲线的割线(有ab两个交点)。
假设b点沿着曲线,越来越靠近a点,那么dx极限趋近于0,这时候dy也会越来越小趋近于0,但是!我们会意识到dy/dx永远不会是0,而最终它仍然是角∠cab的对边比邻边,也就是正切三角函数值。
实际上,这也正是曲线的切线的定义。
可以想象,我们取的a点越是靠右,那么这个切线越是竖直。
如果我们把这个切线看做表示某个一次方程,如y=mx+n这种形式,那么a点越靠右,直线越竖直,m值也就越大。
我们把m值叫做直线的斜率。
导数derivative ,一元函数y=f(x)(即因变量y只受到一个自变量x影响的函数)中任意取x,如果x增加极小趋近于0的Δx(或者写为dx),那么y相应的被增加Δy(或者写作dy),那么导数就是dy/dx,而又有dy=f(x+dx)-f(x),所以:
从函数的曲线图上可以看到,某点的导数就是dx趋近于0时候∠cab的正切,导数反映了切线的陡峭程度,也就是y随着x变化的快慢程度。
微分differential ,简单说就是Δx和Δy,或者记作dx和dy。x称之为自变量,y称之为因变量,那么x趋近于最小的时候的值,就是x的微分(趋近0又不是0的那个神秘值),同样y的微分也是这个意思,总之是想得到又摸不到的神奇值。
斜率slope ,一元一次函数(直线方程)y=mx+n的系数m值。在这里就是a点的导数值f'(x)。
切线tangent ,某个点a的切线,就是经过a点的,以A点斜率为系数的方程y=f'(x)x+n所表示的直线。
自变量dependent variable和因变量 independent variable ,x自己的变化,引发y被动变化。
好了,我们来看 多变量微分Multivariable differential 。
上面都是一个y收到一个x的影响y=f(x),多变量就是不止受到一个自变量的影响,我们以最简单的z=f(x,y)为例,z=x 2 +y 2 。
绿轴x的变化和红轴y的变化,都会对应蓝轴z的变化。
x从负无穷到正无穷无限种可能,y也是无限种可能,x和y复合到一起就在水平方向覆盖了全部地面,z值有高有低,就像现实世界中的海拔一样,把xy平面凸起或凹陷。(图中粉色没有画出全部曲面)
我们可以想象,这时候不能讨论A点的切线了,而应该考虑它的 切平面tangent plane (下图绿色平面)。
方向导数directional derivative ,就是曲面上过A点的任意曲线的切线(下图紫色线)组成的平面,就是切平面。
这么多紫色的方向中,哪一个方向最陡峭?对于这个z=x 2 +y 2 函数来说,明显是最接近竖直朝上的那个箭头和最接近竖直朝下的那个箭头。
和曲线一样道理,越陡峭意味着z对x、y的变化越敏感,或者说dx、dy的变化会引发更多的dz。
梯度gradient ,我们规定,能够引发因变量最快变化的那个切线正方向,就叫做曲面方程上这个点的梯度。注意梯度是个xyz表示的三维方向,例如[0,0,1]表示z轴竖直向上,[0.1,0.1,1]就往xy的正方向偏一点点。
对于只有xy两个变量的三维曲面来说,我们还可以只是考虑x+0.1,x-0.1,y+0.1,y-0.1这样的试探方法找到最低点,只要2*2=4次就可以了,周全一点也就8次。
但是对于我们手写数字识别中13002个自变量来说,那就要2 13002 次,这是不可行的。
借用多元微分,我们可以找到13002个自变量某一随机点对应的切平面(实际早已不是什么平面了,我们姑且这么说),也可以计算出其中变化最快的方向,就是梯度,数学家已经证明,不管多少个维度,沿着梯度往前走一步,都能获得最快变化后新的一个点,这个点是一个n维向量,对于我们的案例来说就是13003个新数字组成的数组[0.322,0.123,0.55,0.222,...0.233]共13003个数字。
唯一要说明的一点不同就是,为了找最低点,我们不是往上走,而是往相反的负方向,朝下走。
步长step size ,就是我们每次沿着 负梯度 往下走多远,在机器学习算法里面它叫做 学习率learning rate ,同样道理,步子迈小了走得太慢,找到最低点耗时间太久,步子太大了容易跳过最低点(注意,1万多维的复杂情况不是我们上面三维漏斗曲面那么简单可以描述的)。所以我们经常设置0.00001这样小的数字,好在很多机器学习程序都会适当的自动调整它(比如Tensorflow中的梯度下降优化GradientDescentOptimizer),实际上不会让它太慢。
同时,我们从上图中看到,计算出的负梯度是由很多数字组成的数组,每个数字代表一个维度(就像xy那样),所以我们只要在原来的位置点坐标(比如[x,y])上分别把这个梯度(比如[0.1,-0.3])加上去就能得到新的点([x+0.1,y-0.3])。
内容小结
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,感谢转发~
END
⑸ 梯度下降法是什么
梯度下降法是一个一阶最优化算法,通常也称为最陡下降法,但是不该与近似积分的最陡下降法(英语:Method of steepest descent)混淆。
梯度下降算法使用当前位置的梯度迭代计算下一个点,然后对其进行缩放(按学习率)并从当前位置减去获得的值(迈出一步)。它减去该值,因为我们想要最小化函数(最大化它会增加)。
注意事项
从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。
注意得到的函数临界点,临界点并不一定是全局最大值或者全局最小值,甚至不是局部的最大值或者局部最小值。
⑹ 梯度下降的求解过程
顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。
其迭代公式为 ,其中 代表梯度负方向, 表示梯度方向上的搜索步长。梯度方向我们可以通过对函数求导得到,步长的确定比较麻烦,太大了的话可能会发散,太小收敛速度又太慢。一般确定步长的方法是由线性搜索算法来确定,即把下一个点的坐标ak+1看做是的函数,然后求满足f(ak+1)的最小值的 即可。
因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。
⑺ 梯度下降算法
方向导数反映是函数沿着其自变量空间某个方向变化的快慢程度,众所周知如果沿着某个方向其导数越大说明沿着这个方向函数值变化的越猛烈。
设若有函数 ,其自变量的空间是个三维空间,如果我们要求 沿着x,y,z三条坐标轴的变化率直接求其偏导数就可即:
这个其实就是函数 的梯度,那么方向导数又是什么嘞?
假设我们沿着 的自变量所在的三维空间的原点做一条射线 ,那么沿着射线这个方向其函数的变化情况有如何?,这里说的沿着这条射线的方向变化是说(x,y,z)在变化之前满足的过点(x,y,z)且平行于 的空间直线方程,其变化之后依旧满足直线方程,这个时候就要用到方向导数
假设有其自变量一维的函数 那么其导数为:
其实导数的本质意义可以从不同的方面去理解,高中我们理解的是切线斜率。大学了当然就应该还有其他的理解,我们现在从导数的结构上去理解,导数就是是用自变量的变化程度去衡量函数的变化程度,两者相比,分子是变量的变化程度,分母是函数的变化程度,那么为什么要去取极限嘞?其实还可以有不同的理解,假设还有一个函数是 如果我们要比较 的函数变化情况的话,显然在全局上我们是不好进行比较的,因为两个函数都变化的很丰富,都是有平坦有陡峭,我们不好去量化函数在某一个取值范围的变化情况,但是当自变量的区间很小的时候我们就有可能能够衡量两函数曲线的变化情况,所以取到极限就是某一点的变化情况,某一点的情况也就可以用斜率的绝对值来衡量了。知道了导数定义的结构,我们也就可以用这样的结构来定义沿着自变量空间或者平面的任何一个方向的函数变化情况了。
因此我们可以这样来定义自变量n维空间的时候函数的变化情况:
我们可以推导出上面导数的具体表达式这里以三维变量空间为例子:
是射线 的方向余弦,也就是其方向与三坐标轴夹角的余弦
而 就是梯度,那么接下来我们看看到底沿着那个方向其方向导数最大,也就是说沿着哪个方向其函数的变化最剧烈
显然
即方向导数等于方向余弦向量与梯度的内积,假设记 记
那么
显然当 与梯度向量的方向一致的时候 此时方向导数的取得最大值这时候函数沿着这个方向增大的最快,方向相反的时候取最小值这时候沿着这个方向减小的最快,也即函数在某一点出沿着梯度向量的方向是变化最剧烈的地方,实际上 梯度是函数 在点(x,y,z)的方向余弦,而梯度下降就意味着更新参数的时候是
可能有的同学说我用梯度下降就不沿着梯度方向迭代,我想往哪个方向就往哪个方向,理论上是有可能达到最小值和局部极小值,而且达到最小值的时候方向导数也是零,但是只是可能,可能沿着某一个方向下降的时候你无数次和你的命中注定擦肩而过,达不到最小值也达不到极小值,达到的时候还有可能是个伪局部极小值,这时候就麻烦了,而且你还要自己设定方向余弦。
而用梯度下降的好处就在于没迭代一次他会自动调整迭代的方向,这样就可以保证每次下降的方向都是函数值减小最剧烈的方向,能够保证损失函数值每次的迭代都是在单调不增。保证能够收敛到某个极值点,至于这个极值点是不是最小值点这个另当别论。
线性回归的假设函数如下:
假设有m个样本
这里面的 也就代表着梯度下降的时候参数调整的幅度是多少,大家如果是刚学梯度下降的时候肯定对参这个式子有疑虑:
图中可以了解到极小值点图中也是最小值点的左边其导数为负号,右边其导数为正号。导数为负的时候如果迭代式子 那么意味参数值左移损失函数值远离极小值,导数值取整数也一样是原理,所以取负号的原因就是首先让参数更新之后的值使得损失函数值有靠近极小值点的趋势
学习率的选取并不是固定的,而是要根据具体情况具体分析,学习率过大的话会导致参数迭代之后越过极小值点,如过损失函数是一个关于极小值点对称的话,一次迭代越过极小值,第二次迭代至越过的对称位置,这就很麻烦,收敛的值不是极小值,还会误解为极小值。如果学习率选取过小,很有可能因为迭代步长很小导致迭代次数无限多。
梯度下降法迭代更新参数取得的值不一定是极小值(迭代收敛的值,因为迭代至接近极值点出其梯度会消失)或者是最小值,但是梯度下降法的学习率和激活函数以及参数的初始化选取得当是一定会收敛至极小值的也有可能是最小值,正因为如此我们有时候或许可以多选择几个学习率,或者是多选取几批次初始化值,然后得到损失函数值相对最小的就可以了。
⑻ 随机梯度下降算法
以线性回归为例:
预测函数为:
代价函数:
重复:{
}
当数据量过大时,梯度下降的算法会变得很慢,因为要对所有的数据进行求和。因为每次重复梯度下降都是所有数据全部求和,所以梯度下降算法又称之为 批量梯度下降(Batch Gradient Descent)
随机梯度下降在每一次迭代中,不用考虑全部的样本,只需要考虑一个训练样本。
针对一个样本,它的代价函数:
而针对所有样本的代价函数可以看作是对每个样本代价函数的平均:
随机梯度下降算法如下:
第一步,先随机打乱训练集样本。
第二步,进行梯度下降:
重复 {
循环所有样本 for i=1,2,3,...,m {
}
}
一开始随机打乱数据是为了对样本集的访问是随机的,会让梯度下降的速度快一点。
该算法一次训练一个样本,对它的代价函数进行一小步梯度下降,修改参数 ,使得它对该样本的拟合会好一点;然后再对下一个样本进行运算,直到扫描完所有的训练样本,最后外部在迭代这个过程。
跟批量梯度下降算法不同的是,随机梯度下降不需要等到所有样本求和来得到梯度项,而是在对每个样本就可以求出梯度项,在对每个样本扫描的过程中就已经在优化参数了。
在梯度下降过程中,批量梯度下降的过程趋向于一条直线,直接收敛到全局最小值;而随机梯度下降不太可能收敛到全局最小值,而是随机地在其周围震荡,但通常会很接近最小值。
随机梯度下降通常需要经过1-10次外部循环才能接近全局最小值。
在批量梯度下降中,要判断是否收敛,需要在每一次迭代算法后计算 的值,根据值的变化来判断收敛。
在执行随机梯度下降时,不需要计算所有的样本的代价函数,只用在对某个样本进行梯度下降前计算该样本的代价函数 ,为了判断是否收敛,可以计算多次迭代后 的平均值,例如1000次迭代,在每次更新 前,计算最后1000次的的cost的平均值。
选择每隔多少次计算成本函数对梯度下降的过程也有影响:
上图中蓝色曲线是每1000次迭代,红色的是每隔5000次迭代。
因为随机梯度下降时会出现震荡,当迭代次数少时发现下降的曲线起伏很多,而迭代次数变大时,曲线就会变得平滑许多。缺点是每隔5000个计算,会增加计算成本。
增加迭代次数可以判断算法是否正确:
上图蓝色的是1000个迭代次数,通过这条曲线,不能很好的判断成本函数是否在下降,这时就需要添加迭代次数,当增加到5000次,则可以通过平滑的曲线判断,当下滑曲线是红色的时,说明算法是有效的,代价函数值在下降;当是紫色的曲线时,可以看到是一个平坦的线,这时判断算法可能出现问题了。
在随机梯度下降中,学习率 也会影响算法,当学习率减小时,下降曲线的震荡就会变小,而且会收敛到一个更好的解:
当看到曲线是上升的时候,可以尝试减小学习率看看效果。
在随机梯度下降中,如果想要收敛到全剧最小值,需要随着时间的变化减小学习率 的值:
学习率等于一个常数除以迭代次数加另一个常数,随着迭代次数增大,学习率会减小;但这会造成常数1和常数2的选择问题。
⑼ 梯度下降法是什么
梯度下降是通过迭代搜索一个函数极小值的优化算法。使用梯度下降,寻找一个函数的局部极小值的过程起始于一个随机点,并向该函数在当前点梯度(或近似梯度)的反方向移动。梯度下降算法是一种非常经典的求极小值的算法。
比如逻辑回归可以用梯度下降进行优化,因为这两个算法的损失函数都是严格意义上的凸函数,即存在全局唯一极小值,较小的学习率和足够的迭代次数,一定可以达到最小值附近,满足精度要求是完全没有问题的。并且随着特征数目的增多,梯度下降的效率将远高于去解析标准方程的逆矩阵。
常用的梯度下降法有3种不同的形式:
(1)批量梯度下降法,简称BGD,使用所有样本,比较耗时。
(2)随机梯度下降法,简称SGD,随机选择一个样本,简单高效。
(3)小批量梯度下降法,简称MBGD,使用少量的样本,这是一个折中的办法。
机梯度下降法优点:
1、更容易跳出局部最优解。
2、具有更快的运行速度。
⑽ 什么是梯度下降算法
梯度下降是迭代法的一种,梯度下降法是一个最优化算法,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。
梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。