日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大白话5分钟带你走进人工智能 - 第二十一节 牛顿法和L-BFGS求函数最优解

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大白话5分钟带你走进人工智能 - 第二十一节 牛顿法和L-BFGS求函数最优解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?????????????????????????????????????????????????????????????????第二十一節(jié) 牛頓法和L-BFGS求函數(shù)最優(yōu)解

這一節(jié)中,我們講解一個新的求函數(shù)最優(yōu)化的方法就是L-BFGS。以下是本節(jié)目錄。

?????????? 目錄

1-L-BFGS算法簡介

2-牛頓法求根問題

3-牛頓法求駐點問題

4-牛頓法求駐點的本質(zhì)

5-多元函數(shù)利用牛頓法求駐點??

6-BFGS算法

7-L-BFGS算法


1-L-BFGS算法簡介

我們知道算法在計算機(jī)中運行的時候是需要很大的內(nèi)存空間的.就像我們解決函數(shù)最優(yōu)化問題常用的梯度下降,它背后的原理就是依據(jù)了泰勒一次展開式.泰勒展開式展開的次數(shù)越多,結(jié)果越精確,沒有使用三階四階或者更高階展開式的原因就是目前硬件內(nèi)存不足以存儲計算過程中演變出來更復(fù)雜體積更龐大的矩陣.L-BFGS算法翻譯過來就是有限內(nèi)存中進(jìn)行BFGS算法,L是limited memory的意思.那算法為什么叫BFGS呢,請看下圖:

?

上圖中從左到右依次是Broyden,Fletcher,Goldfarb,Shanno.四位數(shù)學(xué)家名字的首字母是BFGS,所以算法的名字就叫做BFGS算法.接下來我們就一起來學(xué)習(xí)BFGS算法的內(nèi)容。

2-牛頓法求根問題

我們先來回顧下牛頓法求根問題,比如求1元2次方程的根公式為,我們通常管這種形式的根叫解析根。所謂解析解就是你不用給我具體的值,就是一個公式。3次方程也是有解析解的,但是當(dāng)函數(shù)達(dá)到5次方以上,就不好找解析解了,對于這種復(fù)雜的函數(shù),很遺憾我們不能找到它的全部根,但是至少有辦法找到它的一個根。

我們看一個對于一元函數(shù)的例子

?

對于一個無法解出解析解的函數(shù)來說,現(xiàn)在是一元函數(shù),在只有一個x的情況下,我最終想找到x令y=0,即函數(shù)的根,怎么找到它?牛頓和另外一個人同時分別發(fā)現(xiàn),假如這個函數(shù)是連續(xù)可導(dǎo)的,我隨機(jī)出來一個x1,總能求它在這點x1的導(dǎo)數(shù),導(dǎo)數(shù)是一個實數(shù),它是能代表切線的斜率,那么我們就在這個x1點上畫一個原函數(shù)切線,這個切線一定會與x軸相交,除非特別倒霉,你一步就隨機(jī)到它的駐點上了,也不用求了,你找的就是駐點。不倒霉的情況下一定會使x1點的切線和x軸有個交點,我們命名為x2。 點完之后,又可以找一下x2對應(yīng)在函數(shù)上的點,再畫一條切線找到了x3,這時候相比x1,距離跟的位置來說比較近,然后發(fā)現(xiàn)經(jīng)過有限次數(shù)的迭代之后,怎么迭代都不會變化。它還是會產(chǎn)生震蕩,經(jīng)過震蕩之后,最終會收斂在某一個點上,而這個點就是函數(shù)的根。所以說牛頓法利用幾何直覺就是在找到某一個函數(shù)與x軸的交點。

我們分析下幾何原理:

?

