共轭梯度法
共轭方向法中,最大的问题在于寻找一组彼此独立的向量
u1,...,un
,如果选取不当,那么和高斯消元法就没有区别了。共轭梯度法 (Conjugate Gradient)实际上是一种特殊的共轭方向法,它取
ui=r(i)
。
首先为何残差是彼此独立的?首先,由于共轭方向法每次(A正交地)消除了一个维度上的误差,所以有
dTiAe(j)=0(i<j)
由于
r(j)=−Ae(j)
,于是有
dTir(j)=0
。另外,由于现在的
ui=r(i)
,所以
span{d1,...,dn}=span{ui,...,un}=span{r(1),...,r(n)}
r(j)
和
di(i<j)
张成的子空间正交,因此也和所有的
r(i)(i<j)
正交。
共轭梯度法和最速下降法的区别
这里我产生的一个疑问是,残差其实就是梯度的(反)方向,既然当次迭代的梯度方向总是和之前的梯度方向垂直,那么它和最速下降法有什么区别?为何最速下降法会出现“之”字形的迭代路线?我认为是这样的。首先,在最速下降法中,当次迭代的梯度方向也是和上次迭代梯度方向垂直,但和再之前的梯度方向就不垂直了,所以会有“之”形路线。然后,共轭梯度法要求的是关于矩阵正交,并非直接正交。在上一节的图中,我们可以看到关于矩阵正交的形状,通过拉伸,可以看到,它才能真正的分离维度,普通的正交反而是有偏差的。共轭方向法将本来普通正交的梯度向量,调整为新的关于矩阵正交,虽然张成的空间是一样的,但方向更加合理,所以能保证在
n
步内迭代收敛。
共轭梯度法的优势
于是我们可以看到,起码共轭梯度法作为一种特殊的共轭方向法,是没有错误的。那共轭梯度法有什么优势呢?
先来看一个有趣的性质。在上一节的末尾,我们提到了迭代更新残差的方法:
r(i+1)=r(i)−α(i)Adi
注意到新的残差(或梯度)引入了一个新的维度(因为新的搜索方向和之前所有梯度张成的空间关于矩阵正交)。即假设
span{r(0),...,r(i+1)}=D(i+1)
,那么有
rank(D(i+1))=rank(D(i))+1
。显然
r(i)∈D(i)
,新维度只能来源于
Adi
,而
di∈D(i)
,所以
A
带来的变换引入了新维度。引申开来,不难得到
D(i)=span{d1,...,dn}=span{d1,Ad1,A2d1,...,Ai−1d1}=span{r(1),Ar(1),A2r(1),...,Ai−1r(1)}
诸如此类的,由一个向量反复乘以同样的矩阵变换张成的子空间被成为克雷洛夫子空间 (Krylov Subspace)。这样的子空间有一个很好的性质,那就是施密特正交化法会变得非常容易。
在上一节中,我们给出了施密特正交化法的参数表达式,
βij=r(i)AdjdTjAdj
由于
rT(i)r(j+1)=rT(i)(r(j)−α(j)Adj)=rT(i)r(j)−α(j)rT(i)AdjrT(i)Adj=1α(j)[rT(i)r(j)−rT(i)r(j+1)]
由于
i>j
,所以
(i=j+1):βij=−1α(j)rT(i)r(i)dTjAdj(i>j+1):βij=0
这样,共轭梯度法作为一种特殊的共轭方向法,解决了施密特正交化法速度慢的问题。当然
α(j)
的表达式和之前是一致的,即
α(j)=dTjr(j)dTjAdj
代入
α(j)
,得到
βi=βi,i−1=−rT(i)r(i)dTi−1r(i−1)=−rT(i)r(i)rT(i−1)r(i−1)