L-BFGS


L-BFGS算法比較適合在大規模的數值計算中,具備牛頓法收斂速度快的特點,但不需要牛頓法那樣存儲Hesse矩陣,因此節省了大量的空間以及計算資源。本文主要通過對於無約束最優化問題的一些常用算法總結,一步步的理解L-BFGS算法,本文按照最速下降法 - 牛頓法 - 共軛梯度法 - 擬牛頓法 - DFP矯正 - BFGS 矯正 - LBFGS算法這樣一個順序進行概述。(讀了一些文章之后,深感數學功底不夠,在計算機視覺領域和機器學習領域,數學還是王道)

 

1. 最優化方法的迭代思想: 最優化方法采用的都是迭代的方法,基本思想是給定一個初始的點x_0,按照某一個迭代的規則產生一個點列{x_k},在點列有限的情況下最后一個x_k就為最優解,當點列無窮的時候,則極限點為最優解。基本的迭代方程形式如下:

大規模優化算法 <wbr>- <wbr>LBFGS算法

其中x_k就是迭代點列中的點,d_k為第k次搜索的方向,a_k為步長。

在所有的優化方法中三個關鍵的因素是:初始值x_0, 方向d_k 以及步長a_k,因此在一般的對於優化算法的學習,只需要搞懂這三個東西是怎么生成的,也就可以了。進一步理解則需要對於其理論進行深入的分析了。

 

2.  最速下降法(Gradient descent):GD算法是無約束最優化算法中最簡單的一種算法,它的各種變種也被應用到大規模的機器學習任務中來,比如SGD,batch GD,mini-batch等。

 

GD算法的一個基本假設就是函數f(x)在x_k處是連續可謂的,並且其導數g_k在x_k處不為0. 將一個函數在x_k這一點做一階的泰勒展開,得到:

 大規模優化算法 <wbr>- <wbr>LBFGS算法

優化的目的是讓函數值隨着點列{x_k}的漸進,逐漸下降,在上式中就是讓f(x)小於f(x_k),如何達到這一個目的呢。

由於泰勒展開余項的值相對很小,因此我們可以忽略它。看第二項大規模優化算法 <wbr>- <wbr>LBFGS算法 ,如果它為負值,就可以達到我們的目的。記大規模優化算法 <wbr>- <wbr>LBFGS算法,那么大規模優化算法 <wbr>- <wbr>LBFGS算法的方向d_k就是下降的方向,這個方向有無窮多個,那那個最大呢,由Cauchy-Schwartz不等式,有

 大規模優化算法 <wbr>- <wbr>LBFGS算法

這樣我么可以很容易的推導出當且僅當大規模優化算法 <wbr>- <wbr>LBFGS算法時候,第二項最小,由此得到最速下降法的迭代公式

大規模優化算法 <wbr>- <wbr>LBFGS算法

這里需要注意的是,最速下降方向僅僅是算法的局部性質,也就是說在局部它是一個下降最快的方向,並不是在全局上。在極值點附近,步長越小,前進越慢。

 

3. 牛頓法(Newton method)

 

最速下降法采用的泰勒的一階展開,而牛頓法采用的是泰勒二階展開。

 大規模優化算法 <wbr>- <wbr>LBFGS算法

其中s = x-x_k,將右邊的式子最小化,就可以得到牛頓法的迭代公式

大規模優化算法 <wbr>- <wbr>LBFGS算法

對於正定的二次函數,牛頓法一步就可以達到最優解,也就是不用迭代,就是解析解。而對於非二次函數,牛頓法並不能保證經過有限次迭代就可以求得最優解。有一點是在極小點附近目標函數接近於二次函數,因此其收斂速度一般是快的(2階收斂速度)。另外需要注意的是牛頓法需要計算二階導也就是hesse 矩陣,因此需要較大的存儲空間和計算量,在大規模的數值計算中直接使用牛頓法是不合適的。

 

