牛顿法、拟牛顿法、高斯-牛顿法、共轭梯度法推导总结

前言:

线性最小二乘问题,我们可以通过理论推导可以得到其解析解,但是对于非线性最小二乘问题,则需要依赖迭代优化的方法,牛顿算法是解决非线性最优的常见算法之一。
最近整理了几篇关于牛顿法及其优化算法都不甚满意,网上大多相关技术博客很多是拼凑起来的,多数不全面(某些推导中间过程被省略),或者数学公式的符号表达方式不统一,造成看起来非常凌乱。因此本文旨在对基于牛顿法的非线性最小二乘优化问题的基本概念和算法推导做个系统的梳理。

  • 基本数学名词及概念
  • 海赛矩阵和雅可比矩阵
  • 牛顿算法推导
  • 拟牛顿算法(DFP和BFGS)
  • 高斯牛顿算法
  • 共轭梯度法
  • 补充优化算法

一、基本概念定义

1.非线性方程定义及最优化方法简述

指因变量与自变量之间的关系不是线性的关系,比如平方关系、对数关系、指数关系、三角函数关系等等。对于此类方程,求解n元实函数f在整个n维向量空间Rn上的最优值点往往很难得到精确解,经常需要求近似解问题。

求解该最优化问题的方法大多是逐次一维搜索的迭代算法,基本思想是在一个近似点处选定一个有利于搜索方向,沿这个方向进行一维搜索,得到新的近似点。如此反复迭代,知道满足预定的精度要求为止。根据搜索方向的取法不同,这类迭代算法可分为两类:

  • 解析法 需要用目标函数的倒函数
  • 梯度法 又称最速下降法,是早期的解析法,收敛速度较慢
  • 牛顿法 收敛速度快,但不稳定,计算也较困难。高斯牛顿法基于其改进,但目标作用不同
  • 共轭梯度法 介于最速下降法与牛顿法之间。收敛较快,效果好
  • 变尺度法 效率较高,常用DFP法(Davidon Fletcher Powell)
  • 直接法 不涉及导数,只用到函数值。有交替方向法(又称坐标轮换法)、模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。

2.非线性最小二乘问题

非线性最小二乘问题来自于非线性回归,即通过观察自变量和因变量数据,求非线性目标函数的系数参数,使得函数模型与观测量尽量相似。

高斯牛顿法是解决非线性最小二乘问题的最基本方法,并且它只能处理二次函数。(使用时必须将目标函数转化为二次的)

3.基本数学表达

  1. 梯度(gradient)

    常用 $\nabla $ 表示,由多元函数的哥哥偏导数组成的问题。以二元函数为例,其梯度为:

  2. 海赛矩阵(Hessian matrix)

    由多元函数的二阶偏导数组成的方阵,描述函数的局部曲率,以二元函数为例:

  3. 雅可比矩阵(Jacobian matrix)

    是多元函数一阶偏导数以一定方式排列成的矩阵,体现了一个可微方程与给出点的最优线性逼近。以二元函数为例:

    如果扩展多维的话$F: R_n -> R_m$,则雅可比矩阵是一个$m$行$n$列的矩阵,表示为:$J_F(x_1,x_2,…,x_n)$

    雅可比矩阵作用,如果$P$是$R_n$中的一点,$F$在$P$点可微分,那么在这一点的导数由$J_F(P)$给出,在此情况下,由$F(P)$描述的线性算子即接近点$P$的$F$的最优线性逼近,$x$逼近于$P$:

黑森和雅可比矩阵参考:http://jacoxu.com/jacobian矩阵和hessian矩阵/

  1. 残差(residual)

    表示实际观测值与估计值(拟合值)之间的差。


二、牛顿法

从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法更快。比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。

从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。

1.求解方程

并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。

原理是利用泰勒公式,在$x^{(0)}$处展开,且展开到一阶,即$f(x)=f(x^{(0)})+(x-x^{(0)})f’(x^{(0)}) $

求解方程$f(x)=0$,即$f(x^{(0)})+(x-x^{(0)})f’(x^{(0)})=0 $

