共轭梯度算法
介绍
在数值线性代数中,共轭梯度算法是一种求解对称正定线性方程 组
Ax=b
的迭代方法。
事实上,求解
Ax=b
等价于求解
min 12xTAx+bTx
,于是解方程问题就转化为了求解二次规划问题(QP)。
共轭梯度算法是介于梯度下降与牛顿法之间的一个方法,是一个一阶方法。它克服了梯度下降法收敛慢的缺点,又避免了存储和计算牛顿法所需要的二阶导数信息。
在
n
维的优化问题中,共轭梯度法最多
n
次迭代就能找到最优解(是找到,不是接近),但是只针对二次规划问题。
共轭梯度算法的思想就是找到
n
个两两共轭的共轭方向,每次沿着一个方向优化得到该方向上的极小值,后面再沿着其它方向求解极小值的时候,不会影响前面已经得到的沿那些方向上的极小值,所以理论上对
n
个方向都求解出极小值就能得到
n
维问题的极小值。
算法推到过程
目标函数:
min 12xTAx+bTx
其中
A
为对称正定矩阵。
如果已经有
n
个关于
A
共轭的基向量
p0,p1,…,pn−1
,它们相互共轭(即
<pi,pj>=pTiApj=0,i≠j
)且线性无关。因此有
∀x∈Rn
,有
x=∑n−1i=0aipi
目标函数可以改写为:
==mina0,…,an−112(∑i=0n−1aipi)TA(∑j=0n−1ajpj)−bT(∑i=0n−1aipi)mina0,…,an−112∑i=1n−1∑j=1n−1aiajpTiApj−∑i=0n−1aibTpimina0,…,an−112∑i=0n−1(a2ipTiApi−aibTpi)
由于上式中各个部分独立,于是等价于优化问题:
minai 12a2ipTiApi−aibTpii=0,1,…,n−1
求解可得:
ai=bTpipTiApi
所以给定
p0,p1,…,pn−1
就可以计算优化问题的解
x=∑n−1i=0bTpipTiApipi
,即为原线性方程组的解。
接下来的问题就是如何得到
p0,p1,…,pn−1
,这可以通过Gram-Schmit算法从一组线性无关向量
r0,r1,…,rn−1
得到。
于是需要解决下面两个问题:
- 如何构造一组线性无关向量
r0,r1,…,rn−1
- 如何由
r0,r1,…,rn−1
计算
p0,p1,…,pn−1
如何构造一组线性无关向量
r0,r1,…,rn−1
做如下构造:
ri=b−Axixi=∑k<iakpki=0,1,…,n−1
其中
x0=0
,
xn=∑k<nakpk
为优化问题的解
下证
r0,r1,…,rn−1
线性无关:
不妨设
ri≠0,i=0,1,…,n−1
,否则若
ri=b−Axi=0
,则
xi
为优化问题解。用数学归纳法证明
-
r0≠0
,所以
r0
本身线性无关
- 当
r0,r1,…,ri
线性无关,注意到
ri+1=b−Axi+1=b−A(xi+aipi)=ri−aiApi
于是有
ri+1=ri−aiApi=ri−1−ai−1Api−1−aiApi=⋯=r0−∑k=0iakApk
上式两边和
pk,k<i+1
做内积有
pTkri+1=pTkr0−apTkApk=pTkb−bTpk=0
故可知
ri+1⊥span{p0,p1,…,pi}
由于
p0,p1,…,pi
由
r0,r1,…,ri
正交化通过Gram-Schmit算法构造,有
span{p0,p1,…,pi}=span{r0,r1,…,ri}
故有
ri+1⊥span{r0,r1,…,ri}
又由于
ri+1≠0
,所以
r0,r1,…,ri+1
线性无关
由数学归纳法知
r0,r1,…,rn−1
线性无关
如何由
r0,r1,…,rn−1
计算
p0,p1,…,pn−1
取
p0=r0
,假设已知
p0,p1,…,pi−1
,由Gram-Schmit过程知:
pi=ri−∑k<iβkpk
其中
βk=<pk,ri><pk,pk>=pTkAripTkApk
既有
pi=ri−∑k<ipTkAripTkApkpk(1)
现在化简
βk
,因为
βk
的分子分母都要进行矩阵和向量乘法,需要很高计算量。
注意到:
ri+1=b−Axi+1=b−A(xi+aipi)=ri−aiApi(2)
以及
∀k<i
pTkrk=pTk(b−Axi)=pTkb−pTkA(∑j<iajpj)=pTkb−akpTkApk=0(3)
pTkAri=(Apk)Tri=(2)=1ak(rk−rk+1)Tri(4)
rTkri=(1)(pk+∑j<kβjpj)Tri=(3)0(5)
所以有
pTkAri=0∀k<i−1pTi−1Ari=−1ai−1rTiri
pTkApk=pTkA(rk−∑j<kβjpj)=pTkArk=(4)1ak(rk−rk−1)Trk=(5)1akrTkrk
所以
pi=ri+rTirirTi−1ri−1pi−1
ai=bTpipTiApi=(ri+Axi)TpipTiApi=rTipi+(∑k<iakpk)TApipTiApi=rTi(ri−∑k<iβkpk)pTiApi=(3)=rTiripTiApi
算法
- 初始条件:
x0=0,r0=b,p0=r0
- 迭代:
a=rTiripTiApi,xi+1=xi+aipi,ri+1=ri−aiApi,pi+1=ri+rTi+1ri+1rTiripi