最优化
http://x-algo.cn/index.php/2016/06/15/optimal-gradient-method/
「最优化」一维搜索方法
本文讨论的是一元单值函数 f:R→Rf:R→R 时的最小化优化问题的迭代求解方法。这些方法统称为一维搜索法。一维搜索法普遍重视的原因有两个:
- 一维搜索法是多变量问题求解法的一个特例
- 一维搜索法是多变量问题求解算法的一部分
文章目录 [展开]
黄金分割法
黄金分割法是求解一元单值函数 f:R→Rf:R→R 在闭区间 [a0,b0][a0,b0] 上的极小点。后面讨论的斐波那契数列法和二分法都是针对这一问题的。该方法的唯一前提是目标函数f在区间上是单峰的。
其实介绍「黄金分割法」之前应该介绍一下「比例切割法」(我自己造的名字),「比例分割法」非常直观,如果已知极小值在一个区间内部,可以通过在区间内部取两个点 a1,b1a1,b1 分别计算 f(a1)f(a1) 和 f(b1)f(b1) ,四个点的函数值 f(a0)f(a0), f(a1)f(a1) , f(b1)f(b1) , f(b0)f(b0) 都计算出来了,通过比较 f(a1)f(a1) 和 f(b1)f(b1) 的大小决定极小值落在哪个子区间。
「黄金分割法」巧妙的地方在于,无论子区间是 [a1,b0][a1,b0] 还是 [a0,b1][a0,b1] ,上一步计算的函数值的结果可以作为下一次使用。
斐波那契数列法
利用「黄金分割法」进行迭代的过程中,每一步的压缩比例 pp 是确定的,如果允许压缩比例 pp 每一步动态调整,比如,第k次使用参数 pkpk ;第k+1次使用参数 pk+1pk+1 ,这就产生了一种新的搜索方法。
两次迭代中如果想要实现上一步的计算结果可以被下一步使用,需要满足下面公式:
pk+1(1−pk)=1−2pkpk+1(1−pk)=1−2pk
整理之后可以得到:
pk+1=1−pk1−pkpk+1=1−pk1−pk
上面介绍的「黄金分割法」只是上式的特例 pk=pk+1pk=pk+1 时候的情形。
迭代N次的压缩比为:
(1−p1)(1−p2)...(1−pN)(1−p1)(1−p2)...(1−pN)
所以这个问题可以通过最优化问题描述为:
minimize subject to (1−p1)(1−p2)...(1−pN)pk+1=1−pk1−pk0≤pk≤12minimize (1−p1)(1−p2)...(1−pN)subject to pk+1=1−pk1−pk0≤pk≤12
上面优化问题的最优解可用斐波那契数列表示:
p1=1−FNFN+1p2=1−FN−1FN⋮pk=1−FN−k+1FN−k+2⋮pn=1−F1F3p1=1−FNFN+1p2=1−FN−1FN⋮pk=1−FN−k+1FN−k+2⋮pn=1−F1F3
证明过程就不写了(关键是我也没看懂)。
二分法
在前面的假设基础上,如果限制函数f一阶可导,就可以使用二分法进行求解。 具体的,每次确定中间点 x0=(a0+b0)/2x0=(a0+b0)/2 ,然后计算此位置的一阶导数 f′(x0)f′(x0) ,如果一阶导数大于0说为位于右侧,如果小于0说明位于左侧。每次压缩比1/2,N次迭代之后压缩比要好于「黄金分割法」和「斐波那契法」。
牛顿法
如果函数二阶可微,可用牛顿法求解极小值。核心思想就是在当前点构造一个二次函数(其实就是泰勒展开),通过求解这个二次函数的极小值点,间接求得原始函数的极小值点。构造函数为:
q(x)=f(xk)+f′(xk)(x−xk)+12f′′(xk)(x−xk)2q(x)=f(xk)+f′(xk)(x−xk)+12f″(xk)(x−xk)2
求上面式子的极小值,可以通过一阶必要条件得到:
f′(x)=0=f′(xk)+f′′(xk)(x−xk)f′(x)=0=f′(xk)+f″(xk)(x−xk)
解得:
x=xk−f′(xk)f′′(xk)x=xk−f′(xk)f″(xk)
求方程的根
牛顿法可以通过不断的迭代迫使目标函数f的一阶导数函数趋于0,所以牛顿迭代可以用于求方程的根,不知道是不是因为牛顿迭代名气太大,其实这个方法和将方程一阶泰勒展开后求根是一样的,展开公式为:
q(x)=f(xk)+f′(xk)(x−xk)q(x)=f(xk)+f′(xk)(x−xk)
令上式为0,解得:
x=xk−f(xk)f′(xk)x=xk−f(xk)f′(xk)
割线法
通俗的说,牛顿法构造二次函数是对当前点进行拟合,拟合条件是一阶导数和二阶导数相等。「割线法」是构造函数二次对当前点和前一个点进行拟合,拟合条件是一阶导数相等。例如下面函数就是对 xkxk 和 xk−1xk−1 一阶导数相等的拟合:
q(x)=f(xk)+f′(xk)(x−xk)+12f′(xk)−f′(xk−1)xk−xk−1(x−xk)2q(x)=f(xk)+f′(xk)(x−xk)+12f′(xk)−f′(xk−1)xk−xk−1(x−xk)2
其实很简单,只是使用一阶导数模拟了二阶导数而已。
所以迭代公式可以修改为:
xk+1=xk−xk−xk−1f′(xk)−f′(xk−1)f′(xk)xk+1=xk−xk−xk−1f′(xk)−f′(xk−1)f′(xk)
求方程的根
类似牛顿法求方程的根,「割线法」也是每一步都是在寻找一阶导数等于0的点,构造函数并用「割线法」替换一阶导数得到:
q(x)=f(xk)+f(xk)−f(xk−1)xk−xk−1(x−xk)q(x)=f(xk)+f(xk)−f(xk−1)xk−xk−1(x−xk)
令其为0,解得:
x=xk−xk−xk−1f(xk)−f(xk−1)f(xk)x=xk−xk−xk−1f(xk)−f(xk−1)f(xk)
顺着「割线法」的思想,其实可以构造更加复杂一些的函数,拟合更多点的一阶导数。拟合多个点(吵过2)的想法,和多级「泰勒级数」展开有异曲同工之妙。
划界法
划界法并不是一种求解极值点的方法,它是一种确定极值点区间的方法,因为前面介绍的方法中,都依赖一个前提,就是需要已知极值点一定落在了某个区间[a,b]中。
划界法的想法很简单,就是找到三个点a、b、c使得f(a)>f(b)<f(c),这样就可以保证极值点一定是落在了a和c之间。所以当发现f(a)>f(b>)>f(c)或者f(a)<f(b)<f(c)的之后,就要确定探测的方向,重新选择一个点进行探测。如果想要减少探测过程中计算函数值的次数,可以考虑使用类似黄金分割的思想。
多维优化中的一维搜索法
终于到重点部分了,因为工业界都是「多维优化」的场景。
一维搜索的方法在多维搜索的优化问题中发挥着重要的作用,特别是对多为优化问题的迭代求解算法而言,通常每次迭代都包含一维搜索过程。通常极小点的迭代公式为:
xk+1=xk+αkdkxk+1=xk+αkdk
通常可去d为梯度的反方向, αk≥0αk≥0 为步长,确定方式是使函数:
ϕ(α)=f(xk+αdk)ϕ(α)=f(xk+αdk)
达到最小。这个时候问题就变为了一个一维优化问题,前面列举的优化算法都可以使用了。需要注意的是 ϕ′(α)ϕ′(α) 的一阶导数是小于0的,具体的:
ϕ′k(α)=d(k)Tf′(xk+αdk)ϕk′(α)=d(k)Tf′(xk+αdk)
所以如果d选取为梯度的负方向的话,就有:
ϕ′(0)=d(k)Tf′(xk)=−f′(xk)Tf′(xk)<0 ϕ′(0)=d(k)Tf′(xk)=−f′(xk)Tf′(xk)<0
一维搜索在实际应用中存在一些问题,首先,精确地求解 αkαk 的极小值点 ϕkϕk 可能需要非常大的代价;在某些极端的情况下 ϕkϕk 甚至是不存在的。其次,实际应用经验表明,应该讲更多的计算资源配置到多维优化算法而不是追求高精度的一维搜索上。这就意味着应该为一维搜索设计合理的停止条件。条件一般包含下面两方面:
- 目标函数要有足够程度的下降
- αα 不要太大或太小
Armijo条件
Armijo条件(1),保证第k次迭代 αkαk 不会太大并且有一定程度的下降( ε∈(0,1)ε∈(0,1) ):
ϕkαk≤ϕk(0)+εαkϕ′k(0)ϕkαk≤ϕk(0)+εαkϕk′(0)
Armijo条件(2),保证第k次迭代 αkαk 不会太小(然而这个并不常用,其中 γ>1γ>1 ):
ϕk(γαk)≥ϕk(0)+εγαkϕ′k(0)ϕk(γαk)≥ϕk(0)+εγαkϕk′(0)
GoldStein条件
GoldStein条件就是在Armijo条件(2)条件上稍作修改:
ϕk(αk)≥ϕk(0)+ηαkϕ′k(0)ϕk(αk)≥ϕk(0)+ηαkϕk′(0)
其中 ε<η<1 ε<η<1 。
Armijo条件(1)和GoldStein条件联合称为Armijo-GoldStein条件。
Wolfe条件
前面三个条件是通过函数值做限制,Wolfe条件是通过一阶导数限制,Wolfe条件为:
ϕ′k(αk)≥ηϕ′k(0)ϕk′(αk)≥ηϕk′(0)
Worfe条件的一个变种,强Wolfe条件(通过绝对值限制):
∣∣ϕ′k(αk)∣∣≤∣∣ηϕ′k(0)∣∣|ϕk′(αk)|≤|ηϕk′(0)|
参考资料
《最优化导论》Edwin K.P.Chong Stanislaw H. Zak
「最优化」梯度方法
本文讨论的是实值函数在 RnRn 上的极小点的方法,他们在搜索过程中用到了函数的梯度,故称为梯度方法。
负梯度
「负梯度」其实就是梯度的负方向,默认梯度的方向都是朝着函数值增加的方向。并且容易证明,梯度的方向是函数值增加最快的方向,所以「负梯度」方向就理所应当是下降最快的方向了。我们求极小值的场景中,选择负梯度方向作为搜索方向是一个很好的选择。
前面介绍过,方向梯度的公式为 <d,f′(x)><d,f′(x)> ,因为|d|=1,所以下面式子明显成立:
<f′(x),d>≤|f′(x)|<f′(x),d>≤|f′(x)|
此式也就证明了梯度方向是上升最快的方向。
最速下降法
「最速下降法」用一句话描述:每次一维搜索的时候选取下降最多的方法。不难证明,每次都是搜索到等高线的切线位置(等高线是光滑的椭圆),并且两次搜索的方向必定正交。
收敛性
「最优化」牛顿法
在确定搜索方向上,最速下降法只用到了目标函数的一阶导数。这种方式并非总是最高效的,在某些情况下,如果能够在迭代中引入高阶导数,其效率可能将优于最速下降法。「牛顿法」就是如此,他同时使用一阶导数和二阶导数作为搜索方向。当初始点和目标函数的极小点足够接近的时候,牛顿法的效率要优于最速下降法。牛顿法的迭代原理图:
文章目录 [展开]
迭代公式
前提是目标函数二阶可导,将目标函数在 xkxk 处进行泰勒二阶展开,得到:
q(x)=f(xk)+f′(xk)(x−xk)+12f′′(xk)(x−xk)2q(x)=f(xk)+f′(xk)(x−xk)+12f″(xk)(x−xk)2
求此函数的极小值:
q′(x)=f′(xk)+f′′(xk)(x−xk)=0q′(x)=f′(xk)+f″(xk)(x−xk)=0
如果 f′′(xk)>0f″(xk)>0 ,也就是正定,解得:
xk+1=xk−f′′(xk)−1f′(xk)=xk−F(xk)−1gkxk+1=xk−f″(xk)−1f′(xk)=xk−F(xk)−1gk
上式就是牛顿迭代公式,是不是和「最速下降法」长得很像,差别就在于:最速下降法的步长是通过「一维搜索」求得,牛顿法是直接使用二阶导数(汉森矩阵)的逆作为"步长"。站在矩阵乘法的角度来看,可看做对一阶导数进行「行变换」。
牛顿法的性质分析
在单变量的情况下,如果函数的二阶导数 f′′(x)<0f″(x)<0 牛顿法无法收敛到极小点;再多变量的情况向,如果目标函数的汉森矩阵 F(xk)F(xk) 非正定,牛顿法的搜索方向不一定是目标函数值下降的方向。甚至在某些情况下,即使 F(xk)F(xk) 是正定的,如果当前点远离目标函数的极小点的时候,可能出现 f(xk+1)≥f(xk)f(xk+1)≥f(xk) 。牛顿法的优势在于当前点距离极小点比较近的情况下。
如果目标函数是二次型函数,此时牛顿法只需要一次就可以迭代到极小点。假设二次型函数为:
f(x)=12xTQx−xTbf(x)=12xTQx−xTb
令其一阶导数为零,求得的解就是极小值点:
g(x)=f′(x)=Qx−b=0g(x)=f′(x)=Qx−b=0
令其为0,发现解就是线性方程组 Qx=bQx=b 的解,如果Q可逆,解可以记为: x=Q−1bx=Q−1b 。
上式二阶导数为:
F(x)=QF(x)=Q
这个结论可以记住,就是二次型函数的汉森矩阵为Q(常数矩阵,和x无关),二次型大于0的条件是Q函数正定,函数有极小值也要保证汉森矩阵正定。
利用牛顿迭代式,可以得到下一个迭代点:
x1===x0−F(x0)−1g0x0−Q−1[Qx0−b]Q−1bx1=x0−F(x0)−1g0=x0−Q−1[Qx0−b]=Q−1b
由此可见,牛顿法对二次型函数收敛的阶数为正无穷。
收敛性
没看懂。。挖坑先
牛顿局部下降
牛顿法本质上其实就是用一个二次函数「拟合」目标函数,然后使用求解二次函数的一些方法来求解目标函数。前面说过,原始牛顿法不能保证下一步迭代是下降的。接下来会证明,在当前点附近足够小的邻域内,牛顿法确定的方向一定是原函数的下降方向。这个结论保证了,通过对原始方法的一些修正,可以使得「牛顿法」每一次迭代都是下降的。牛顿法的「局部下降」可以使用更数学的方式定义如下:
{xk}{xk} 是利用牛顿法求解目标函数 f(x)f(x) 极小值的迭代序列,如果 F(xk)>0F(xk)>0 ,且 gk=f′(xk)≠0gk=f′(xk)≠0 ,那么 xkxk到 xk+1xk+1 的搜索方向:
dk=−F(xk)−1gk=xk+1−xkdk=−F(xk)−1gk=xk+1−xk
是一个下降方向,即存在一个 a^>0a^>0 ,使得对所有的 α∈(0,a^)α∈(0,a^) ,都有:
f(xk+αdk)<f(xk)f(xk+αdk)<f(xk)
成立。
下面开始证明:
构造复合函数
ϕ(α)=f(xk+αdk)ϕ(α)=f(xk+αdk)
使用链式法则得到:
ϕ′(α)=f′(xk+αdk)Tdkϕ′(α)=f′(xk+αdk)Tdk
由于 F(xk)>−1>0,gk≠0F(xk)>−1>0,gk≠0 ,有
ϕ′(0)=f′(xk)Tdk=−g(k)TF(xk)−1gk<0ϕ′(0)=f′(xk)Tdk=−g(k)TF(xk)−1gk<0
根据导数本身的意义,得证。
一维搜索修正牛顿法
既然我们已经得到了一个确定会下降的方向,一种直观的想法就是确定一个合适的步长即可:
xk+1=xk−αkF(xk)−1gkxk+1=xk−αkF(xk)−1gk
其中,
αk=argminα≥0f(xk−αF(xk)−1gk)αk=argminα≥0f(xk−αF(xk)−1gk)
上式可以通过一维搜索求解。
当目标函数的维数n比较大的时候计算很森矩阵所需要的时间就比较多,同时还要求解汉森矩阵的逆,可以等价看做是求解线性方程组 F(xk)dk=−gkF(xk)dk=−gk 的解。这是牛顿法的缺陷之一。
Levenberg-Marquardt 修正
通过「一维搜索」修正了牛顿法的步长,但是如果汉森矩阵不正定,还是不能保证搜索方向是下降的。所以接下来介绍的方法是对汉森矩阵的修正。
修正之后的迭代公式为:
xk+1=xk−(F(xk+ukI)gk)xk+1=xk−(F(xk+ukI)gk)
其中 uk≥0uk≥0 。
F(xk)F(xk) 为对阵矩阵,假设特征值为 λ1,λ2,...,λnλ1,λ2,...,λn ,矩阵 G=F+uIG=F+uI 的特征值为 λ1+u,λ2+u,...,λn+uλ1+u,λ2+u,...,λn+u ,且满足:
Gvi====(F+uI)viFvi+uIviλivi+uvi(λi+u)viGvi=(F+uI)vi=Fvi+uIvi=λivi+uvi=(λi+u)vi
所以,只要u足够大,肯定可以使得修正之后的矩阵G是正定的,加入以为搜索的过程后迭代公式可以写作:
xk+1=xk−αk(F(xk)+ukI)−1gkxk+1=xk−αk(F(xk)+ukI)−1gk
如果 uk→0uk→0 ,修正效果可以接近牛顿法,如果 uk→∞uk→∞ ,Levenberg-Marquardt修正基本退化为步长较小时的梯度方法。在实际应用中,优选选择 ukuk 较小的值。
参考资料
《最优化导论》Edwin K.P.Chong Stanislaw H. Zak
「最优化」共轭方向法
从计算效率上来看,共轭方向法位于最速下降法和牛顿法之间。 共轭方向法具体有以下特性:
- 对n维二次型问题,能够在n步之内得到结果
- 作为共轭方向法的典型代表,共轭梯度法不需要计算很森矩阵
- 不需要存储 n×nn×n 的矩阵,也不需要对其进行求逆
文章目录 [展开]
共轭的定义
对于一个n次二次型函数 f(x)=12xTQx−xTb,x∈Rn,Q=QT>0f(x)=12xTQx−xTb,x∈Rn,Q=QT>0 ,最好的搜索方向为Q的共轭方向,如果 RnRn 中的两个方向 d1d1 和 d2d2 满足 d(1)TQd(2)=0d(1)TQd(2)=0 ,则他们是关于Q共轭的。
可以证明共轭的方向都是线性无关的,Q>0时,若存在一组标量 α0,α2,...,αkα0,α2,...,αk 使得:
α0d0+α1d1+...+αkak=0α0d0+α1d1+...+αkak=0
通过将上式两边同乘 djQdjQ 可以得到 αjαj 为0,得证。
基本的共轭方向算法
既然有「基本」两个字,说明这个方法适用的范围非常小。接下来介绍的时候都是针对目标函数为二次型函数。
f(x)=12xTQx−xTbf(x)=12xTQx−xTb
算法迭代流程
给定初始点 x0x0 和一组关于Q共轭的方向 d0,d1,...,dn−1d0,d1,...,dn−1 ,迭代公式为:
gk=f′(xk)=Qxk−bgk=f′(xk)=Qxk−b
αk=−g(k)Td(k)d(k)TQd(k)αk=−g(k)Td(k)d(k)TQd(k)
xk+1=xk+αkdkxk+1=xk+αkdk
算法性能
对于任意的初始点 x0x0 ,基本的共轭方向法都可以在n步之内收敛到全局的唯一极小点 x∗x∗ ,即 xn=x∗xn=x∗ 。
假设已经得到极小点 x∗x∗ ,因为n个共轭方向线性无关,所以一定可以使用n个「共轭方向」表示极值点:
x∗=x0+β0d0+β1d1+...+βn−1dn−1x∗=x0+β0d0+β1d1+...+βn−1dn−1
上式将 x0x0 移到左边,并两边同乘 d(k)TQd(k)TQ :
d(k)TQ(x∗−x0)=d(k)TQ(β0d0+β1d1+...+βn−1dn−1)d(k)TQ(x∗−x0)=d(k)TQ(β0d0+β1d1+...+βn−1dn−1)
可以解得:
βk=d(k)TQ(x∗−x0)d(k)TQd(k)βk=d(k)TQ(x∗−x0)d(k)TQd(k)
迭代点 xkxk 可以表示为:
xk=x0+α0d0+α1d1+...+αk−1dk−1xk=x0+α0d0+α1d1+...+αk−1dk−1
由于目标函数是二次型函数,所以 gk=Qxk−b,Qx∗=bgk=Qxk−b,Qx∗=b ,可以得到:
d(k)TQ(x∗−x0)===d(k)TQ(x∗−xk+xk−x0)d(k)TQ(x∗−xk)+d(k)TQ(xk−x0)−d(k)Tgkd(k)TQ(x∗−x0)=d(k)TQ(x∗−xk+xk−x0)=d(k)TQ(x∗−xk)+d(k)TQ(xk−x0)=−d(k)Tgk
因此有:
βk=−d(k)Tgkd(k)TQd(k)=αkβk=−d(k)Tgkd(k)TQd(k)=αk
梯度和搜索方向的性质
当前梯度和历史搜索方向垂直
「最速下降法」优化过程中,当前点的梯度一定是和等高线垂直,上一步的搜索方向一定是和当前点的等高线相切。所以容易想象 xk+1xk+1 一定是和 dkdk 垂直的。
由于共轭梯度法在第k步迭代的时候,可以求得当前方向最优,即:
αk=argminf(xk+αdk)αk=argminf(xk+αdk)
同时也是当前「子空间」最优,此处子空间为共轭方向锁确认的子空间,记为:
νk=x0+span[d0,d1,...,dk]νk=x0+span[d0,d1,...,dk]
由于共轭方向法可以做到每一次迭代是得到当前方向在全局最优的位置,所以有:
f(xk+1)=minαf(x0+Dkα=minx∈νkf(x)f(xk+1)=minαf(x0+Dkα=minx∈νkf(x)
其中 Dk=[d0,d1,...,dk]Dk=[d0,d1,...,dk] 。
根据负梯度的意义,是描述函数下降方向的,在已经优化过的k个方向已经达到了最优点,所以 gk+1gk+1 一定是和每一个「历史共轭方向」垂直。
当前梯度和未来共轭方向线性相关
用反证法,已经和「历史方向」垂直了(线性无关),肯定就和未来方向线性相关了。
共轭方向法的计算效率很高,但是前提是必须能够给一组Q的共轭方向,幸运的是存在一种方法,能够随着迭代的进行,逐一产生Q的共轭方向,无需提前指定。
共轭梯度法
前面介绍了梯度和历史「共轭方向」之间的存在正交关系,那么是否可以利用这个「关系」逐一产生共轭方向呢?
为了生成下一个共轭方向,一种很直观的想法是空间随机生成一个向量,此向量和已有的共轭方向「线性无关」,然后调整向量的方向,使得和已有共轭方向「共轭」,由于 DnDn 可以表示整个空间,所以通过 DkDk 来调整方向是一种选择。所以新的方向可以用参数 βk=[β0k,β1k,...,βkk]Tβk=[βk0,βk1,...,βkk]T 表示为:
dk+1=−gk+1+β0kd0+β1kd1+...+βkkdkhistory spandk+1=−gk+1+βk0d0+βk1d1+...+βkkdk⏟history span
接下来的问题就是确定向量 βkβk 即可。
因为 dk+1dk+1 要满足和历史搜索方向共轭,所以可以得到下面等式:
接下来就是求解上面的线性方程组,很容易求得:
β0kβ1kβkk==⋮=d(0)TQgk+1d(0)TQd0d(1)TQgk+1d(1)TQd1d(k)TQgk+1d(k)TQdkβk0=d(0)TQgk+1d(0)TQd0βk1=d(1)TQgk+1d(1)TQd1⋮βkk=d(k)TQgk+1d(k)TQdk
接下来的求解救水到渠成了,方向确定了之后可以通过直接求导并令导数为0求解:
αk=argminα>=0f(xk+αdk)=−g(k)Tdkd(k)TQdkαk=argminα>=0f(xk+αdk)=−g(k)Tdkd(k)TQdk
接下来会证明, d(j)TQgk+1=0,j∈[0,k−1]d(j)TQgk+1=0,j∈[0,k−1] ,所以 βjk=d(j)TQgk+1d(j)TQdj=0d(j)TQdj=0βkj=d(j)TQgk+1d(j)TQdj=0d(j)TQdj=0 ,那么方向的迭代公式可以写为:
dk+1=−gk+1+β0kd0+β1kd1+...+βkkdkhistory span=−gk+1+βkkdkdk+1=−gk+1+βk0d0+βk1d1+...+βkkdk⏟history span=−gk+1+βkkdk
当前梯度和历史梯度垂直
还是反证法,因为梯度不是0,所以如果不垂直那么在历史梯度方向一定会有下降,和前面「子空间最优」结论矛盾。所以这里可以得到更加一般的结论:共轭梯度法中「当前梯度」和历史子空间垂直(这里的历史子空间是 DkDk 确定的子空间)。
所以当整个搜索完成的时候,搜索的每一步梯度都是互相「正交」,方向都是互相「共轭」。
当前梯度和历史非相邻方向共轭
这是一个神奇的结论:当前梯度 gk+1gk+1 和不相邻的历史方向 dj,j∈[0,k−1]dj,j∈[0,k−1] 共轭。其实就是证明 \(j<k\)< span="">j<kj<k 的情况下,下面式子成立:
g(k+1)TQdj=0g(k+1)TQdj=0
由于:
gj+1=Qxj+1−b=Q(xj+αjdj)−b=Qxj−b+Qαjdj=gj+αjQdjgj+1=Qxj+1−b=Q(xj+αjdj)−b=Qxj−b+Qαjdj=gj+αjQdj
将其代入得到:
g(k+1)TQdj=g(k+1)T(gj+1−gj)αj=0g(k+1)TQdj=g(k+1)T(gj+1−gj)αj=0
非二次型中的共轭梯度法
接下来就是套路了,非二次型利用泰勒展开转化为二次型问题即可。同时为了避免计算汉森矩阵, αkαk 可以通过一维搜索转化为一维搜索,对 βkβk 可以进行各种替换计算。
Hestenes-Stiefel公式
利用 Qdk=(gk+1−gk)/αkQdk=(gk+1−gk)/αk , βkβk 可以改写为:
βk=g(k+1)T Qdkd(k)TQdk=g(k+1)T (gk+1−gk)d(k)T(gk+1−gk)βk=g(k+1)T Qdkd(k)TQdk=g(k+1)T (gk+1−gk)d(k)T(gk+1−gk)
Polak-Ribiere公式
利用当前梯度和历史方向正交,上式分母可以进一步化简为:
βk=g(k+1)T (gk+1−gk) g(k)Tgkβk=g(k+1)T (gk+1−gk) g(k)Tgk
Fletcher-Reeves公式
利用当前梯度和历史梯度正交,上式分子可以化简为:
βk=g(k+1)T gk+1 g(k)T gkβk=g(k+1)T gk+1 g(k)T gk
上面三个迭代公式中,虽然对二次型是等价的,但是对非二次型的表现确实不同的。实际应用中,要对共轭梯度法进行一些稍微的调整,首先在通过「最速下降法」中的停止条件(偏导数为0)并不实用,因为可能迭代好多次也不为0。所以需要选择合适的停止条件。
对于非二次型问题,共轭梯度法通常不会在n步之内收敛到极小,随着迭代的进行搜索方向将不再是Q的共轭方向,通常用的解决方法是经过几次迭代之后将搜索方向初始化为目标函数的梯度方向,然后接着搜索。
至于选择哪个公式作为搜索方向,没有定论说哪个公式一定好于另一个,不同的目标函数结论不一样。
参考文献
《最优化导论》Edwin K.P.Chong Stanislaw H. Zak
《Numerical Optimization》 Jorge Nocedal Stephen J. Wright