求解$x=x^{(1)}=x^{(0)}-\frac {f(x^{(0)})}{f’(x^{(0)})}$

因为这是利用泰勒公式的一阶展开,$f(x)=f(x^{(0)})+(x-x^{(0)})f’(x^{(0)}) $此处并非完全相等,而是近似相等。这里求得的$x^{(1)}$并不能让$f(x)=0$,只能说$f(x^{(1)})$比$f(x^{(0)})$更接近$f(x)=0$,这样就可以通过不断迭代去逼近$f(x)$。

进而推出:$x^{(k+1)}=x^{(k)}-\frac {f(x^{(k)})}{f’(x^{(k)})}$

通过迭代,这恶搞狮子必然在$f(x^*)=0 $的时候收敛,如下图:
1022856-20170916202719078-1588446775

在最优化的问题中, 线性最优化至少可以使用单纯形法(或称不动点算法)求解, 但对于非线性优化问题, 牛顿法提供了一种求解的办法。 假设任务是优化一个目标函数$f$, 求函数$f$的极大极小问题, 可以转化为求解函数$f$的导数$f′=0$的问题, 这样求可以把优化问题看成方程求解问题。剩下的就和上面的牛顿法求解很相似了。

2.一维无约束极值最优化

$$min f(x),x\in R^1 $$

其中$x^*$为目标函数的极小点即$f’(x)$的根

首先把$f(x)$在探索点$x^{(k)}$处泰勒展开到2阶形式进行近似:
$$f (x)=f(x^{(k)})+f’(x^{(k)})(x-x^{(k)})+\frac 12f’’(x^{(k)})(x-x^{(k)})^2 $$
然后用$f(x)$的最小点作为新的探索点$x^{(k+1)}$

据此令:
$$f’(x)=f’(x^{(k)})+f’’(x^{(k)})(x-x^{(k)})=0 $$

求出迭代公式:
$$x^{(k+1)}=x^{(k)}-\frac {f’(x^{(k)})}{f’’(x^{(k)})}, k=0,1,…$$

因此,一维牛顿法最优化问题的计算步骤如下:
(1)给定初始点$x^{(0)}$,允许误差$\epsilon >0$,置$k=0$
(2)如果$f’(x^{(k)})< \epsilon $,则停止迭代,得到$x^{(k)}$;否则继续
(3)计算点$x^{(k+1)}$,$x^{(k+1)}=x^{(k)}-\frac {f(x^{(k)})}{f’’(x^{(k)})}$,置$k=k+1$,转(2)

需要注意的是,牛顿法在求极值的时候,如果初始点选取不好,则可能不收敛于极小点

3.多维无约束极值最优化

$$minf(x), x\in R^n$$
其中$x^*$为目标函数的极小点。

假设$f(x)$具有二阶连续偏导数,若第$k$次迭代值为$x^{(k)}$,则可将$f(x)$在$x^{(k)}$附近进行二阶泰勒展开:
$$f(x)=f(x^{(k)})+\nabla f(x^{(k)})^T(x-x^{(k)})+\frac 12(x-x^{(k)})^TH(x^{(k)})(x-x^{(k)}) (式一) $$
这里$\nabla f(x^{(k)})$是$f(x)$的梯度向量在点$x^{(k)}$的值;

$H(x^{(k)})$是$f(x)$的海赛矩阵(Hesse matrix)$H(x)=[\frac {ϑ^2f}{ϑ_{x_i}ϑ_{x_j}}]_{n*n} $在点$x^{(k)}$的值;

函数$f(x)$有极值的必要条件是在极值点处一阶导数为0,即梯度向量为0。特别是当$H(x^{(k)})$是正定矩阵时,函数$f(x)$的极值为极小值。

牛顿利用极小点的必要条件:$\nabla f(x)=0$

每次迭代中从点$x^{(k)} $开始,求目标函数的极小点,作为第$k+1$次迭代值$x^{(k+1)}$

假设:$x^{(k+1)}$满足$\nabla f(x^{(k+1)})=0 $

