L-BFGS

L-BFGS

转载并总结:http://www.cnblogs.com/alexanderkun/p/4024600.html

L-BFGS算法比较适合在大规模的数值计算中,具备牛顿法收敛速度快的特点,但不需要牛顿法那样存储Hesse矩阵,因此节省了大量的空间以及计算资源。本文主要通过对于无约束最优化问题的一些常用算法总结,一步步的理解L-BFGS算法,本文按照:

最速下降法 - 牛顿法 - 共轭梯度法 - 拟牛顿法 - DFP矫正 - BFGS 矫正 - LBFGS算法

这样一个顺序进行概述。(读了一些文章之后,深感数学功底不够,在计算机视觉领域和机器学习领域,数学还是王道)

最优化方法的迭代思想: 最优化方法采用的都是迭代的方法,基本思想是给定一个初始的点 x0 ,按照某一个迭代的规则产生一个点列 {xk} ,在点列有限的情况下最后一个 xk 就为最优解,当点列无穷的时候,则极限点为最优解。基本的迭代方程形式如下:

xk+1=xk+akdk

其中x_k就是迭代点列中的点, dk 为第k次搜索的方向, ak 为步长。
在所有的优化方法中三个关键的因素是:初始值 x0 , 方向 dk 以及步长 ak ,因此在一般的对于优化算法的学习,只需要搞懂这三个东西是怎么生成的,也就可以了。进一步理解则需要对于其理论进行深入的分析了。

最速下降法(Gradient descent)

最速下降法(Gradient descent):GD算法是无约束最优化算法中最简单的一种算法,它的各种变种也被应用到大规模的机器学习任务中来,比如SGD,batch GD,mini-batch等。首先回顾一下泰勒公式:

f(x+Δx)=f(x)+Δxf(x)+o(Δx2)

GD算法的一个基本假设就是函数 f(x) xk 处是连续可谓的,并且其导数 gk xk 处不为0. 将一个函数在 xk 这一点做一阶的泰勒展开,得到:

f(x)=f(xk)+(xxk)Tf(xk)+o(||xxk||)

优化的目的是让函数值随着点列 xk 的渐进,逐渐下降,在上式中就是让 f(x) 小于 f(xk) ,如何达到这一个目的呢。

由于泰勒展开余项的值相对很小,因此我们可以忽略它。看第二项 (xxk)Tf(xk) ,如果它为负值,就可以达到我们的目的。记 (xxk)=adk (<–这里应该假定步长 ak 是个常数 a>0 , for k ) 且 f(xk)=gk ,也即:

f(x)=f(xk)+adkgk

那么使得 dTkgk<0 的方向 dk 就是下降的方向,这个方向有无穷多个,究竟哪个有极值呢,由Cauchy-Schwartz不等式,有:
|dTkgk|||dk||||gk||

注意, || 表示绝对值, |||| 表示向量的模, dTkgk=||dk||||gk||cosθ

这样我么可以很容易的推导出当且仅当 dk=gk 时候(两者内积要小于零, 两个向量反向共线时内积的值取极小值),第二项最小,由此得到最速下降法的迭代公式 (原来是 (xxk)=adk ):

xk+1xkagk

这里需要注意的是,最速下降方向仅仅是算法的局部性质,也就是说在局部它是一个下降最快的方向,并不是在全局上。在极值点附近,步长越小,前进越慢。

牛顿法 (Newton method)

最速下降法采用的泰勒的一阶展开,而牛顿法采用的是泰勒二阶展开。

f(xk+s)g(k)(s)=f(xk)+f(xk)Ts+12sT2f(xk)s

其中 s=xxk ,将右边的式子最小化 ( 关于s求导, 令导函数取 0 的 s 值处可能存在极小值),就可以得到牛顿法的迭代公式
xk+1=xk[2f(xk)]1f(xk)

对于正定的二次函数,牛顿法一步就可以达到最优解,也就是不用迭代,就是解析解。而对于非二次函数,牛顿法并不能保证经过有限次迭代就可以求得最优解。有一点是在极小点附近目标函数接近于二次函数,因此其收敛速度一般是快的(2阶收敛速度)。另外需要注意的是牛顿法需要计算二阶导也就是hesse 矩阵,因此需要较大的存储空间和计算量,在大规模的数值计算中直接使用牛顿法是不合适的。

共轭梯度法(Conjugate Gradient)

共轭梯度法是介于GD和Newton法之间的一个方法,它仅仅需要利用一阶导数的信息,克服了GD方法收敛慢的特点,由避免了计算和存储Hesse 矩阵信息。
基本思想 是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜素,求出目标函数的极小点。
共轭: 对于任意两个 n 维向量d1,d2来说,如果对于对于一个 n×n 对称正定矩阵,满足 dTiGdj=0 , 则称d1,d2是G共轭的,同时它们也就是线性无关的。假设我们所要求的函数具有以下形式(这个形式和牛顿法的那个二阶展开是否很像,G是二阶导数矩阵,G正定 ?,这一点是BFGS算法的核心点,下面会提到)。

f(x)=12xTGx+bTx+c

导数矩阵为:
g(x)=f(x)=Gx+b

共轭梯度法关键点是如何找共轭的方向,同时保证函数下降。一般说来,基本的假设是当前的搜索方向是当前梯度和前面所有梯度的一个线性组合,这个假设在一定程度上是合理的:每一个下降方向都是和前面的相关的,并不是完全无关的。初始化一个 d0 方向,根据这个假设可以得到:
d1=g1+β0d0

其中 β 就是关于上一方向的系数,而 β 如何计算?我们如果有了一个对称的正定矩阵 G β 可以由下面的公式来计算(由上式子,和共轭条件推导得来)
http://www.cnblogs.com/yangxi/archive/2011/10/20/2219408.html
未完待续

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值