機器學習優化算法—L-BFGS

關於優化算法的求解,書上已經介紹了很多的方法,比如有梯度下降法,座標下降法,牛頓法和擬牛頓法。梯度下降法是基於目標函數梯度的,算法的收斂速度是線性的,並且當問題是病態時或者問題規模較大時,收斂速度尤其慢(幾乎不適用);座標下降法雖然不用計算目標函數的梯度,但是其收斂速度依然很慢,因此它的適用範圍也有侷限;牛頓法是基於目標函數的二階導數(海森矩陣)的,其收斂速度較快,迭代次數較少,尤其是在最優值附近時,收斂速度是二次的。但牛頓法的問題在於當海森矩陣稠密時,每次迭代的計算量比較大,因爲每次都會計算目標函數的海森矩陣的逆,這樣一來,當問題規模較大時,不僅計算量大(有時大到不可計算),而且需要的存儲空間也多,因此牛頓法在面對海量數據時由於每一步迭代的開銷巨大而變得不適用;擬牛頓法是在牛頓法的基礎上引入了海森矩陣的近似矩陣,避免每次迭代都要計算海森矩陣的逆,擬牛頓法的收斂速度介於梯度下降法和牛頓法之間,是超線性的。擬牛頓法的問題也是當問題規模很大時,近似矩陣變得很稠密,在計算和存儲上也有很大的開銷,因此變得不實用。

另外需要注意的是,牛頓法在每次迭代時不能總是保證海森矩陣是正定的,一旦海森矩陣不是正定的,優化方向就會“跑偏”,從而使得牛頓法失效,也說明了牛頓法的魯棒性較差。擬牛頓法用海森矩陣的逆矩陣來替代海森矩陣,雖然每次迭代不能保證是最優的優化方向,但是近似矩陣始終是正定的,因此算法總是朝着最優值的方向在搜索。

從上面的描述可以看出,很多優化算法在理論上有很好的結果,並且當優化問題的規模較小時,上面的任何算法都能夠很好地解決問題。而在實際工程中,很多算法卻失效了。比如說,在實際工程中,很多問題是病態的,這樣一來,基於梯度的方法肯定會失效,即便迭代上千上萬次也未必收斂到很好的結果;另外,當數據量大的時候,牛頓法和擬牛頓法需要保存矩陣的內存開銷和計算矩陣的開銷都很大,因此也會變得不適用。

本文將介紹一種在實際工程中解決大規模優化問題時必然會用到的優化算法:L-BFGS算法。

上面已經提到了在面對大規模優化問題時,由於近似矩陣往往是稠密的,在計算和存儲上都是n2的增長,因此擬牛頓法變得不適用。

L-BFGS算法就是對擬牛頓算法的一個改進。它的名字已經告訴我們它是基於擬牛頓法BFGS算法的改進。L-BFGS算法的基本思想是:算法只保存並利用最近m次迭代的曲率信息來構造海森矩陣的近似矩陣。

在介紹L-BFGS算法之前,我們先來簡單回顧下BFGS算法。

在算法的每一步迭代,有如下式:

,      k = 0, 1, 2,…,           (1)

式(1)中ak是步長,Hk的更新通過如下公式:

 (2)

在式(2)中

 (3)

 (4)

 (5)

(6)

從式(2)到式(6)可以看出Hk+1是用{sk, yk}修正Hk來得到的。需要注意的是,這裏Hk表示海森矩陣的逆的近似矩陣。

在BFGS算法中,由於Hk隨着迭代次數的增加會越來越稠密,當優化問題的規模很大時,存儲和計算矩陣Hk將變得不可行。

爲了解決上述問題,我們可以不存儲矩陣Hk,而是存儲最近m次迭代的曲率信息,即{sk, yk}。每當完成一次迭代,最舊的曲率信息{si, yi}將被刪除,而最新的曲率信息被保存下來。通過這種方式,算法保證了保存的曲率信息是來自於最近的m次迭代。在實際工程中,m取3到20往往能有很好的結果。除了更新矩陣Hk的策略和初始化Hk的方式不同外,L-BFGS算法和BFGS算法是一樣的。

下面將會詳細介紹一下矩陣Hk的更新步驟。

在第k次迭代,算法求得了xk,並且保存的曲率信息爲{si, yi},其中i = k-m, …, k-1。爲了得到Hk,算法首先選擇一個初始的矩陣Hk0,這是不同於BFGS算法的一個地方,L-BFGS算法允許每次迭代選取一個初始的矩陣,然後用最近的m次曲率信息對該初始矩陣進行修正,從而得到Hk

通過反覆利用式(2),我們可以得到下式:

     (7)

關於每次迭代時Hk0的初始值的設定,一個在實踐中經常用到的有效方法爲:

 (8)

(9)

其中rk表示比例係數,它利用最近一次的曲率信息來估計真實海森矩陣的大小,這就使得當前步的搜索方向較爲理想,而不至於跑得“太偏”,從而使得步長ak = 1在大多數時候都是滿足的,這樣就省去了步長搜索的步驟,節省了時間。

在L-BFGS算法中,通過保存最近m次的曲率信息來更新近似矩陣的這種方法在實踐中是很有效的。

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

百度最近提出了一個shooting算法,該算法比L-BFGS快了十倍。由於L-BFGS算法的迭代方向不是最優的,所以我猜想shooting算法應該是在迭代的方向上做了優化。

原文地址:http://blog.csdn.net/henryczj/article/details/41542049?utm_source=tuicool&utm_medium=referral
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章