由式二得:$$\nabla f(x)=\nabla f(x^{(k)})+H(x^{(k)})(x-x^{(k)})$$

由于:$$\nabla f(x^{(k+1)})=0 $$

即:$$\nabla f(x^{k)})+H(x^{(k)})(x^{(k+1)}-x^{(k)})=0 $$

得:$$x^{(k+1)}=x^{(k)}-H(x^{(k)})^{-1}\nabla f(x^{(k)})$$
简写为:$$x^{(k+1)}=x^{(k)}-H_k^{-1}g_k $$
用该公式作为迭代公式的算法就是牛顿法。其中,$H_kp_k=-g_k$

下面给出计算步骤

输入:目标函数$f(x)$,梯度为$g(x)=\nabla f(x)$,海赛矩阵$H(x)$,精度要求$\epsilon $;

输出:$f(x)$的极小点$x^*$

(1)取初始点$x^{(0)}$,置$k=0$
(2)计算梯度$g_k=\nabla f(x^{(k)})$
(3)若$||g_k||<\epsilon $,停止计算,得近似解$x^*=x^{(k)}$;否则转(3)
(4)计算$H_k=H(x^{(k)})$,并根据迭代公式求出:$p_k=H(x^{(k)})^{-1}\nabla f(x^{(k)})$
(5)置$x^{(k+1)}=x^{(k)}+p_k$
(6)置$k=k+1$,转(2)

步骤(4)求$p_k$,需要求$H_K^{-1}$,计算比较复杂,所以有其他改进方法。


三、拟牛顿法

在牛顿法的迭代中,需要计算海赛矩阵的逆矩阵$H^{-1}$,这一计算比较复杂,考虑用一个正定矩阵$G_k=G(x^{(k)})$来近似代替$H_K^{-1}=H^{-1}(x^{(k)}) $。这就是拟牛顿法的基本想法。

1.拟牛顿法推导

先看牛顿迭代中海赛矩阵$H_k$满足的条件。

首先,$H_k $满足以下关系:

在$$\nabla f(x)=\nabla f(x^{(k)})+H(x^{(k)})(x-x^{(k)})$$中取$$x=x^{(k+1)}$$

即得:$$g_{k+1}-g_k=H(x^{(k)})(x^{(k+1)}-x^{(k)}) $$

记:$g_k=\nabla f(x^{(k)})$;$y_k=g_{k+1}-g_k$;$\delta _k=x^{(k+1)}-x^{(k)} $;$H_k=H(x^{(k)})$;$p_k=-H_k^{-1}g_k$

则:$$y_k=H_k\delta _k$$
或 $$H_k^{-1}y_k=\delta _k$$

该式称为拟牛顿条件

如果$H_k$是正定的($H_k^{-1}$也是正定的),那么可以保证牛顿法搜索方向$p_k$是下降方向。这是因为搜索方向是$p_k=-H_k^{-1}g_k$

由式:$$x^{(k+1)}=x^{(k)}-H_k^{-1}g_k $$

有:$$x=x^{(k)}+ \lambda p_k =x^{(k)} - \lambda H_k^{(-1)}g_k$$

所以$f(x)$在$x^{(k)}$得泰勒展开式(见上文)可以近似写成:$$f(x)=f(x^{(k)})-\lambda g^T_kH^{-1}_kg_k $$

因$H^{-1}_k$正定,故有$g_k^TH^{-1}_kg_k>0 $,当$\lambda $为一个充分小得正数时,总有$f(x)<f(x^{(k)})$,也就是说$p_k$是下降方向。

拟牛顿法将$G_k$作为$H_k^{-1}$的近似,要求矩阵$G_k$满足同样的条件。首先,每次迭代矩阵$G_k$是正定的。同时,$G_k$满足拟牛顿条件:$G_{k+1}y_k=\delta _k$

按照拟牛顿条件选择$G_k$作为$H_k^{-1}$的近似或选择$B_k$作为$H_k$的近似的算法成为拟牛顿法。

