牛顿法和拟牛顿法

牛顿法(Newton method)和拟牛顿法(quasi Newton method)也是求解无约束最优化问题的常用方法。方法使用函数 $f(x)$的一二阶导数。具有收敛速度快、迭代次数少、计算量大的特点。

问题描述

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

最优点记为$x^\ast$

牛顿法

  • 输入:目标函数$f(x)$,梯度$g(x)=\bigtriangledown f(x)$,海森矩阵$H(x)$,精度要求$\varepsilon $
  • 输出:$f(x)$的极小点$x^\ast$
    1. 确定初始点$x_0$,置$k=0$。
    2. 计算 $g_k=g(x^{(k)})$
    3. 若$\left | g_k \right |<\varepsilon $,则停止计算,得近似解$x^\ast=x^{(k)}$
    4. 计算$H_k=H(x^{(k)})$
    5. 置$x^{(k+1)}=x^{(k)}-H_k^{-1}g_k$
    6. 置$k=k+1$,转第二步骤

其中$g_k=\bigtriangledown f(x^{(k)})$,$H_k=\bigtriangledown^2 f(x^{(k)})=\left [\frac{\partial^2 f}{\partial x_i\partial x_j} \right ]_{n\times n}$。$H_{k}^{-1}$为$x^{(k)}$的Hessian的逆矩阵,

代数推导

假设函数 $f(x)$ 二次可微,则在当前第$k$次迭代点 $x^{(k)}$ 对 $f(x)$ 进行二阶泰勒展开

求函数 $f(x)$ 极值则可以转化为对 $f(x)$ 求导并令其为0,

得到

阻尼牛顿法

原始牛顿法由于迭代公式中没有步长因子,而是固定步长,有时会使迭代超过极值点,即$f(x^{(k+1)})>f(x^k)$,在牛顿方向上附加了步长因子,每次调整时会在搜索空间,在该方向找到最优步长,然后调整

  • 输入:目标函数$f(x)$,梯度$g(x)=\bigtriangledown f(x)$,海森矩阵$H(x)$,精度要求$\varepsilon $
  • 输出:$f(x)$的极小点$x^\ast$
    1. 确定初始点$x_0$,置$k=0$。
    2. 计算 $g_k=g(x^{(k)})$
    3. 若$\left | g_k \right |<\varepsilon $,则停止计算,得近似解$x^\ast=x^{(k)}$
    4. 计算$H_k=H(x^{(k)})$
    5. 利用$(2)$式子得到步长$\lambda_k$置$x^{(k+1)}=x^{(k)}-\lambda_k H_k^{-1}g_k$
    6. 置$k=k+1$,转第二步骤

拟牛顿算法

拟牛顿思路

因为Hessian矩阵的计算量大而且无法保持正定所以采用拟牛顿算法。拟牛顿算法的基本思想是不用二阶偏导数而构造出可以近似Hessian矩阵(或者Hessian矩阵的逆矩阵)的正定对称矩阵,在拟牛顿的条件下优化目标函数

拟牛顿条件

拟牛顿法对$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$。根据拟牛顿条件,可得近似公式:

DFP算法

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

$D_0$通常取单位矩阵I,关键导出每一步的$ΔD_k$。
通过一系列艰苦而又卓绝的推导计算假设取便,最终的导出结果为:

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

BFGS算法

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

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的计算量也会相应的增加,这是可以接受的,马,也是可以接受的。

最终的递推关系为

其中