最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)
目錄
- 前言
- 最速下降法(梯度下降/一階導數法)
- 牛頓法(二階導數法)
- 高斯牛頓法
- Levenberg-Marquadt(LM算法)
前言
最優化方法應用廣泛,但在實現原理上大同小異。作者在學習高翔博士的視覺SLAM十四講的過程中對其第六章非線性最小二乘求解所涉及到的最優化方法(最速下降、牛頓法、高斯牛頓法、LM算法)進行了簡要總結如下:
最速下降法(梯度下降/一階導數法)
作者在最速下降法解析(理解筆記)中曾經介紹過最速下降法的實現過程,并列舉了一個小例子。在這里,為了文章整體的完整性,我們再重新敘述一下,大家也可以參考。
假設我們希望求解一個最小二乘問題:
min?x=12∥f(x)∥22\min_{x} = \frac{1}{2}\begin{Vmatrix}f(x)\end{Vmatrix}^2_2xmin?=21?∥∥?f(x)?∥∥?22?
把上式在xxx處進行泰勒展開:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x∥∥?f(x+Δx)?∥∥?22?=∥∥?f(x)?∥∥?22?+J(x)Δx+21?ΔxTH(x)Δx
式中J(x)J(x)J(x)與H(x)H(x)H(x)分別為關于變量xxx的雅克比矩陣(一階導數)和海塞矩陣(二階導數)。
在梯度下降法中,我們只考慮在xxx處的一階梯度。則上式變為:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x∥∥?f(x+Δx)?∥∥?22?=∥∥?f(x)?∥∥?22?+J(x)Δx
認為沿著一階梯度反方向下降最快,當然,在迭代過程中每一步走多長也是一個需要考慮的問題,我們可以設計一個定長λ\lambdaλ。當然這種方式有著明顯的不合理之處,一個較大的步長會導致我們在優化過程中走出鋸齒狀路線,而一個較小的步長則會導致我們收斂速度過慢。這種設置為固定步長λ\lambdaλ的方式為梯度下降法。很多時候認為梯度下降與最速下降是等價的,這并不十分準確,最速下降法對步長λ\lambdaλ進行選取一個最優的λ?\lambda^*λ?。
其把λ\lambdaλ代入:x(1)=x(0)?λJ(x)x_{(1)}=x_{(0)}-\lambda J(x)x(1)?=x(0)??λJ(x),然后求取在f(x(1))f(x_{(1)})f(x(1)?)處取得最小值的λ\lambdaλ作為λ?\lambda^*λ?。
建議讀者去最速下降法解析(理解筆記)看一下實際使用過程中的例子。
牛頓法(二階導數法)
這里我們保留在xxx處的二階展開項:
∥f(x+Δx)∥22=∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2=\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x∥∥?f(x+Δx)?∥∥?22?=∥∥?f(x)?∥∥?22?+J(x)Δx+21?ΔxTH(x)Δx
首先明確一下我們的目的是找到一個最優的Δx?\Delta x^*Δx?使得上式取得最小值:
Δx?=arcmin(∥f(x)∥22+J(x)Δx+12ΔxTH(x)Δx)\Delta x^*=arcmin(\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+J(x)\Delta x+ \frac{1}{2}\Delta x^TH(x)\Delta x)Δx?=arcmin(∥∥?f(x)?∥∥?22?+J(x)Δx+21?ΔxTH(x)Δx)
將上式視為Δx\Delta xΔx的函數,對Δx\Delta xΔx進行求導,得到如下形式:
J(x)+H(x)ΔxJ(x)+ H(x)\Delta xJ(x)+H(x)Δx
令其導數為0:
J(x)+H(x)Δx=0J(x)+ H(x)\Delta x=0J(x)+H(x)Δx=0
則取得極小值,解出增量為:
Δx=?H(x)?1J(x)\Delta x=- H(x)^{-1}J(x)Δx=?H(x)?1J(x)
還有另外一種理解方式是把牛頓法看成是對一階導數法的求根過程,即使用牛頓法求解原函數一階導數為零的Δx\Delta xΔx。
牛頓法需要計算目標函數的二階導數H(x)H(x)H(x),這在遇到規模較大的問題時,會比較困難,因此我們常常避免H(x)H(x)H(x)矩陣的運算。
后續的高斯牛頓法和LM算法解決了這個問題。
高斯牛頓法
高斯牛頓法是對函數f(x)f(x)f(x)進行一階展開(注意不是f(x)2f(x)^2f(x)2),展開形式如下:
f(x+Δx)≈f(x)+J(x)Δxf(x+\Delta x)\approx f(x)+J(x)\Delta xf(x+Δx)≈f(x)+J(x)Δx
這里的J(x)也是雅克比矩陣,與前述不同的是這里是f(x)f(x)f(x)對變量xxx的導數。
由此,當前我們的目標變成了:尋找一個增量Δx\Delta xΔx,使得∥f(x+Δx)∥22\begin{Vmatrix}f(x+\Delta x)\end{Vmatrix}^2_2∥∥?f(x+Δx)?∥∥?22?的值達到最小。即求解下述關系:
Δx?=argmin?Δx(12∥f(x)+J(x)Δx∥22)\Delta x^*=arg\min_{\Delta x} (\frac{1}{2}\begin{Vmatrix}f(x)+J(x)\Delta x\end{Vmatrix}^2_2)Δx?=argΔxmin?(21?∥∥?f(x)+J(x)Δx?∥∥?22?)
展開上式:
12∥f(x)+J(x)Δx∥22=12(f(x)+J(x)Δx)T(f(x)+J(x)Δx)=12(∥f(x)∥22+2f(x)TJ(x)Δx+ΔxTJ(x)TJ(x)Δx)\frac{1}{2}\begin{Vmatrix}f(x)+J(x)\Delta x\end{Vmatrix}^2_2 \\ =\frac{1}{2}(f(x)+J(x)\Delta x)^T(f(x)+J(x)\Delta x) \\ = \frac{1}{2}(\begin{Vmatrix}f(x)\end{Vmatrix}^2_2+2f(x)^TJ(x)\Delta x+\Delta x^{T}J(x)^{T}J(x)\Delta x)21?∥∥?f(x)+J(x)Δx?∥∥?22?=21?(f(x)+J(x)Δx)T(f(x)+J(x)Δx)=21?(∥∥?f(x)?∥∥?22?+2f(x)TJ(x)Δx+ΔxTJ(x)TJ(x)Δx)
上式關于Δx\Delta xΔx求導,并令其為0:
J(x)Tf(x)+J(x)TJ(x)Δx=0J(x)^Tf(x)+J(x)^{T}J(x)\Delta x=0J(x)Tf(x)+J(x)TJ(x)Δx=0
即:
J(x)TJ(x)Δx=?J(x)Tf(x)J(x)^{T}J(x)\Delta x=-J(x)^Tf(x)J(x)TJ(x)Δx=?J(x)Tf(x)
上式是一個線性方程組,被稱為增量方程,也可以稱為高斯牛頓方程或者正規方程。把左邊的系數即為HHH,右側記為ggg,則上式轉換為:
HΔx=gΔx=H?1gH\Delta x=g \\ \Delta x=H^{-1}gHΔx=gΔx=H?1g
這里的HHH即為牛頓法里海塞矩陣的近似,省略了計算二階導數的過程。
上述過程中我們使用了J(x)TJ(x)J(x)^{T}J(x)J(x)TJ(x)的逆,但是J(x)TJ(x)J(x)^{T}J(x)J(x)TJ(x)是半正定的,不能保證其為非奇異性。
Levenberg-Marquadt(LM算法)
LM算法是一種信賴域方法,我們使用一個參數 ρ\rhoρ 來根據我們的近似模型跟實際函數之間的差異來確定這個范圍,如果ρ\rhoρ的值較小,則差異較小,讓范圍繼續擴大,而如果ρ\rhoρ的值很大,則差異較大,則縮小范圍:
ρ=f(x+Δx)?f(x)J(x)Δx\rho=\frac{f(x+\Delta x)-f(x)}{J(x)\Delta x}ρ=J(x)Δxf(x+Δx)?f(x)?
上式中分子是實際函數下降的值,分母是近似值。若ρ\rhoρ的值接近1則認為近似是好的。如果ρ\rhoρ太小,則認為近似比較差,則需要縮小近似范圍。反之,如果ρ\rhoρ比較大,則認為實際下降的比預計的大,我們可以擴大近似范圍。
上圖中公式(6.24)是一個帶有不等式約束的優化問題。使用一個Lagrange乘子把其轉換為一個無約束優化問題。
min?Δxk=12∥f(xk)+J(xk)Δxk∥22+λ2∥DΔx∥22\min_{\Delta x_{k}}= \frac{1}{2}\begin{Vmatrix}f(x_{k})+J(x_{k})\Delta x_{k}\end{Vmatrix}^2_2+ \frac{\lambda}{2}\begin{Vmatrix}D\Delta x\end{Vmatrix}^2_2Δxk?min?=21?∥∥?f(xk?)+J(xk?)Δxk??∥∥?22?+2λ?∥∥?DΔx?∥∥?22?
使用類似于高斯牛頓法中的過程,對上式進行求導,然后使其導數為0,得到的增量方程為:
(H+λDTD)Δx=g(H+\lambda D^TD)\Delta x=g(H+λDTD)Δx=g
與高斯牛頓法相比,我們可以發現多出來一項λDTD\lambda D^TDλDTD,簡化記D=ID=ID=I則上式變為:
(H+λI)Δx=g(H+\lambda I)\Delta x=g(H+λI)Δx=g
可以由上式觀察到,當參數λ\lambdaλ的值比較大時,則LM算法接近為最速下降法,而λ\lambdaλ的值較小時則近似于高斯牛頓法。
總結
以上是生活随笔為你收集整理的最优化方法(最速下降、牛顿法、高斯牛顿法、LM算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3ds Max制作碗实例教程
- 下一篇: HALCON示例程序measure_me