牛顿法(Newton’s Method)是一种近似求解实数域和复数域上方程 $f(x) = 0$ 根的方法,主要利用函数的泰勒级数前几项找对应的根。
1. 牛顿法求解近似根
令 $f: \mathbb{R} \rightarrow \mathbb{R}$ 为一个连续可导函数,设 $x_0$ 为 $f(x) = 0$ 一根的近似值,写出泰勒级数:
\[f(x)=0=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+O\left(\left(x-x_{0}\right)^{2}\right)\]通过泰勒一阶展开式可知,如果 $\vert x-x_0\vert$ 足够小,我们可以忽略阶段 $O\left(\left(x-x_{0}\right)^{2}\right)$ 求解线性方程
\[f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)=0\]可得近似根:
\[x_{1}=x_{0}-\frac{f\left(x_{0}\right)}{f^{\prime}\left(x_{0}\right)}\]将新得到的点坐标用 $x_1$ 标记,上式的几何意义是 $(x_1, 0)$ 为函数 $f$ 于点 $(x_0, f(x_0))$ 处的切线与 $x$ 轴的交点,我们期待 $x_1$ 比 $x_0$ 更接近真实值,那么迭代求解:
\[x_{k+1}=x_{k}-\frac{f\left(x_{k}\right)}{f^{\prime}\left(x_{k}\right)}\]
迭代求解,直到 $f(x_k)$ 够接近 $0$,或者到达最大迭代次数(人工设置)。
证明牛顿法的收敛性还是需要整理下的,待整理!
2. 最优化中的牛顿法
在最优化时,我们需要找到损失函数 $l(\theta)$ 偏导 $l^{\prime}(\theta)$ 为零的参数值。看到求偏导 $l^{\prime}(\theta)$ 为零的参数值,可以令 $f(\theta) = l^{\prime}(\theta)$,然后利用上节牛顿法求解即可。接下来我们直接从二阶展开的方式,自实数拓展到求解向量的普遍情况。
2.1 实数应用
将函数 $f(x)$ 利用泰勒公式在点 $x_{k}$ 附近展开到二阶(也可以通过一阶展开,再换元得到二阶):
\[f(x)= f\left(x_{k}\right)+f^{\prime}\left(x_{k}\right)\left(x-x_{k}\right)+\frac{1}{2} f^{\prime \prime}\left(x_{k}\right)\left(x-x_{k}\right)^{2}\]然后对上式两边求 $x$ 的偏导并且令导数为零(求原函数极值的条件):
\[0 = f^{\prime}\left(x_{k}\right)+f^{\prime \prime}\left(x_{k}\right)\left(x-x_{k}\right)\]即可得到牛顿法的更新公式:
\[x=x_{k}-\frac{f^{\prime}\left(x_{k}\right)}{f^{\prime \prime}\left(x_{k}\right)}\]以上是一维情况下的迭代,接下来拓展到多维的推导过程。
2.2 向量应用
考虑无约束最优化问题:
\[\min _{x \in \mathbf{R}^{n}} f(x)\]用泰勒展开式在 $x_k$ 点处展开到二阶:
\[f(x)=f\left(x_{k}\right)+\nabla f\left(x_{k}\right)\left(x-x_{k}\right)+\frac{1}{2} (x-x_k)^T \nabla^2 f\left(x_{k}\right)\left(x-x_{k}\right)\]其中 $\nabla f$ 是 $f$ 的梯度向量(统一起见,此后记作 $g$),$\nabla^2 f$ 是 $f$ 的海森矩阵(记作 $H$),其定义分别是:
\[\nabla f= g = \left[ \begin{array}{c}{\frac{\partial f}{\partial x_{1}}} \\ {\frac{\partial f}{\partial x_{2}}} \\ {\vdots} \\ {\frac{\partial f}{\partial x_{n}}}\end{array}\right]\] \[\nabla^2 f = H(x)=\left[\frac{\partial^{2} f}{\partial x_{i} \partial x_{j}}\right]_{n \times n}\]函数 $f\left(x\right)$ 有极值的必要条件是在极值点处一阶导数为 0,将上述泰勒展开式左右两边对 $x$ 求偏导:
\[0 = \nabla f\left(x_{k}\right)+ \nabla^2 f\left(x_{k}\right)\left(x-x_{k}\right)\]得到
\[x = x_{k} - (\nabla^2 f\left(x_{k}\right) )^{-1}\nabla f\left(x_{k}\right)\]方便起见,$g_k = \nabla f\left(x_{k}\right)$,$H_k = \nabla^2 f\left(x_{k}\right)$,这样给定了初始值 $x_0$,上式就可以记录成迭代的方式:
\[x_{(k+1)}=x_{(k)}-H_{k}^{-1} g_{k}, \quad k=0,1,2, \ldots\]这就是原始的牛顿迭代法,其中搜索方向 $d_k = -H_{k}^{-1} g_{k}$ 叫做牛顿方向。算法流程如下:
为什么牛顿法比较快?
牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
根据 wiki 上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
牛顿法优点:
- 牛顿法是二阶收敛,速度相当快
- 能高度逼近最优值
缺点:
- 牛顿法是局部收敛的,当初始点选择不当时,往往导致不收敛,所以初始点要尽量靠近最优值
- 牛顿法是一种迭代算法,每一步都需要求解目标函数的 Hessian 矩阵的逆矩阵,计算比较复杂
- 对函数要求苛刻(二阶连续可微,海塞矩阵可逆),而且运算量大
- 可能发生被零除错误。当函数在它的零点附近,导函数的绝对值非常小时,运算会出现被零除错误。
- 可能出现死循环。当函数在它的零点有拐点时,可能会使迭代陷入死循环。