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

牛顿法的本质是通过函数的一阶展开拟合函数的变化趋势,然后去逼近零点位置。最常用的地方其实是函数零点的求解,或者说是一种快速求解方程的方法。

在求解最值问题方面,我们把中心放在求解一阶导数的零点问题即可:

对于一元函数 $f(x)$来说,在 $x=x_0$处进行二阶展开:

$$f(x) = f(x_0) + f'(x_0)(x - x_0) + \frac{f''(x_0)}{2}(x - x_0)^2 + o(x - x_0)^2$$

对于高阶项我们省去考虑,取:

$$g(x) = f(x_0) + f'(x_0)(x - x_0) + \frac{f''(x_0)}{2}(x - x_0)^2$$

这个式子就是一个标准的一元二次函数,我们需要的最值点位置就在函数一阶导数为0的地方

微分得:

$$g'(x) = f'(x_0) + f''(x_0)(x - x_0)$$

令$g'(x_1) = 0$能解得$x_1$取值即为极值点

故 $f'(x_0) + f''(x_0)(x_1 - x_0) = 0$

进而得到: $x_1 = x_0 - \frac{f'(x_0)}{f''(x_0)}$

逐步迭代即可得到极值点取值。

也就是说,我们只需要导数和二阶导就能得到一个步进的指示参数,这个在后面的高斯牛顿法中也有体现。

对于多元函数,要分清两个不同的概念:雅可比矩阵是向量函数(残差 $r\in\mathbb{R}^m$)对自变量的导数,形状 $m\times n$;而梯度是标量函数(代价 $F$)对自变量的导数,形状 $n\times 1$。两者不是一回事,满足 $g=J^\top r$。至于二阶导矩阵,被称为海森矩阵。

如果是收敛的话,$\Delta x = x_{n+1} - x_n \approx 0$,则式子可以转化为:

$$\Delta x = -\frac{f'(x_n)}{f''(x_n)} = -\frac{g}{H}$$

也就是说

$$H\,\Delta x = -g,\qquad g=\nabla F=J^\top r$$

可以这么进行理解:曲率乘以需要移动的步长应该得到刚好抵消梯度的矩阵。对这个方程进行求解即可,表述成乘法的原因是矩阵无法进行除法,转换成矩阵乘法就好表示了。

这个方法面临着如下问题:

  • 需要原函数二阶可导
  • 非凸函数的海森矩阵不一定有逆
  • 海森矩阵计算量大

这些问题也为我们后续方法的优化留好了空间。