參考https://blog.csdn.net/weixin_39445556/article/details/84502260算法
本章咱們來學習L-BFGS算法.L-BFGS是機器學習中解決函數最優化問題比較經常使用的手段,本文主要包括如下六部分:微信
1-L-BFGS算法簡介機器學習
2-牛頓法求根問題ide
3-牛頓法求函數的駐點函數
4-牛頓法求駐點的本質學習
5-BFGS算法優化
6-L-BFGS算法spa
1-L-BFGS算法簡介.net
咱們知道算法在計算機中運行的時候是須要很大的內存空間的.就像咱們解決函數最優化問題經常使用的梯度降低,它背後的原理就是依據了泰勒一次展開式.泰勒展開式展開的次數越多,結果越精確,沒有使用三階四階或者更高階展開式的緣由就是目前硬件內存不足以存儲計算過程當中演變出來更復雜體積更龐大的矩陣.L-BFGS算法翻譯過來就是有限內存中進行BFGS算法,L是limited memory的意思.
那算法爲何叫BFGS呢,請看下圖:
上圖中從左到右依次是Broyden,Fletcher,Goldfarb,Shanno.四位數學家名字的首字母是BFGS,因此算法的名字就叫作BFGS算法.接下來咱們就一塊兒來學習BFGS算法的內容.
學習BFGS必需要先了解牛頓法的求根問題.
2-牛頓法求根問題
牛頓發現,一個函數的跟從物理的角度就能夠根據函數圖像迭代求得.牛頓法求根的思路是:
a.在X軸上隨機一點,通過作X軸的垂線,獲得垂線與函數圖像的交點.
b.經過作函數的切線,獲得切線與X軸的交點.
c.迭代a/b兩步.
下面附上一張動圖方便理解:
經過圖片咱們能夠看到.在X軸上取的點會隨着迭代次數的增長而愈來愈接近函數的根.通過無限屢次的迭代,就等於函數的根.但牛頓法在實際應用的時候咱們不會讓算法就這麼迭代下去,因此當和相同或者兩個值的差小於一個閾值的時候,就是函數的根.
那麼問題來了,怎麼樣找到的導函數與X軸的交點.請看下圖:
圖片是上邊動圖從到
的動做.能夠看到,三角形綠色的直角邊的值是
-
,
是已知的(隨機出來的),並且函數表達式
也是已知的(不知道要求的函數我們折騰啥呢).因此三角形的另外一條直角邊
也是已知的.根據導函數定義,函數
在
點的導函數就是
(公式一).
公式一變換一下獲得:(公式二 ),同理能夠得出每一次迭代的表達式都是(公式三).
因此,根據牛頓法求根的思路,咱們能夠總結(模仿)一下使用牛頓法求根的步驟:
a.已知函數的狀況下,隨機產生點.
b.由已知的點按照的公式進行k次迭代.
c.若是與上一次的迭代結果相同或者相差結果小於一個閾值時,本次結果就是函數的根.
以上爲牛頓法的求根的思路.
3-牛頓法求函數的駐點
咱們知道,機器學習過程當中的函數最優化問題,大部分優化的都是目標函數的導函數,咱們要求得導函數爲零時的點或近似點來做爲機器學習算法表現最好的點.如今咱們知道了牛頓求根法,那把牛頓求根法的函數換成我們要優化的導函數不就好了麼.要求的的導函數爲零的點叫作駐點.因此用牛頓法求函數駐點同求函數的根是沒有任何區別的.只是公式二中的變爲了,原來的變成了一階導函數的導函數也就是二階導函數,求的迭代公式以下:
(公式四)
這樣,咱們經過幾何直覺,獲得了求解函數根的辦法,那這麼厲害的一個想法,有沒有什麼理論依據做爲支撐呢?固然有了,要不我也不這麼問.
4-牛頓法求駐點的本質
牛頓法求駐點的本質實際上是二階泰勒展開.咱們來看二階泰勒展開式:
是咱們要求解的原函數的近似式.當咱們要對原函數求解時,能夠直接求得的導函數 令時的結果就是原函數的解.因此對求導,消去常數項後獲得公式以下:
通過變換後所得的公式就是上邊的公式四.因此,牛頓法求駐點的本質就是對函數進行二階泰勒展開後變換所獲得的結果.
在一元函數求解的問題中,咱們能夠很愉快的使用牛頓法求駐點,但咱們知道,在機器學習的優化問題中,咱們要優化的都是多元函數,因此x每每不是一個實數,而是一個向量.因此將牛頓求根法利用到機器學習中時,x是一個向量,也是一個向量,可是對求導之後獲得的是一個矩陣,叫作Hessian矩陣.等價公式以下:
公式中,爲公式四種的,表明二階導函數的倒數.
當x的維度特別多的時候,咱們想求得是很是困難的.而牛頓法求駐點又是一個迭代算法,因此這個困難咱們還要面臨無限屢次,致使了牛頓法求駐點在機器學習中沒法使用.有沒有什麼解決辦法呢?請看博客開頭的照片,四位數學家在向你微笑....
5-BFGS算法
BFGS算法是經過迭代來逼近的算法.逼近的方式以下:
(公式五)
公式五中的 就是.,. 是原函數的導函數.
的迭代公式複雜無比,還好咱們不用記住它.BFGS是經過迭代來逼近矩陣,第一步的D矩陣是單位矩陣.
咱們要經過牛頓求駐點法和BFGS算法來求得一個函數的根,兩個算法都須要迭代,因此咱們乾脆讓他倆一塊兒迭代就行了.兩個算法都是慢慢逼近函數根,因此通過k次迭代之後,所獲得的解就是機器學習中目標函數導函數的根.這種兩個算法共同迭代的計算方式,咱們稱之爲On The Fly.我的翻譯:讓子彈飛~
回顧一下梯度降低的表達式 ,在BFGS算法迭代的第一步,單位矩陣與梯度g相乘,就等於梯度g,形式上同梯度降低的表達式是相同的.因此BFGS算法能夠理解爲從梯度降低逐步轉換爲牛頓法求函數解的一個算法.
雖然咱們使用了BFGS算法來利用單位矩陣逐步逼近H矩陣,可是每次計算的時候都要存儲D矩陣,D矩陣有多大呢.假設咱們的數據集有十萬個維度(不算特別大),那麼每次迭代所要存儲D矩陣的結果是74.5GB.咱們沒法保存如此巨大的矩陣內容,如何解決呢?
使用L-BFGS算法.
6-L-BFGS算法:
咱們每一次對D矩陣的迭代,都是經過迭代計算和獲得的.既然存不下D矩陣,那麼咱們存儲下全部的和,想要獲得就用單位矩陣同存儲下的和到和計算就能夠了.這樣一個時間換空間的辦法可讓咱們在數據集有10000個維度的狀況下,由存儲10000 x 10000的矩陣變爲了存儲十個1 x 10000的10個向量,有效節省了內存空間.
可是,僅僅是這樣仍是不夠的,由於當迭代次數很是大的時候,咱們的內存一樣存不下.這個時候只能丟掉一些存不下的數據.假設咱們設置的存儲向量數爲100,當s和y迭代超過100時,就會扔掉第一個s和y,存儲到和到,每多一次迭代就對應的扔掉最前邊的s和y.這樣雖然損失了精度,但確能夠保證使用有限的內存將函數的解經過BFGS算法求獲得.
因此L-BFGS算法能夠理解爲對BFGS算法的又一次近似..
到這裏,L-BFGS算法的邏輯和由來就已經講解完畢了文章中惟一沒有講到的地方就是BFGS算法的推導過程,由於推導過程比較長並且不是咱們學習的重點.若是你們有興趣的話能夠去百度BFGS算法推導過程.
python風控建模實戰lendingClub(博主錄製,catboost,lightgbm建模,2K超清分辨率)
https://study.163.com/course/courseMain.htm?courseId=1005988013&share=2&shareId=400000000398149
微信掃二維碼,免費學習更多python資源