優化問題一直貫穿整個學習與生活,而且在數學上一直有很重要的地位。優化問題根據不同應用場景有不同的分類:如線性優化與非線性優化,無約束優化與有約束優化等等。值得一提的是,現如今我們所接觸的都屬於最優化問題。
一、概述
所謂優化,就是指在給定的目標函數中,尋找最優的一組數值映射,即 x --- min f(x)。根據導數理論,我們可以借助導數方程Δf(x)=0的求解獲取有效的x的取值。然而,在實際的應用場景中,f(x)的嚴格數學解析式常常會非常復雜甚至沒有具體形式,亦或者存在大量的自變量,這就直接導致根本無法獲得導數方程,此時,就必須借助其他的方法來求解最優值了。
當f(x)是非線性函數時,我們稱為該優化為非線性優化,其本質依舊是最優化問題,在本次分享中我們聚焦於無約束的非線性優化。(有約束優化的解決方法請自行參考學習凸優化理論以及拉格朗日乘子法)
二、參考資料
1、高翔————《視覺SLAM十四講》第六章 非線性優化
2、《多視圖幾何》
3、https://blog.csdn.net/xiaocong1990/article/details/82814906
4、https://blog.csdn.net/yu132563/article/details/81239276
三、一階梯度法和二階梯度法
這里,我們稱f(x)為目標函數,其代表一個高度非線性,自變量為x(維度至少為1)的函數映射。由於無法直接根據導數計算極值點(但是一般情況下導數是存在的,只是形式過於復雜或是無法通過公式表達),最有效的方法就是通過迭代的方法一步一步逼近目標函數的極值點。
我們設計一個問題:找f(x)的最小值(此處x為n維向量,不是一維的)。根據上述說明,可以變為尋找f(x+Δx)的最小值,再依此迭代多次,逼近f(x)的最小值。此時,x變為已知(可以簡單理解為初始值),而未知是Δx的大小(當然也可以理解為方向,因為n維向量表示了一個方向)。也就是說,我們希望找到一個Δx,使得函數f(x+Δx)在點x處取得最小值。那么,一個自然的想法就是將f(x+Δx)對Δx求導,再另f'(x+Δx)=0就可以找到Δx的值。然而,這其實又回到了上面說的問題,即求f'(x+Δx)=0和f'(x)=0是一樣不可求的。怎么辦?
數學大殺器:泰勒級數展開!
f(x+Δx)處於f(x)的鄰域中,根據泰勒級數的性質和要求,在點x如下展開:
將上式對Δx求導,並令導函數為0,此時對應的Δx就是所求的解。然而由於存在Δx的高階項,仍然很困難獲得具體數值,不過考慮到此時在x的領域內,我們可以忽略Δx的高階項。
1、一階梯度法
當僅保留一階項時,得:(注意求導的
上式中的J(x)在多維情況下,被稱為雅可比矩陣,其實就是對f(x)求偏導。此時增量Δx的大小為:
這是因為J(x)本身和Δx無關,僅僅提供一個方向(從一維度理解就是一個斜率而已),所以這里的重點是這個方向,而不是數值,而在實際使用的時候,往往會增加一個步長(也有增加歸一化):
這就是一階梯度下降算法,也叫做最速下降法。
2、二階梯度法
和上面的問題很近似,當保留的項增加到二階時,方程為:
上式中的H(x)被稱為Hessian矩陣,而且J(x)和H(x)在點x的值是已知的,所以上式是一個線性方程組。
此時, Δx可求解,這個方法被稱之為牛頓法。
至此,可以看到,一階和二階梯度法都非常直觀,核心做法就是對目標函數在迭代點附近進行泰勒展開,針對更新量做最小化即可。由於展開后的方程都是線性的,因此增量的求解只需要解線性方程即可。
但是都存在一定的問題:
最速下降法過於貪心,容易走出鋸齒路線,反而增加了迭代次數,同時在靠近極小值時收斂速度下降;
牛頓法需要計算目標函數的Hessian矩陣,當問題規模較大時,計算困難。
四、改進
一階梯度下降算法的改進大多是針對其缺點進行地改動,這些改動大多集中使用在深度學習中,如批量梯度下降算法(Batch Gradient Descent, BGD),隨機梯度下降(Stochastic Gradient Descent, SGD)等等,具體的分析在后續分享會中在進行。
我們主要來看二階梯度下降算法的改進。總結來講主要是針對Hessian矩陣的處理方式的不同導致出現了不同的二階優化算法(提高效率)。
1、擬牛頓法
擬牛頓法是求解非線性優化問題最有效的方法之一,其本質思想是改善牛頓法每次需要求解復雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的復雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優於最速下降法,尤其對於困難的問題。另外,因為擬牛頓法不需要二階導數的信息,所以有時比牛頓法更為有效。如今,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。
可以看出,該優化算法的關鍵在於近似Hessian矩陣的正定矩陣的求解,著名的方法有DFP,BFGS,LBFGS。(詳細的證明推導不在此進行)
2、Gauss-Newton
Gauss Newton 是最優化算法里面最簡單的方法之一。它的思想是將 f(x) 進行一階的泰勒展開(請注意不是目標函數 f(x) 2 ):
這里 J(x) 為 f(x) 關於 x 的導數,實際上是一個 m × n 的矩陣,也是一個雅可比矩陣。根據前面的框架,當前的目標是為了尋找下降矢量 ∆x,使得||f(x + ∆x)||2達到最小。為了求 ∆x,我們需要解一個線性的最小二乘問題:
這個方程與之前有什么不一樣呢?根據極值條件,將上述目標函數對 ∆x 求導,並令導數為零。由於這里考慮的是 ∆x 的導數(而不是 x),我們最后將得到一個線性的方程。
為此,先展開目標函數的平方項:
求上式關於 ∆x 的導數,並令其為零:
可以得到如下方程組:
注意,我們要求解的變量是 ∆x,這是增量方程,也可以稱為高斯牛頓方程 (Gauss Newton equations) 或者正規方程 (Normal equations)。我們把左邊的系數定義為 H,右邊定義為 g,那么上式變為:
對比牛頓法可見,Gauss-Newton 用 JT J作為牛頓法中二階 Hessian 矩陣的近似,從而省略了計算 H 的過程。
然而,不同於擬牛頓法,這里JT J在實際數據中是半正定的,這也就意味着存在奇異矩陣或者病態的情況,此時算法很可能不收斂。
3、Levenberg-Marquadt
由於 Gauss-Newton 方法中采用的近似二階泰勒展開只能在展開點附近有較好的近似效果,所以我們很自然地想到應該給 ∆x 添加一個信賴區域(Trust Region),不能讓它太大而使得近似不准確。非線性優化種有一系列這類方法,這類方法也被稱之為信賴區域方法 (Trust Region Method)。在信賴區域里邊,我們認為近似是有效的;出了這個區域,近似可能會出問題。
那么如何確定這個信賴區域的范圍呢?一個比較好的方法是根據我們的近似模型跟實際函數之間的差異來確定這個范圍:如果差異小,我們就讓范圍盡可能大;如果差異大,我們就縮小這個近似范圍。因此,考慮使用:
來判斷泰勒近似是否夠好。ρ 的分子是實際函數下降的值,分母是近似模型下降的值。如果 ρ 接近於 1,則近似是好的。如果 ρ 太小,說明實際減小的值遠少於近似減小的值,則認為近似比較差,需要縮小近似范圍。反之,如果 ρ 比較大,則說明實際下降的比預計的更大,我們可以放大近似范圍。
這里近似范圍擴大的倍數和閾值都是經驗值,可以替換成別的數值。在式(6.24)中,我們把增量限定於一個半徑為 µ 的球中,認為只在這個球內才是有效的。帶上 D 之后,這個球可以看成一個橢球。在 Levenberg 提出的優化方法中,把 D 取成單位陣 I,相當於直接把 ∆x 約束在一個球中。隨后,Marqaurdt 提出將 D 取成非負數對角陣——實際中通常用JT J的對角元素平方根,使得在梯度小的維度上約束范圍更大一些。
不論如何,在 L-M 優化中,我們都需要解式(6.24)那樣一個子問題來獲得梯度。這個子問題是帶不等式約束的優化問題,我們用 Lagrange 乘子將它轉化為一個無約束優化問題:
這里 λ 為 Lagrange 乘子。類似於 Gauss-Newton 中的做法,把它展開后,計算增量的線性方程:
可以看到,增量方程相比於 Gauss-Newton,多了一項 λDT D。
當參數 λ 比較小時,H 占主要地位,這說明二次近似模型在該范圍內是比較好的,L-M 方法更接近於 G-N 法。另一方面,當 λ 比較大時,λI 占據主要地位,L-M更接近於一階梯度下降法(即最速下降),這說明附近的二次近似不夠好。L-M 的求解方式,可在一定程度上避免線性方程組的系數矩陣的非奇異和病態問題,提供更穩定更准確的增量 ∆x。
五、總結與討論
1、重要的前提,那就是f(x)是連續可導,同時算法是基於迭代的,因此要有良好的初始值;
2、上面的解法求得的只是局部最優解,而不能確定是否是全局最優解;
3、這里只討論了無約束的情況,而優化問題真實情況往往是存在對變量的約束的。(此時需要借助拉格朗日乘子法)