泰勒级数
在开始介绍优化方法之前,我们先介绍一些基础知识
f ( x ) = f ( a ) 0 ! + f ′ ( a ) 1 ! ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + . . . + f n ( a ) n ! ( x − a ) n + R n ( x ) f(x)=\frac{f(\mathbf{a})}{0!}+\frac{f'(\mathbf{a})}{1!}(x-\mathbf{a})+\frac{f''(\mathbf{a})}{2!}(x-\mathbf{a})^2+...+\frac{f^{n}(\mathbf{a})}{n!}(x-\mathbf{a})^n+R_n(x) f(x)=0!f(a)+1!f′(a)(x−a)+2!f′′(a)(x−a)2+...+n!fn(a)(x−a)n+Rn(x)
泰勒公式是一个用函数在某点的信息描述其附近取值的公式。上面这个公式,描述了函数 f ( x ) f(x) f(x)在 a \mathbf{a} a 点附近的取值情况。如果函数足够光滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值。
泰勒公式就是把一个函数展开成具有任意多项幂级数方便计算任意函数的值(这使得计算机能得出自己想要的精度的值)且可以人为控制误差范围。
泰勒公式还给出了这个多项式和实际的函数值之间的偏差。
一维搜索 / 线搜索 (linear search)
线搜索是最优化(Optimization)算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。
原理
线搜索是一种迭代的求得某个函数的最值的方法。 对于每次迭代, 线搜索会计算得到搜索的方向 p k p_k pk以及沿这个方向移动的步长 a k a_k ak。
搜索方向
大多数的线搜索方法都会要求 p k p_k pk 是下降方向(descent direction), 亦即需要满足以下条件: p k T ∇ f k < 0 p_k^T \nabla f_k < 0 pkT∇fk<0,这样就能够保证函数 f ( x ) f(x) f(x) 沿着这个方向是下降的。 一般来说, 搜索方向是:
p k = − B k − 1 ∇ f k p_k=−B_k^{-1}\nabla f_k pk=−Bk−1∇fk
其中 B k B_k Bk是一个对称非奇异矩阵:
- 在最深下降(steepest descent)方法中, B k B_k Bk是单位矩阵 I I I
- 在牛顿方法(Newton)中, B k B_k Bk则是海森(Hessian)矩阵 ∇ 2 f ( x k ) \nabla^2 f(x_k) ∇2f(xk)
- 在Quasi-Newton方法中,则是一个通过迭代求得的Hessian矩阵的近似矩阵
当 p k p_k pk由上式定义, 且 B k B_k Bk是正定矩阵时:
p k T ∇ f k = − ∇ f k T B k − 1 ∇ f k < 0 p_k^T\nabla f_k = -\nabla f_k^T B_k^{-1}\nabla f_k <0 pkT∇fk=−∇fkTBk−1∇fk<0
搜索步长
步长 α \alpha α 应该最小化下面的函数:
ϕ ( α ) = f ( x k + α p k ) \phi (\alpha)=f(x_k+\alpha p_k) ϕ(α)=f(xk+αpk)
但是求得使上式最小的 α \alpha α 比较困难, 且计算量比较大, 实际常用的方法是在可接受的计算量的情况下尽可能的求得较大的步长, 以使得 ϕ ( α ) \phi (\alpha) ϕ(α) 尽可能的降低。
经典的线搜索方法通过迭代来求得 α \alpha α, 直至达到某个停止条件。一般的线搜索方法都包含以下两个步骤:
bracketing
:求得一个包含理想的步长的区间二分法或者插值法
: 在这个区间内使用二分法或者插值法来求得步长
分类
使用导数的优化算法都涉及到沿优化方向 d k \mathbf{d}_k dk的一维搜索。事实上一维搜索算法本身就一个非常重要的课题,分为精确一维搜索以及非精确一维搜索。标准的拟牛顿法或L-BFGS均采用精确一维搜索。与前者相比,非精确一维搜索虽然牺牲了部分精度,但是效率更高,调用函数的次数更少。因此 Li-Fukushima方法和Xiao-Wei-Wang方法中均采用了这类算法。不加证明的,
本节分别给出两类范畴中各自的一个应用最为广泛的例子, 分别是二点三次插值方法和Wolfe-Powell准则。
精确线搜索:二点三次插值
在精确一维搜索各种算法中,这种方法得到的评价最高。其基本思想是:
选取两个初始点 x 1 x_1 x1和 x 2 x_2 x2,为了保证了在区间 ( x 1 , x 2 ) (x_1, x_2) (x1,x2)中存在极小点,需要满足以下条件:
- x 1 x_1 x1 < x 2 x_2 x2
- f ′ ( x 1 ) f^{'}(x_1) f′(x1) < 0 0 0
- f ′ ( x 2 ) f^{'}(x_2) f′(x2) > 0 0 0
利用这两点处的函数值 f ( x 1 ) f(x_1) f(x1)、 f ( x 2 ) f(x_2) f(x2)和导数值 f ′ ( x 1 ) f^{'} (x_1) f′(x1)、 f ′ ( x 2 ) f^{'}(x_2) f′(x2)构造一个三次多项式 φ ( x ) \varphi(x) φ(x),使得 φ ( x ) \varphi(x) φ(x)在 x 1 x_1 x1和 x 2 x_2 x2处与目标函数$ f(x) $有相同的函数值和导数值:
φ ( x ) = a ( x − x 1 ) 3 + b ( x − x 1 ) 2 + c ( x − x 1 ) + d \varphi(x)=a(x- x_1)^3+b(x-x_1)^2+c(x-x_1)+d φ(x)=a(x−x1)3+b(x−x1)2+c(x−x1)+d
通过4个边界条件可以完全确定4个参数 a a a、 b b b、 c c c、 d d d。之后找出 φ ′ ( x ) \varphi^{'}(x) φ′(x)的零点 x ′ x^{'} x′,作为极小点的一个进一步的估计。可以证明,由 x 1 x_1 x1出发,最佳估计值的计算公式为:
x ′ = x 1 + − c b + b 2 − 3 a c x^{'}=x_1+\frac{-c}{b+\sqrt{b^2-3ac}} x′=x1+b+b2−3ac−c
记 f 1 = f ( x 1 ) f_1=f(x_1) f1=f(x1)、 f 2 = f ( x 2 ) f_2=f(x_2) f2=f(x2)、 f 1 ′ = f ′ ( x 1 ) f^{'}_1=f^{'}(x_1) f1′=f′(x1)、 f 2 ′ = f ′ ( x 2 ) f^{'}_2 =f^{'}(x_2) f2′=f′(x2),则具体算法步骤如下:
- 给定初始点 x 1 、 x 2 x_1、x_2 x1、x2,满足 f 1 ′ > 0 、 f 2 ′ > 0 f^{'}_1>0、f^{'}_2>0 f1′>0、f2′>