這是前一段時間寫的博客,然後又重新整理了一下
【最速下降法】
無約束最優化方法不涉及約束條件,所以都是介紹如何尋找搜索方向以及搜索步長。
無約束最優化問題的目標函數:
minx∈Rnf(x)
感覺這latex還是有些彆扭,稍不留意就直接當做字符處理了。
還是首先介紹一下梯度下降,梯度下降學過優化的都很清楚,一般叫最速下降法,這個方法有兩點,首先是
x 更新的方向是負梯度方向,第二個是沿着該方向搜索,找到該方向的最小值所對應的
x 就是下次更新的值。梯度下降是最簡單的一種方法,但是很多情況下卻並不使用這種方法,原因是收斂速率比較慢,問題出在第二步上,由於搜索搜索時一直打到該方向的最小值,那麼很顯然,繼續沿着該方向搜索會使函數值變小,函數梯度與搜索方向夾角大於九十度,所以該點的梯度和搜索方向在此時正交,這樣相鄰搜索點的梯度就會呈現鋸齒狀,函數沿着鋸齒狀下降,嚴重降低目標函數的收斂速率。
梯度下降的遞推公式推導是根據函數的一階泰勒展開近似得到的。將
f(x) 在
x(k) 附近進行一階泰勒展開:
f(x)≈f(x(k))+gTk(x−x(k))
這裏,
gk=g(x(k))=∇f(x(k)) 爲
f(x) 在
x(k) 的梯度。
那麼第
k+1 次的迭代值就可以通過:
x(k+1)←x(k)+λkpk
.
其中
pk 是搜索方向,取負梯度方向
pk=−∇f(x(k)) 可以使函數下降最快,
λk 是步長,並且取
λk 使得
f(x(k)+λkpk)=minλ≥0f(x(k)+λpk)
最速下降法就是這樣,不斷地尋找搜索方向以及確定搜索步長,直到達到終止條件,相鄰函數值相遇某個閾值或是
x(k) 和
x(k+1) 小於某個閾值。但是產生的問題就是最速下降在接近終點的時候收斂速度較慢,容易之字形收斂。當然步長也不必是取該方向下降盡頭的值,可以取固定值,但是太大容易發散,太小收斂速率比較慢。
關於隨機梯度下降法與批量下降法,大多數用梯度下降是求無約束目標函數,例如求經驗損失最小時函數的參數,含有大量的訓練數據。批量下降法是同時使用所有數據對梯度進行更新,很顯然需要好多次迭代。隨機梯度下降是每次只使用一個數據對函數參數進行更新,這樣往往只通過一部分數據更新參數就會收斂,但是由於每次根據一個數據跟新,容易造成噪音問題。
【牛頓法】
由於最速梯度下降收斂速度並不“最速”,局部搜索中最速下降的方向和全局的最小值方向並不一致,所以就有後來改進的方法,包括牛頓法以及擬牛頓法。
牛頓法要求f(x) 具有二階連續可導性。
仍然考慮無約束最優化問題的目標函數:
minx∈Rf(x)
這裏所不同的是進行二階泰勒展開:
f(x)≈f(x(k))+gTk(x−x(k))+12(x−x(k))TH(x(k))(x−x(k))
這裏,
gk=g(x(k))=∇f(x(k)) 爲
f(x) 在
x(k) 的梯度。
H(x(k)) 是
f(x) 的海塞矩陣
H(x)=[∂2f(x)∂xi∂xj]n×n
顯然,
f(x) 有極值的條件是在
xk 處的一階導數爲0,
∇f(x)=0 ,所以,當我們從
xk 處開始搜索時,搜索終止處
xk+1 應該滿足
∇f(x(k+1))=0 。所以我們對二階近似求導。
∇f(x)=gk+Hk(x−x(k))
所以
gk+Hk(x−x(k))=0
then,
x(k+1)=x(k)−H−1kgk
經典牛頓法雖然具有二次收斂性,但是要求初始點需要儘量靠近極小點,否則有可能不收斂。計算過程中需要計算目標函數的二階偏導數,難度較大。更爲複雜的是目標函數的Hesse矩陣無法保持正定,會導致算法產生的方向不能保證是f在Xk 處的下降方向,從而令牛頓法失效;特別的,如果Hesse矩陣奇異,牛頓方向可能根本是不存在的。
擬牛頓法
上面說了,雖然牛頓法能夠具有二次收斂性,但是要求太高,個別情況下甚至無法求出牛頓法的迭代方向,所以就有了擬牛頓法,來對Hesse矩陣的逆進行近似。
通過泰勒二階近似可以得到:
∇f(xk+1)=∇f(xk)+Hk(x(k+1)−xk)
令,
yk=∇f(xk+1)−∇f(xk),sk=x(k+1)−xk
then,
yk=Hksk
或者說,
H−1kyk=sk
注意到,
sk=x(k+1)−x(k)=αdk
,所以擬牛頓法模擬了牛頓的方向。
所以,擬牛頓法選取滿足條件
Bksk=yk ,
Bk 作爲Hesse矩陣
Hk 的近似,或者
sk=Gkyk Gk 作爲hesse矩陣逆的近似,而且要使得計算簡便。當有了
Bk 之後,通過對
Bk 進行低秩修改得到
Bk+1 ,
Bk+1=Bk+Δk
使其仍滿足近似條件。
一般,最初始
Bk 都是使用單位矩陣或者隨機初始化。
SR1
根據修改Bk 方法的不同,衍生出很多不同的方法,最簡單的就是給Bk−1 加上一個秩爲1的對稱矩陣,由於秩爲1的對稱矩陣可以寫成一個列向量和其轉置相乘的形式,所以Bk 的約束條件可以寫成:
(Bk−1+βkukuTk)sk=yk
展開得到:
Bk−1sk+βkukuTksk=yk
注意到
uTksk 是個常數,所以,
−Bk−1sk+yk=(βkuTksk)uk
所以我們可以選
βk 使其滿足
βkuTksk=1
uk=yk−Bk−1sk,βk=1uTksk=1sTkuk=1sTk(yk−Bk−1sk)
最後得到
Bk 的更新式子
Bk=Bk−1+(yk−Bk−1sk)(yk−Bk−1sk)TsTk(yk−Bk−1sk)
當然,通過
Gk 也能得到類似的式子,
BFGS
BFGS方法是一種秩2近似,至於爲什麼使用秩2近似這個暫時還不得而知。先講一下是如何推導的。
BFGS是近似海瑟矩陣H ,首先,相應的牛頓條件是
Bk+1sk=yk
使用秩2近似,
Bk+1=Bk+Pk+Qk=Bk+αukuTk+βvkvTk
所以,
Bk+1sk=(Bk+Pk+Qk)sk=Bksk+αukuTksk+βvkvTksk=yk
Bk+1sk=Bksk+(αuTksk)uk+(βvTksk)vk=yk
由於滿足條件的
α,β,uk,vk 相當多,所以可以這樣設置,
αuTksk=1,βvTksk=1
α=1uTksk,β=1vTksk
這樣式子就成了
Bk+1sk=Bksk+uk+vk=yk
令
uk=yk,Bksk+vk=0,vk=−Bksk
所以(
Bk 是對稱的)
Bk=Bk+αukuTk+βvkvTk
=Bk+ykyTkyTksk−BksksTkBksTkBksk
我們使用的
Bk 的逆,所以這裏還需要使用Sherman-Morrison公式,假設A是n階可逆矩陣,
u,v 是n維向量,且
A+uvT 也是可逆矩陣,則
(A+uvT)−1=A−1−A−1uvTA−11+vTA−1u
得到
B−1k+1=(I−skyTkyTksk)B−1k(I−yksTkyTksk)+sksTkyTksk
或者說使用Sherman–Morrison–Woodbury formula 進行一步變換【7】
(A+UVT)−1=A−1−A−1U(I+VTA−1U)−1VTA−1
由這個式子就很容推了,上面式子可以寫成
(A+∑i=1kuivTi)−1=A−1−A−1U(C)−1VTA−1
Cij=δij+vTiA−1uj.i,j=1,2,...k
很明顯,BFGS是對於Sherman–Morrison–Woodbury k=2的情況,
我們可以令
u1=v1=yk(sTkyk)1/2,u2=−v2=Bksk(sTkBksk)1/2
我們可以令
Hk=B−1k
C11=1+vT1A−1u1=1+yTkHkyksTkyk
C22=1+vT2A−1u2=1−sTkBkHkBksksTkBksk=1−1=0
C12=vT1u2=yTkBksk(sTkyk)1/2)(sTkBksk)1/2=(sTkBksk)1/2(sTkyk)1/2
C21=vT2u1=−C11
回想一下2x2矩陣的逆
C={β−αα0}
C−1=1α2{0α−αβ}
β=C11=1+yTkHkyksTkyk,α=C12=(sTkBksk)1/2(sTkyk)1/2
然後就是代入了,可以令
U˜=HkU,V˜=HkV
這樣,對於每一維
u˜i=Hkui,v˜i=Hkvi,i=1,2
Hk+1←Hk−HkUC−1VTHk=Hk−U˜C−1V˜T=Hk+1α(−u˜1v˜T1)−βα2u˜2vT2=Hk−HkyksTk+skyTkHksTkyk+sksTksTkyk(1+yTkHkyksTkyk)
整理就得到BFGS的一般式了
DFP
DFP推導方法和BFGS類似,只不過是對hesse矩陣的逆進行近似,略。
LBFGS
關於LBFGS的推導,可以參考【3】和【4】,主要是通過BFGS的最後目標式子,不再保留完整的矩陣B_k^{-1},因爲當維度很大的時候(n>10^4),需要的空間非常大,所以保留了一些計算B−1k 需要的sk,yk 序列,而且只保存最近的m個序列。
這裏不妨用Hk 表示B−1k ,非hesse矩陣.
Hk+1=(I−skyTkyTksk)Hk(I−yksTkyTksk)+sksTkyTksk
define:
ρk=1yTksk ,
Vk=I−ρkyksTk ,then the above formulation can be rewritten as:
Hk+1=VTkHkVk+ρksksTk
Then,recursively
H1=VT0H0V0+ρ0s0sT0
H2===VT1H1V1+ρ1s1sT1VT1(VT0H0V0+ρ0s0sT0)V1+ρ1s1sT1VT1VT0H0V0V1+VT1ρ0s0sT0)V1+ρ1s1sT1
所以就有了這個公式:
Hk+1=++++(VTkVTk−1...VT1VT0)H0(V0V1...Vk−1Vk)(VTkVTk−1...VT1)ρ1s1sT1(V1...Vk−1Vk)...(VTk)ρk−1sk−1sTk−1(Vk)ρksksTk
然後爲了算這個式子,需要不斷迭代LBFGS原著中給了一個兩層的遞推程序求這個式子,只保留最近m步:
Hk+1=++...++(VTkVTk−1...VTk−m)H0(Vk−m...Vk−1Vk)(VTkVTk−1...VTk−m+1)ρk−msk−msTk−m(Vk−m+1...Vk−1Vk)(VTk)ρk−1sk−1sTk−1(Vk)ρksksTk
更新的方向:
Hk+1∇f(x)=++++(VTkVTk−1...VTk−m)H0(Vk−m...Vk−1Vk)∇f(x)(VTkVTk−1...VTk−m+1)ρk−msk−msTk−m(Vk−m+1...Vk−1Vk)∇f(x)...(VTk)ρk−1sk−1sTk−1(Vk)∇f(x)ρksksTk∇f(x)
所謂的Two-loop算法:
qk←∇f(xk)
對
i=k−1 to k−m
αi=ρisTiqi+1
qi=qi+1−αiyi
然後第二次循環,
根據 wiki LBFGS 【5】
H0=yTk−1sk−1yTk−1yk−1
初始化:rk−m−1=H0qk−m
對於 i=k−m,k−m+1 to k−1
βi=ρiyTiri−1
ri=ri−1+si(αi−βi)
最後得到的r 即爲所求。上面的q以及 r都只有最後一步結果,中間結果的可以用一個變量代替。
參考:
【1】http://blog.csdn.net/lilyth_lilyth/article/details/8973972
【2】統計學習方法
【3】http://blog.csdn.net/lansatiankongxxc/article/details/38801863
【4】http://blog.csdn.net/zhirom/article/details/38332111
【5】http://en.wikipedia.org/wiki/Limited-memory_BFGS
【6】http://en.wikipedia.org/wiki/Woodbury_matrix_identity
【7】http://www.ing.unitn.it/~bertolaz/2-teaching/2004-2005/AA-2004-2005-PHD/lucidi/slides-mQN-1x2.pdf
【8】http://www.iaeng.org/publication/WCE2012/WCE2012_pp1-5.pdf