BFGS算法

BFGS算法

22239人阅读 评论(11) 收藏 举报
分类:

今天,我来讲一种在机器学习中常用到的优化算法,叫做BFGS算法。BFGS算法被认为是数值效果最好的拟牛顿

法,并具有全局收敛性和超线性收敛速度。那么接下来将会详细讲解。

 

Contents

 

   1. 什么是拟牛顿法

   2. 拟牛顿法原理

   3. DFP算法原理

   4. BFGS算法原理

   5. BFGS算法的实现

 

 

1. 什么是拟牛顿法

 

   前面Logisitc回归讲解中,我介绍了牛顿法。牛顿法的特点是:收敛速度快,迭代次数少,但是当Hessian

   矩阵很稠密时,每次迭代的计算量很大。随着数据规模的增大,那么Hessian矩阵会越大,需要的存储空间

    多,计算量也会增大,有时候大到不可计算,所以针对海量数据的计算,牛顿法不再适用

 

   拟牛顿法是在牛顿法的基础上引入了Hessian矩阵的近似矩阵,避免每次迭代都计算Hessian矩阵的逆,它

   的收敛速度介于梯度下降法和牛顿法之间。拟牛顿法跟牛顿法一样,也是不能处理太大规模的数据,因为计算

   量和存储空间会开销很多。拟牛顿法虽然每次迭代不像牛顿法那样保证是最优化的方向,但是近似矩阵始终是

   正定的,因此算法始终是朝着最优化的方向在搜索。

 

 

2. 拟牛顿法原理

 

   拟牛顿法的基本思想是在牛顿法中用Hessian矩阵的某个近似矩阵来代替它。在高数中,学过泰勒公式,如下

 

       

 

   关于泰勒展开的更多内容,可以参考这里:泰勒公式介绍泰勒公式应用泰勒公式是用一个近似的多项式

   来代替原来复杂的函数表达式。对于拟牛顿法来说,构造二次模型。如下

 

   

 

   忽略高阶无穷小部分,进行求导得到

 

       

 

   令,那么得到

 

       

 

   牛顿迭代中,要求Hessian矩阵的逆,计算量增大,而拟牛顿法是用Hessian矩阵的逆矩阵来代替Hessian

   矩阵。即如下迭代式

 

       

 

   这个方程就是拟牛顿方程,这就是拟牛顿的核心公式啊。所以最关键的问题是如何得到每一步的。关

   于这个问题,又有很多种方法来迭代计算,接下来主要介绍DFP算法和BFGS算法。

 

 

3. DFP算法原理

 

   在上面的拟牛顿法原理介绍中,已经得到拟牛顿方程。现在来介绍一种算法,叫做DFP算法,它是Davidon、

   Fletcher、Powell三位牛人名字的首字母缩写。在DFP算法中,假设有如下迭代

 

       

 

   其中均为实数,均为维向量,那么带入上述的拟牛顿方程中,有如下推导

 

       

 

   那么进一步有

   

 

 

   接下来,我们重新记一下符号,设

 

   

 

   那么得到

 

   

 

   现在只要我们求出了,那么问题也就解决了。那么为了更容易看出结论,继续作如下变换

 

   

 

   那么只需要如下几个条件成立就可以了

 

   

 

   带入原式最终得到

 

   

 

   由于虽然是有矩阵相乘,但是实际上是向量相乘,然后又矩阵相加,所以时间复杂度为,比起普通

   牛顿迭代矩阵求逆来说,时间复杂度大大降低,这就是DFP算法的原理。

 

 

4. BFGS算法原理

 

   上面的DFP算法中,已经很好地解决了问题,接下来,继续学习BFGS算法。是Broyden,Fletcher,

   Goldfarb,Shanno四位牛人发明出来到现在的40多年时间里,它仍然被认为是最好的拟牛顿算法。假设

   迭代如下

 

       

 

   这样最终得到迭代式如下

 

       

 

   这就是BFGS算法的原理。

 

 

 

5. BFGS算法的实现

 

   BFGS算法的C++实现参考这里在Python中,有一个优化算法工具,叫做scipy。scipy中的optimize子

   包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数

   最典型的特点就是能够从函数名称上看出是使用了什么算法,可以参考这里比如BFGS算法的用法如下

 

    

 

   运行结果如下

 

    

 

 

4
0
 
 
  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BFGS算法是一种用于优化问题的数值方法。在MATLAB中,可以使用函数fminunc来实现BFGS算法。fminunc函数是MATLAB中的优化工具箱函数,它可以用于求解无约束优化问题。BFGS算法是fminunc函数的默认算法之一。 要使用BFGS算法进行优化,可以按照以下步骤进行操作: 1. 首先,定义一个代表目标函数的函数句柄。这个函数应该输入一个向量作为参数,并返回一个标量作为目标函数的值。 2. 然后,定义一个初始点作为优化的起始点。 3. 最后,调用fminunc函数,并将目标函数句柄和初始点作为输入参数传递给它。可以选择性地指定其他可选参数,例如最大迭代次数、容差等。 示例代码如下: ```matlab % 定义目标函数 fun = @(x) x(1)^2 + x(2)^2; % 定义初始点 x0 = [1, 1]; % 调用fminunc函数进行优化 options = optimoptions('fminunc','Algorithm','quasi-newton'); [x, fval = fminunc(fun, x0, options); ``` 在上述示例中,我们定义了一个简单的目标函数f(x) = x1^2 + x2^2,并将初始点设置为[1, 1]。然后,我们调用fminunc函数,并使用'quasi-newton'算法(即BFGS算法)进行优化。最后,优化结果将存储在x和fval变量中,分别表示优化后的解和优化后的目标函数值。 请注意,BFGS算法是一种迭代算法,它会根据目标函数的梯度信息来更新当前的解。在每次迭代中,BFGS算法会根据当前解的梯度和Hessian矩阵的近似值来计算下一步的搜索方向。通过迭代,BFGS算法逐步优化解,直到满足收敛条件为止。<span class="em">1</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值