老铁们,大家好,相信还有很多朋友对于深入浅出最优化方法(三):最速下降法与牛顿法详解和的相关问题不太懂,没关系,今天就由我来为大家分享分享深入浅出最优化方法(三):最速下降法与牛顿法详解以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
因此,我们接下来研究计算搜索方向的算法时,最重要的前提是计算出的搜索方向应当是下降方向。步长计算使用精确搜索、Wolfe-Powell搜索或强条件的Wolfe-Powell搜索。
2 最速梯度下降法
2.1 最速梯度下降法步骤
既然我们要求下降方向,那么我们首先想到的就是梯度的反方向。函数的值沿梯度方向增加最快,沿梯度相反方向减少最快。因此,对于每个步骤,方法将负梯度方向作为下降方向也称为最速梯度下降法。
在此处插入描述步骤的图像:
给定初始点,精度,设,如果,则解为,算法终止计算计算步骤订购,转到步骤2
2.2 性能评估
收敛:因为每一步产生一个向下的方向,所以必定收敛。收敛速度:用正定二次函数逼近该点附近的函数。如果正定二次函数的Hessian矩阵的所有特征值都相等,则超线性收敛;否则,线性收敛。 (证明见附录2) 二次可终止性:显然满足。计算量:小,只需要计算梯度存储空间:小,只需要存储梯度
2.3 实战测试
本合集第一篇文章,深入讲解优化(一)优化针对最小二乘问题提出在问题概念和基础知识中,的初始值都是在范围内随机生成的,共生成100组起点。平均迭代步数、平均迭代时间、得到的最优解、迭代成功的样本残差最小平方和(1000步以内得到最优解且单步搜索迭代次数不超过1000步)超过1000)被计算。
平均迭代步数平均迭代时间最优解残差平方和最小值234.683.31s
3 阻尼牛顿法
3.1 阻尼牛顿法步骤
经典牛顿法的思想是利用近似二次方的最小点充当原问题新的近似解。处的二阶泰勒展开式为,二次逼近函数为,以及,若正定,则的极小点为的解,取二次函数的最小值点如,则,该迭代公式称为古典牛顿法的迭代公式,其中在处为牛顿方向。
在此插入图片说明。如果目标函数是二次函数,则在牛顿方向上步长为1的搜索可以直接搜索到局部最优解。但如果二次函数只是目标函数的近似值,则需要使用Wolfe-Powell 搜索来找到步长。此时算法称为阻尼牛顿法。
步:
设定初始点,精度,令如果,则解为,算法终止,计算步长为:0 10-69506,让3336 0010 -69507,转步骤2
3.2 性能评估
收敛:当且仅当每一步存在目标函数的Hessian矩阵,即近似二次函数的Hessian矩阵为正定,牛顿方向为向下方向,所以收敛性不能保证。收敛速度:如果是在最优解附近二阶连续可微,最优解处梯度为0,Hessian矩阵是正定的,那么算法为超线性收敛。特别是,如果目标函数在最优解处是二阶Lipschitz 连续,则算法为二阶收敛。 (证明见附录3) 二次终止性:显然满足。计算量:大,需要计算Hessian矩阵,变量个数较多时计算量较大。存储空间:大,需要存储Hessian矩阵,变量数量多时存储空间就大。
4 牛顿-梯度下降混合法
4.1 牛顿-梯度下降混合法步骤
由于我们不能保证牛顿法会产生向下的方向,但我们希望利用牛顿法的二阶收敛性来提高最快梯度下降法的收敛速度,所以我们可以将两者融合。当牛顿法无法产生下降方向时,可以使用最快的梯度下降法来产生下降方向。
步:
设置初始点,精度,设if,则解为,算法终止if 010-69 538、取:计算步长订购:010 -69507,转步骤2
4.2 实战测试
本合集第一篇文章,深入介绍优化(一)优化问题的概念和基础知识中提出的最小二乘问题,初步的值都是在范围内随机生成的,总共生成了100组起始点。统计迭代成功率(1000步内得到最优解且单步搜索迭代次数不超过1000次)、平均迭代步数、平均迭代时间与得到的最优解以及最小和残差的平方。
平均迭代步数平均迭代时间最优解残差平方和最小值56.01.02s
代码实现
本博客所有代码均开源于https://github.com/HarmoniaLeo/optimization-in-a-简而言之,如果对你有帮助,请给我一个star,谢谢,这对我来说真的很重要!
您可以在上面的GitHub 链接或本合集的第一篇文章中找到Function.py 和lagb.py:用简单的方法了解优化(一)优化问题的概念和基础知识
最速下降法:
将numpy 导入为np
from Function import Function #Definition 方法推导工具
from lagb import * #线性代数工具库
n=2 #x 长度
def myFunc(x): #x是包含所有参数的列表
return x[0]**2 + 2*x[1]**2 + 2*x[0] - 6*x[1] +1 #目标方程
x=np.zeros(n) #初始值点
=0.6
贝塔=1
西格玛=0.4
e=0.001
k=0
焦油=函数(myFunc)
而tar.norm(x)e:
d=-tar.grad(x)
a=1
如果不是(tar.value(x+a*d)=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) 和dot(turn(tar.grad(x+ a) *d)),d)=sigma*dot(转(tar.grad(x)),d)):
a=贝塔
而tar.value(x+a*d)tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
a*=rho
while dot(turn(tar.grad(x+a*d)),d)tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
达*=rho
a+=da
x+=a*d
k+=1
打印(k)
print(x)牛顿-梯度下降混合方法:
将numpy 导入为np
from Function import Function #Definition 方法推导工具
from lagb import * #线性代数工具库
从scipy 导入linalg
n=2 #x 长度
def myFunc(x): #x是包含所有参数的列表
return x[0]**2 + 2*x[1]**2 + 2*x[0] - 6*x[1] +1 #目标方程
x=np.zeros(n) #初始值点
=0.6
贝塔=1
e=0.001
西格玛=0.4
k=0
焦油=函数(myFunc)
而tar.norm(x)e:
尝试:
d=linalg.solve(tar.hesse(x),-tar.grad(x))
if tar.value(x)-tar.value(x+d)0:
d=-tar.grad(x)
除了Exception:
d=-tar.grad(x)
a=1
如果不是(tar.value(x+a*d)=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) 和dot(turn(tar.grad(x+ a) *d)),d)=sigma*dot(转(tar.grad(x)),d)):
a=贝塔
而tar.value(x+a*d)tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
a*=rho
while dot(turn(tar.grad(x+a*d)),d)tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
达*=rho
a+=da
x+=a*d
k+=1
打印(k)
print(x)
附录
设向量和之间的角度为,则给出以下基本假设:连续可导且有下界,并且3 336001 0- 69551 Lipschitz连续,即存在一个常数,使得
那么有一个定理,如果通过下降算法生成序列,并且通过精确搜索或Wolfe-Powell搜索生成步长,则为。特别是,如果存在常量,使得,则为。该定理表明,当生成方向与负梯度方向的夹角小于时,可以保证算法的收敛。
下面是基于假设的定理证明: 从Wolfe-Powell搜索条件和假设来看,我们有,这意味着。这里是,进一步通过Wolfe-Powell搜索第一个条件,我们得到
将上述不等式的左右两边从到相加,注意有一个下界。可以得到第一定理,由无穷级数收敛的必要条件可以得到第二定理。
最快梯度下降法收敛速度证明:https://blog.csdn.net/weixin_43010548/article/details/97619095
牛顿法收敛速度证明:
提出定理:假设在的某个邻域内两次连续可微,并且满足,是正定的,则存在常数010-6955 7、这样当010-在69574时,由单位步长牛顿法生成的序列超线性收敛到。此外,如果在处是Lipschitz 连续的,则序列二次收敛到。
关于深入浅出最优化方法(三):最速下降法与牛顿法详解和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
【深入浅出最优化方法(三):最速下降法与牛顿法详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始学习最优化了,我最感兴趣的是最速下降法和牛顿法,希望能学到东西!
有5位网友表示赞同!
这篇文章介绍怎么用算法找到最好结果?听起来很有用!
有16位网友表示赞同!
我一直在找一些关于最优化的资料,这样一篇浅入易出的文真不错。
有13位网友表示赞同!
对最速下降法和牛顿法的区别不太懂,希望文章能讲清楚!
有14位网友表示赞同!
看标题感觉这篇文章会讲解一些最优方法的理论基础。
有13位网友表示赞同!
我最喜欢数学模型,希望能从这篇文章中学到些什么新的算法。
有7位网友表示赞同!
想好好学习一下这些优化算法,以后应该可以在现实生活中用到呢!
有10位网友表示赞同!
希望文章能用例子解释清楚最速下降法和牛顿法的具体操作步骤!
有10位网友表示赞同!
学习人工智能需要了解优化算法,这篇文章正好可以填补我的知识漏洞。
有5位网友表示赞同!
感觉这些最优化的算法都还挺复杂的,希望能慢慢理解一下。
有18位网友表示赞同!
在研究中总会遇到一些需要优化的问题,希望这篇教程能给我启发!
有12位网友表示赞同!
对机器学习模型训练感兴趣,所以最优化这块挺重要。期待看看文章!
有6位网友表示赞同!
不知道最速下降法和牛顿法的效率怎么样?文章里面应该会对比一下吧!
有11位网友表示赞同!
我已经了解了一点最优化的基础知识,希望能在这篇文章里更深入理解!
有7位网友表示赞同!
学习代码的时候经常需要用到优化算法的知识,这篇文章正好能让我补课!
有7位网友表示赞同!
感觉这篇文章可以帮助我更好地理解机器学习模型是如何运作的!
有12位网友表示赞同!
我最喜欢的是一些图示化的讲解方式,希望文章也能这样呈现!
有9位网友表示赞同!
最近在看一些算法设计相关的书籍,这篇题目的介绍也挺有意思的!
有8位网友表示赞同!
我想了解最速下降法和牛顿法的优缺点比较,以及什么时候使用哪种方法较为合适?
有9位网友表示赞同!
希望文章能提供一些实际案例,让这些算法更容易理解!
有11位网友表示赞同!