conjugate gradient method (共軛梯度法)


轉自:http://blog.csdn.net/u010922186/article/details/43852707

共軛梯度法(Conjugate Gradient)是介於最速下降法牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。 在各種優化算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有步收斂性,穩定性高,而且不需要任何外來參數。

 

http://www.willnaylor.com/wnlib.html中有可以直接使用的代碼和數據包。(在后續的文檔中將詳細介紹如何使用相應的數據包)

 

共軛梯度法最早是由Fletcher和Reeves(1964)首先提出了解非線性最優化問題的共軛梯度法。由於共軛梯度法不需要矩陣存儲,且有較快的收斂速度和二次終止性等優點,現在共軛梯度法已經廣泛地應用於實際問題中。軛梯度法是一個典型的共軛方向法,它的每一個搜索方向是互相共軛的,而這些搜索方向d僅僅是負梯度方向與上一次迭代的搜索方向的組合,因此,存儲量少,計算方便。

 

最速下降法在《自適應信號處理》中有詳細的介紹,這里簡單回顧一下:

1.最速下降方向

   函數f(x)在點x處沿方向d的變化率可用方向導數來表示。對於可微函數,方向導數等於梯度與方向的內積,即:Df(x;d) = ▽f(x)Td,因此,求函數f(x)在點x處的下降最快的方向,可歸結為求解下列非線性規划:min f(x)Tds.t.  ||d|| ≤ 1。

       當 d = -f(x) / ||f(x)||   時等號成立。因此,在點x處沿上式所定義的方向變化率最小,即負梯度方向為最速下降方向。

 

2.最速下降算法

最速下降法的迭代公式是:x(k+1) = x(k) + λkd(k)

其中d(k)是從x(k)出發的搜索方向,這里取在x(k)處的最速下降方向,即:d = -f(x(k)).

    λk是從x(k)出發沿方向d(k)進行一維搜索的步長,即λk滿足:f(x(k) + λkd(k)) = min f(x(k)d(k))   (λ≥0).

 

計算步驟如下:

(1)給定初點x(1) ∈ Rn,允許誤差ε> 0, 置k = 1

(2)計算搜索方向d = -f(x(k))。

(3)若||d(k)|| ≤ ε,則停止計算;否則,從x(k)出發,沿d(k)進行一維搜索,求λk,使

f(x(k) + λkd(k)) = min f(x(k)d(k))   (λ≥0).

(4)令x(k+1) = x(k) + λkd(k) ,置k = k + 1,轉步驟(2)

 

上面介紹完了最速下降法的基本算法,下面介紹一下共軛梯度法:

 

1.共軛方向:

無約束問題最優化方法的核心問題是選擇搜索方向。以正定二次函數為例,來觀察兩個方向關於矩陣A共軛的幾何意義。

設有二次函數:f(x) = 1/2 (x - x*)TA(x - x*) ,其中An×n對稱正定矩陣,x*是一個定點,函數f(x)的等值面可以表示為:

1/2 (x - x*)TA(x - x*) = c 這是以x*為中心的橢球面,由於f(x) = A(x - x*) = 0x = x*,A正定,因此x*f(x)的極小點。

    設x(1)是在某個等值面上的一點,該等值面在點x(1)處的法向量:f(x(1)) = A(x(1) - x*)又設d(1)是這個等值面在d(1)處的一個切向量。自然,d(1)f(x(1))正交,即d(1)Tf(x(1)) = 0,因此有 d(1)TAd(2) = 0,其中 d(2) = x* - x(1) 等值面上一點處的切向量與由這一點指向極小點的向量關於A共軛。(已知的有d(1)Ax(1),進一步求解d(2)  x*).


                                                                                                                        

 由此可知,極小化式所定義的二次函數,若依次沿着d(1)d(2)進行一維搜索,則經兩次迭代必達到極小點。

 

 1.共軛梯度法
共軛梯度法最初由Hesteness和Stiefel於1952年為求解線性方程組而提出的。后來,人們把這種方法用於求解無約束最優化問題,使之成為一種重要的最優化方法。
Fletcher-Reeves共軛梯度法,簡稱FR法。
共軛梯度法的基本思想是把共軛性與最速下降方法相結合,利用已知點處的梯度構造一組共軛方向,並沿這組方向進行搜素,求出目標函數的極小點。根據共軛方向基本性質,這種方法具有二次終止性。


對於二次凸函數的共軛梯度法:

min f(x) = 1/2 xTAx + bTx + c,

其中x∈ RnA是對稱正定矩陣,c是常數。

相應的求解方法如下:

首先,任意給定一個初始點x(1),計算出目標函數f(x)在這點的梯度,若||g1|| = 0,則停止計算;否則,令

d(1) = -f(x(1)) = -g1

沿方向d(1)搜索,得到點x(2)。計算在x(2)處的梯度,若||g2|| ≠ 0,則利用-g2d(1)構造第2個搜索方向d(2),在沿d(2)搜索。

一般地,若已知點x(k)和搜索方向d(k),則從x(k)出發,沿d(k)進行搜索,得到

x(k+1) = x(k) + λkd(k) ,

其中步長λk滿足

f(x(k) + λkd(k)) = min f(x(k)+λd(k))

此時可求出λk的顯示表達

 

 

計算f(x)x(k+1)處的梯度。若||gk+1|| = 0,則停止計算;否則,用-gk+1d(k)構造下一個搜索方向d(k+1),並使d(k+1)d(k)關於A共軛。按此設想,令

d(k+1) = -gk+1 + βkd(k)


上式兩端左乘d(k)TA,並令

d(k)TAd(k+1) = -d(k)TAgk+1 + βkd(k)TAd(k) = 0

由此得到

βk = d(k)TAgk+1 / d(k)TAd(k)

再從x(k+1)出發,沿方向d(k+1)搜索。

FR法中,初始搜索方向必須取最速下降方向,這一點決不可忽視。因子βk可以簡化為:βk = ||gk+1||2 / ||gk||2


3.非線性共軛梯度


當目標函數是高於二次的連續函數(即目標函數的梯度存在)時,其對應的解方程是非線性方程,非線性問題的目標函數可能存在局部極值,並且破壞了二次截止性,共軛梯度法需要在兩個方面加以改進后,仍然可以用於實際的反演計算,但共軛梯度法不能確保收斂到全局極值。
(1)首先是共軛梯度法不能在n維空間內依靠n步搜索到達極值點,需要重啟共軛梯度法,繼續迭代,以完成搜索極值點的工作。
(2)在目標函數復雜,在計算時,由於需要局部線性化,需計算Hessian矩陣A,且計算工作量比較大,矩陣A也有可能是病態的。Fletcher和Reeves的方案最為常用,拋棄了矩陣A的計算,具體形式如下:

 

式中gk-1gk分別為第k-1和第k次搜索是計算出來的目標函數的梯度。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM