優化方法總結:梯度下降法、牛頓法、擬牛頓法、共軛梯度法等等


概述

優化問題就是在給定限制條件下尋找目標函數\(f(\mathbf{x}),\mathbf{x}\in\mathbf{R}^{\mathbf{n}}\)的極值點。極值可以分為整體極值或局部極值,整體極值即函數的最大/最小值,局部極值就是函數在有限鄰域內的最大/最小值。通常都希望能求得函數的整體極值,但總體來說這是很困難的,目前有一些啟發式算法可以在某種程度上處理全局極值的計算問題,但是並不能保證每次都能求出整體極值。另外,有一類“凸優化”問題可以比較簡單地計算得到全局極值。

本文的目的是對一些常用的優化算法做一個整理和歸納,希望能夠盡量理清各類算法的基本思路。算法中涉及到的公式推導和定理證明一般都不太復雜,為了避免過多的公式沖淡本文的主題(公式一個個敲出來太麻煩),所以采取能省則省的原則,如有需要可以查閱本文列出的參考文獻。另外,文獻[3]中還有部分算法的代碼實現(該書被導師譽為數值計算領域的聖經)。為了簡單起見,下文介紹的方法都以光滑函數的無約束優化問題為例。另外,由於極大值和極小值是等價的,下文默認待求的是函數極小值。

首先,根據自變量\(\mathbf{x}\)的維度\(\mathbf{n}\)的不同,可以將問題划分為一維和多維兩種情況。對於一維優化方法,由於只有一個維度,所以就不存在選擇“搜索方向”的問題,只需要在該方向上迭代計算極值即可。而對於多維優化方法,情況就復雜得多,一般的處理方法主要有直線搜索法和置信域法兩種。對於我而言,看過的大部分書上都重點介紹的是直線搜索法,置信域法出鏡率相對較低。

本文參考文獻:

[1] Press, W.H., 2007. Numerical recipes 3rd edition: The art of scientific computing. Cambridge university press.

[2] Boyd, S. and Vandenberghe, L., 2004. Convex optimization. Cambridge university press.

[3] Nocedal, J. and Wright, S., 2006. Numerical optimization. Springer Science & Business Media.

一維優化方法

黃金分割法

黃金分割法求函數極值的思想和求根算法中的二分法類似。在二分法中,首先需要確定一個根所在的區間\((a,b)\),其中\(a\)\(b\)滿足\(ab<0\)以確保至少區間中至少有有一個根。然后逐步縮小該區間直到達到預設精度。在黃金分割法中,同樣也需要確定極值所在的范圍。這個可以用一個三元組\((a,b,c)\)表示,其中\(a<b<c\)\(f(b)<min\{f(a),f(c)\}\)。這樣,在區間\((a,c)\)內存在一極值。

接下來,需要逐步設法縮小區間\((a,c)\)。在區間\((a,c)\)內選擇新的一點\(x\),則\(x\)落在區間\((a,b)\)\((b,c)\)內。以\(x\in(b,c)\)為例,計算\(f(x)\)的值並與\(f(b)\)作比較。如果\(f(b)<f(x)\),那么取新的三元組為\((a,b,x)\),如果\(f(b)>f(x)\),那么將新的三元組取為\((b,x,c)\)。這樣一來,總能保證新的三元組確定的區間長度小於原來的區間。重復這一過程直到區間范圍小於預設的精度即可得到一個極值點。

接下來討論\(x\)的選取方法。令\(b\)分區間\((a,c)\)的比例為\(w\),即

\(\frac{b-a}{c-a}=w\)\(\frac{c-b}{c-a}=1-w\)

而下一實驗點\(x\)\(a,b,c\)的關系為:

\(\frac{x-b}{c-a}=z\)

那么下一區間長度是原區間長度的\(w+z\)\(1-w\)倍。為了最小化最壞情況出現的概率,令

\(w+z=1-w\)

