原文:http://ihoge.cn/2018/newton1.html
前言:
线性最小二乘问题,我们可以通过理论推导可以得到其解析解,但是对于非线性最小二乘问题,则需要依赖迭代优化的方法,牛顿算法是解决非线性最优的常见算法之一。
最近整理了几篇关于牛顿法及其优化算法都不甚满意,网上大多相关技术博客很多是拼凑起来的,多数不全面(某些推导中间过程被省略),或者数学公式的符号表达方式不统一,造成看起来非常凌乱。因此本文旨在对基于牛顿法的非线性最小二乘优化问题的基本概念和算法推导做个系统的梳理。
- 基本数学名词及概念
- 海赛矩阵和雅可比矩阵
- 牛顿算法推导
- 拟牛顿算法(DFP和BFGS)
- 高斯牛顿算法
- 共轭梯度法
- 补充优化算法
一、基本概念定义
1.非线性方程定义及最优化方法简述
指因变量与自变量之间的关系不是线性的关系,比如平方关系、对数关系、指数关系、三角函数关系等等。对于此类方程,求解n元实函数f在整个n维向量空间Rn上的最优值点往往很难得到精确解,经常需要求近似解问题。
求解该最优化问题的方法大多是逐次一维搜索的迭代算法,基本思想是在一个近似点处选定一个有利于搜索方向,沿这个方向进行一维搜索,得到新的近似点。如此反复迭代,知道满足预定的精度要求为止。根据搜索方向的取法不同,这类迭代算法可分为两类:
- 解析法 需要用目标函数的倒函数
- 梯度法 又称最速下降法,是早期的解析法,收敛速度较慢
- 牛顿法 收敛速度快,但不稳定,计算也较困难。高斯牛顿法基于其改进,但目标作用不同
- 共轭梯度法 介于最速下降法与牛顿法之间。收敛较快,效果好
- 变尺度法 效率较高,常用DFP法(Davidon Fletcher Powell)
- 直接法 不涉及导数,只用到函数值。有交替方向法(又称坐标轮换法)、模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。
2.非线性最小二乘问题
非线性最小二乘问题来自于非线性回归,即通过观察自变量和因变量数据,求非线性目标函数的系数参数,使得函数模型与观测量尽量相似。
高斯牛顿法是解决非线性最小二乘问题的最基本方法,并且它只能处理二次函数。(使用时必须将目标函数转化为二次的)
3.基本数学表达
梯度(gradient)
常用 ∇ ∇ 表示,由多元函数的哥哥偏导数组成的问题。以二元函数为例,其梯度为:
海赛矩阵(Hessian matrix)
由多元函数的二阶偏导数组成的方阵,描述函数的局部曲率,以二元函数为例:
雅可比矩阵(Jacobian matrix)
是多元函数一阶偏导数以一定方式排列成的矩阵,体现了一个可微方程与给出点的最优线性逼近。以二元函数为例:
如果扩展多维的话 F:Rn−>Rm F : R n − > R m ,则雅可比矩阵是一个 m m 行 列的矩阵,表示为: JF(x1,x2,...,xn) J F ( x 1 , x 2 , . . . , x n )
雅可比矩阵作用,如果 P P 是 中的一点, F F 在 点可微分,那么在这一点的导数由 JF(P) J F ( P ) 给出,在此情况下,由 F(P) F ( P ) 描述的线性算子即接近点 P P 的 的最优线性逼近, x x 逼近于 :
黑森和雅可比矩阵参考:http://jacoxu.com/jacobian矩阵和hessian矩阵/
残差(residual)
表示实际观测值与估计值(拟合值)之间的差。
二、牛顿法
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法更快。比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。
从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。
1.求解方程
并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。
原理是利用泰勒公式,在 x(0) x ( 0 ) 处展开,且展开到一阶,即 f(x)=f(x(0))+(x−x(0))f′(x(0)) f ( x ) = f ( x ( 0 ) ) + ( x − x ( 0 ) ) f ′ ( x ( 0 ) )
求解方程 f(x)=0 f ( x ) = 0 ,即 f(x(0))+(x−x(0))f′(x(0))=0 f ( x ( 0 ) ) + ( x − x ( 0 ) ) f ′ ( x ( 0 ) ) = 0
求解 x=x(1)=x(0)−f(x(0))f′(x(0)) x = x ( 1 ) = x ( 0 ) − f ( x ( 0 ) ) f ′ ( x ( 0 ) )
因为这是利用泰勒公式的一阶展开, f(x)=f(x(0))+(x−x(0))f′(x(0)) f ( x ) = f ( x ( 0 ) ) + ( x − x ( 0 ) ) f ′ ( x ( 0 ) ) 此处并非完全相等,而是近似相等。这里求得的 x(1) x ( 1 ) 并不能让 f(x)=0 f ( x ) = 0 ,只能说 f(x(1)) f ( x ( 1 ) ) 比 f(x(0)) f ( x ( 0 ) ) 更接近 f(x)=0 f ( x ) = 0 ,这样就可以通过不断迭代去逼近 f(x) f ( x ) 。
进而推出: x(k+1)=x(k)−f(x(k))f′(x(k)) x ( k + 1 ) = x ( k ) − f ( x ( k ) ) f ′ ( x ( k ) )
通过迭代,这恶搞狮子必然在 f(x∗)=0 f ( x ∗ ) = 0 的时候收敛,如下图:
在最优化的问题中, 线性最优化至少可以使用单纯形法(或称不动点算法)求解, 但对于非线性优化问题, 牛顿法提供了一种求解的办法。 假设任务是优化一个目标函数 f f , 求函数 的极大极小问题, 可以转化为求解函数 f f 的导数 的问题, 这样求可以把优化问题看成方程求解问题。剩下的就和上面的牛顿法求解很相似了。
2.一维无约束极值最优化
其中 x∗ x ∗ 为目标函数的极小点即 f′(x) f ′ ( x ) 的根
首先把 f(x) f ( x ) 在探索点 x(k) x ( k ) 处泰勒展开到2阶形式进行近似:
然后用 f(x) f ( x ) 的最小点作为新的探索点 x(k+1) x ( k + 1 )
据此令:
求出迭代公式:
因此,一维牛顿法最优化问题的计算步骤如下:
(1)给定初始点 x(0) x ( 0 ) ,允许误差 ϵ>0 ϵ > 0 ,置 k=0 k = 0
(2)如果 f′(x(k))<ϵ f ′ ( x ( k ) ) < ϵ ,则停止迭代,得到 x(k) x ( k ) ;否则继续
(3)计算点 x(k+1) x ( k + 1 ) , x(k+1)=x(k)−f(x(k))f″(x(k)) x ( k + 1 ) = x ( k ) − f ( x ( k ) ) f ″ ( x ( k ) ) ,置 k=k+1 k = k + 1 ,转(2)
需要注意的是,牛顿法在求极值的时候,如果初始点选取不好,则可能不收敛于极小点
3.多维无约束极值最优化