共轭梯度法(CG)详解
共軛梯度法(CG)詳解
這篇文章寫得不錯(cuò),建議收藏。想要了解 CG,把它認(rèn)認(rèn)真真讀一遍,就很清楚了。
文章目錄
- 共軛梯度法(CG)詳解
- 線性共軛梯度法
- 共軛方向
- 共軛方向法
- CG 方法
- 收斂率
- 預(yù)條件
- 非線性共軛梯度法
- FR 方法
- 其他非線性 CG
- PR+ 方法
- 重啟動(dòng)
之前寫過幾個(gè)關(guān)于共軛梯度法的注記,譬如:
- https://blog.csdn.net/lusongno1/article/details/78550803
- https://blog.csdn.net/lusongno1/article/details/68942821
但事實(shí)上很多人反應(yīng),看得一頭霧水,基于此,本篇文章旨在對(duì)于共軛梯度方法從優(yōu)化的角度給一個(gè)干凈的描述。
線性共軛梯度法
線性共軛梯度方法是 Hestenes 和 Stiefel 在 20 世紀(jì) 50 年代提出來的的一個(gè)迭代方法,用于求解正定系數(shù)矩陣的線性系統(tǒng)。
假定 AAA 是對(duì)稱正定的矩陣,求解線性方程組
Ax=bA x=b Ax=b
等價(jià)于求解如下凸優(yōu)化問題:
min??(x)≡12xTAx?bTx\min \phi(x) \equiv \frac{1}{2} x^{T} A x-b^{T} x min?(x)≡21?xTAx?bTx
該問題的梯度便是原線性系統(tǒng)的殘差,
??(x)=Ax?b≡r(x)\nabla \phi(x)=A x-b \equiv r(x) ??(x)=Ax?b≡r(x)
在 x=xkx=x_kx=xk? 點(diǎn), rk=Axk?br_{k}=A x_{k}-brk?=Axk??b。
共軛方向
定義 對(duì)于非零向量集合 {p0,p1,?,pt}\left\{p_{0}, p_{1}, \cdots, p_{t}\right\}{p0?,p1?,?,pt?} 關(guān)于對(duì)稱正定矩陣 AAA 是共軛的,若
piTApj=0,for?all?i≠j.p_{i}^{T} A p_{j}=0, \quad \text { for all } i \neq j . piT?Apj?=0,?for?all?i=j.
容易證明,共軛向量之間是線性獨(dú)立的。
假設(shè)已經(jīng)有了一組共軛向量,我們把未知量表示為它們的線性組合 x=∑i=1nαipix=\sum_{i=1}^{n} \alpha^{i} p_{i}x=∑i=1n?αipi?,我們希望能夠?qū)ふ乙唤M系數(shù),去極小化
?(x)=∑i=1n((αi)22piTApi?αipiTb)\phi(x)=\sum_{i=1}^{n} \left(\frac{\left(\alpha^{i}\right)^{2}}{2} p_{i}^{T} A p_{i}-\alpha^{i} p_{i}^{T} b\right) ?(x)=i=1∑n?(2(αi)2?piT?Api??αipiT?b)
求和中的每一項(xiàng)都是獨(dú)立的,極小化之,那么我們就可以得到
αi=piTbpiTApi\alpha^{i}=\frac{p_{i}^{T} b}{p_{i}^{T} A p_{i}} αi=piT?Api?piT?b?
通過共軛方向,把一個(gè) n 維問題,拆解成了 n 個(gè)一維問題。
從矩陣的角度來看這個(gè)問題,我們把自變量做一個(gè)變換,
x^=S?1x\hat{x}=S^{-1} x x^=S?1x
其中,SSS 由共軛向量張成,
S=[p0,p1,?,pn?1]S=\left[p_{0}, p_{1}, \cdots, p_{n-1}\right] S=[p0?,p1?,?,pn?1?]
那么二次問題變?yōu)?#xff0c;
?^(x^)≡?(Sx^)=12x^T(STAS)x^?(STb)Tx^\hat{\phi}(\hat{x}) \equiv \phi(S \hat{x})=\frac{1}{2} \hat{x}^{T}\left(S^{T} A S\right) \hat{x}-\left(S^{T} b\right)^{T} \hat{x} ?^?(x^)≡?(Sx^)=21?x^T(STAS)x^?(STb)Tx^
由共軛性,我們知道矩陣 STASS^{T} A SSTAS 是個(gè)對(duì)角矩陣,那么久變成了一個(gè)對(duì)角矩陣系數(shù)的極簡(jiǎn)方程。
共軛方向法
所謂的共軛方向法,就是給定初值點(diǎn) x0x_0x0? 和一組共軛方向,我們通過如下方式迭代更新 xkx_kxk?:
xk+1=xk+αkpkx_{k+1}=x_{k}+\alpha_{k} p_{k} xk+1?=xk?+αk?pk?
αk=?rkTpkpkTApk\alpha_{k}=-\frac{r_{k}^{T} p_{k}}{p_{k}^{T} A p_{k}} αk?=?pkT?Apk?rkT?pk??
1、這里的步長(zhǎng) αk\alpha_kαk? 是二次函數(shù) ?\phi? 沿著 xk+αpkx_{k}+\alpha p_{k}xk?+αpk? 的一維的極小化,我們一般稱之為精確線搜索步長(zhǎng)。
2、理論上,精確線搜索方法至多 n 步收到到線性系統(tǒng)的解。忽略證明。
對(duì)于共軛方向法來說,有如下定理。
定理: x0∈?nx_{0} \in \Re^{n}x0?∈?n 是任意起點(diǎn), {xk}\left\{x_{k}\right\}{xk?} 通過共軛方向法生成,那么
rkTpi=0,for?i=0,1,?,k?1,r_{k}^{T} p_{i}=0, \text { for } i=0,1, \cdots, k-1, rkT?pi?=0,?for?i=0,1,?,k?1,
且 xkx_{k}xk? 在集合
{x∣x=x0+span?{p0,p1,?,pk?1}}.\left\{x \mid x=x_{0}+\operatorname{span}\left\{p_{0}, p_{1}, \cdots, p_{k-1}\right\}\right\} . {x∣x=x0?+span{p0?,p1?,?,pk?1?}}.
上,關(guān)于 ?(x)=12xTAx?bTx\phi(x)=\frac{1}{2} x^{T} A x-b^{T} x?(x)=21?xTAx?bTx 的極小化。
CG 方法
共軛方向法的共軛方向如何得到呢?共軛梯度方法(Conjugate Gradient,CG)方法是一個(gè)特別的共軛方向法:它的共軛方向是在 xkx_kxk? 的迭代中一個(gè)一個(gè)生成出來的,并且 pkp_kpk? 的計(jì)算只用到 pk?1p_{k-1}pk?1?。
它的思想在于,選取當(dāng)前共軛方向?yàn)樨?fù)梯度方向和前一個(gè)共軛方向的線性組合,
pk=?rk+βkpk?1p_{k}=-r_{k}+\beta_{k} p_{k-1} pk?=?rk?+βk?pk?1?
將其左乘 pk?1TAp_{k-1}^{T} Apk?1T?A,由 pkp_kpk? 與 pk?1p_{k-1}pk?1? 的共軛性,可以得到組合系數(shù):
βk=rkTApk?1pk?1TApk?1\beta_{k}=\frac{r_{k}^{T} A p_{k-1}}{p_{k-1}^{T} A p_{k-1}} βk?=pk?1T?Apk?1?rkT?Apk?1??
在這個(gè)過程中,選擇 p0p_0p0? 為 x0x_0x0? 處負(fù)梯度方向,結(jié)合前面的介紹,就可以得到線性共軛梯度方法。
注意到梯度和共軛方向的一些關(guān)系:
rkTri=0,?i=0,?,k?1span?{r0,r1,?,rk}=span?{r0,Ar0,?,Akr0}span?{p0,p1,?,pk}=span?{r0,Ar0,?,Akr0}pkTApi=0,?i=0,1,?,k?1.\begin{aligned} r_{k}^{T} r_{i} &=0, \quad \forall i=0, \cdots, k-1 \\ \operatorname{span}\left\{r_{0}, r_{1}, \cdots, r_{k}\right\} &=\operatorname{span}\left\{r_{0}, A r_{0}, \cdots, A^{k} r_{0}\right\} \\ \operatorname{span}\left\{p_{0}, p_{1}, \cdots, p_{k}\right\} &=\operatorname{span}\left\{r_{0}, A r_{0}, \cdots, A^{k} r_{0}\right\} \\ p_{k}^{T} A p_{i} &=0, \quad \forall i=0,1, \cdots, k-1 . \end{aligned} rkT?ri?span{r0?,r1?,?,rk?}span{p0?,p1?,?,pk?}pkT?Api??=0,?i=0,?,k?1=span{r0?,Ar0?,?,Akr0?}=span{r0?,Ar0?,?,Akr0?}=0,?i=0,1,?,k?1.?
通過一些簡(jiǎn)單的推導(dǎo),替換掉 CG 算法中的一些表達(dá),就得到了如下的 CG 方法的更加經(jīng)濟(jì)的實(shí)用形式,
收斂率
定義條件數(shù):
κ(A)=∥A∥2∥A?1∥2=λnλ1\kappa(A)=\|A\|_{2}\left\|A^{-1}\right\|_{2}=\frac{\lambda_{n}}{\lambda_{1}} κ(A)=∥A∥2?∥∥?A?1∥∥?2?=λ1?λn??
那么,CG 的收斂率可以表達(dá)為:
∥xk?x?∥A≤2(κ(A)?1κ(A)+1)k∥x0?x?∥A\left\|x_{k}-x^{*}\right\|_{A} \leq 2\left(\frac{\sqrt{\kappa(A)}-1}{\sqrt{\kappa(A)}+1}\right)^{k}\left\|x_{0}-x^{*}\right\|_{A} ∥xk??x?∥A?≤2(κ(A)?+1κ(A)??1?)k∥x0??x?∥A?
由表達(dá)式可以看出,當(dāng) AAA 條件數(shù)很大的時(shí)候,前面的系數(shù)趨近于 1,收斂速度無法保證。
預(yù)條件
所謂的預(yù)條件,就是希望對(duì)矩陣 AAA 做一個(gè)改造,改進(jìn)特征值分布,讓它的條件數(shù)小一些。
具體地,引入一個(gè)非奇異矩陣 CCC,做變量替換,
x^=Cx.\hat{x}=C x . x^=Cx.
二次問題就變?yōu)榱?#xff0c;
?^(x^)=12x^T(C?TAC?1)?1x^?(C?Tb)Tx^\hat{\phi}(\hat{x})=\frac{1}{2} \hat{x}^{T}\left(C^{-T} A C^{-1}\right)^{-1} \hat{x}-\left(C^{-T} b\right)^{T} \hat{x} ?^?(x^)=21?x^T(C?TAC?1)?1x^?(C?Tb)Tx^
其對(duì)應(yīng)的線性系統(tǒng)是,
(C?TAC?1)x^=C?Tb\left(C^{-T} A C^{-1}\right) \hat{x}=C^{-T} b (C?TAC?1)x^=C?Tb
我們要做的,就是找一個(gè)逆比較好求的 CCC,使得 C?TAC?1C^{-T} A C^{-1}C?TAC?1 特征值分布更集中。落實(shí)到實(shí)用算法上,得到:
注意到,這里沒有顯式用到 CCC,而是用到了
M=CTCM = C^TCM=CTC
性質(zhì)中的殘差的正交性表達(dá)也發(fā)生了改變,
riTM?1rj=0for?all?i≠jr_{i}^{T} M^{-1} r_{j}=0 \text { for all } i \neq j riT?M?1rj?=0?for?all?i=j
非線性共軛梯度法
求解非線性極小化問題:
min?f(x)\min f(x) minf(x)
fff 此時(shí)是非線性函數(shù)。
FR 方法
相對(duì)于共軛梯度法,我們做兩點(diǎn)改動(dòng):
-
對(duì)于步長(zhǎng) αk\alpha_kαk?,我們需要采取一種線搜索方法沿著 pkp_kpk? 去逼近非線性目標(biāo)函數(shù) fff 的極小。(滿足所謂的強(qiáng) wolfe 條件的步長(zhǎng))
-
殘差 rrr 原來是線性 CG 方法的梯度,現(xiàn)在需要用 fff 的梯度來替代它。
那么我們就得到了第一個(gè)非線性共軛梯度法,它是 Fletcher 和 Reeves 在 20 世紀(jì) 60 年代搞的。
對(duì)于 FR 方法,如果某步的方向不太好或者步長(zhǎng)太小,那么下一步的方向和步長(zhǎng)也會(huì)很糟糕。
其他非線性 CG
除了 PR 方法,我們選取不同的組合系數(shù) β\betaβ,就能得到不同的非線性 CG 方法。
PR 方法:
βk+1PR=?fk+1T(?fk+1??fk)∥?fk∥2.\beta_{k+1}^{P R}=\frac{\nabla f_{k+1}^{T}\left(\nabla f_{k+1}-\nabla f_{k}\right)}{\left\|\nabla f_{k}\right\|^{2}} . βk+1PR?=∥?fk?∥2?fk+1T?(?fk+1???fk?)?.
HS 方法:
βk+1HS=?fk+1T(?fk+1??fk)(?fk+1??fk)Tpk\beta_{k+1}^{H S}=\frac{\nabla f_{k+1}^{T}\left(\nabla f_{k+1}-\nabla f_{k}\right)}{\left(\nabla f_{k+1}-\nabla f_{k}\right)^{T} p_{k}} βk+1HS?=(?fk+1???fk?)Tpk??fk+1T?(?fk+1???fk?)?
DY 方法:
βk+1DY=?fk+1T?fk+1(?fk+1??fk)Tpk\beta_{k+1}^{D Y}=\frac{\nabla f_{k+1}^{T} \nabla f_{k+1}}{\left(\nabla f_{k+1}-\nabla f_{k}\right)^{T} p_{k}} βk+1DY?=(?fk+1???fk?)Tpk??fk+1T??fk+1??
容易觀察到,這四種方法無非是兩個(gè)分子和兩個(gè)分母的四種組合。
我們指出以下幾點(diǎn):
- DY 方法是我們所的戴彧虹和袁亞湘老師提出的。
- 對(duì)于 fff 是強(qiáng)凸的二次問題,若采用精確想搜索,那么 PR-CG 和 HS-CG 是一個(gè)東西。
- 數(shù)值實(shí)驗(yàn)表明,PR 更魯棒更有效。
- PR 方法其實(shí)就是在 FR 的基礎(chǔ)上,當(dāng)遇到前后兩步梯度變化比較小的壞條件的時(shí)候,重新開始梯度下降的 “重啟動(dòng)” 方法。
- PR 方法可能不收斂。
PR+ 方法
若要保證 pkp_kpk? 是下降方向,我們只需要為 PR 的 β\betaβ 進(jìn)行微調(diào):
βk+1+=max?{βk+1PR,0}\beta_{k+1}^{+}=\max \left\{\beta_{k+1}^{P R}, 0\right\} βk+1+?=max{βk+1PR?,0}
稱之為 PR+ 方法。
重啟動(dòng)
一個(gè)重啟動(dòng)的方式是,每迭代 nnn 步,就設(shè)置 βk=0\beta_{k}=0βk?=0,即取迭代方向?yàn)樽钏傧陆捣较颉V貑?dòng)能抹掉一些舊的信息。但是這種重啟動(dòng),沒有什么實(shí)際的意義,只能說是一種理論的貢獻(xiàn)。因?yàn)榇蟛糠智闆r下 nnn 很大,可能不需要迭代多少個(gè) nnn 步,差不多就達(dá)到了比較好的逼近解。
另外一個(gè)重新啟動(dòng)是基于前后兩步的梯度不正交的考慮,即當(dāng)遇到
∣?fkT?fk?1∣∥?fk∥2≥0.1\frac{\left|\nabla f_{k}^{T} \nabla f_{k-1}\right|}{\left\|\nabla f_{k}\right\|^{2}} \geq 0.1∥?fk?∥2∣∣??fkT??fk?1?∣∣??≥0.1
我們進(jìn)行一個(gè)重啟動(dòng)。
總結(jié)
以上是生活随笔為你收集整理的共轭梯度法(CG)详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五季2:STA模式USB-WIFI网卡
- 下一篇: 用计算机计算出密码,自带计算器的密码