牛顿法,又称为牛顿-拉佛森方法,最开始是用来求解高次方程的根,其核心思想就是利用迭代点在曲线上的切线不断逼近曲线的根,直至收敛。我们知道,连续可微曲线的最值可以通过对曲线进行求导,并令导数为0来求解,所以牛顿法也可以作为一种最优化方法求最值。如果是把最优化(最小值)比作从山顶移动到山脚的过程,之前在文章梯度下降法有提到,梯度下降法是选择往相对当前位置来说最陡峭的地方向下移动,而牛顿法的目光会相对长远一点,牛顿法在选择方向的时候,不仅会考虑当前这一步是否是最陡峭的,还会结合下一步一起考虑,就像下象棋能够看到走完这一步之后下一步还应该怎么走才是最有利的,这是因为牛顿法是二阶收敛,梯度下降法是一阶收敛的。关于牛顿法二阶收敛的证明请看这里,根据收敛的方式,牛顿法的收敛速度显然要快于梯度下降算法。
原理
其实在上大学的时候有学过牛顿法,但是作为数学系一名不折不扣的学渣,当然是考完就忘啦。关于牛顿法的原理,强烈推荐马同学在知乎上的这个回答如何通俗易懂地讲解牛顿迭代法求开方? 行文流畅,脉络清晰明了,一看就懂,总结起来就是:
- (1)牛顿法首先随机找一个初始点$x_0$,作为迭代点;
- (2)计算函数$f(x)$ 在改点的切线,将该切线与$x$轴的交点作为新的迭代点,其更新方式为$$x_{n+1} = x_n - \frac{f(x_n)}{f’(x_n)}$$
- (3)重复步骤(2),直至找到函数的根或者满足指定的迭代条件。
牛顿法应用
下面来看下,牛顿法是如何对逻辑回归的损失函数进行优化的。
上面提及的迭代更新方式$$x_{n+1} = x_n - \frac{f(x_n)}{f’(x_n)} \qquad (1)$$ 是求函数的根的,也就是求解$f(x)=0$。而求曲线的最值,是令曲线导数等于0来求解,所以,逻辑回归损失函数的优化目标应该是$f’(x) = 0$。
举个例子,对于函数$f(x) = (x+2)(x-2)(x-4)$,基于(1)进行迭代,其实就是求解$f(x)$的根,也就是下图的$x_0,x_1,x_2 $三个点。

但这不是我们的目的,我们的目的是要求该图中的点 $ x_3, x_4 $,这个好办,只要对$f(x)$求导,并求$f’(x) =0$ 的解就可以了,也就是下图的点

我们在函数$f’(x)$随机找一个点,作该点在$f’(x)$的上切线,将该切线与$x$轴的交点作为新的迭代点,那么更新方式就变为(也可以通过二阶泰勒展开式直接得出):$$x_{n+1} = x_n - \frac{f’(x_n)}{f’’(x_n)} $$

逻辑回归的方程为:

则其对应的似然损失函数为:

求损失函数的一阶导,有

由一阶导组成的矩阵,就是雅可比矩阵,记为$\nabla$
对应的二阶导为:

由二阶导组成的矩阵,就是Hessian矩阵,记为$H$,所以,损失函数优化迭代的方式为:
$$\theta \leftarrow \theta -H^{-1}\nabla $$