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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

?????????????????????????????????????????????????????????????????第二十一節 牛頓法和L-BFGS求函數最優解

這一節中,我們講解一個新的求函數最優化的方法就是L-BFGS。以下是本節目錄。

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

1-L-BFGS算法簡介

2-牛頓法求根問題

3-牛頓法求駐點問題

4-牛頓法求駐點的本質

5-多元函數利用牛頓法求駐點??

6-BFGS算法

7-L-BFGS算法


1-L-BFGS算法簡介

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

?

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

2-牛頓法求根問題

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

我們看一個對于一元函數的例子

?

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

我們分析下幾何原理:

?

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

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

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

總結下牛頓法求根的流程:

.1、已知函數f(x)的情況下隨機產生x0。

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

?3、當迭代結果xn與上一次迭代結果xn-1相同或小于一定閾值時,本次的結果即為函數f(x)的根。

?

3-牛頓法求駐點問題

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

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

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

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

????????? 總結下利用牛頓法求函數的駐點過程:

?????????????? 1、當函數f(x) 的一階導數 f’(x) = 0?時點(x,f(x))為函數f(x)的駐點

???????????? ? 2、求某函數的駐點即為求該函數的導函數的根,同樣可以利用牛頓法進行求解

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

?

4-牛頓法求駐點的本質

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

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

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

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

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

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

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

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

?

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

5-多元函數利用牛頓法求駐點??

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

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

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

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

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

??

?

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

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

6-BFGS算法

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

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

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

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

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

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

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

?

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

?7-L-BFGS算法

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

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

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

?

轉載于:https://www.cnblogs.com/LHWorldBlog/p/10807354.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。