參考博客
參考博客: https://blog.csdn.net/heshaofeng2ly/article/details/105812746#3GN_50
參考博客:LM算法流程
數學基礎(泰勒展開)
泰勒展開公式:
f(x)=0!f(x0)+1!f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+......+n!f(n)(x0)(x−x0)n
該式表示 f(x)在 x0處的 n階泰勒展開.
1. 高斯牛頓法(GN法)
Gauss Newton 是最優化算法裏面最簡單的方法之一。它的思想是將f(x) 進行一階的泰勒展開.
1.1 基本原理
待優化的目標函數: ∣∣f(x+Δx)∣∣2
將目標函數中f(x+Δx) 進行一階泰勒展開可得:
f(x+Δx)≈f(x)+f′(x)Δx
取J(x)=f′(x),J(x)表示f(x)的一階導數,是雅克比矩陣.
目的: 通過不斷尋找下降矢量Δx, 使目標函數∣∣f(x+Δx)∣∣2達到最小值, 變爲線性的最小二乘問題:
Δx∗=Δxargmin21∣∣f(x+Δx)∣∣2=Δxargmin21∣∣f(x)+J(x)Δx∣∣2將其展開:
21∣∣f(x)+J(x)Δx∣∣2=21[f(x)+J(x)Δx]T[f(x)+J(x)Δx]=21[∣f(x)∣∣2+fT(x)J(x)Δx+ΔxTJT(x)f(x)+ΔxTJT(x)J(x)Δx]這裏需要注意的是ΔxTJT(x)f(x)=(fT(x)J(x)Δx)T 而轉置不改變值的大小, 兩者可以合併, 得到:
21∣∣f(x)+J(x)Δx∣∣2=21[∣f(x)∣∣2+2fT(x)J(x)Δx+ΔxTJT(x)J(x)Δx]求上式關於 ∆x 的導數,並令其爲零:
2JT(x)f(x)+2JT(x)J(x)Δx=0
這裏需要注意的是:
Y=A∗X,dXdY=AT
Y=X∗A,dXdY=A
dXdXT=I
可以得到如下方程組:
JT(x)J(x)Δx=−JT(x)f(x)注意,我們要求解的變量是 ∆x,因此這是一個線性方程組,我們稱它爲增量方程,也可以稱爲高斯牛頓方程或者正規方程.
其中J(x)=f′(x)表示f(x)的一階導數,是雅克比矩陣.f(x)爲x處的值
1.2 GN迭代算法步驟
- 給定初始值x0, 即取x=x0.
- 對於第k次迭代,期初一階導數雅克比矩陣J(xk)=f′(xk), 以及目標函數(誤差)f(xk).
- 求解增量方程: JT(xk)J(xk)Δxk=−JT(xk)f(xk), 將(2)的值帶入方程,求出Δxk.
- 若Δxk足夠小,停止迭代. 否則令xk+1=xk+Δxk, 返回(2), 繼續迭代計算.
1.3 優缺點
-
優點: 高斯牛頓(Gauss-Newton)法是對牛頓法的一種改進,它用雅克比矩陣的乘積近似代替牛頓法中的二階Hessian 矩陣,從而省略了求二階Hessian 矩陣的計算,計算量降低.
-
缺點1: 在高斯牛頓法中,用來近似Hessian矩陣的JTJ可能是奇異矩陣(不可逆)或者病態的,此時會導致方程無解,穩定性很差,算法不收斂.
-
缺點2: 由於採用二階泰勒展開來進行的推導,而泰勒展開只是在一個較小的範圍內的近似,因此如果高斯牛頓法計算得到的步長較大的話,上述的近似將不再準確,也會導致算法不收斂.
2. 列文伯格-馬夸特法(LM法)
Levenberg-Marquardt (LM)在一定程度上修正了高斯牛頓法的缺點,因此它比高斯牛頓法更加魯棒,不過是以犧牲一定的收斂速度爲代價–它的收斂速度比高斯牛頓法慢. 也被稱爲阻尼牛頓法.
2.1 基本原理
LM法加入一個正定對角陣uI, 一定程度上修正了GN的缺點.
LM算法增量方程:
(JT(x)J(x)+uI)Δx=−JT(x)f(x)其中u≥0,u表示信賴域半徑.
- 當u=0時,LM退化爲高斯牛頓法(GN)
- 當u很大時,LM退化爲一階梯度下降法
LM法會在每一次迭代計算因子ρ來判斷泰勒近似是否良好,並根據因子ρ,動態擴大或縮小信賴域半徑u.
ρ=J(x)Δxf(x+Δx)−f(x)
- 若因子ρ接近於1, 則認爲泰勒近似比較準確, 可以擴大信賴域半徑u
- 若因子ρ遠小於1, 則認爲泰勒近似結果較差, 可以縮小信賴域半徑u
2.2 LM迭代算法步驟
-
給定初始值x0, 設置u初始值u0
A0=JT(x0)J(x0)u0=τimax(aii0)其中τ需要自己設定, aii爲A0的對角線元素.
-
第k次迭代,根據前面的公式求出步長Δxk, 並計算此時的ρk.
-
根據ρk的取值來調整信賴域半徑:
- (1) 若ρk≤0.25,說明步子過大, 泰勒近似較差,應縮小信賴域半徑, 取uk+1=21uk
- (2) 若ρk≥0.75,說明步子較小, 泰勒近似準確,應擴大信賴域半徑, 取uk+1=2uk
- (3) 若0.25<ρk<0.75,說明 泰勒近似介於兩者之間,應保持此時的信賴域半徑, 取uk+1=uk
-
若Δxk足夠小, 則停止迭代, 否則根據ρk大小判斷xk+1應該如何更新. 計算出xk+1後返回(2), 繼續進行迭代:
- (1) 若ρk≤0,說明誤差向着上升而非下降的趨勢變化了(與最優化的目標相反),這說明這一步邁得錯得“離譜”了,這時不應該走到下一點,而應“原地踏步”,即取xk+1=xk
- (2) 若ρk≥0,說明可以向下一步走, 取xk+1=xk+Δxk
2.3 優缺點
- 優點: 在一定程度上修正了高斯牛頓算法不收斂的缺點,同時具備高斯牛頓法和一階梯度算法的特點, 因此它比高斯牛頓法更加魯棒.
- 缺點: 由於需要不斷計算更新收斂域半徑u,不斷變化梯度下降步長,會導致收斂速度較慢.
3. 手抄版