按照拟牛顿条件选择$G_k$作为$H_k^{-1}$的近似;或者选择$B_k$作为$H_k$的近似的算法称为拟牛顿法。

按照拟牛顿条件,在每次迭代中可以选择更新矩阵$G_{k+1}$:
$$G_{k+1}=G_k+\nabla G_k$$

这种选择有一定的灵活性,因此有多种具体实现方法。下面介绍Broyden类拟牛顿法。

2.DFP(Davidon-Fletcher-Powell)算法(DFP algorithm)

DFP算法选择$G_{k+1}$的方法是,假设每一步迭代中矩阵$G_{k+1}$是由$G_k$加上两个附加项构成的,即:
$$G_{k+1}=G_k+P_k+Q_k $$
其中$P_k,Q_k$是待定矩阵。这时:
$$G_{k+1}y_k=G_ky_k+P_ky_k+Q_ky_k $$

为使$G_{k+1}$满足拟牛顿条件$y_k=H_k\delta _k$,可使$P_k$和$Q_k$满足:
$$P_ky_k=\delta _k$$
$$Q_ky_k=-G_ky_k$$

事实上,不难找出这样的$P_k$和$Q_k$,例如取:
$$P_k=\frac {\delta _k\delta _k^T}{\delta _k^Ty_k}$$
$$Q_k=- \frac {G_ky_ky_k^TG_k}{y^T_kG_ky_k}$$

这样就可以得到矩阵$G_{k+1}$的迭代公式:
$$G_{k+1}=G_k+\frac {\delta _k\delta _k^T}{\delta _k^Ty_k}-\frac {G_ky_ky_k^TG_k}{y^T_kG_ky_k}$$
称为DFP算法

可以证明,如果初始矩阵$G_0$是正定的,则迭代过程中的每个矩阵$G_k$都是正定的。

DFP算法步骤迭代如下

输入:目标函数$f(x)$,梯度$g(x)=\nabla f(x)$,精度要求为$\epsilon $
输出:$f(x)$的极小点$x^*$。

(1)选定初始点$x^{(0)}$,取$G_0$为正定对称矩阵,置$k=0$
(2)计算$g_k=g(x^{(k)})$。若$||g_k||<\epsilon $,则停止计算,得近似解$x^=x^{(k)}$,否则转(3)
(3)置$p_k=-G_kg_k$(这里与BFGS不同)
(4)一维搜索:求$\lambda _k$使得:$$f(x^{(k)}+\lambda _kp_k)=Min(f(x^{(k)}+\lambda p_k)),{(\lambda ≥0)}$$
(5)置$x^{(k+1)}=x^{(k)}+\lambda _kp_k$
(6)计算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}||<\epsilon $,则停止计算,得近似解$x^
=x^{(k+1)}$;否则,按$G_{k+1}$的迭代公式(上文)计算出$G_{k+1}$(这里与BFGS不同)
(7)置$k=k+1$,转(3)

3.BFGS算法(Broyden-Fletcher-Goldfarb-Shanno)

BFGS算法是最流行的拟牛顿算法。

考虑用$G_k$逼近海赛矩阵的逆矩阵$H^{-1} $,也可以考虑用$B_k$逼近海赛矩阵。

这时,相应的拟牛顿条件是:$$B_{k+1}\delta _k=y_k$$

可以用同样的方法得到另一迭代公式.首先,令:
$$B_{k+1}=B_k+P_k+Q_k$$
$$B_{k+1}\delta _k=B_k\delta _k+P_k\delta _k+Q_k\delta_k $$

考虑使$P_k和Q_k$满足:
$$P_k\delta_k=y_k$$
$$Q_k\delta_k=-B_k\delta_k$$
找出适合条件的$P_k和Q_k$,得到BFGS算法矩阵$B_{k+1}$的迭代公式:
$$B_{k+1}=B_k+\frac {y_ky_k^T}{y^T_k\delta_k}-\frac {B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k} $$

可以证明,如果初始矩阵$B_0$是正定的,则迭代过程中的每个矩阵$B_k$都是正定的。

BFGS拟牛顿算法的迭代步骤