函數(shù)本身f(x)也是已知的,那么f(x1)就可以計算。x2是x1切線的位置,我們建立一個關(guān)于x2,x1的解析式,三角形這條邊是x1-x2,另外一條邊是f(x1),如果用f(x1)/?x1-x2就應(yīng)該是這條線的斜率,斜率又等于x1這點導(dǎo)數(shù)的值。所以x2,x1建立一個關(guān)系,x2 =?x1-f(x1)/?f`(x1),此時x2就可求了。我們大的思路想從x1找到x2,從x2找到x3,最終找著發(fā)現(xiàn)xn,xn+1它倆沒區(qū)別的時候xn就是函數(shù)的根。因此建立了一個xn,xn-1的之間關(guān)系的迭代公式:

??????????????????????????????????????????????????????????????????? xn=xn-1-?f(xn-1)/?f`(xn-1)

我們在求數(shù)值解的時候,雖然我們求根法是求損失函數(shù)最小值,當(dāng)最小值只差一點點的時候,對模型的預(yù)測結(jié)果影響不大,但是它在底部會震蕩很久。 對于這種在底部頻繁震蕩的情況下,通常會設(shè)置超參tolerance,當(dāng)xk,xk+1的變化已經(jīng)小于你設(shè)的閾值的時候,我就認(rèn)為它已經(jīng)收斂了,而不去非得接近它,駐點數(shù)本身就是不那么可控的。設(shè)置超參tolerance,它幾乎在不犧牲精度的情況下來對我們這個函數(shù)最優(yōu)化算法進(jìn)行。

總結(jié)下牛頓法求根的流程:

.1、已知函數(shù)f(x)的情況下隨機(jī)產(chǎn)生x0。

?2、由已知的x0按照?? xn=xn-1-?f(xn-1)/?f`(xn-1)公式進(jìn)行n次迭代。

?3、當(dāng)?shù)Y(jié)果xn與上一次迭代結(jié)果xn-1相同或小于一定閾值時,本次的結(jié)果即為函數(shù)f(x)的根。

?

3-牛頓法求駐點問題

既然利用上述辦法找到任意函數(shù)的根,能不能借這個找到函數(shù)最小值呢?我們可以利用駐點的知識,雖然駐點不一定是極值點,極值點也不一定是駐點,但大部分情況下兩個值相等,駐點也就是導(dǎo)數(shù)為零的點,即原函數(shù)最小值的點。 所以我們需要找到導(dǎo)函數(shù)為零的點,實際上也就是導(dǎo)函數(shù)的根。導(dǎo)函數(shù)是一個函數(shù),它是用來計算一個函數(shù)導(dǎo)數(shù)的工具,給我一個x,我就算這個原函數(shù)在這個點的導(dǎo)數(shù)是多少的這么一個函數(shù)。如果我們能把原函數(shù)的導(dǎo)函數(shù)寫出來,進(jìn)而求導(dǎo)函數(shù)的根,就解決了求原函數(shù)最小值的問題。

既然都是求根問題,我們可不可以利用上面的方法呢?肯定是可以的,只不過現(xiàn)在的函數(shù)是我們要求的導(dǎo)函數(shù)而已。我們看下剛才原函數(shù)求根的迭代公式:xn+1 =?xn-f(xn)/?f`(xn)。對于導(dǎo)函數(shù)來說,唯一的區(qū)別就是f(xn)表達(dá)式不同,所以我們此時的原函數(shù)就是f`(xn),此時f`(xn)的導(dǎo)函數(shù)就是f``(xn)。最終的迭代公式就是:

?????????????????????????????????????????????????????????????????? xk =?xk-1-f'(xk-1)/?f''(?xk-1

通過這個東西,我最終找到xn不再是f(x)的根,而是f(x)導(dǎo)數(shù)的根,也就是駐點。

????????? 總結(jié)下利用牛頓法求函數(shù)的駐點過程:

?????????????? 1、當(dāng)函數(shù)f(x) 的一階導(dǎo)數(shù) f’(x) = 0?時點(x,f(x))為函數(shù)f(x)的駐點

???????????? ? 2、求某函數(shù)的駐點即為求該函數(shù)的導(dǎo)函數(shù)的根,同樣可以利用牛頓法進(jìn)行求解

?????????????? 3、對于f(x)?函數(shù)來說 迭代公式為 xk?= xk-1?- f’(xk-1)/f’’(xk-1)