\(z=1-2w\),可見\(x\)就是\(b\)點關於區間中心的對稱點,所以\(x\)處於\((a,b)\)\((b,c)\)中較長的哪個區間內。

關於\(w\)的選取,可以采用scale similarity的思想,即每一步的區間划分比例是相等的,如果\(z\)是最佳比例,那么\(w\)也是最佳,所以有

\(\frac{z}{1-w}=w\)

再利用\(z=1-2w\)可以解出\(w\approx 0.38197\)\(1-w\approx 0.61803\),即黃金分割比例。而該算法也因此得名。

下面將黃金分割算法做一個歸納:首先給定一個包含極值點的初始三元組\((a,b,c)\),然后下一個試探點\(x\)選在較長區間段的0.38197分割點。初始三元組並不需要滿足黃金分割比例,算法會在迭代過程中自動達到一個穩定的重復比例。顯然黃金分割算法是一種線性收斂算法,每一步計算都能使區間范圍縮小到原來的0.618。

另外,關於“預設精度”的選取問題,有一個原則就是,不能設置精度為數值的機器精度\(\epsilon\),即區間范圍為\((\bar{x}-\epsilon \bar{x},\bar{x}+\epsilon \bar{x} )\),其中\(\bar{x}\)為極值點,這一點和求根算法不同。為了說明該原則,考慮函數\(f(x)\)在極值點的泰勒展開:

\(f(x)\approx f(\bar{x})+\frac{1}{2}f''(\bar{x})(x-\bar{x})^2\) (1)

\(|x-\bar{x}|<\sqrt{\epsilon}|\bar{x}|\sqrt{\frac{2|f(\bar{x})|}{\bar{x}^2f''(\bar{x})}}\) (2)

時,式(1)右端可以寫成\((1+\pm\epsilon)f(\bar{x})\),其中正負號由\(f(\bar{x})\)的符號決定。而式(2)中最后的平方根項對於絕大多數函數都是單位階大小的(即可以認為是1)。所以\(|x-\bar{x}|\)最多可以到達\(sqrt{\epsilon}|\bar{x}|\)量級。更高的精度已經沒有意義,因為\(f(x)\)\(f(\bar{x})\)將不能分辨。所以“it is hopeless to ask for a bracketing interval of width less than \(\epsilon\) times its central value.”

拋物線插值和Brent算法

黃金分割法的優點是穩定可靠,缺點是收斂速度很慢。為了加快收斂速度,可以考慮采用拋物線插值的方法在計算極值。其思路是利用光滑函數在極值點的拋物線性質,在極值點附近用3個點確定的拋物線來近似函數\(f(x)\),然后再求拋物線的極值點\(\tilde{x}\)。用\(\tilde{x}\)替代上文的黃金分割點進行迭代更新。這種方法在很靠近極值點的時候相對黃金分割法有更快的收斂速度,但是在遠離極值點也有可能不工作。所以,可以將黃金分割法和拋物線插值法綜合起來應用,在拋物線插值法可以成功的時候,用該方法進行一次迭代,如果拋物線插值法不適用,則退回到黃金分割法。同樣地,可以類比求根算法中二分法和牛頓法的結合算法。Brent算法就是一種結合兩種方法的優化算法,具體可以參見文獻[1]。

多維優化方法

概述

如前所述,多維優化問題可以分解成為在多個方向上的一維優化問題。具體來說,多維優化的每一步需要解決兩個問題:

(a). 確定搜索方向\(\mathbf{p}\)
(b). 確定沿搜索方向前進的步長\(\delta\mathbf{x}\)

解決以上問題一般有兩個途徑:直線搜索(line search)法和置信域(trust region)法。其中直線搜索方法解決問題的思路是依次解決問題(a)和(b),即先確定搜索方向\(\mathbf{p}\),然后在該搜索方向上執行一維優化,確定\(\delta\mathbf{x}\)。而置信域方法則可以同時得到\(\mathbf{p}\)\(\delta\mathbf{x}\)

