概述
共轭梯度算法在最优化问题中备受关注,有两层用途,一是可以求解线性方程 Ax=b ;二是可以求解最优化问题。相对于最速下降法,它没有额外的矩阵存储并且比更快,一般N步内收敛。实际收敛效率依赖于系数矩阵特征值的分布。
主要介绍一下内容:
1. 线性共轭梯度算法
2. 共轭方向算法
3. 共轭梯度算法
4. 收敛性
5. 非线性共轭梯度算法
线性共轭梯度算法
共轭梯度算法是一个求解线性方程的迭代方法
问题形式
CG算法求解问题的两种形式:
1. 线性方程 Ax=b 并且要求A是对称正定矩阵。
2. 最优化问题:
minϕ(x)=12xTAx−bTx
,要求A对称正定,这样该问题是一个凸问题并且有最优解,根据最优解满足
∇ϕ(x)=Ax−b=0,一般即为r(x) 。在迭代过程中第K步的残差为
rk=Axk−b
共轭性
给定一个非零向量集合 { p0,p1,p2...pn−1 }和一个对称正定矩阵A;如果向量集合相对于A是共轭的当且仅当 pTiApj=0, i≠j
如果向量集合是共轭的,则他们之间是相互线性独立。
证明:反证法。如果不是线性独立,则有 pi=λpj ,则 pTiApj=λpTjApj≠0 ,不满足共轭条件。
共轭方向算法
共轭方向算法(Conjugate Direction Method)不同于共轭梯度方法,共轭向量提前给出。
算法描述
- 给定共轭方向集合{ p0,p1,p2...pn−1 }和任意初始点 x0
- 计算 xk+1=xk+αkpk
- 计算最优步长 α ,即优化 ϕ(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维空间中可以生成整个空间,因此
x∗−x0=δ0p0+δ1p1+...+δn−1pn−1
左边同时乘上
pTkA 得到
pTkA(x∗−x0)=pTkA(δ0p0+δ1p1+...+δn−1pn−1)=δkpTkApk
,可以推出
δk=pTkA(x∗−x0)pTkApk
2. 根据共轭方向算法可以得到
xk=x0+α0p0+α1p1+...+αk−1pk−1
,同样两边同时乘上
pTkA 可以得到
pTkA(xk−x0)=0
即
pTkAxk=pTkAx0
3. 因此有
pTkA(x∗−x0)=pTkA(x∗−xk)=pTk(Ax∗−Axk)=pTk(b−Axk)=−pTkrk=δkpTkApk
4. 可见
αk=δk ,从而任意起点都可以再N步内得到最优解。
算法理解
如果假设矩阵A是对角阵,则我们可以沿着坐标轴方向依次优化各个方向的值。坐标轴方向为 e0,e1...en−1 。二维情况如下:
但是如果A是非对角阵,如果还沿着坐标轴方向进行优化,有可能不会收敛。
但是可以通过转换的方式将A变成对角阵。
定义 x^=S−1x ,其中S的定义为
S=[p0,p1...pn−1]
则原问题可以表示为:
ϕ^(x^)=ϕ(Sx^)=12x^T(STAS)x−(STb)Tx^
由于共轭性,则有
(STAS) 是对角阵,可以按照坐标轴方向进行优化。其中的关键点是
在 x^空间内的ei方向等价于在x空间内的pi方向 ,从而进一步验证该算法的正确性。
算法性质
从上述算法理解中可以看出,在计算到 ek 方向时,此时的 xk 是扩展子空间 e1...ek 中的最优解。类比于共轭方向算法有
对于任意初始值 x0 ,解序列 x0,x1...xk 由共轭方向算法生成,则有以下性质
1. rTkpi=0i=0,1,...,k−1
2. xk在以下集合中是ϕ(x)的最优解,{x|x=x0+span(p0,p1...pk−1)}
在证明之间简单理解一下,第K步的残差 rk 和前面K-1个共轭方向是正交的。
证明:用归纳法可以得到。
1. 当k=1时,需要证明 rT1p0=0 ,由于 x1=x0+α0p0,α0=−rT0p0pT0Ap0 ,又
rT1p0=(Ax1−b)Tp0=(Ax0+α0Ap0−b)Tp0=(r0+α0Ap0)Tp0=rT0p0+α0pT0Ap0=0
2. 假设k-1时也成立,即
rTk−1pi=0; i=0,1,2...k−2
3. 证明k时也成立,由于
rk=Axk−b=A(xk−1+αk−1pk−1)−b=rk−1+αk−1Apk−1
4.
pTk−1rk=pk−1rk−1+αk−1pTk−1Apk−1=0 ,根据
αk−1 的定义可以得到
5.
pTirk=pirk−1+αk−1pTiApk−1=0i=0,1...k−2 根据归纳假设可以得到。
共轭方向计算
- 可以直接采用特征向量,但是特征向量计算复杂度比较高
- 可以采用Gram_Schmidt求解正交分解的方式得到共轭方向,对于大规模数据计算复杂度也高。
共轭梯度算法
共轭梯度算法是共轭方向算法的一种,它提供了一种计算共轭方向集合的方法,并且当前方向的计算仅和上一步方向相关,从而减少矩阵存储。
当前共轭方向 pk 选择为当前残差方向和上一步方向 pk−1 的线性表示,即 pk=−rk+βkpk−1 。由于要满足 pkApk−1=0 ,从而可以推出:
βk=rTkApk−1pk−1TApk−1
初始点
x0 可以随机选择,初始搜索方向
p0 选择为最速下降方向
−r0
CG-Preliminary算法
- 初始化 x0
- r0=Ax0−b,p0=r0,k=0
- while rk≠0
-
αk=−rTkpkpTkApk
-
xk+1=xk+αkpk
-
rk+1=Axk+1−b
-
βk+1=rTk+1ApkpTkApk
-
pk+1=−rk+1+βk+1pk
-
k=k+1
- end while
算法证明
现在需要解决的问题是上述算法的正确性?如何更好的优化?
证明正确性需要解决的问题是根据上述算法求解得到的 pk 是否满足相对于A是共轭的。
定理:共轭算法产生的解序列{ xk }满足一下性质:
1. rTkri=0i=0,1,2...k−1
2. pTkApi=0i=0,1,2...k−1
即当前步骤产出的残差和之前所有残差正交;当前搜索方向和之前所有方向共轭。
证明:首先回顾一下在共轭方向算法中的一个性质
rTkpi=0i=0,1,2...k−1
即当前步骤的残差方向和之前所有的搜索方向正交。
性质1证明:由于
pk=−rk+βkpk−1 则有
rk=−pk+βkpk−1 ,两边同时乘上
ri 可以推出
rTirk=rTi(−pk+βkpk−1)
根据上述性质,显而易见结果为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+βkpk−1)pTkApk=rTkrkpTkApk
改进思路2:由于
rk+1=rk+αkApk 可以得到
Apk=rk+1−rkαk
βk+1=rTk+1ApkpTkApk=rTk+1ApkpTkApk=rTk+1(rk+1−rk)αkpTkApk=rTk+1rk+1rTkrk
最后一步变换根据
改进思路1和上述性质1。
因此最后的算法为:
1. 初始化
x0
2.
r0=Ax0−b,p0=r0,k=0
3. while
rk≠0
αk=rTkrkpTkApk
xk+1=xk+αkpk
rk+1=Axk+1−b
β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方法
算法如下:
主要改变如上图红框所示
1. 计算步长 αk 不一定能找到最优步长,可以采用wolf 条件进行计算。
2. 残差的计算可以直接用梯度代替。
3. 重点是需要保证每一步的搜索方向都满足下降,否则不保证收敛。选择强wolf条件可以保证上述约束
FR其他变种
主要思路优化 βk 的计算。
总结
共轭梯度算法可以认为解决了一类特殊最优化问题: minϕ(x)=12xTAx−bTx ,并且矩阵A对称且正定。
解决思路和lineSearch比较相似,首先确定搜索方向然后计算步长。CG特别的地方在于搜索方向相对于A共轭,并且步长均选择为最优步长。其收敛速度线性。通过本节内容需要了解
1. CG算法解决问题的形式
2. 共轭性
3. 共轭方向算法
4. 共轭梯度算法以及正确性证明
5. 收敛性