4. 共軛梯度法(Conjugate Gradient):共軛梯度法是介於GD和Newton法之間的一個方法,它僅僅需要利用一階導數的信息,克服了GD方法收斂慢的特點,由避免了計算和存儲Hesse矩陣信息。其基本思想是把共軛性與最速下降方法相結合,利用已知點處的梯度構造一組共軛方向,並沿這組方向進行搜素,求出目標函數的極小點。

 

 共軛:對於任意兩個n維向量d1,d2來說,如果對於對於一個n*n對稱正定矩陣,滿足大規模優化算法 <wbr>- <wbr>LBFGS算法則稱d1,d2是G共軛的,同時它們也就是線性無關的。假設我們所要求的函數具有以下形式(這個形式和牛頓法的那個二階展開是否很像,G是二階導數矩陣,G正定 ?,這一點是BFGS算法的核心點,下面會提到)。

 大規模優化算法 <wbr>- <wbr>LBFGS算法


導數矩陣為

大規模優化算法 <wbr>- <wbr>LBFGS算法

共軛梯度法關鍵點是如何找共軛的方向,同時保證函數下降。一般說來,基本的假設是當前的搜索方向是當前梯度和前面所有梯度的一個線性組合,這個假設在一定程度上是合理的:每一個下降方向都是和前面的相關的,並不是完全無關的。初始化一個d_0方向,根據這個假設可以得到:

 大規模優化算法 <wbr>- <wbr>LBFGS算法 

其中beta就是關於上一方向的系數,而beta如何計算?我們如果有了一個對稱的正定矩陣G,beta可以由下面的公式來計算(由上式子,和共軛條件推導得來)

 大規模優化算法 <wbr>- <wbr>LBFGS算法 

這樣最后可以得到最終的共軛梯度法的計算公式:

 大規模優化算法 <wbr>- <wbr>LBFGS算法


大規模優化算法 <wbr>- <wbr>LBFGS算法

 

總結以下4個屬性

a. 同一點處的搜索方向與梯度的點積等於該點處的負梯度與梯度的點積,

b. 某一點處的梯度與前面所有搜索方向的點積為0,

c. 某一點處的梯度與前面所有梯度的點積為0,

d . 某一點處的搜索方向與前面所有搜索方向共軛。

 

在一個需要特別指出的一點:共軛梯度法只使用到了函數的一階導數的,而沒有涉及到二階導數,在beta的計算中給消掉了,所以不用計算和存儲Hesse矩陣了。但是共軛方法經過n步迭代之后,產生的新方向可能不再有共軛性,需要進一步的修正,比如從新取負梯度方向為下降方向等。

 

 

5. 擬牛頓法(Quasi-Newton)

 

在牛頓法中,函數的Hesse矩陣實際上提供的是函數的曲率,但是計算Hesse矩陣在很多情況下並不是很方便的事情,在高緯的情況下,存在計算量大,需要較大的存儲空間的問題,人們想到能不能不顯示的計算Hesse矩陣,而是利用一個和Hesse矩陣的近似來替代它呢,這就是擬牛頓法的初衷也是它名字的由來。

 

擬牛頓法的核心思想是:構造與Hesse矩陣相似的正定矩陣,而這個構造方法計算量比牛頓法小。其實可以發現上面講的共軛梯度法也避免了Hesse矩陣的直接計算,一定程度上可以認為擬牛頓法是共軛梯度法的兄弟。

 

首先將目標函數展成二階的泰勒級數,(和3中的牛頓法的表示略有不同,只是為了后邊書寫的方便,其實是一樣的)

 大規模優化算法 <wbr>- <wbr>LBFGS算法


目標是推導一個G的近似,因此上面兩邊對x求導,可以得到

大規模優化算法 <wbr>- <wbr>LBFGS算法

令  大規模優化算法 <wbr>- <wbr>LBFGS算法可以得到 

大規模優化算法 <wbr>- <wbr>LBFGS算法

再變化一下,得到

大規模優化算法 <wbr>- <wbr>LBFGS算法

此處的H表示的是G的逆的近似,這個公式就是逆牛頓條件或者逆牛頓方程。同時我們也可以這樣來寫這個方程

大規模優化算法 <wbr>- <wbr>LBFGS算法

此處的B表示的就是G的近似,也是BFGS公式推導的一個基礎。以上兩個公式互為對偶。

總結一下,如果我們使用H來替代原來牛頓方法中的G的逆,就變成了擬牛頓法。如何擬合H變成了重點。

在擬牛頓法中有兩個重要的方法,一個是DFP(Davidon、Fletcher、Powell三人的首字母)方法,由Davidon(1959)提出,Felether和Powell(1963)發展,一個就是BFGS方法。下面分別來討論一下。

 