直線搜索方法

直線搜索方法的迭代公式可以寫為:

\(\mathbf{x}_{k+1}=\mathbf{x}_k+\alpha_k\mathbf{p}_k\)

其中\(\mathbf{p}_k\)\(\alpha_k\)分別表示搜索方向和步長。直線搜索方法的就是要確定\(\mathbf{p}_k\)\(\alpha_k\),下面分別介紹。

步長選擇

假設搜索方向\(\mathbf{p}_k\)已知,一個最直觀的確定\(\alpha_k\)的思路就是令\(\alpha_k\)為函數\(\phi(\alpha)=f(\mathbf{x}+\alpha\mathbf{p}_k)\)的極小值(全局的或局部的)。這是個一維最優化問題,可以利用上一章介紹的方法進行求解。這種方法稱作“精確直線搜索”,因為它試圖計算的是沿着搜索方向上目標函數精確的極小值。但是,在每一步都求解一個一維優化問題的代價通常會比較大,所以通常采用的是一種稱作“非精確直線搜索”的方法。該方法在每一步中尋找一個不是“特別壞”的步長,相對精確直線搜索的計算量更少。

Wolfe條件

Wolfe條件是一種用於非精確直線搜索中的判據,它包含兩部分:

\(f(\mathbf{x}_k+\alpha_k\mathbf{p}_k)\leq f(\mathbf{x}_k)+c_1\alpha_k\nabla f(\mathbf{x}_k)^T\mathbf{p}_k\)

\(\nabla f(\mathbf{x}_k+\alpha_k\mathbf{p}_k)^T\mathbf{p}_k\ge c_2\nabla f(\mathbf{x}_k)^T\mathbf{p}_k\)

其中\(0<c_1<c_2<1\)。上式的第一個稱作充分下降(sufficient decrease)條件,第二個條件稱作曲率條件(curvature condition)。

在充分下降條件中,\(\alpha_k\)的取值保證\(\phi(\alpha)\)低於其與縱軸的交點\(\phi(0)=f(\mathbf{x}_k)\)。只要滿足這個條件的\(\alpha_k\)均被認為是合適的。而曲率條件是要求\(\alpha_k\)的取值使\(\phi(\alpha)\)不能出現劇烈的下降,只能是較為平坦的下降、不下降或上升。因為劇烈的下降意味着\(\alpha_k\)的值還可以再更新以得到更合適的值,平坦的下降或者不下降則說明對\(\alpha_k\)進行更新的效果不明顯,所以無需更新。注意曲率條件並不要求\(\phi(\alpha)\)的取值小於\(\phi(0)\),如果沒有充分下降條件約束,僅憑曲率條件完全可以選擇出\(\alpha_k\)使\(\phi(\alpha)\)比原始值更大。

根據上述Wolfe條件中的曲率條件可知,選取\(\alpha_k\)使\(\phi'(\alpha)\)為一個很大的正數也是被允許的,然而這意味着在該點附近函數值還會發生很大的改變,即該點仍然距離極值點或駐點較遠。為了強制要求直線搜索得到的下一步迭代點在極值點或駐點附近,可以采用所謂的強Wolfe條件:

\(f(\mathbf{x}_k+\alpha_k\mathbf{p}_k)\leq f(\mathbf{x}_k)+c_1\alpha_k\nabla f(\mathbf{x}_k)^T\mathbf{p}_k\)

\(|\nabla f(\mathbf{x}_k+\alpha_k\mathbf{p}_k)^T\mathbf{p}_k|\le c_2|\nabla f(\mathbf{x}_k)^T\mathbf{p}_k|\)

可見強Wolfe條件相對Wolfe條件的改變僅僅是要求\(\phi'(\alpha)\)不能取太大的正數。

可以證明對於所有的連續可微的有界函數,都能找到滿足Wolfe條件的步長。證明可以參考文獻[3]的引理3.1。

關於采用Wolfe條件的非精確直線搜索算法的實現,可以參考文獻[3]的3.5節。

回溯

在Wolfe條件中,充分下降條件總可以靠設置足夠小的步長\(\alpha_k\)得到滿足,所以只有充分下降條件一般是不能選出較好的直線搜索步長的。但是可以利用一種叫回溯(backtracing)的方法,使得僅僅依靠充分下降條件也能選出合適的步長。回溯算法的偽代碼如下:

choose \(\bar{\alpha}>0\)\(\rho\in (0,1)\)\(c\in (0,1)\);

set \(\alpha=\bar{\alpha}\);

repeat until \(f(\mathbf{x}_k+\alpha\mathbf{p}_k)\leq f(\mathbf{x}_k)+c\alpha\nabla f(\mathbf{x}_k)^T\mathbf{p}_k\)

set \(\alpha=\rho\alpha\);

end

\(\alpha_k=\alpha\)

回溯算法是將步長從一個起始值\(\bar{\alpha}\)開始,按照比例\(\rho\)不斷縮小,直到滿足充分下降條件時即可停止,因此可以避免步長選擇過小的問題。關於參數\(\bar{\alpha}>0\)\(\rho\in (0,1)\)\(c\in (0,1)\)的選取,文獻[2]給出的范圍是\(\bar{\alpha}=1\)\(\rho\in (0.1,0.8)\)\(c\in (0.01,0.3)\)

回溯算法比較適合於牛頓法,但是對於擬牛頓法和共軛梯度法表現不好[3]。

收斂性分析

文獻[3]中比較詳細地討論了Wolfe條件下非精確直線搜索的收斂性。其中Zoutendijk定理說明,只要保證搜索方向不是垂直於當前梯度方向,那么梯度會隨着迭代而最終趨近於0,即迭代會收斂到駐點。對於梯度下降法,搜索方向沿着負梯度方向,所以總是收斂的。

收斂速率

[2-3]都討論了\(f(\mathbf{x})\)為強凸函數(\(\nabla^2f-m\mathbf{I}\)為正定矩陣)情況下采用精確直線搜索梯度下降方法的收斂性。收斂速度都是線性的,而且收斂速度與\(f(\mathbf{x})\)在最優解處的黑塞矩陣的條件數(或者\(f(\mathbf{x})\)下水平集的條件數,因為\(f(\mathbf{x})\)的下水平集在極值點處可以用黑塞矩陣表示的橢球做近似)關系很大。黑塞矩陣條件數越接近1,收斂速度越快。如果條件數遠大於1,梯度下降法的收斂速度會變得非常慢。而牛頓法和擬牛頓法的思路就是通過線性變換使黑塞矩陣條件數近似等於1,據此得到更快的收斂速度。

搜索方向選擇

最速下降法

對目標函數\(f(\mathbf{x})\)\(\mathbf{x}\)處做一階泰勒展開,有:

\(f(\mathbf{x}+\mathbf{v})\approx f(\mathbf{x})+\nabla f(\mathbf{x})^T\mathbf{v}\)
其中上式右端第二項代表目標函數在\(\mathbf{x}\)沿方向\(\mathbf{v}\)的方向導數。如果該方向導數為負數,則為下降方向。

所謂的最速下降法,就是尋找\(\mathbf{v}\)使目標函數在沿着該方向的方向導數最小(注意下降方法要求方向導數為負值,方向導數最小即絕對值最大)。但是顯然可以發現,只要\(\mathbf{v}\)是下降方向,增加\(\mathbf{v}\)的長度便可以使方向導數任意小,所以為了讓問題有意義,需要限制\(\mathbf{v}\)的大小在一定范圍內。

根據以上思路,定義規范化的最速下降方向如下:

\(\mathbf{v}=\textrm{argmin}\{\nabla f(\mathbf{x})^T\mathbf{v}\},\|\mathbf{v}\|=1\)
其中\(\|\|\)表示\(\mathbf{R}^{\mathbf{n}}\)上的任意范數。

\(\|\|\)取做1-范數時,對應的最速下降法稱作“坐標下降法”,此時\(\mathbf{v}\)的方向沿着梯度\(\nabla f(\mathbf{x})\)絕對值最大的分量;當\(\|\|\)取做歐幾里得范數(即單位矩陣\(I\)定義的2-范數)時,就得到所謂的“梯度下降法”,因為顯然\(\mathbf{v}\)沿着負梯度方向的方向導數最小;當\(\|\|\)取做\(f(\mathbf{x})\)的二階導數\(\nabla^2 f(\mathbf{x})=\mathbf{H}\)定義的2-范數時,得到的就是牛頓法。而各種擬牛頓法也可以認為是取\(\|\|\)\(2-\mathbf{P}^{-1}\)范數的最速下降法,其中\(\mathbf{P}\)為對稱正定(symmetric positive definite, SPD)矩陣,通常用來模擬真實的黑塞矩陣\(\mathbf{H}\)

坐標下降法

坐標下降法的下降方向為:

\(\mathbf{v}=\textrm{argmin}\{\nabla f(\mathbf{x})^T\mathbf{v}\},\|\mathbf{v}\|_1=1\)

\(i\)滿足\(\|\nabla f(\mathbf{x})\|_{\infty}=|(\nabla f(\mathbf{x}))_i|\),即\(i\)代表梯度向量中最大的那個分量,則易知下降方向為:

\(\mathbf{v}=-\textrm{sign}[(\nabla f(\mathbf{x}))_i]\mathbf{e}_i\)

對於上式一個直觀的解釋如下:由於\(\|\mathbf{v}\|_1=1\),即\(\mathbf{v}\)的坐標分量絕對值之和為1,可以把\(\nabla f(\mathbf{x})^T\mathbf{v}\)看做是對梯度向量\(\nabla f(\mathbf{x})^T\)的各個分量以\(\mathbf{v}\)為權重進行加權求和。所以只有當權重都集中在梯度向量最大的分量上才會得到最大值(對應負數的最小值)。

坐標下降法每次只對變量\(\mathbf{x}\)的一個分量進行更改,該算法可以極大地簡化或者省略步長選擇步驟。

梯度下降法

\(\|\|\)取做歐幾里得范數時,可見\(\mathbf{v}\)就是沿着負梯度方向,所以該方法稱作梯度下降法。在采用精確直線搜索方法的情況下,梯度下降發每一步搜索的方向都是沿着當前位置的負梯度方向\(\nabla f(\mathbf{x}_{k})\),而搜索步長的選擇都使得在該方向上目標函數達到最小值,即沿着搜索方向上的方向導數為0,有\(\nabla f(\mathbf{x}_{k+1})^T\mathbf{v}_k=0\)。所以下一步的搜索方向\(\mathbf{v}_{k+1}=\nabla f(\mathbf{x}_{k+1})\)與當前搜索方向\(\mathbf{v}_k\)垂直。在二維情況下,采用精確直線搜索的梯度下降法的搜索路徑會呈現出台階形狀,參考[2]的圖9.2和[3]的圖3.7。當采取非精確直線搜索時,連續兩次搜索方向不一定垂直,但還是會呈現出鋸齒狀。文獻[2]的圖9.3給出了回溯直線搜索法的搜索路徑。出現這種鋸齒狀路徑的原因是每次搜索方向不能保證互相“獨立”,沿着\(\mathbf{v}_{k+1}\)方向上的極小值不一定是(基本上都不會是)沿着\(\mathbf{v}_{k}\)方向上的極小值,所以下一次搜索時又要重復進行計算。

梯度下降法因為只用到了目標函數的一階導數,涉及到的計算較為簡單,而且梯度下降方法選擇的搜索方向可以保證是收斂的。其缺點就是收斂速度非常的慢,尤其是目標函數下水平集的條件數很大的時候。

更新:梯度下降的一個解釋可以參見MLAPP 13.4節。

牛頓法

從收斂性分析可知,最速下降法的收斂速度與待優化函數\(f(\mathbf{x})\)在極值點的黑塞矩陣\(\mathbf{H}\)條件數有很大關系,\(\mathbf{H}\)越接近單位矩陣\(\mathbf{I}\),收斂性越好。牛頓法相比梯度下降法,采用\(2-\mathbf{H}\)范數來替代梯度下降法中的歐幾里得范數。這相當於對原始變量\(\mathbf{x}\)做了個線性變換\(\bar{\mathbf{x}}=\mathbf{H}^{\frac{1}{2}}\mathbf{x}\)。在此變換下,可以發現黑塞矩陣\(\bar{\mathbf{H}}=\mathbf{H}^{-1}\mathbf{H}=\mathbf{I}\),因此可以期望牛頓法具有更好的收斂性(當距離極值點較近的時候,牛頓法具有二次收斂速度)。

牛頓法的另一個解釋是在極小值附近用二次曲面來近似目標函數\(f(\mathbf{x})\),然后求二次曲面的極小值作為步徑。為了看出這一點,考慮\(f(\mathbf{x})\)的二階泰勒展開:

\(f(\mathbf{x}+\mathbf{v})\approx f(\mathbf{x})+\nabla f(\mathbf{x})^T\mathbf{v}+\frac{1}{2}\mathbf{v}^T\nabla^2 f(\mathbf{x})\mathbf{v}\)

上式是關於\(\mathbf{v}\)的二次函數,易知其極小值為\(\mathbf{v}=-[\nabla^2 f(\mathbf{x})]^{-1}\nabla f(\mathbf{x})\),剛好是牛頓法的步徑。相比之下,梯度下降法則是用平面來近似(參見最速下降法的推導)。

牛頓法相比梯度下降法的優點有:

  • 在極值點附近具有二次收斂性。一旦進入二次收斂階段,最多再經過6次的迭代便可以得到很高精度的解。
  • 具有仿射不變性,對坐標選擇或者目標函數下水平集不敏感(牛頓法本身相當於做了一次線性變換以保證目標函數下水平集近似為\(\mathbf{I}\))。
  • 和問題規模有很好的比例關系,求解\(\mathbf{R}^{1000}\)中問題的性能和\(\mathbf{R}^{10}\)中問題的性能類似。
  • 性能不依賴於參數的選擇。

牛頓法的缺點是需要計算黑塞矩陣和其逆矩陣,這使得存儲和計算的開銷相比梯度下降法要大很多。為了解決這個問題,人們提出了所謂的擬牛頓法。

另外,牛頓法還有個問題就是在遠離極值點的時候,目標函數的黑塞矩陣可能並不是正定的,所以牛頓法給出的搜索方向並不能保證是下降方向。為了解決這個問題,可以對黑塞矩陣做一些更改,比如加上一個矩陣\(\mathbf{E}\)使其變得正定。有關這方面的詳細討論可參見文獻[3]。牛頓法的C++代碼可以參考文獻[2]。

擬牛頓法

擬牛頓法與牛頓法類似,只是用一個SPD矩陣代替精確的黑塞矩陣。

共軛方向法

一組矢量\(\{\mathbf{v}_1,\mathbf{v}_2,\cdots,\mathbf{v}_n\}\)關於SPD矩陣\(\mathbf{A}\)共軛是指對於任意的\(i\neq j\),都有:

\(\mathbf{v}_i^T\mathbf{A}\mathbf{v}_j=0\)

由於\(\mathbf{A}\)是SPD矩陣,所以上式的意思實際上就是\(\mathbf{v}_i\)\(\mathbf{v}_j\)關於\(\mathbf{A}\)定義的內積是正交的。

共軛方向法就是在問題空間\(\mathbf{R}^n\)中選擇一組互相共軛的基向量作為搜索方向。相比於最速下降法,它的一個顯著優點是每次搜索是“互不干擾”的,所以最多需要\(N\)次便可以保證求出目標函數的一個極小值,其中\(N\)是問題的維度。為了看出這一點,仍然考慮目標函數的二階泰勒展開式:

\(f(\mathbf{x}+\mathbf{v})\approx f(\mathbf{x})+\nabla f(\mathbf{x})^T\mathbf{v}+\frac{1}{2}\mathbf{v}^T\nabla^2 f(\mathbf{x})\mathbf{v}\)

\(\mathbf{b}=-\nabla f(\mathbf{x})\)\(\mathbf{A}=\nabla^2 f(\mathbf{x})\),則有:

\(f(\mathbf{x}+\mathbf{v})\approx f(\mathbf{x})-\mathbf{b}^T\mathbf{v}+\frac{1}{2}\mathbf{v}^T\mathbf{A}\mathbf{v}\)

易知\(f(\mathbf{v})\)的梯度可以近似等於\(\mathbf{Ax-b}\)。另外值得一提的是,求解線性方程組\(\mathbf{Ax=b}\)可以認為是關於二次型\(f(\mathbf{x})=c-\mathbf{b}^T\mathbf{x}+\frac{1}{2}\mathbf{x}^T\mathbf{A}\mathbf{x}\)的優化問題,即尋找令\(f(\mathbf{x})\)梯度為0的\(\mathbf{x}\)

\(\mathbf{x}\)沿某一方向移動時,梯度的變化可以表示為\(\delta\nabla f=\mathbf{A}(\delta\mathbf{x})\)。假設已經沿着方向\(\mathbf{v}_i\)達到了極小值,現在要沿着\(\mathbf{v}_j\)進行搜索。可以發現沿\(\mathbf{v}_j\)的搜索並不會破壞之前沿\(\mathbf{v}_i\)的搜索結果,因為根據共軛性可知,沿\(\mathbf{v}_j\)搜索造成的梯度的變化\(\mathbf{A}\mathbf{v}_j\)垂直於之前的搜索方向\(\mathbf{v}_i\),即\(\mathbf{v}_i^T\mathbf{A}\mathbf{v}_j=0\)。所以更新后的梯度仍然垂直於\(\mathbf{v}_i\),也就是說沿着\(\mathbf{v}_i\)的方向導數仍然為0,新的搜索不會破壞沿之前方向上已經找出的極小值。所以沿着一組共軛方向集依次做搜索時,不需要做重復搜索。文獻[3]給出了更正式的證明,每次搜索得到的\(\mathbf{x}_k\)都是\(f(\mathbf{x})\)在子空間\(\mathbf{x}_0+\textrm{span}\{\mathbf{v}_1,\mathbf{v}_2,\cdots,\mathbf{v}_{k-1}\}\)上的極小值,其中\(\mathbf{x}_0\)是初始試探解。

共軛方向法也可以從幾何上比較直觀地進行理解。考慮關於\(\mathbf{v}\)的二次函數\(\varphi(\mathbf{v})=a+\mathbf{b}^T\mathbf{v}+\frac{1}{2}\mathbf{v}^T\mathbf{A}\mathbf{v}\),如果\(\mathbf{A}\)在標准正交基\(E=\{\mathbf{e}_1,\mathbf{e}_2,\cdots,\mathbf{e}_n\}\)下是對角陣,那么\(\varphi(\mathbf{v})\)對應的圖形就是主軸沿笛卡爾坐標系坐標軸的橢球。此時顯然可以直接沿着各坐標軸的方向逐次求極小值,而且在每個坐標軸方向上求極小值都不會對其他坐標產生影響,最多需要遍歷\(E\)便可求出\(\varphi(\mathbf{v})\)的極小值。

如果\(\mathbf{A}\)不是對角的,\(\varphi(\mathbf{v})\)所代表的橢球的主軸方向將發生傾斜,不再沿着坐標軸,這時再沿着坐標軸的方向逐次求極小值的時候,就會發現每次新的方向求極小都可能影響到之前已經搜索得到的極小值點。為了解決這個問題,可以考慮把該組基做線性變換,得到新的基\(P=\{\mathbf{p}_1,\mathbf{p}_2,\cdots,\mathbf{p}_n\}\)。在基\(P\)下,\(\mathbf{A}\)成為對角的,橢球的主軸也沿着\(P\)的方向,這樣就回到了之前的情況。等價地在原空間中看,現在新的搜索方向就是沿着一組關於\(\mathbf{A}\)共軛的基向量\(P\)來進行。

共軛梯度法

共軛梯度法(Conjucate Gradient,CG)是一類特殊的共軛方向法,它的第一個共軛矢量\(\mathbf{p}_0\)選擇為初始點的負梯度方向,接下來的共軛矢量則是前一個共軛矢量和當前點負梯度方向的線性組合的形式。
共軛梯度法的一個特點是在計算當前共軛矢量的時候只需要之前的一個矢量即可。也就是說,計算\(\mathbf{p}_k\)時只需要\(\mathbf{p}_{k-1}\),計算得到的\(\mathbf{p}_k\)自動與之前的共軛方向\(\mathbf{p}_1,\mathbf{p}_2,\cdots,\mathbf{p}_{k-2}\)正交。它的另一個特點是並不需要計算目標函數\(f(\mathbf{x})\)的二階導數,整個迭代過程只需要計算目標函數的一階導數以及直線搜索。

文獻[3]對共軛梯度法的理論基礎做了比較詳細的介紹,包括基本原理,收斂性,算法偽代碼等;文獻[1]從實現的角度進行了介紹,並給出了代碼。 關於共軛梯度法和擬牛頓法的優劣,文獻[1]中說道**On the other hand, there is not, as far as we know, any overwhelming advantage that the quasi-Newton methods hold over the conjugate gradient techniques, except perhaps a historical one. **

此外,在矩陣計算里面,共軛梯度法可以歸結到克雷洛夫子空間(Krylov Subspace)方法中去。作為克雷洛夫子空間方法中的一個判據,共軛梯度法尋找的是最小化\(\|\mathbf{r}_k\|_{A^{-1}}\)的解\(\mathbf{x}_k\)。其中\(\mathbf{r}_k=A\mathbf{x}_k-b\)是上文中的梯度,同時也是近似解\(\mathbf{x}_k\)對應的殘量,\(\|\dot\|_{A^{-1}}\)表示矩陣\(A^{-1}\)定義的2-范數。其他的判據還有包括MINRES、GMRES、SYMMLQ等等。

置信域法

置信域法的思路是在一個有限區域內把目標函數近似地用一個二次模型函數\(m_k(\mathbf{p})=f(\mathbf{x}_k)+\nabla f(\mathbf{x}_k)^T\mathbf{p}+\frac{1}{2}\mathbf{p}^T\mathbf{B}_k\mathbf{p}\)替代,在該區域內尋找\(m_k(\mathbf{p})\)的極小值\(\mathbf{p}\),並令\(\mathbf{x}_{k+1}=\mathbf{x}_{k}+\mathbf{p}\)。如果\(m_k\)中的\(\mathbf{B}_k\)是目標函數的二階導數\(\nabla^2 f(\mathbf{x}_k)\),就稱作置信域-牛頓法,可見此時置信域法和直線搜索牛頓法的幾何解釋是一致的。


免責聲明!

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



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