?

4-牛頓法求駐點的本質(zhì)

牛頓法求駐點本質(zhì)實際上是二階泰勒展開公式。我們先來回顧下什么是泰勒展開。所謂泰勒展開就是把任意一個復(fù)雜函數(shù)在某個點附近,用一個有限長度的多項式來擬合,那么通常多項式在xk點附近展開是φ(x)=f(x)+?f’(x-xk)+ 1/2!f''(xk)*(x-xk)^2+1/3!f'''(xk)(x-xn)^3...,一直往上加,越加越像原函數(shù)。 我們看下一階展開就是φ(x)=f(x)+?f’(x-xk)。它本質(zhì)就是y=ax+b,一條直線,只不過a和b里面雜糅了很多關(guān)于xk函數(shù)的數(shù)值,a和b是通過xk這個點的函數(shù)還有一階導(dǎo)函數(shù)算出來的,所以一階泰勒展開就是在xk附近用一條直線盡量的去擬合原函數(shù)。什么叫做xk盡量的去擬合原函數(shù)?意思是在xk點附近,我不關(guān)注其它地方,我就在你周圍畫一條直線,你能跟我原先xk點的附近重合的越多越好。而二階泰勒展開式是ax2+bx+c,只不過a,b,c是通過這些導(dǎo)數(shù)什么雜糅在一起算出來,無論這些東西等于多少,它始終是一個實數(shù),它一定就是這個形勢,這個形式是一個拋物線。

我們看下任意函數(shù)在?xk點附近的二階泰勒展開公式為:

??????????????????????????????????????????

該公式表達(dá)的函數(shù)φ(x) 的幾何意義為通過2次函數(shù)對于原函數(shù)的最佳擬合。當(dāng)φ'(x)=0時:

????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

解釋下這個公式怎么來的:對x求導(dǎo),沒有對xk求導(dǎo)的,xk是個已知數(shù),第一項f(xk)沒有x,求導(dǎo)等于0。第二項對x的求導(dǎo),把它展開變成x*f’(xk)就剩這么一個東西,f’(xk)它是個數(shù),它不是x函數(shù)。第三項對x求導(dǎo)結(jié)果是1/2 f''(xk).2(x-xk) 。綜合以上結(jié)果就得到φ'(x)=0的解析式,也就是函數(shù)二階泰勒展開所擬合出來的拋物線的最小值。

把上述φ'(x)=0的解析式展開成x= xk -f’(xk)/f’’(xk)。發(fā)現(xiàn)剛好和之前牛頓法求駐點xk?= xk-1?- f’(xk-1)/f’’(xk-1)的迭代公式一致。所以下一次xxk的迭代值就是以它擬合出來的拋物線的最小值對應(yīng)的x來作為我原函數(shù)根的下一次迭代值。

我們畫圖示意牛頓法求駐點的本質(zhì):

?

因為一階泰勒展開是一條直線它沒有最小值,而拋物線有最小值,實際上它就是在拿擬合出來的拋物線的最小值當(dāng)成更好一點的x作為下一次的起始點,下次到這新的點,就又找了一個拋物線,以此類推,類似于我們每次拿一個碗形的曲線去套原先的曲線,所以它能更好的擬合在某一點附近的真實曲線情況,正因為如此,這個東西帶來的好處就是牛頓法比梯度下降在底部震蕩次數(shù)小很多,它能夠讓我們在求函數(shù)最優(yōu)解的過程中有更少的收斂次數(shù)。

5-多元函數(shù)利用牛頓法求駐點??

上面所說的都是針對一元的,而機(jī)器學(xué)習(xí)里面都是多元的,所謂的x在機(jī)器學(xué)習(xí)里面是誰?你要優(yōu)化損失函數(shù),損失函數(shù)是跟著w來的,我們一定要了然一個事,在機(jī)器學(xué)習(xí)的訓(xùn)練集里,x是已知數(shù),你唯一未知數(shù)就是w。x都是w的系數(shù),它在損失函數(shù)里面無論什么情況,最終都會變成w的系數(shù)。那么這里面的w實際上是機(jī)器學(xué)習(xí)里面的未知數(shù)x,w有多少個,往往不止一個。對于多元函數(shù)求駐點怎么求?實際在多元函數(shù)中,一階導(dǎo)數(shù)映射到多元函數(shù)里就是梯度:即一階導(dǎo)數(shù)f'(x) ----->梯度

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

梯度就是它的所有一階導(dǎo)數(shù)給它寫一塊去。比如你原來就一個x,求個導(dǎo)就完事了。你現(xiàn)在有十個x,你求誰都不合適,你就干脆把十個逐個求個叫偏導(dǎo),然后把這第一個x求偏導(dǎo)的函數(shù)放在這個向量的第一位,第二個求偏導(dǎo)的函數(shù)放在向量第二位,最后一個求偏導(dǎo)放在最后一位,組成一個向量。這個向量里面存的目前來講還是一個函數(shù),這個叫做梯度函數(shù)向量,而梯度是不是指的是某個點的梯度,就像導(dǎo)數(shù)指的是某一個點的導(dǎo)數(shù)一樣,那么梯度里邊存的就不再是函數(shù),而是把某組x帶到這一組函數(shù)里面,去得到了那一組實數(shù)的向量值,所有你只要說梯度,雖然它里面寫的是字母,但實際上知道這是一個真真切切的實數(shù)。 它是一個實數(shù)向量。 ??那么梯度是什么情況?假設(shè)你有十個w,梯度就有10個元素,因為要對10個未知的w逐個求偏導(dǎo)放到向量里面。

對第一個w求偏導(dǎo),它得的結(jié)果是一個導(dǎo)函數(shù),它們通常我們在寫梯度的時候,有時候會這么寫,這個x代表一個向量,它并不是向量中的某個元素,這個x就已經(jīng)包含了若干個x了,x1到xn,k就代表第幾代x。?這個梯度的意思就是說你先把這些偏導(dǎo)函數(shù)擱在這之后,然后再對當(dāng)前這一代xk的具體的值帶到這里來求出的結(jié)果,這個東西叫梯度。涉及到梯度,就意味著有一定的方向。

多元函數(shù)中,我們之前的求駐點的迭代公式xk?= xk-1?- f’(xk-1)/f’’(xk-1),f’(x)在多元函數(shù)中就是它對應(yīng)的的梯度g(x)?,f’’(?x)叫做Hessian矩陣對應(yīng)關(guān)系為:一階導(dǎo)數(shù)f''(x) ----->Hessian矩陣

??

?

這個矩陣是怎么求?就是它要求兩次導(dǎo),假如說原來對x1求導(dǎo),求了之后還對x1求一次導(dǎo),它還需要再對x1到xn分別求一次導(dǎo),這樣就形成了一個巨大的偏導(dǎo)數(shù)的矩陣,這個矩陣的情況應(yīng)該是N乘N的,它的對角線元素是對同一個自變量求兩次,而其它是各種各樣的排列組合。這個就是二階導(dǎo)數(shù)Hessian矩陣。

所以我們的迭代公式演變?yōu)?#xff1a;從到 其中g(shù)k就是多元函數(shù)一階導(dǎo),Hk就是多元函數(shù)二階導(dǎo)。gk原來在分子中,Hessian矩陣應(yīng)該是除以二階導(dǎo)數(shù),所以變成了矩陣的逆。我們可以看一下Hk矩陣,逆矩陣還是一個N*N的,gk是一個N*1的矩陣,它倆相乘得到是一個N*1的向量,就是一個高高的向量, N行1列。xk本身也是一個高高的向量,它倆做減法完全沒有問題。但是Hk矩陣的N*N就給我們帶來了一個非常不喜歡的問題,這個矩陣太難運算的,當(dāng)你有1000個維度的時候,就是1000×1000的矩陣,然后1萬個維度的時候,10000×10000,維度就爆炸了。而牛頓法求駐點又是一個迭代算法,所以這個困難我們還要面臨無限多次,導(dǎo)致了牛頓法求駐點在機(jī)器學(xué)習(xí)中無法使用.有沒有什么解決辦法呢。

6-BFGS算法

?BFGS算法是通過迭代來逼近的算法.逼近的方式如下:

?????????????????????????????????????

??????? 其中:。I是單位矩陣,

??????? BFGS就是通過迭代來逼近Hk的逆矩陣矩陣,其中第一步的D矩陣是單位矩陣.所謂單位矩陣就是只有對角線元素為1,其余全為零的矩陣。根據(jù)之前的迭代公式:,除了第一步還是需要計算之前的逆矩陣H1,第一步迭代需要計算出x2=x1-H1*g1,s1=x2-x1,y1=g2-g1。因為有x2,所以g2是其梯度,也可求,有了s1,y1便可以求D2來近似代替H2的逆矩陣,然后一步步迭代,求出駐點。

???????? 我們要通過牛頓求駐點法和BFGS算法來求得一個函數(shù)的根,兩個算法都需要迭代,慢慢逼近函數(shù)根,經(jīng)過k次迭代以后,所得到的解就是機(jī)器學(xué)習(xí)中目標(biāo)函數(shù)導(dǎo)函數(shù)的根.這種兩個算法共同迭代的計算方式,我們稱之為On The Fly。

????????? 回顧一下梯度下降的表達(dá)式,在BFGS算法迭代的第一步x2=x1-D1*g1,單位矩陣與梯度g相乘,就等于梯度g,形式上同梯度下降的表達(dá)式是相同的。相當(dāng)于學(xué)習(xí)率等于1的梯度下降,所以BFGS算法可以理解為從梯度下降逐步轉(zhuǎn)換為牛頓法求函數(shù)解的一個算法.

???????? 雖然我們使用了BFGS算法來利用單位矩陣逐步逼近H矩陣,但是根據(jù)Dk+1的公式,每次計算的時候都要存儲上一代的Dk矩陣,Dk矩陣有多大呢.假設(shè)我們的數(shù)據(jù)集有十萬個維度(不算特別大),那么每次迭代所要存儲D矩陣的結(jié)果是74.5GB.

?

我們無法保存如此巨大的矩陣內(nèi)容,如何解決呢? L-BFGS 算法上陣。

?7-L-BFGS算法

我們每一次對D矩陣的迭代,都是通過迭代計算sk和yk得到的.既然存不下D矩陣,那么我們存儲下所有的sk和yk,想要得到D10就用單位矩陣同存儲下的s1和y1到s10和y10計算就可以了.這樣一個時間換空間的辦法,有效節(jié)省了內(nèi)存空間。

???????? 但是,僅僅是這樣還是不夠的,因為當(dāng)?shù)螖?shù)非常大的時候,我們的內(nèi)存同樣存不下.這個時候只能丟掉一些存不下的數(shù)據(jù).假設(shè)我們設(shè)置的存儲向量數(shù)為100,當(dāng)s和y迭代超過100時,就會扔掉第一個s和y,存儲s2到s101和y2到y(tǒng)101,每多一次迭代就對應(yīng)的扔掉最前邊的s和y。假如最后收斂次數(shù)是1000的話,只保留s901,y901從而計算出D901 ,然后再保留s902,y902計算出D902,依次根據(jù)s1000,y1000,從而算出D1000,按理說需要D900才能計算出D901 ,此時我們粗暴的將D901置為單位矩陣I,這樣雖然損失了精度,但確可以保證使用有限的內(nèi)存將函數(shù)的解通過BFGS算法求得到。

雖然L-BFGS算法是線性收斂,但是每次迭代的開銷非常小,因此L-BFGS算法執(zhí)行速度還是很快的,而且由于每一步迭代都能保證近似矩陣的正定,因此算法的魯棒性還是很強(qiáng)的。

?

轉(zhuǎn)載于:https://www.cnblogs.com/LHWorldBlog/p/10807354.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的大白话5分钟带你走进人工智能 - 第二十一节 牛顿法和L-BFGS求函数最优解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。