6. 擬牛頓法 - DFP

 

DFP算法的矯正公式為

 大規模優化算法 <wbr>- <wbr>LBFGS算法 

這個公式是由對於矩陣的秩二矯正(rank two update)推導而來的,設u,v為任意的n維向量,構造:

 大規模優化算法 <wbr>- <wbr>LBFGS算法

帶入擬牛頓條件可以得到:

大規模優化算法 <wbr>- <wbr>LBFGS算法

 為了使得上述公式成立,做如下的構造:

 

大規模優化算法 <wbr>- <wbr>LBFGS算法  大規模優化算法 <wbr>- <wbr>LBFGS算法

這樣公式就成立了,由此導出了DFP算法的矯正公式。

 

7. 擬牛頓法 - BFGS

到這里我們終於距離L-BFGS算法越來越接近了。關於B的BFGS矯正公式如下

 大規模優化算法 <wbr>- <wbr>LBFGS算法


 

利用兩次Sharman-Morrison的逆的 rank one update就可以得到關於H的BFGS矯正公式

 

大規模優化算法 <wbr>- <wbr>LBFGS算法

 

Sharman-Morrison 定理(如下式)是描述的如何求秩一校正后的矩陣的逆矩陣:

大規模優化算法 <wbr>- <wbr>LBFGS算法

其實B_k就是H_k的逆矩陣,利用這個定理可以對於B的BFGS矯正公式的右端求逆矩陣,從而可以得到關於H的BFGS矯正。

 

8. L-BFGS算法

 

在上述的BFGS算法的計算過程中,H_k逐漸的變得稠密,因此計算量逐漸正大。為了避免這個問題,LBFGS算法做了以下的改進:

a) 在每一步估算hesse矩陣的近似的時候,給出一個當前的初始估計H0

b) 利用過去的m-1次的曲率信息修正H0直到得到最終的Hesse矩陣。

 

在關於H的BFGS矯正中,令

大規模優化算法 <wbr>- <wbr>LBFGS算法

得到

大規模優化算法 <wbr>- <wbr>LBFGS算法

 然后給定m,則迭代m+1次后得到此時的H

 大規模優化算法 <wbr>- <wbr>LBFGS算法

寫出H的最終表達式為

 大規模優化算法 <wbr>- <wbr>LBFGS算法 

初始值由以下公式給出。

 大規模優化算法 <wbr>- <wbr>LBFGS算法

L-BFGS算法的優點是,它不需要記憶H或者B這兩個近似矩陣,而只需要存儲{si,yi}的一個序列,這樣就大大節省了存儲空間。

 

9. 在@夏粉_百度 的幾次講座中都提到了LBFGS算法,並提到百度首創的Shooting算法,既然是和LBFGS算法比較的,相必也應該是從這個算法出發的,提出的一些改進。可以看到Shooting算法在初始的時候下降的非常快,收斂速度比LBFGS要快一些,具體怎么做的就不知道了。

 

順便提一下,LBFGS構造的H並不一定是最優的下降方向,但保證正定,也就是函數一定會下降,估計Shooting算法會在這個最優方向上做文章。

大規模優化算法 <wbr>- <wbr>LBFGS算法

 

10. 總結:

 

從LBFGS算法的流程來看,其整個的核心的就是如何快速計算一個Hesse的近似:重點一是近似,所以有了LBFGS算法中使用前m個近似下降方向進行迭代的計算過程;重點二是快速,這個體現在不用保存Hesse矩陣上,只需要使用一個保存后的一階導數序列就可以完成,因此不需要大量的存儲,從而節省了計算資源;重點三,是在推導中使用秩二校正構造了一個正定矩陣,即便這個矩陣不是最優的下降方向,但至少可以保證函數下降。

 

參考文獻:

 

1. 《最優化理論與方法》 袁亞湘 孫文瑜

 

2.   http://blog.csdn.net/nocml/article/details/8287466

 

3.  Updating Quasi-Newton Matrices with Limited Storage , Jorge Nocedal

 

4.  Nonlinear Programming, second edition, Dimitri P. Bertsekas

 

5. 《廣告數據上的大規模機器學習》  夏粉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM