牛顿法
考虑如下无约束极小化问题:
$$\min_{x} f(x)$$
其中$x\in 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=\nabla f(x_k)$为梯度向量,$H_k=\nabla^2f(x_k)$为海森矩阵。
牛顿法是具有二次收敛性的算法,收敛速度比较快。但是其步长固定,因此不能保证稳定的下降。
阻尼牛顿法在牛顿方向上附加了步长因子,每次调整时会在搜索空间,在该方向找到最优步长,然后调整。
拟牛顿法
由于牛顿法的要求比较严格,计算比较复杂,衍生出拟牛顿法。
拟牛顿法对$H_k$或$H_k^{-1}$取近似值,可减少计算量。记$B\approx H$,$D\approx 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+\rho_k s_ks^T_k$$
其中
$$\rho_k=\frac{1}{y^T_ks_k},V_k=I-\rho_ky_ks^T_k$$
参考文献:http://blog.csdn.net/itplus/article/details/21897715