最优化相关理论
發現一個特別好的將最優化基礎的博客
http://www.codelast.com/
在最優化的領域中,這“法”那“法”無窮多,而且還“長得像”——名字相似的多,有時讓人覺得很迷惑。
在自變量為一維的情況下,也就是自變量可以視為一個標量,此時,一個實數就可以代表它了,這個時候,如果要改變自變量的值,則其要么減小,要么增加,也就是“非左即右“,所以,說到“自變量在某個方向上移動”這個概念的時候,它并不是十分明顯;而在自變量為n(n≥2)維的情況下,這個概念就有用了起來:假設自變量X為3維的,即每一個X是(x1, x2, x3)這樣的一個點,其中x1,x2和x3分別是一個實數,即標量。那么,如果要改變X,即將一個點移動到另一個點,你怎么移動?可以選擇的方法太多了,例如,我們可以令x1,x2不變,僅使x3改變,也可以令x1,x3不變,僅使x2改變,等等。這些做法也就使得我們有了”方向“的概念,因為在3維空間中,一個點移動到另一個點,并不是像一維情況下那樣“非左即右”的,而是有“方向”的。在這樣的情況下,找到一個合適的”方向“,使得從一個點移動到另一個點的時候,函數值的改變最符合我們預定的要求(例如,函數值要減小到什么程度),就變得十分有必要了。
文章來源:http://www.codelast.com/
前奏已經結束,下面進入正題。
【1】最速下降法(或:梯度法)
很形象,也許你的腦子里一閃而過的,就是:取可以讓目標函數值最快速“下降”的方法?差不多是這么回事。嚴謹地說:以負梯度方向作為極小化方法的下降方向,這種方法就是最速下降法。
為什么是負梯度方向使目標函數值下降最快?以前我也只是死記硬背,背出來的東西雖然有用,終究還是令人糊涂的。所以有必要寫出它”為什么“的理由:
我們正在討論的是”n維空間中的一個點移動到另一個點之后,目標函數值的改變情況“,因此,先直接寫出代表最終的目標函數值的數學表達式:
:代表第k個點的自變量(一個向量)。
:單位方向(一個向量),即 |d|=1。
:步長(一個實數)。
:目標函數在Xk這一點的梯度(一個向量)。
:α的高階無窮小。
文章來源:http://www.codelast.com/
顯然,這個數學表達式是用泰勒公式展開得到的,樣子有點難看,所以對比一下自變量為一維的情況下的泰勒展開式
就知道多維的情況下的泰勒展開式是怎么回事了。
在[1]式中,高階無窮小可以忽略,因此,要使[1]式取到最小值,應使取到最小——這是兩個向量的點積(數量積),何種情況下其值最小呢?來看兩向量的夾角θ的余弦是如何定義的:
假設向量與負梯度的夾角為θ,我們便可求出點積的值為:
可見,θ為0時,上式取得最小值。也就是說,取時,目標函數值下降得最快,這就是稱負梯度方向為“最速下降”方向的由來了。
文章來源:http://www.codelast.com/
最速下降法的收斂性:對一般的目標函數是整體收斂的(所謂整體收斂,是指不會非要在某些點附近的范圍內,才會有好的收斂性)。
最速下降法的收斂速度:至少是線性收斂的。
?
【2】牛頓法
上面的最速下降法只用到了梯度信息,即目標函數的一階導數信息,而牛頓法則用到了二階導數信息。
在點處,對目標函數進行泰勒展開,并只取二階導數及其之前的幾項(更高階的導數項忽略),得:
:目標函數在Xk這一點的梯度(一個向量)。
:目標函數在Xk這一點的Hesse矩陣(二階導數矩陣),這里假設其是連續的。
由于極小值點必然是駐點,而駐點是一階導數為0的點,所以,對 r(X) 這個函數來說,要取到極小值,我們應該分析其一階導數。對X求一階導數,并令其等于0:
當Gk的逆矩陣存在,也即Gk為非奇異矩陣的時候,將上式兩邊都左乘Gk的逆矩陣Gk-1,得:
到了這一步,已經很明顯了。這個式子表達了下一點的計算方法:Xk在方向d上按步長1(1×d = d)移動到點X。所以我們知道方向d怎么求了:
如果你覺得上式有點奇怪:為什么都得到了d的表達式,還要再弄出一個Gkd=-gk?那么我說:因為在實際應用中,d并不是通過Gk-1與gk相乘來計算出的(因為我們并不知道逆矩陣Gk-1是什么),而是通過解方程組Gkd=-gk求出的。這個解方程組的過程,其實也就可能是一個求逆矩陣的過程。關于解此方程組的方法,可以參考這一篇文章。關鍵時刻,概念清晰很重要。
有人說,那么方程組可能無解呢?沒錯,方程組可能是奇異的,在這種情況下,就需要用到其他的修正技術,來獲取搜索方向了,本文不談。
文章來源:http://www.codelast.com/
上面關于牛頓法的各種推導可能讓你覺得雜亂無章,但實際上它們就是牛頓法的基本步驟:每一步迭代過程中,通過解線性方程組得到搜索方向,然后將自變量移動到下一個點,然后再計算是否符合收斂條件,不符合的話就一直按這個策略(解方程組→得到搜索方向→移動點→檢驗收斂條件)繼續下去。
牛頓法的收斂性:對一般問題都不是整體收斂的(只有當初始點充分接近極小點時,才有很好的收斂性)。
最速下降法的收斂速度:二階收斂。因此,它比最速下降法要快。
?
【3】共軛方向法
上面的方法,前、后兩次迭代的方向并沒有特別的相關要求,而共軛方向法則有了——它要求新的搜索方向與前面所有的搜索方向是共軛的。由于搜索方向是向量,所以也就是說,這些向量是滿足共軛條件的:
其中,m≠n,dm和dn分別為兩個向量(搜索方向),G為對稱正定矩陣。
對于“共軛”,我有一個自己“捏造”出來的說法,來幫助你記憶它的含義:看到“共軛”,就想到“共遏”,即“互相遏制”,這不,兩個向量中間夾著一個矩陣互相發力,結果誰也占不到便宜——積為0。
共軛方向法也是只利用了目標函數的梯度信息,即一階導數信息,不用計算Hesse矩陣,使得其計算量比牛頓法小很多。
但是,怎么在每一步迭代的過程中,都得到若干個兩兩共軛的搜索方向?Powell共軛方向集方法是一個選擇,它可以構造出若干個兩兩共軛的方向。不過,它本身也有一些缺陷:在構造共軛方向的過程中,各方向會逐漸變得線性相關,這就達不到“共軛”的要求了。所以,有很多種對Powell算法進行修正的策略被人們應用到了實際場景中,現在說到Powell方法,應該或多或少都包含了那些修正策略吧(我的感覺)。
特別值得一提的是,在共軛方向法中,新搜索方向的確定,是要滿足“下降”條件的,即方向與梯度之積<0:
是不是意味著目標函數值下降量越大,這個方向就越可取呢?不是。在人們已經發現的修正Powell算法的有效方法中,有一種方法是舍棄目標函數值下降最大的方向——這看似不合理的做法恰恰蘊含了合理的結果:放棄目標函數值下降最大的方向能更好地避免各方向線性相關。關于這一點,這里就不詳述了。
一句話總結共軛方向法的過程:選定搜索方向d,使之滿足共軛條件以及下降條件,在此搜索方向上通過精確線搜索確定移動的步長,然后將當前點移動到下一點,再重新選定搜索方向,周而復始,直到滿足終止條件。
文章來源:http://www.codelast.com/
共軛方向法的收斂性:對二次函數,最多在n步(n為自變量的維數)內就可找到其極小值點。對一般的非二次函數,經適當修正后,也可以達到相同的效果。
共軛方向法的收斂速度:比最速下降法快,比牛頓法慢。
?
【4】共軛梯度法
“共軛梯度法”是一種特殊的“共軛方向法”。既然叫共軛梯度法,它與梯度必然是有關系的。共軛方向法與梯度也有關系——共軛方向法利用了目標函數的梯度信息(梯度與方向的積滿足“下降”條件)。共軛梯度法與此關系有所區別:用當前點的負梯度方向,與前面的搜索方向進行共軛化,以得到新的搜索方向。
具體來說,這個新的搜索方向是怎么計算出來的呢?推導起來比較麻煩,下面就慢慢道來。
首先,需要說明共軛梯度法的一個理論基礎(記為T1):在迭代過程中,我們會從初始點開始,在搜索方向上通過精確線搜索的方法,找到使目標函數值符合要求(例如,min f(X))的步長,然后將點移動到下一點。這樣不斷進行下去,就會得到很多個點。在N維空間Rn中,在每一個搜索方向上,都有無數個點,它們構成了一個軌跡(或者說一個集合),我們稱之為線性流形——拿二維空間(二維平面)作比喻,就好像是一個點在二維平面上的移動形成的軌跡:
只不過在高維空間中,我們想像不出這個軌跡的樣子,不過這沒關系,能引申上去就好了。
當目標函數是二次函數時,在這個線性流形中,每一個我們迭代到的點都是極小值點。在某些書中,你可能還會看到一種說法,稱此線性流形為N維超平面,也是一個意思,不過概念太多了會讓人很暈,尤其是在沒有掌握足夠的背景的情況下,往往不能判斷一個概念與另一個概念是不是同一個意思,這樣就導致理解受到影響,因此,在剛開始學習的時候,我覺得努力弄懂一個概念就好了。
這個理論基礎在推導“如何獲取共軛梯度法的搜索方向”的過程中會用到。
文章來源:http://www.codelast.com/
由于上面的理論基礎是在目標函數為二次函數的情況下得到的,因此,在推導共軛梯度法的搜索方向的公式之前,我們先假定目標函數是二次函數:
??
其中G為n階對稱正定矩陣。X為自變量(一個n維向量)。
如果覺得這個X為n維向量的函數形式有點怪的話,那么還是對比一下X為1維(可以視為一個標量)的函數形式,就很清楚了:
在下面的推導過程中,如果你遇到看上去很“別扭”的式子,只要按照這樣的規則來對比就行了。
由于共軛梯度法就是與梯度相關的方法,因此我們必須要求[2]式的函數的梯度(即一階導數):
現在,假設初始點為X0,我們從X0出發,先推導出前幾個搜索方向的計算方法,從而總結出若干規律,進而再得到通用的公式。下面我們就開始這樣做。
在每一個迭代點處,新的搜索方向都是用前面的搜索方向與當前點的負梯度方向共軛化得到的。在初始點處,并沒有“前面的搜索方向”,因此,初始點處的搜索方向d0簡單地定為負梯度方向:
上面的式子中,將目標函數在X0點的梯度g(X0)寫為g0,是為了表達簡潔。同理,g(X1)也記為g1,等等。
第二個迭代到的點為X1,它與X0滿足關系:
這表明,點X1是在d0方向上,由X0點移動一定的距離得到的。移動的步長α0,則是通過精確線搜索的方法計算得到的,X1是一個極小值點,在點X1處,目標函數的一階導數為零,即:
所以一階導數再乘以d0仍然為零:
這個式子,在緊接著的推導中馬上要用到。我發現從[7]到[8]我真的太廢話了,好吧,我承認我很啰嗦…
文章來源:http://www.codelast.com/
既然第一個搜索方向d0毫無難度地取了負梯度方向,那么我們就來看看下一個搜索方向d1怎么獲取。從共軛梯度法的定義(或者說是原則)——新的搜索方向是用前面的搜索方向與當前點的負梯度方向共軛化得到的——來看,d1與d0(前面的搜索方向)有關,也與-g1(當前點的負梯度方向)有關,因此,只需要假定d1是-g1與d0的線性組合即可:
其中,r0是一個實數。此外,由于每一個搜索方向與前面的搜索方向都是共軛的,因此,d1與d0還要滿足共軛條件:
但是r0到底是什么值呢?只有知道了r0,我們才能算出d1,從而繼續算出d2,d3,……
由上面的式[8],可以聯想到,是否在式[9]的左右兩邊分別乘以一些矩陣或向量,從而得到一個等式,以求出r0?對,就是在式[9]的兩邊均左乘d0TG,可推出:
得到了r0,我們先記下它的形式,后面再使用。緊接著,來計算其他幾個式子并由它們得到一些規律。
文章來源:http://www.codelast.com/
首先是在同一點處,搜索方向與梯度的點積dkTgk:
看出規律來了嗎?dkTgk=-gkTgk?像這么回事。也就是說,在同一點處,搜索方向與梯度的點積等于負梯度與梯度的點積。所以我們估計d2Tg2,d3Tg3,……都是符合這個規律的。
其次是在某一點處的梯度與前面所有的梯度的點積gmTgn(m>n):
由前文所描述的共軛梯度法的理論基礎T1,我們知道點X2,X3,……均為極小值點,因此,在這些點處,目標函數的梯度為零,即g(Xk)=0,所以有g2Td0=0,g2Td1=0,因此上面的[14],[15]式均為零:
又看出一點規律沒有?gmTgn=0(m>n)?像是這么回事。也就是說,在某一點處的梯度與前面所有梯度的點積為零。
由上面的特例的計算,我們可以總結出一些規律并用這些規律來得到通用的結論了。假設對所有的搜索方向和梯度,有如下規律:
再重復一遍以上四個式子的含義:同一點處的搜索方向與梯度的點積等于該點處的負梯度與梯度的點積,某一點處的梯度與前面所有搜索方向的點積為0,某一點處的梯度與前面所有梯度的點積為0,某一點處的搜索方向與前面所有搜索方向共軛。文章來源:http://www.codelast.com/
前面我們單獨地求出了d0和d1,現在要來看方向d的通用的表達式怎么求了。可以設:
?
為什么可以這樣表示方向d?乍一看,這個式子表示的含義是:當前點的搜索方向是當前點的負梯度方向與前面所有方向的線性組合——似乎很有道理,但是有什么理論依據可以讓我們這樣假設呢?其實,這是有線性代數理論支持的,但是這個證明涉及到更多的推導,所以這里就不扯過去了。前文所述的方向d1,也是這樣假設之后再求出來的。我就是這樣記憶的:當前點的搜索方向是當前點的負梯度方向與前面所有方向的線性組合。我覺得這種感覺很直觀,并且也符合我心中的設想,而且事實上它也是對的,初學者就這樣記住就好了。
[22]式不夠直觀,所以,我還是拿一個特例來演示:
這下夠清晰了吧?
但是,如何救出[22]式中的每一個ri,m呢?我們會想到,式子的左邊是一個方向向量,在共軛梯度法中,我們要保證某一點的搜索方向與前面所有搜索方向是G共軛的,因此,這提醒了我們,應該在[22]式兩邊均左乘一個式子,形成“G共軛”的表達式——等式兩邊均左乘的式子就是dnTG(n=0,1,…,m-1):
我認為在共軛梯度法的推導中,最令人費解的就是這個式子。恕我愚笨,我看了4本最優化的書才搞懂,每一本書不是這里略過去了,就是那里略過去了,總有讓人坐過山車的跨越感,但想明白之后的感覺終究是很舒坦的,我在這里就要把它徹底寫明白了。
首先要對一個概念非常清楚:在[24]式中,我們乘的dnTG,不是說我們要乘n個式子,而是說,對[22]式來說,當m選定以后,那么n就唯一選定了。例如,當m=4時,[22]式就是用來求d4的,此時,我們乘的dnTG就是d3TG:
寫得如此詳細的一個例子,看懂了嗎?從這個例子中,我們知道,對n所取的任何值,在[24]式的求和式∑中,除最后一項外,其余所有項的值均為0——這是因為任何一個方向與前面所有方向都是G共軛的(參看G共軛的定義)。所以現在可以寫出[24]式的結果了:
其中,r的寫法很不直觀——其實,對每一個方向d來說,[25]式中只含有一個r,不會像[24]式那樣,由于有多個r,使得必須要用復雜的下標來區分,因此此處我們完全可以用rn來代替[25]式中那個怪怪的r的表達式:
順便將[27]式轉換了一下,得到了[29]式,即 r 的計算方法——這就是我們日夜思念的式子啊,終于揭開面紗了!
(待補全)
共軛梯度法同樣會有這樣的問題:經過n步迭代之后,產生的新方向不再有共軛性。所以在實際運用中,也有很多修正方向的策略。其中一種策略是:經過n步迭代之后,取負梯度方向作為新的方向。
共軛梯度法的收斂性:比最速下降法的收斂性要好得多。
(1)DFP算法
下面,就從DFP算法來看看“擬牛頓”是如何實現的(DFP算法是以Davidon、Fletcher、Powell三位牛人的名字的首字母命名的)。
前面說了,Hesse矩陣在擬牛頓法中是不計算的,擬牛頓法是構造與Hesse矩陣相似的正定矩陣,這個構造方法,使用了目標函數的梯度(一階導數)信息和兩個點的“位移”(Xk-Xk-1)來實現。有人會說,是不是用Hesse矩陣的近似矩陣來代替Hesse矩陣,會導致求解效果變差呢?事實上,效果反而通常會變好。有人又會問為什么?那么就簡要地說一下——
由牛頓法的原理可知如下幾個等式:
若最后一個等式子的最左邊 < 0,即,就是直觀概念上的“沿方向d上,目標函數值下降”的表達。而在逐步尋找最優解的過程中,我們是要求目標函數值下降的,因此,應該有-(X-Xi)A(X-Xi) < 0,也即?(X-Xi)A(X-Xi) > 0。這表明矩陣A是正定的。而在遠離極小值點處,Hesse矩陣一般不能保證正定,使得目標函數值不降反升。而擬牛頓法可以使目標函數值沿下降方向走下去,并且到了最后,在極小值點附近,可使構造出來的矩陣與Hesse矩陣“很像”了,這樣,擬牛頓法也會具有牛頓法的二階收斂性。
文章來源:http://www.codelast.com/
由于涉及到Hesse矩陣(二階導數矩陣),我們當然要從目標函數 f(X) 的泰勒展開式說開去。與最優化理論中的很多問題一樣,在這里,我們依然要假設目標函數可以用二次函數進行近似(實際上很多函數都可以用二次函數很好地近似):
忽略高階無窮小部分,只看前面的3項,其中A為目標函數的Hesse矩陣(二階導數矩陣)。此式兩邊對X求導得:
于是,當 X=Xi?時,將[2]式兩邊均左乘(Ai+1)-1,有:
上式左右兩邊近似相等,但如果我們把它換成等號,并且用另一個矩陣H來代替上式中的A-1,則得到:
文章來源:http://www.codelast.com/
這個方程,就是擬牛頓方程,其中的矩陣H,就是Hesse矩陣的逆矩陣的一個近似矩陣。但是,從初始的H0開始,如何得到每一步迭代過程中需要的H1,H2,……呢?在迭代過程中生成的矩陣序列H0,H1,H2,……中,每一個矩陣Hi+1,都是由前一個矩陣Hi修正得到的,這個修正方法有很多種,這里只說DFP算法的修正方法。設:
然后又有問題:矩陣E怎么求?再設:
其中,m和n均為實數,v和w均為N維向量。將[6]代入[5]式,再將[5]式代入[4]式,可得:
文章來源:http://www.codelast.com/
[8]式與[7]式完全相同,只不過用簡化的記號重寫了一下。如果求出了m,n,v,w,就可以知道[6]式怎么求,從而進一步知道[5]式怎么求,從而我們的問題就徹底解決了。符合[7]這個方程的v,w可能有很多,但是我們有沒有可能找到v,w的一個“特例”,使之符合這個等式呢?仔細觀察一下,是可以找到的:[7]式的右邊兩個向量相減的結果,是一個n×1的向量,因此,等式左邊的計算結果當然也是一個n×1的向量(每一項都是一個n×1的向量),所以我們把[7]式寫成了[8]式的樣子,可以看到,其中的第二、第三項中的括號里的向量的點積均為實數,這里,可以使第一個括號中的mvTqi值為1,使第二個括號中的nwTqi值為-1,這樣的話,v只要取si,w只要取Hiqi,就可以使[8]式成立了。的確,這種帶有一點猜測性質的做法,確實可以讓我們找到一組適合的m,n,v,w值。
所以,我們得到的m,n,v,w值如下:
現在我們幾乎大功告成了:將[8]~[11]代入[6]式,然后再將[6]代入[5]式,就得到了Hesse矩陣的逆矩陣的近似陣H的計算方法:
在上面的推導過程中,有人可能覺得有點無厘頭:為什么[6]式要那樣假設,是怎么想到的?我能給出的答案是:這一點我也沒想明白。如果你知道,請告訴我,非常感謝。某些書上經常寫類似于“很顯然,XXX”之類的話,從一個定理直接得出了一個讓人摸不著頭腦的結論,而作為我這樣比較笨的人來說,我覺得寫書的很多專家們認為“很顯然”的東西一點也不“顯然”,甚至于有時候,我覺得那就像鳳姐突然變成了范冰冰一樣——一下子變出來了一個漂亮的結論,難以相信。所以這也是為什么我花費了很多時間,來把一些“很顯然”的東西記下來,寫明白的原因了。對于大多數牛人,他們需要的當然不是這種思維跨度這么小的文章,而是那種從地球可以一下子飛到火星的文章。所以,我寫的東西不適合于水平高的人看,我只期望能幫助一小部分人就知足了。
文章來源:http://www.codelast.com/
說到這里,那么到底什么是DFP算法呢?上面的矩陣H的計算方法就是其核心,下面再用簡單的幾句話描述一下DFP算法的流程:
已知初始正定矩陣H0,從一個初始點開始(迭代),用式子??來計算出下一個搜索方向,并在該方向上求出可使目標函數極小化的步長α,然后用這個步長,將當前點挪到下一個點上,并檢測是否達到了程序中止的條件,如果沒有達到,則用上面所說的[13]式的方法計算出下一個修正矩陣H,并計算下一個搜索方向……周而復始,直到達到程序中止條件。
有人會說,上面那些亂七八糟的都是搞什么啊,猜來猜去的就折騰出了一個公式,然后就確定這公式能用了?就不怕它在迭代的時候根本無法尋找到目標函數的極小值?正因為有這些疑問,所以在這里,還要提及一個非常重要的問題:我們通過帶有猜測性質的做法,得到了矩陣H的計算公式,但是,這個修正過的矩陣,能否保持正定呢?前面已經說了,矩陣H正定是使目標函數值下降的條件,所以,它保持正定性很重要。可以證明,矩陣H保持正定的充分必要條件是:
并且,在迭代過程中,這個條件也是容易滿足的。此結論的證明并不復雜,但是為了不影響本文的主旨,這里就沒有必要寫出來了。總之,我覺得作為一個最優化的學習者來說,首先要關注的是不是這些細節問題,而是先假設這些算法都適用,然后等積累到一定程度了,再去想“為什么能適用”的問題。
?
(2)BFGS算法
在上面的DFP算法的推導中,我們得到了矩陣H的計算公式,而BFGS算法和它有點像,但是比它形式上復雜一點。盡管它更復雜,但是在BFGS算法被Broyden,Fletcher,Goldfarb,Shanno四位牛人發明出來到現在的40多年時間里,它仍然被認為是最好的擬牛頓算法。歷史總是這樣,越往后推移,人們要超越某種技術所需的時間通常就越長。但是我們很幸運地可以站在巨人的肩膀上,從而可以在使用前人已經發明的東西的基礎上感嘆一聲:這玩意太牛了。
好吧,又扯遠了…… 回到中心主題,看看在BFGS算法中,與上面的[13]式一樣的矩陣H是如何計算的:
在[14]式中,最后一項(深藍色的部分)就是BFGS比DFP多出來的東西。其中,w為一個n×1的向量。我們看到,由于向量w的表達式太長,所以沒有把它直接寫在[14]式中,而是單獨列在了[15]式里。
可能[14]式一看就讓人頭暈,所以先來弱弱地解釋一下這個式子的計算結果(如果你覺得好雷人,那么請直接無視):wwT是一個n×1的向量與一個1×n的向量相乘,結果為一個n×n的矩陣,而[14]式中最后一項里,除了wwT之外的那一部分是(1×n)向量、n×n矩陣、n×1向量相乘,結果為一實數,因此[14]式最后一項結果為一個n×n矩陣,這與[14]式等號左邊的矩陣H為n×n矩陣一致。這一點沒有問題了。
在目標函數為二次型(“在數學中,二次型是一些變量上的二次齊次多項式”)時,無論是DFP還是BFGS——也就是說,無論[14]式中有沒有最后一項——它們均可以使矩陣H在n步之內收斂于A-1。
文章來源:http://www.codelast.com/
延伸閱讀:BFGS有一個變種(我不知道這樣稱呼是否正確),叫作“Limited-memory BFGS”,簡稱“L-BFGS”或“LM-BFGS”(這里的“LM”與Levenberg-Marquard算法沒有關系),從它的名字上看,你肯定能猜到,使用L-BFGS算法來編寫程序時,它會比BFGS算法占用的內存小。從前面的文章中,我們知道,BFGS在計算過程中要存儲一個n×n的矩陣,當維數n很大的時候,這個內存占用量會很大——例如,在10萬維的情況下,假設矩陣H中的元素以double來存儲,那么,內存占用即為100000×100000×8÷1024÷1024÷1024≈74.5(GB),這太驚人了,一般的服務器幾乎無法承受。所以,使用L-BFGS來降低內存使用量在某些情況下是非常有意義的。
關于L-BFGS的英文解釋,請點擊這個Wiki鏈接。由于我還沒有深入學習L-BFGS,所以沒辦法在這里詳細敘述了。
至于后面的部分,還是覺得袁亞湘老師的書比較好懂寫
總結