到底什麼是非線性優化?

你是否也對非線性優化這個領域望而卻步?​​​

你是否也在思索非線性優化求解方法的根源?​​​

你是否也苦惱於非線性優化到底在研究什麼

如果你的回答是肯定的,說明我們是一樣的。那麼,讓我們從這裏開始,一起嘗試去移走上面的三座大山。​

-------------------------------------------分割線----------------------------------------​

1.非線性優化真的那麼?​

其實,在上高中的時候我們就已經對非線性優化的求解方法瞭然於心了。可見,非線性優化並不是我們想的那麼困難,只不過在後來由於學習了大量的新知識,而迷失其中。你可能不相信,那麼讓我們一同回到高中的數學課上。數學老師給瞭如下的問題:​​

 ​如何找到上面這個函數的最小值?相信你很快的就能想起上面這個問題的解法,並且求出上面這個函數的極值。而至此,我們已經解決了一個非線性優化的問題。​爲什麼這麼說呢?請看下面的公式:​

 

 當這個公式中的f(x)是一個非線性函數的時候,上面的問題就是一個非線性優化的問題。​也就是說,非線性優化問題是針對一個非線性函數求最值的問題。那麼,再讓我們回過頭看一看數學老師出的問題,這不就是一個非線性優化問題嗎?​而且,求解方法也很簡單,就是對函數求導,再令導數爲零,我們就找到了極值點。可見,非線性優化並不是一個高不可攀的山峯。​

那麼,我們是否可以對所有的非線性優化問題,都可以用上面的解法呢?很遺憾,對於很多情況,通過導數爲零求解析的求出極值點,是做不到的,如下式:​​

 我們對x,y分別求偏導,得到:​​

 我們很難直接的從上面的式子中,求出導數爲0的點。一方面,是因爲該函數已經不是初等函數。另一方面,是因爲增加了未知數(變量)的個數。我們重新寫一下公式(1),如下:​

 可見,這個函數是一個單變量的非線性函數,而且極值點只有一個。即使,增加x的冪次方,不過是增加了幾個極值點,我們還是可以通過之前的辦法,只不過將每個極值點的值都帶回方程,就可以找到整個函數上的最小值。無論,這個一維函數如何複雜,都可以畫在一個二維座標中,如下:​

 上圖中,極值點1和點3是最小值點,點2是最大值點,而點4既不是最大值點,也不是最小值點。通過比較我們知道,點3是全局最小值點,而點1是局部最小值點。

但是,如果再增加函數的變量個數會發生什麼呢?比如,只再增加一個變量y,此時函數變爲f(x,y),而這個函數在x和y的方向上都有多個極值點。這時,我們還能將這個函數表示在三維座標系下,如下:​

 此時,極值點的分佈就比一維的情況複雜了許多。當變量個數繼續增加的時候,極值點的個數會成幾何倍增加,顯然也就無法通過求解出所有極值點再比較大小的方法,實現對問題的求解。​

 2.如何求解複雜的非線性優化問題?

上面的方法是一種比較貪心的解決方法,希望直接找到問題的解。俗話說,飯得一口一口吃,不能一口吃個胖子。這裏要注意的一點就是,雖然我們不能直接找到函數值爲零的點。但是,非線性函數的導數是存在的,也就可以計算出每一點的導數。也就是說,既然不能直接找到極值點,我們就應該一步一步的逐漸逼近函數的極值點。​

我們將原問題找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的高階項。

(1)當我們只保留一階項的時候,得到如下式子:​

 上式中的J(x)在多維情況下,被稱爲雅可比矩陣,其實就是對f(x)求偏導。接着,一般書就會直接給出增量Δx的大小,如下:​

 

 這個過程其實不太好理解。因爲,如果從一維的角度理解,那麼此處的f'(x)只是一個斜率,按理說斜率的多少跟Δx的值是無關的,只要Δx值不要太大保證在鄰域內就可以。所以,直接得出上面的式子就感覺很詭異。​

其實,換一個角度解釋上面的式子就很容易理解。這裏讓Δx等於負梯度,重點並不在於Δx的大小,而是規定了Δx的方向。其實,即使在1維裏,我們也可以這麼理解,Δx=-k,此處的k只用於提供方向,也就是正負號,而不代表走多遠。​對於多維情況更是如此,因爲我們需要知道增量的方向,而方向是由Δx各維度大小決定的。其實,一個更清晰的表示應該是將梯度歸一化,然後再乘以一個步長係數,如下所示:​

 

 這個方法也就是我們經常聽到的——最速下降法

(2)如果我們保留到二階項的時候,得到如下式子:​

 

 上式中的H(x)被稱爲Hessian矩陣,而且J(x)和H(x)在點x的值是已知的,所以上式是一個線性方程組。寫成矩陣形式如下:​

 Δx的值可以通過解這個方程得到,求解方法由很多,在此就不再贅述。這個方法,就叫做——牛頓法

 3.非線性優化到底在研究什麼?​

說到這裏,你可能會疑惑,既然非線性優化好像通過上面的方法都可以求解,那麼爲什麼還有那麼多數學家在研究這個問題。或者說,是不是世間所有問題,都可以通過這個方法求解呢?要想回答這個問題,我們需要重新來審視一下上面的求解過程。​

(1)其實這個過程有個重要的前提,那就是f(x)是連續可導。如果f(x)這個函數不可導,或者不可微呢?比如說,在SLAM中需要處理姿態估計的問題。而姿態是通過旋轉矩陣和平移向量表示的,這顯然是不連續的。但是,由於旋轉矩陣是一個李羣,那麼我們可以將其映射到其李代數上。而且,李代數是可以求導的。所以我們就還可以利用非線性優化的方法對姿態進行估計。也就是說對於不連續的函數,我們可以想辦法將其變得連續,從而繼續用這種方法。​

(2)上面的解法求得的只是局部最優解,而不能確定是否是全局最優解。因爲,這種方法可以說是一種“近視眼”的方法,它只看到下一時刻,在鄰域內的最小值,而不能全局的尋找。所以,很容易陷入到局部最優中,或者說最終求出的最優值是跟初始位置極度相關的。即使初始值在同一個未知,也很有可能落入到兩個不同的局部最優值中,也就是說這個解是很不穩定的。所以,如何解決這個問題,至今仍然存在很大的挑戰。​​

比如凸優化就可以在一定程度上解決這個問題。凸優化的思想是,如果局部最優就是全局最優,就不存在這個問題了。那麼如何將一個非凸的問題轉換成凸的呢?或者什麼問題就是凸的,什麼是非凸的呢?​​

在此,只是粗淺的舉了兩個例子,其實非線性優化中存在的問題還有很多很多。而且我們在這裏只討論了無約束的情況,而優化問題真實情況往往是存在對變量的約束的。本文只是希望破除我們心中對非線性優化的恐懼,勇敢的邁進非線性優化這道大門。

本人也是半路出家,有很多不嚴謹的地方,希望大家多包涵,多指正,也歡迎大家在留言中多多交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章