zoukankan      html  css  js  c++  java
  • 牛顿法与拟牛顿法,DFP法,BFGS法,L-BFGS法

    牛顿法

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

    $$min_{x} f(x)$$

    其中$xin R^N$,并且假设$f(x)$为凸函数,二阶可微。当前点记为$x_k$,最优点记为$x^*$。

    梯度下降法用的是一阶偏导,牛顿法用二阶偏导。以标量为例,在当前点进行泰勒二阶展开:

    $$varphi(x)=f(x_k)+f'(x_k)(x-x_k)+frac{1}{2}f''(x_k)(x-x_k)^2$$

    极小值点满足$varphi'(x)=0$,求得:

    $$x_{k+1}=x_k-frac{f'(x_k)}{f''(x_k)}$$

    右半部第二部分的分式指明下一步的迭代方向。

    若扩展到多维,上式变为

    $$x_{k+1}=x_k-H^{-1}cdot g_k$$

    其中$g_k= abla f(x_k)$为梯度向量,$H_k= abla^2f(x_k)$为海森矩阵。

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

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

    拟牛顿法

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

    拟牛顿法对$H_k$或$H_k^{-1}$取近似值,可减少计算量。记$Bapprox H$,$Dapprox H^{-1}$,$y_k=g_{k+1}-g_k$,$s_k=x_{k+1}-x_k$。、

    根据拟牛顿条件,可得近似公式:

    $$B_{k+1}=frac{y_k}{s_k}$$

    $$D_{k+1}=frac{s_k}{y_k}$$

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

    下面是几个拟牛顿法。

    DFP算法

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

    $$D_{k+1}=D_k+Delta D_k$$

    $D_0$通常取单位矩阵$I$,关键导出每一步的$Delta D_{k}$。

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

    $$Delta D_k=frac{s_k s_k^T}{s_k^T y_k}-frac{D_k y_k y_k^TD_k}{y_k^T D_k y_k}$$

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

    BFGS算法

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

    $$Delta B_k=frac{y_k y_k^T}{y_k^T x_k}-frac{B_k s_k s_k^T B_k}{s_k^T B_k s_k}$$

    跟DFP相比,只是$D leftrightarrow B$,$s leftrightarrow y$互调。

    L-BFGS算法

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

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

    最终的递推关系为

    $$D_{k+1}=V^T_kD_kV_k+ ho_k s_ks^T_k$$

    其中

    $$ ho_k=frac{1}{y^T_ks_k},V_k=I- ho_ky_ks^T_k$$

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

  • 相关阅读:
    HDU4385Moving Bricks【状压DP】
    用位运算实现加减法
    hdu 1874(最短路 Dilkstra +优先队列优化+spfa)
    codeforces 782B The Meeting Place Cannot Be Changed+hdu 4355+hdu 2438 (三分)
    hdu 1542(线段树+扫描线 求矩形相交面积)
    hdu 2602(经典01背包)
    hdu 1698(线段树区间更新)
    hdu 1754(单点更新 ,区间最大值)
    NYOJ 寻找最大数
    hdu 2222(AC自动机模版题)
  • 原文地址:https://www.cnblogs.com/wuseguang/p/4088817.html
Copyright © 2011-2022 走看看