最小二乘非線性優化整理
泰勒展開
在整理非線性最小二乘問題之前,先整理一個預備知識,泰勒展開。
這裏直接放上一個很不錯的學習視頻,看完這個我就開始在B站學數學了。
泰勒級數
這是一位博主對該視頻做了一個簡單的總結: 泰勒級數博客
泰勒展開的公式如下:
從視頻中我們可以知道,泰勒展開其實就是用一系列的多項式來在a點附近擬合一個複雜的函數。本質上就是讓多項式與原函數的各級導數保持一致,從而在a點附近保持比較高的一致性。
接下來的內容則是從一篇文章中截取的:
METHODS FOR NON-LINEAR LEASTSQUARES PROBLEMS
最小二乘問題與非線性優化
問題定義:
這個問題定義可能看着不是很明朗,但帶上數據擬合的例子就比較清楚了。
數據點與待擬合模型之間總是有誤差的,設擬合模型爲
該模型的係數爲 ,這是待求的。那麼最小二乘的的目的就是計算一個最優的 , 使 與的誤差之和最小。與公式1.1對應,也就是
【m表示數據點的個數,其中 被稱爲cost function】
求取全局最優解是很複雜的。在後面的解釋中,我們只給出一個較爲簡單的解決方案,也就是求取局部最優解。問題定義爲:
這也是非線性最優化問題的基本解題思路,尋找 的下降方向,持續迭代直至該函數無法再下降。【從定義1.1可以看出 總是大於等於0 的。只要 F(x) 不斷減小,那麼就擬合的越好。在ICP匹配中,就是使用最小二乘,不斷迭代來找到使總體匹配誤差最小的情況,從而求得位移矩陣及旋轉矩陣。】
原泰勒公式描述的是複雜函數在a點的擬合公式,那麼對於a+h,其泰勒公式爲
然後用x來替換a,就可以得到1.4a的公式。
後面是兩個定理。如果一個點,其一次導數等於0,附近的二次導數是正定的,那麼該點就是局部最小點。二次導數正定意味着一次導數是遞增的,也就意味着該點附近的一次導數,左邊小於0,右邊大於0。也就是該點左邊是遞減的,右邊是遞增的。那麼顯然該點是一個局部最小點。
總之,最小二乘的目標就是找到一個點,使總誤差最小。而爲了達到這個目標,所有的非線性優化方法都是通過迭代來完成的。每次迭代都需要滿足
那麼第一個方法也就呼之欲出了。就是我們想要求的迭代增量。下面介紹非線性優化的常用方法。
下降法 (Descent methods)
最速下降法 (The Steepest Descent method)
最速下降法也叫梯度法,此方法只需要計算原函數的一次導數,故計算速度比較快。從前面的定義2.6也可以大概看出,要想滿足該條件,那麼顯然 。具體的推導見下。【注意,中的 指的是 與 的夾角】
從幾何角度來看,最速下降法的下降方向就是與該點切線方向(一次導數)相反的方向。該方法的優勢在於計算速度快,對初始位置要求低,但在最終的收斂階段會比較慢,容易陷入局部最優。
牛頓法(Newton’s Method)
最速下降法只利用了一次導數的信息,並沒有關注一次導數的變化趨勢。只關注表面,而不掌握其背後的規律,這樣肯定會被迷惑,栽跟頭。比如當迭代到某一處,其附近的一次導數都爲0時,最速下降法就停止迭代了,而這個點可算不上局部最優點(原文中稱之爲Stationary point, 駐點)。而牛頓法則更聰明一點,它還考慮了二次導數的信息。一次導數反映的函數值的變化趨勢,而二次導數反映的則是一次導數的變化趨勢。
牛頓法得到的結果可以確保是局部最優,其同時滿足定理 1.5 和 1.8。但代價是較慢的下降速度與較複雜的計算(二次導數的計算)。那麼很自然的,就會有人提出一種混合的方法。在初始階段,使用最速下降法。在收斂階段,使用牛頓法。
如果該點二次導數是正定的(初始階段),使用最速下降法的下降方向。如果該點不是正定的(收斂階段),那就使用牛頓法的下降方向。
該章節後面還介紹了怎麼選取步長 ,這不是我所關注的,有興趣的可自己去看看原文。同樣,後面還有對信賴域法和阻尼法的介紹。
非線性最小二乘問題(NON-LINEAR LEAST SQUARES PROBLEMS)
問題定義
下面的定義其實與前面的最小二乘問題是一樣的,區別在於用 Jacobian Matrix 代替了一次導數, 用 Hessian Matrix 代替了 二次導數。關於線性代數,再次推薦B站學習視頻:線性代數的本質 - 系列合集
高斯牛頓法(The Gauss–Newton Method)
3.7a 公式是用 來表示 。 後面雖然看着複雜,其實也就是一些符號變換,比如用 f 表示 f(x), 用 J 表示 J(x) , 爲了將問題說的更清楚。涉及一些線性代數的知識。這裏的轉置是爲了維度匹配,簡單理解可以直接看成是乘法就好。比如 直接看成 即可。而此處得到的結果 3.9,你會發現跟 2.9a 是一樣的。 知道怎麼求每次的下降方向,也就解決了問題了。
然而,一般牛頓高斯法只是一個引子,真正高效常用的方法是 LM 方法,一種帶阻尼的高斯牛頓法。通過阻尼來混合使用高斯牛頓法和最速下降法。
The Levenberg–Marquardt Method
LM算法與 高斯牛頓法的區別在於其加入了一個阻尼因子,從而將 公式 3.11 中的 變成了 , 得到下面的 3.13 式。這個 雖然看着不起眼,但作用巨大。
- 確保了二次導數是正定的,這意味着在未到達最優點之前,求得的增量肯定是下降的。
- 當 比較大時, LM算法類似於最速下降法,這意味着該算法對初始迭代點要求不高。
- 當 較小時,LM 算法類似於高斯牛頓法,有利於收斂到最優解。
- 與前面方法相比,此動態步長更加靈活高效。
後面描述了 的初始值選取以及如何更新的。 的更新取決於一個更新比公式。該公式分子部分是原函數在某個點的增量,分母部分是近似函數在該點的增量。根據此增量比來更新 。
下面是 LM 算法的僞代碼。總體架構和前面的一樣。
最後放上一篇論文,使用 FPGA 對非線性優化最小二乘問題做加速。【雖然非線性優化需要求解高維矩陣的逆,但評估發現其運算很快,只有幾十us。】
Pang Y, Wang S, Peng Y, et al. A microcoded kernel recursive least squares processor using fpga technology[J]. ACM Transactions on Reconfigurable Technology and Systems (TRETS), 2016, 10(1): 1-22.
如果有什麼地方寫的有問題,歡迎大佬們批評指正。