转载来自无色光的博客园:http://www.cnblogs.com/wuseguang/p/4088817.html
牛顿法
考虑如下无约束极小化问题:
其中 x∈RN,并且假设 f(x)为凸函数,二阶可微。当前点记为 xk,最优点记为 x∗。
梯度下降法用的是一阶偏导,牛顿法用二阶偏导。以标量为例,在当前点进行泰勒二阶展开:
函数f(x)在xk的二阶近似:
令 φ(x)等于函数 f(x)的二阶近似,即:
极小值点满足 φ′(x)=0,求得:
右半部第二部分的分式指明下一步的迭代方向。
若扩展到多维,上式变为
其中 gk=∇f(xk)为梯度向量, 也可以用雅克比矩阵的形式表示, Hk=∇2f(xk)为海森矩阵。
牛顿法是具有二次收敛性的算法,收敛速度比较快。但是其步长固定,因此不能保证稳定的下降。
阻尼牛顿法在牛顿方向上附加了步长因子,每次调整时会在搜索空间,在该方向找到最优步长,然后调整。
拟牛顿法
由于牛顿法的要求比较严格,计算比较复杂,衍生出拟牛顿法。
拟牛顿法对Hk或H−1k取近似值,可减少计算量。记B≈H,D≈H−1,yk=gk+1−gk,sk=xk+1−xk,
根据拟牛顿条件,可得近似公式:
或
是不是跟二阶导数的定义很相似? k阶导数定义为自变量增加1之后, k−1阶导数增加的值,然后求极限而已。
下面是几个拟牛顿法。
DFP算法
DFP算法采用的是D,但并不直接计算D,而是计算每一步D的增量△D来间接的求出D。这也是很多优化算法的做法,因为一般上一步的中间结果对下一步的计算仍有价值,若直接抛弃重新计算耗时耗力耗内存,重新发明了轮子。
D0通常取单位矩阵 I,关键导出每一步的 △Dk.
通过一系列艰苦而又卓绝的推导计算假设取便,最终的导出结果为:
一般来说,在进行中间增量计算时,都要经过这一步艰苦而又卓绝的推导计算。
BFGS算法
BFGS算法与DFP算法类似,只是采用的B来近似H。最终的公式为:
跟DFP相比,只是 D↔B, s↔y互调。
L-BFGS算法
L-BFGS算法对BFGS算法进行改进,不再存储矩阵Dk,因为Dk有时候比较大,计算机的肚子盛不下。但是我们用到Dk的时候怎么办呢?答案是根据公式求出来。
从上面的算法推导可知,Dk只跟D0和序列{sk}和{yk}有关。即我们知道了后者,即可以求得前者。进一步近似,我们只需要序列{sk}和{yk}的最近m个值即可。这样说来,我们的计算机内存中只需要存储这两个序列即可,瞬间卸掉了很多东西,正是春风得意马蹄轻。当然,这样cpu的计算量也会相应的增加,这是可以接受的,马,也是可以接受的。
最终的递推关系为
其中