数值优化(Numerical Optimization)学习系列-共轭梯度方法(Conjugate Gradient)

概述

共轭梯度算法在最优化问题中备受关注,有两层用途,一是可以求解线性方程 Ax=b ;二是可以求解最优化问题。相对于最速下降法,它没有额外的矩阵存储并且比更快,一般N步内收敛。实际收敛效率依赖于系数矩阵特征值的分布。

主要介绍一下内容:
1. 线性共轭梯度算法
2. 共轭方向算法
3. 共轭梯度算法
4. 收敛性
5. 非线性共轭梯度算法

线性共轭梯度算法

共轭梯度算法是一个求解线性方程的迭代方法

问题形式

CG算法求解问题的两种形式:
1. 线性方程 Ax=b 并且要求A是对称正定矩阵
2. 最优化问题:

minϕ(x)=12xTAxbTx
,要求A对称正定,这样该问题是一个凸问题并且有最优解,根据最优解满足 ϕ(x)=Axb=0r(x) 。在迭代过程中第K步的残差为 rk=Axkb

共轭性

给定一个非零向量集合 { p0,p1,p2...pn1 }和一个对称正定矩阵A;如果向量集合相对于A是共轭的当且仅当 pTiApj=0, ij

如果向量集合是共轭的,则他们之间是相互线性独立。

证明:反证法。如果不是线性独立,则有 pi=λpj ,则 pTiApj=λpTjApj0 ,不满足共轭条件。

共轭方向算法

共轭方向算法(Conjugate Direction Method)不同于共轭梯度方法,共轭向量提前给出。

算法描述

  1. 给定共轭方向集合{ p0,p1,p2...pn1 }和任意初始点 x0
  2. 计算 xk+1=xk+αkpk
  3. 计算最优步长 α ,即优化 ϕ(xk+αpk) ,通过求解单变量最优化问题,可以容易得到最优步长
    αk=rTkpkpTkApk

关于 αk 的计算

αk=arg min(ϕ(xk+αpk))=argmin12(xk+αpk)TA(xk+αpk)bT(xk+αpk)ϕ(α)=0αk=rTkpkpTkApk

对于任何初始点 x0 共轭方向算法最多N步可以收敛到最优解 x

证明:思路通过上述算法可以表示出最优解。
1. 由于 pi 线性独立,则在N维空间中可以生成整个空间,因此

xx0=δ0p0+δ1p1+...+δn1pn1
左边同时乘上 pTkA 得到
pTkA(xx0)=pTkA(δ0p0+δ1p1+...+δn1pn1)=δkpTkApk
,可以推出
δk=pTkA(xx0)pTkApk

2. 根据共轭方向算法可以得到
xk=x0+α0p0+α1p1+...+αk1pk1
,同样两边同时乘上 pTkA 可以得到
pTkA(xkx0)=0
pTkAxk=pTkAx0
3. 因此有
pTkA(xx0)=pTkA(xxk)=pTk(AxAxk)=pTk(bAxk)=pTkrk=δkpTkApk

4. 可见 αk=δk ,从而任意起点都可以再N步内得到最优解。

算法理解

如果假设矩阵A是对角阵,则我们可以沿着坐标轴方向依次优化各个方向的值。坐标轴方向为 e0,e1...en1 。二维情况如下:数值优化(Numerical Optimization)学习系列-共轭梯度方法(Conjugate Gradient)_第1张图片
但是如果A是非对角阵,如果还沿着坐标轴方向进行优化,有可能不会收敛。
但是可以通过转换的方式将A变成对角阵。
定义 x^=S1x ,其中S的定义为

S=[p0,p1...pn1]

则原问题可以表示为:
ϕ^(x^)=ϕ(Sx^)=12x^T(STAS)x(STb)Tx^

由于共轭性,则有 (STAS) 是对角阵,可以按照坐标轴方向进行优化。其中的关键点是

x^eixpi ,从而进一步验证该算法的正确性。

算法性质

从上述算法理解中可以看出,在计算到 ek 方向时,此时的 xk 是扩展子空间 e1...ek 中的最优解。类比于共轭方向算法有

对于任意初始值 x0 ,解序列 x0,x1...xk 由共轭方向算法生成,则有以下性质
1. rTkpi=0i=0,1,...,k1
2. xkϕ(x){x|x=x0+span(p0,p1...pk1)}

在证明之间简单理解一下,第K步的残差 rk 和前面K-1个共轭方向是正交的。
证明:用归纳法可以得到。
1. 当k=1时,需要证明 rT1p0=0 ,由于 x1=x0+α0p0α0=rT0p0pT0Ap0 ,又

rT1p0=(Ax1b)Tp0=(Ax0+α0Ap0b)Tp0=(r0+α0Ap0)Tp0=rT0p0+α0pT0Ap0=0

2. 假设k-1时也成立,即 rTk1pi=0; i=0,1,2...k2
3. 证明k时也成立,由于
rk=Axkb=A(xk1+αk1pk1)b=rk1+αk1Apk1