输入:目标函数$f(x)$,$g(x)=\nabla f(x)$,精度要求$\epsilon$;
输出:$f(x)$的极小点$x^*$

(1)选定初始点$x^{(0)}$,取$B_0$为正定矩阵的对称矩阵,置$k=0$
(2)计算$g_k=g(x^{(k)})$。若$||g_k||<\epsilon $,则停止计算,得近似解$x^=x^{(k)}$;否则转(3)
(3)由$B_kp_k=-g_k$求出$p_k$ (这里与DFP不同)
(4)一维搜索:求$\lambda _k$使得:$$f(x^{(k)}+\lambda _kp_k)=Min(f(x^{(k)}+\lambda p_k)),{(\lambda ≥0)}$$
(5)置$x^{(k+1)}=x^{(k)}+\lambda _kp_k$
(6)计算$g_{k+1}=g(x^{(k+1)})$,若$||g_{k+1}||<\epsilon $,则停止计算,得近似解$x^
=x^{(k+1)}$;否则,按$B_{k+1}$的迭代公式(上文)计算出$B_{k+1}$(这里与DFP不同)
(7)置$k=k+1$,转(3)

4.Broyden类算法(Broyden’s algorithm)

该算法是由DFP算法和BFGS算法相结合派生出的一类拟牛顿法。

我们可以从BFDS算法矩阵$B_k$的迭代式($B_{k+1}=B_k+\frac {y_ky_k^T}{y^T_k\delta_k}-\frac {B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k} $)得到BFGS算法关于$G_k$的迭代公式。

事实上,若记$G_k=B^{-1}k,G{k+1}=B^{-1}_{k+1} $

那么对以上BFDS算法矩阵$B_k$的迭代式两次应用Sherman-Morrison公式得:
$$G_{k+1}=(I-\frac {\delta _ky_k^T}{\delta_k^Ty_k })G_k(I-\frac {\delta _ky_k^T}{\delta_k^Ty_k })^T+\frac {\delta_k\delta_k^T}{\delta _k^Ty_k} $$
称为BFGS算法关于G_k的迭代公式

将DFP算法的迭代公式:$$G_{k+1}=G_k+\frac {\delta _k\delta _k^T}{\delta _k^Ty_k}-\frac {G_ky_ky_k^TG_k}{y^T_kG_ky_k}$$
记作$G^{DFP}$

将BFGS算法迭代公式:
$$B_{k+1}=B_k+\frac {y_ky_k^T}{y^T_k\delta_k}-\frac {B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k} $$
记作$G^{BFGS}$

他们都满足方程拟牛顿条件式,所以他们的线性组合
$$G_{k+1}=\alpha G^{DFP}+(1-\alpha)G^{BFGS}$$也满足拟牛顿条件式,而且是正定的。

其中$0≤\alpha≤1$,这样就得到了一类拟牛顿法,称为Broyden类算法。其步骤与上文类似,唯(3)和(6)步有所不同。

⚠️ Sherman-Morrison公式:假设$A$是$n$阶可逆矩阵,$u,v$是$n$维向量,且$A+uv^T$也是可逆矩阵,则有:$$(A+uv^T)^{-1}=A^{-1}-\frac {A^{-1}uv^TA^{-1}}{1+v^TA^{-1}u} $$

四、高斯牛顿法

以后再补充。

五、共轭梯度法(Conjugate Gradient)

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

具体的实现步骤请参加wiki百科共轭梯度法

下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:(绿色为梯度下降法,红色代表共轭梯度法)

六、其他优化方法

1、启发式优化方法

启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法。其特点是在解决问题时,利用过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案。启发式优化方法种类繁多,包括经典的模拟退火方法、遗传算法、蚁群算法以及粒子群算法等等。

还有一种特殊的优化算法被称之多目标优化算法,它主要针对同时优化多个目标(两个及两个以上)的优化问题,这方面比较经典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。

2、解决约束优化问题——拉格朗日乘数法

有关拉格朗日乘数法的介绍请见另一篇博客:《拉格朗日乘数法》