牛顿法与拟牛顿法,DFP法,BFGS法,L-BFGS法

来源:互联网 发布:jsp和javascript 编辑:程序博客网 时间:2024/05/16 19:16

转载来自无色光的博客园:http://www.cnblogs.com/wuseguang/p/4088817.html

牛顿法

考虑如下无约束极小化问题:

minxf(x)

其中xRN,并且假设f(x)为凸函数,二阶可微。当前点记为xk,最优点记为x
梯度下降法用的是一阶偏导,牛顿法用二阶偏导。以标量为例,在当前点进行泰勒二阶展开:
函数f(x)xk的二阶近似:
f(x)f(xk)+f(xk)(xxk)+12f′′(xk)(xxk)2

φ(x)等于函数f(x)的二阶近似,即:

φ(x)=f(xk)+f(xk)(xxk)+12f′′(xk)(xxk)2

极小值点满足φ(x)=0,求得:
xk+1=xkf(xk)f′′(xk)

右半部第二部分的分式指明下一步的迭代方向。
若扩展到多维,上式变为
xk+1=xkH1gk

其中gk=f(xk)为梯度向量,也可以用雅克比矩阵的形式表示Hk=2f(xk)为海森矩阵。

牛顿法是具有二次收敛性的算法,收敛速度比较快。但是其步长固定,因此不能保证稳定的下降。

阻尼牛顿法在牛顿方向上附加了步长因子,每次调整时会在搜索空间,在该方向找到最优步长,然后调整。

拟牛顿法

由于牛顿法的要求比较严格,计算比较复杂,衍生出拟牛顿法。

拟牛顿法对HkH1k取近似值,可减少计算量。记BH,DH1,yk=gk+1gk,sk=xk+1xk
根据拟牛顿条件,可得近似公式:

Bk+1=yksk


Dk+1=skyk

是不是跟二阶导数的定义很相似?k阶导数定义为自变量增加1之后,k1阶导数增加的值,然后求极限而已。

下面是几个拟牛顿法。

DFP算法

DFP算法采用的是D,但并不直接计算D,而是计算每一步D的增量D来间接的求出D。这也是很多优化算法的做法,因为一般上一步的中间结果对下一步的计算仍有价值,若直接抛弃重新计算耗时耗力耗内存,重新发明了轮子。

Dk+1=Dk+ΔDk

D0通常取单位矩阵I,关键导出每一步的Dk.

通过一系列艰苦而又卓绝的推导计算假设取便,最终的导出结果为:

ΔDk=sksTksTkykDkykyTkDkyTkDkyk

一般来说,在进行中间增量计算时,都要经过这一步艰苦而又卓绝的推导计算。

BFGS算法

BFGS算法与DFP算法类似,只是采用的B来近似H。最终的公式为:

ΔBk=ykyTkyTkxkBksksTkBksTkBksk

跟DFP相比,只是DBsy互调。

L-BFGS算法

L-BFGS算法对BFGS算法进行改进,不再存储矩阵Dk,因为Dk有时候比较大,计算机的肚子盛不下。但是我们用到Dk的时候怎么办呢?答案是根据公式求出来。

从上面的算法推导可知,Dk只跟D0和序列{sk}{yk}有关。即我们知道了后者,即可以求得前者。进一步近似,我们只需要序列{sk}{yk}的最近m个值即可。这样说来,我们的计算机内存中只需要存储这两个序列即可,瞬间卸掉了很多东西,正是春风得意马蹄轻。当然,这样cpu的计算量也会相应的增加,这是可以接受的,马,也是可以接受的。

最终的递推关系为

Dk+1=VTkDkVk+ρksksTk

其中

ρk=1yTksk,Vk=IρkyksTk

参考文献:http://blog.csdn.net/itplus/article/details/21897715

0 0
原创粉丝点击