4. pTk1rk=pk1rk1+αk1pTk1Apk1=0 ,根据 αk1 的定义可以得到
5. pTirk=pirk1+αk1pTiApk1=0i=0,1...k2 根据归纳假设可以得到。

共轭方向计算

  1. 可以直接采用特征向量,但是特征向量计算复杂度比较高
  2. 可以采用Gram_Schmidt求解正交分解的方式得到共轭方向,对于大规模数据计算复杂度也高。

共轭梯度算法

共轭梯度算法是共轭方向算法的一种,它提供了一种计算共轭方向集合的方法,并且当前方向的计算仅和上一步方向相关,从而减少矩阵存储。
当前共轭方向 pk 选择为当前残差方向和上一步方向 pk1 的线性表示,即 pk=rk+βkpk1 。由于要满足 pkApk1=0 ,从而可以推出:

βk=rTkApk1pk1TApk1

初始点 x0 可以随机选择,初始搜索方向 p0 选择为最速下降方向 r0

CG-Preliminary算法

  1. 初始化 x0
  2. r0=Ax0b,p0=r0,k=0
  3. while rk0
    • αk=rTkpkpTkApk
    • xk+1=xk+αkpk
    • rk+1=Axk+1b
    • βk+1=rTk+1ApkpTkApk
    • pk+1=rk+1+βk+1pk
    • k=k+1
  4. end while

算法证明

现在需要解决的问题是上述算法的正确性?如何更好的优化?
证明正确性需要解决的问题是根据上述算法求解得到的 pk 是否满足相对于A是共轭的。

定理:共轭算法产生的解序列{ xk }满足一下性质:
1. rTkri=0i=0,1,2...k1
2. pTkApi=0i=0,1,2...k1

即当前步骤产出的残差和之前所有残差正交;当前搜索方向和之前所有方向共轭。
证明:首先回顾一下在共轭方向算法中的一个性质

rTkpi=0i=0,1,2...k1
即当前步骤的残差方向和之前所有的搜索方向正交。
性质1证明:由于 pk=rk+βkpk1 则有 rk=pk+βkpk1 ,两边同时乘上 ri 可以推出
rTirk=rTi(pk+βkpk1)
根据上述性质,显而易见结果为0.
性质2证明:可以采用归纳方法证明。
1. k=0时, p0=r0
2. k=1时, p1=r1+β1p0 ,根据定义肯定满足 pT1Ap0=0
3. k=2时, p2=r2+β2p1 ,根据定义 pT2Ap1=0 ,下面需要证明 pT2Ap0=0
pT2Ap0=(r2+β2p1)TAp0=rT2Ap0+β2p1Ap0=rT2Ap0+0=(r1+α1Ap1)TAp0=(r0+α0Ap0+α1Ap1)TAp0=α0 and α1=0

CG算法

下面正式介绍CG算法,根据上述性质可以对基础算法进行优化改进。
改进思路1:

αk=rTkpkpTkApk=rTk(rk+βkpk1)pTkApk=rTkrkpTkApk

改进思路2:由于 rk+1=rk+αkApk 可以得到 Apk=rk+1rkαk
βk+1=rTk+1ApkpTkApk=rTk+1ApkpTkApk=rTk+1(rk+1rk)αkpTkApk=rTk+1rk+1rTkrk
最后一步变换根据 改进思路1和上述性质1
因此最后的算法为:
1. 初始化 x0
2. r0=Ax0b,p0=r0,k=0
3. while rk0
αk=rTkrkpTkApk

xk+1=xk+αkpk

rk+1=Axk+1b

βk+1=rTk+1rk+1rTkrk

pk+1=rk+1+βk+1pk

k=k+1

4. end while

CG算法收敛性质

如果矩阵A有r个不同的特征值,则最多循环r步。
算法的收敛速度和A的特征值分布相关,如果A的条件数越大收敛越慢。

根据收敛性质,在实际应用中可以先对A进行预处理,从而使得A特征值分布更均匀一些。

非线性共轭梯度算法

将共轭的思想应用到一般化的最优化问题中,甚至非线性问题中去。

Fletcher-Reeves方法

算法如下:数值优化(Numerical Optimization)学习系列-共轭梯度方法(Conjugate Gradient)_第2张图片
主要改变如上图红框所示
1. 计算步长 αk 不一定能找到最优步长,可以采用wolf 条件进行计算。
2. 残差的计算可以直接用梯度代替。
3. 重点是需要保证每一步的搜索方向都满足下降,否则不保证收敛。选择强wolf条件可以保证上述约束

FR其他变种

主要思路优化 βk 的计算。

总结

共轭梯度算法可以认为解决了一类特殊最优化问题: minϕ(x)=12xTAxbTx ,并且矩阵A对称且正定。
解决思路和lineSearch比较相似,首先确定搜索方向然后计算步长。CG特别的地方在于搜索方向相对于A共轭,并且步长均选择为最优步长。其收敛速度线性。通过本节内容需要了解
1. CG算法解决问题的形式
2. 共轭性
3. 共轭方向算法
4. 共轭梯度算法以及正确性证明
5. 收敛性

你可能感兴趣的:(数值优化)