牛顿法

原理

牛顿法收敛速度快,每一步需要求解目标函数的海赛矩阵的逆矩阵,计算比较复杂,可通过拟牛顿法简化计算过程。

因为牛顿法是通过泰勒展开推导出来的。

先看泰勒展开:
$$
f(x)=f(x^{(k)})+\frac {f′(x^{(k)})}{1!}(x−x^{(k)})+\frac {f′′(x^{(k)})}{2!}(x−x^{(k)})^2+\frac {f′′′(x^{(k)})}{3!}(x−x^{(k)})^3+ \dots
$$

我们取右式的前3项:
$$
f(x)=f(x^{(k)})+\frac {f′(x^{(k)})}{1!}(x−x^{(k)})+\frac {f′′(x^{(k)})}{2!}(x−x^{(k)})^2
$$

如果 $x$ 是向量,则:

$$
f(x)=f(x^{(k)})+ g_k^T(x−x^{(k)})+\frac 12 (x−x^{(k)})^T H(x^{(k)})(x−x^{(k)})
$$
此处: $g_k = g(x^{(k)}) = \nabla f(x^{(k)})$ 为$f(x)$在 $x^{(k)}$ 处的梯度。$H(x^{(k)})$是$f(x)$的海塞矩阵(Hesse matrix)
$$
H(x) = [\frac {\partial^2f}{\partial x_i \partial x_j}]_{n \times 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
$$

三阶的泰勒展开式关于 $x$ 求导,得

$$
\nabla f(x) = g_k + H(x^{(k)})(x−x^{(k)})
$$

当 $x = x^{(k+1)}$ 时:
$$
\nabla f(x^{(k+1)}) = g_k + H(x^{(k)})(x^{(k+1)}−x^{(k)}) = 0
$$

此时:

$$
x^{(k+1)} \gets x^{(k)} - \frac {g_k}{H_k}
$$

牛顿法总结

牛顿法:是通过求解目标函数的一阶导数为0时的参数,进而求出目标函数最小值时的参数。有点为:

  • 收敛速度很快。
  • 海森矩阵的逆在迭代过程中不断减小,可以起到逐步减小步长的效果。

缺点:

  • 海森矩阵的逆计算复杂,代价比较大;
  • 只适用于Hessian矩阵是正定的情况:在深度学习中,目标函数的表面通常非凸的,此时Hessian矩阵不是正定的。如果Hessian矩阵的特征值并不都是正的,牛顿法实际上回导致更新朝错误方向移动。

note: Hessian矩阵不是是正定时 可以通过正则化Hessian矩阵来避免。常用的正则化策略包括在Hessian矩阵对角线上增加常数 $\alpha$,即$H=H+\alpha I$.

梯度下降法和牛顿法的区别

  • 梯度下降法是一阶优化算法,牛顿法是二阶优化算法
  • 牛顿法的收敛速度相比梯度下降法常常较快
  • 牛顿法每次需要更新一个二维矩阵,计算代价很大,实际使用中常使用拟牛顿法
  • 牛顿法对初始值有一定要求,在非凸优化问题中(如神经网络训练),牛顿法很容易陷入鞍点(牛顿法步长会越来越小),而梯度下降法则很容易逃离鞍点(因此在神经网络训练中一般使用梯度下降法)
  • 梯度下降法在靠近最优点时会震荡,因此步长调整在梯度下降法中是必要的,具体有adagrad, adadelta, rmsprop, adam等一系列自适应学习率的方法

参考资料

梯度下降法和(拟)牛顿法区别及介绍