牛顿法(Newton method)和拟牛顿法(quasi Newton method)也是求解无约束最优化问题的常用方法。方法使用函数 $f(x)$的一二阶导数。具有收敛速度快、迭代次数少、计算量大的特点。
问题描述
考虑如下无约束极小化问题:
最优点记为$x^\ast$
牛顿法
- 输入:目标函数$f(x)$,梯度$g(x)=\bigtriangledown f(x)$,海森矩阵$H(x)$,精度要求$\varepsilon $
- 输出:$f(x)$的极小点$x^\ast$
- 确定初始点$x_0$,置$k=0$。
- 计算 $g_k=g(x^{(k)})$
- 若$\left | g_k \right |<\varepsilon $,则停止计算,得近似解$x^\ast=x^{(k)}$
- 计算$H_k=H(x^{(k)})$
- 置$x^{(k+1)}=x^{(k)}-H_k^{-1}g_k$
- 置$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$
- 确定初始点$x_0$,置$k=0$。
- 计算 $g_k=g(x^{(k)})$
- 若$\left | g_k \right |<\varepsilon $,则停止计算,得近似解$x^\ast=x^{(k)}$
- 计算$H_k=H(x^{(k)})$
- 利用$(2)$式子得到步长$\lambda_k$置$x^{(k+1)}=x^{(k)}-\lambda_k H_k^{-1}g_k$
- 置$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的计算量也会相应的增加,这是可以接受的,马,也是可以接受的。
最终的递推关系为
其中