知识库 › 定位仓库学习 › 核心算法 › 最小二乘问题 › 高斯牛顿法

之前讨论了牛顿法和梯度下降法,前者基于海森矩阵对

设状态 $x\in\mathbb{R}^n$,残差 $r(x)\in\mathbb{R}^m$ 为向量函数,

代价函数为标量函数

$$F(x)=\frac{1}{2}\lVert r(x)\rVert^2 =\frac{1}{2}\sum_{i=1}^{m}r_i(x)^2 .$$

雅可比矩阵定义为

$$ J=\frac{\partial r}{\partial x}, \qquad J_{ij}=\frac{\partial r_i}{\partial x_j}, \qquad J\in\mathbb{R}^{m\times n}.$$

对代价函数展开求和

$$ F=\frac{1}{2}\left(r_1^2+r_2^2+\cdots+r_m^2\right).$$

对单个状态分量求偏导

$x_j$ 通过观测函数影响所有残差,故需对每一项求和:

$$ \frac{\partial F}{\partial x_j} =\frac{1}{2}\sum_{i=1}^{m}\frac{\partial\!\left(r_i^2\right)}{\partial x_j}.$$

对每一项用链式法则

$$ \frac{\partial\!\left(r_i^2\right)}{\partial x_j} =\underbrace{2r_i}_{\text{对外层平方求导}} \cdot \underbrace{\frac{\partial r_i}{\partial x_j}}_{\text{对内层用链式法则}}.$$

代回,系数 $\tfrac12$ 与 $2$ 相消

$$ \frac{\partial F}{\partial x_j} =\frac{1}{2}\sum_{i=1}^{m}2\,r_i\frac{\partial r_i}{\partial x_j} =\sum_{i=1}^{m}r_i\frac{\partial r_i}{\partial x_j}.$$

代入雅可比

$$ \boxed{\; \frac{\partial F}{\partial x_j} =\sum_{i=1}^{m}J_{ij}\,r_i \;}$$

即:第 $j$ 个梯度分量 $=$ 所有残差按“它们对 $x_j$ 的敏感度”加权求和。

写成矩阵形式

$$(J^{\top} r)_j=\sum_{i=1}^{m}(J^{\top})_{ji}r_i=\sum_{i=1}^{m}J_{ij}r_i$$

与第 4 步结果一致,故

$$\nabla F=J^{\top} r$$

也就是说,梯度可以表示为残差对状态的雅可比转置后乘以残差本身,这是由传递法则得到的结论,能够帮助我们得到后面下降的方向以及距离。

对刚才已经得到的F导数再求一次导

$$\frac{\partial^2F}{\partial x_j\partial x_k}=\sum_{i=1}^{m}\frac{\partial}{\partial x_k}\left(r_iJ_{ij}\right)$$

$$\frac{\partial}{\partial x_k}\left(r_iJ_{ij}\right)=\frac{\partial r_i}{\partial x_k}J_{ij}+r_i\frac{\partial J_{ij}}{\partial x_k}$$

代入并整理,得到两项

$$\frac{\partial^2F}{\partial x_j\partial x_k}=\sum_{i=1}^{m}J_{ij}J_{ik}+\sum_{i=1}^{m}r_i\frac{\partial^2r_i}{\partial x_j\partial x_k}$$

认出第一项就是 JᵀJ

$$(J^{\top}J)_{jk}=\sum_{i=1}^{m}J_{ij}J_{ik}$$

所以第二项被丢弃后(高斯牛顿近似:认为残差足够小,所以后面一项对曲率影响可以忽略)

$$\nabla^2F\approx J^{\top}J=H$$

之后直接带入牛顿法就能替代之前的二阶导数,用一阶导数去逼近了。

$$J^\top J\,\Delta x = -J^\top r$$

其中 $H$ 等于 $H=J^\top J$,注意到此时 $J$ 是残差 $r$ 关于自变量 $x$ 的雅可比矩阵($m\times n$),而代价函数的梯度是 $g=J^\top r$。所以本质上该表达式仍然和之前牛顿法推导的 $H \Delta x = -g$ 是等价的,只不过这里用到了函数在某点处的二阶展开,本质上也就是导数在该点处的线性近似,就能顺理成章地使用“两个J的乘积”实现曲率的近似了。

这个方法的优点很明显,就是通过一阶导数去实现二阶导数的近似,从而避免了去计算曲率的复杂过程。当然同时,这个方法需要求解H的逆,在这个近似中 $H=J^TJ$显然半正定,无法保证总是有解,在鞍面奇异值点处不能保证是真正的最低点。再就是求出来的 $\Delta x$容易过大,导致无法收敛,也同样有可能出现类似梯度下降一样的左右震荡问题。

在生产实践中,我们一般采用LM法进行进行更加精准的下降。