查了很多地方说牛顿法是二阶算法,一直没找到二阶项在哪。花了大半天的时间才弄明白。记录一下。
牛顿法一般应用场景:
- 求方程的根;
- 求解最优化方法;
比如要求
f
(
x
)
=
0
f(x)=0
f(x)=0的根。
首先,选择一个接近函数
f
(
x
)
f(x)
f(x)零点的
x
0
x_0
x0,计算相应的
f
(
x
0
)
f(x_0)
f(x0)和切线斜率
f
′
(
x
0
)
f ' (x_0)
f′(x0)(这里
f
′
f '
f′表示函数
f
f
f的导数)。然后我们计算穿过点
(
x
0
,
f
(
x
0
)
)
(x_0, f (x_0))
(x0,f(x0))并且斜率为
f
′
(
x
0
)
f '(x0)
f′(x0)的直线和
x
x
x 轴的交点的
x
x
x坐标,也就是求如下方程的解:
f
(
x
1
)
−
f
(
x
0
)
=
f
′
(
x
0
)
⋅
(
x
1
−
x
0
)
f(x_1)-f(x_0) = f^{\prime}\left(x_{0}\right) \cdot (x_1-x_0)
f(x1)−f(x0)=f′(x0)⋅(x1−x0)
通常x1会比x0更接近方程f (x) = 0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)}
xn+1=xn−f′(xn)f(xn)
已经证明,如果f ’ 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f ’ (x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。下图为一个牛顿法执行过程的例子。
由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是"切线法"。牛顿法的搜索路径(二维情况)如下图所示:
牛顿法搜索动态示例图:
关于牛顿法和梯度下降法的效率对比:
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。
牛顿法的优缺点总结:
优点:二阶收敛,收敛速度快;
缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
当我们将牛顿法用作优化算法的时候,它就是二阶的。
假设我们有一个凸优化问题
min
x
f
(
x
)
\min _{x} f(x)
xminf(x)
也就是说我们要找一个x来最小化f(x)。对于凸优化问题,f(x)的最小值点就是f(x)的极值点,也就是导数为0的点。那么我们上面的优化问题就转换为了如下的求根问题:
f
′
(
x
)
=
0
f^{\prime}(x)=0
f′(x)=0
利用牛顿法求解上面的式子,我们先选取初始点x0,然后进行如下迭代
x
n
+
1
=
x
n
−
f
′
(
x
n
)
f
′
′
(
x
n
)
x_{n+1}=x_{n}-\frac{f^{\prime}\left(x_{n}\right)}{f^{\prime \prime}\left(x_{n}\right)}
xn+1=xn−f′′(xn)f′(xn)
直到
∣
x
n
+
1
−
x
n
∣
<
ϵ
| x_{n+1}-x_{n} |<\epsilon
∣xn+1−xn∣<ϵ
综上,牛顿法求根是一阶算法,我们将优化问题转为求根问题需要一阶导数,所以用牛顿法进行最优化是二阶算法。
参考资料
http://sofasofa.io/forum_main_post.php?postid=1000966
https://www.cnblogs.com/shixiangwan/p/7532830.html