数值计算之 共轭梯度法(1)线性共轭梯度法
數(shù)值計(jì)算之 共軛梯度法(1)線性共軛梯度法
- 前言
- 共軛梯度法的引出
- 線性共軛梯度法
- 共軛向量組構(gòu)造
- 線性共軛梯度流程
- 補(bǔ)充:線性共軛梯度法的簡(jiǎn)化
前言
本篇繼續(xù)無(wú)約束優(yōu)化算法學(xué)習(xí),線性共軛梯度法。
共軛梯度法的引出
回顧之前的牛頓法、擬牛頓法,目的都是尋找迭代方向。牛頓法中的HΔx=JH\Delta x=JHΔx=J,高斯牛頓的JJTp=?JfJJ^Tp=-JfJJTp=?Jf,都涉及到一個(gè)解方程組的問題。如果方程組是線性的,則解線性方程組Ax=bAx=bAx=b的問題可以轉(zhuǎn)化為一個(gè)優(yōu)化問題:
Ax=b→arg?min?xf(x)=12xTAx?bTxbecause?f(x)=Ax?b=0whenf(x)=min?f(x)Ax=b \\ \to \argmin_{x} f(x) = \frac{1}{2}x^TAx-b^Tx \\ \quad \\ because \quad \nabla f(x)=Ax-b=0 \\ when \quad f(x)=\min f(x) Ax=b→xargmin?f(x)=21?xTAx?bTxbecause?f(x)=Ax?b=0whenf(x)=minf(x)
在梯度下降法中,迭代過(guò)程可能出現(xiàn)下圖的折線。這是因?yàn)樘荻认陆捣ㄖ豢紤]了一階梯度,當(dāng)前迭代的方向可能與上次迭代的方向線性相關(guān),使得迭代過(guò)程來(lái)回抖動(dòng)。
即使通過(guò)線搜索方法得到最優(yōu)步長(zhǎng)時(shí),相鄰兩次迭代的梯度正交,如下圖所示,將增量進(jìn)行分解,不朝向極值點(diǎn)的分量仍然會(huì)導(dǎo)致抖動(dòng)。
這里證明一下精確線搜索的梯度下降法,兩次梯度正交:
最優(yōu)步長(zhǎng)處,f關(guān)于α的導(dǎo)數(shù)為0f′(xk+1)=f′(xk+α(??f(xk)))=0→f′(xk+α(??f(xk))=??f(xk)T?f(xk+1)=0最優(yōu)步長(zhǎng)處,f關(guān)于\alpha的導(dǎo)數(shù)為0 \\ f' (x_{k+1})=f'(x_k+\alpha (-\nabla f(x_k)))=0 \\ \to f'(x_k+\alpha (-\nabla f(x_k))= -\nabla f(x_k)^T\nabla f(x_{k+1}) =0 最優(yōu)步長(zhǎng)處,f關(guān)于α的導(dǎo)數(shù)為0f′(xk+1?)=f′(xk?+α(??f(xk?)))=0→f′(xk?+α(??f(xk?))=??f(xk?)T?f(xk+1?)=0
共軛梯度法要解決的就是生成下面這條綠線的迭代過(guò)程。
線性共軛梯度法
對(duì)于對(duì)稱正定矩陣AAA,如果存在一個(gè)向量組{δn},δiTAδj=0\{ \delta _n\},\delta_i^TA\delta_j=0{δn?},δiT?Aδj?=0對(duì)于任意兩個(gè)不同的向量都成立,稱向量組是AAA的共軛向量組。共軛向量組是線性無(wú)關(guān)的,可以用反證法證明:
ifd1=λ2d2+?+λndnthendiTAdj=(λ2d2+?+λndn)TAdj=λdjTAdj=0then?j,dj=0?if \quad d_1=\lambda_2d_2+\dots+\lambda_nd_n \\ then \quad d_i^TAd_j=(\lambda_2d_2+\dots+\lambda_nd_n)^TAd_j \\ = \lambda d_j^TAd_j=0 \\ then \quad \forall j, \quad d_j=\vec 0 ifd1?=λ2?d2?+?+λn?dn?thendiT?Adj?=(λ2?d2?+?+λn?dn?)TAdj?=λdjT?Adj?=0then?j,dj?=0
共軛梯度法證明了對(duì)于二次型的優(yōu)化問題,可以通過(guò)構(gòu)造共軛向量組{δn}\{ \delta _n\}{δn?},依次沿著每個(gè)共軛向量(梯度)上優(yōu)化后,就能得到極小值。也就是說(shuō),迭代nnn次后就能得到結(jié)果。
共軛向量組構(gòu)造
第一個(gè)共軛向量可以通過(guò)梯度下降法獲得p0p_0p0?,梯度下降法得到的相鄰梯度是正交的(線性無(wú)關(guān)),因此可以用來(lái)構(gòu)造共軛向量:
α0通過(guò)精確線搜索獲得p0=??f(x0)p^1=??f(x0+α0p0)p1=p^1+β1p0=?f(x0+α0p0)?β1p0p0TAp1=0β1p0TAp0?p0TA?f(x0+α0p0)=0β1=p0TA?f(x0+α0p0)p0TAp0\alpha_0通過(guò)精確線搜索獲得 \\ p_0 = -\nabla f(x_0) \\ \hat p_1=-\nabla f(x_0+\alpha_0 p_0) \\ p_1 =\hat p_1 + \beta_1p_0=\nabla f(x_0+\alpha_0 p_0)-\beta_1p_0 \\ \quad \\ p_0^TAp_1=0 \\ \beta_1p_0^TAp_0 - p_0^TA\nabla f(x_0+\alpha_0 p_0)=0 \\ \quad \\ \beta_1 = \frac{p_0^TA\nabla f(x_0+\alpha_0 p_0)}{p_0^TAp_0} \\ \quad \\ α0?通過(guò)精確線搜索獲得p0?=??f(x0?)p^?1?=??f(x0?+α0?p0?)p1?=p^?1?+β1?p0?=?f(x0?+α0?p0?)?β1?p0?p0T?Ap1?=0β1?p0T?Ap0??p0T?A?f(x0?+α0?p0?)=0β1?=p0T?Ap0?p0T?A?f(x0?+α0?p0?)?
然后迭代構(gòu)造每一步的共軛向量:
αk通過(guò)精確線搜索獲得pk+1=βk+1pk+p^k+1βk+1=pkTA?f(xk+αkpk)pkTApk\alpha_k通過(guò)精確線搜索獲得 \\ p_{k+1} = \beta_{k+1} p_{k}+\hat p_{k+1} \\ \beta_{k+1}=\frac{p_k^T A \nabla f(x_k+\alpha_kp_k)}{p_k^TAp_k} αk?通過(guò)精確線搜索獲得pk+1?=βk+1?pk?+p^?k+1?βk+1?=pkT?Apk?pkT?A?f(xk?+αk?pk?)?
可以證明,上面的迭代出的共軛向量可以構(gòu)成共軛向量組。
然后通過(guò)精確線搜索獲得αk+1\alpha_{k+1}αk+1?:
αk+1=pk+1Tp^k+1pk+1TApk+1\alpha_{k+1}=\frac{p_{k+1}^T\hat p_{k+1}}{p_{k+1}^TAp_{k+1}} αk+1?=pk+1T?Apk+1?pk+1T?p^?k+1??
線性共軛梯度流程
補(bǔ)充:線性共軛梯度法的簡(jiǎn)化
前面推導(dǎo)的時(shí)候,沒有用到線性條件?f(x)=Ax?b\nabla f(x)=Ax-b?f(x)=Ax?b,這里可以進(jìn)行簡(jiǎn)化。首先給出簡(jiǎn)化后的精確線搜索步長(zhǎng):
f′(xk+αkpk)=pkT?f(xk+αkpk)=0→pkT(A(xk+αkpk)?b)=0→pkTAxk+αkpkTApk=pkTb→αk=pkT(b?Axk)pkTApksetb?Axk=rk,αk=rkTpkpkTApkf'(x_k+\alpha_k p_k)=p_k^T\nabla f(x_k+\alpha_k p_k)=0 \\ \to p_k^T(A(x_k+\alpha_k p_k)-b)=0 \\ \to p_k^TAx_k+\alpha_k p_k^TAp_k=p_k^Tb \\ \quad \\ \to \alpha_k=\frac {p_k^T(b-Ax_k)}{p^T_kAp_k} \\ set \quad b-Ax_k=r_k, \quad \alpha_k = \frac {r^T_kp_k}{p^T_kAp_k} f′(xk?+αk?pk?)=pkT??f(xk?+αk?pk?)=0→pkT?(A(xk?+αk?pk?)?b)=0→pkT?Axk?+αk?pkT?Apk?=pkT?b→αk?=pkT?Apk?pkT?(b?Axk?)?setb?Axk?=rk?,αk?=pkT?Apk?rkT?pk??
然后構(gòu)造共軛梯度向量:
pk+1=?f(xk+αkpk)+βk+1pkandpkTApk+1=0→pkTA?f(xk+αkpk)+βk+1pkTApk=0→βk+1pkTApk=?pkTA?f(xk+αkpk)βk+1=?pkTA?f(xk+αkpk)pkTApk=?pkTA(Axk+1?b)pkTApk=rk+1TApkpkTApkp_{k+1}=\nabla f(x_{k}+\alpha_kp_k)+\beta_{k+1} p_k \\ and \quad p_{k}^TAp_{k+1}=0 \\ \to p_k^TA\nabla f(x_{k}+\alpha_kp_k)+\beta_{k+1} p_k^TAp_k=0 \\ \to \beta_{k+1} p_k^TAp_k= -p_k^TA\nabla f(x_{k}+\alpha_kp_k) \\ \quad \\ \beta_{k+1} = -\frac{p_k^TA\nabla f(x_{k}+\alpha_kp_k)}{p_k^TAp_k} \\ \quad \\ = -\frac {p_k^TA(Ax_{k+1}-b)}{p_k^TAp_k} \\ = \frac {r_{k+1}^TAp_{k}}{p_k^TAp_k} \\ pk+1?=?f(xk?+αk?pk?)+βk+1?pk?andpkT?Apk+1?=0→pkT?A?f(xk?+αk?pk?)+βk+1?pkT?Apk?=0→βk+1?pkT?Apk?=?pkT?A?f(xk?+αk?pk?)βk+1?=?pkT?Apk?pkT?A?f(xk?+αk?pk?)?=?pkT?Apk?pkT?A(Axk+1??b)?=pkT?Apk?rk+1T?Apk??
最后梳理一下:
總結(jié)
以上是生活随笔為你收集整理的数值计算之 共轭梯度法(1)线性共轭梯度法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb java报授权,mong
- 下一篇: 函数参数的值传递和地址传递