1. 程式人生 > >常用非線性優化演算法總結

常用非線性優化演算法總結

非線性最小二乘

定義:簡單的非線性最小二乘問題可以定義為
\[ \min_{x} \frac{1}{2}||f(x)||^2_2 \]
其中自變數\(x \in R^n\),\(f(x)\)是任意的非線性函式,並設它的維度為\(m\),即\(f(x) \in R^m\).

對於一些最小二乘問題,我們可以利用目標函式對\(x\)求導並令導數等於0來求解。但是導數
\[ \frac{d(\frac{1}{2}||f(x)||^2_2)}{dx}=0 \]
不一定可以直接求解\(x\),這個導函式可能是一個複雜的非線性方程。這種情況下一般採用迭代來求解,具體步驟可以表示為 :

  • (1) 給定一個初試值\(x_0\)
  • (2) 對於第\(k\)次迭代,尋找一個增量\(\Delta x_ k\),使得\(||f(x_k+\Delta x_k)||\)達到極小值
  • (3) 若\(\Delta x_k\)足夠小,則停止迭代
  • (4) 否則,令\(x_{k+1}=x_k+\Delta x_k\),返回第(2)步驟

這個其實是通過迭代讓目標函式一步步下降,直到最終達到收斂為止。一般而言,增量\(\Delta x\)可通過一階梯度或二階梯度來確定。

一階梯度和二階梯度法

首先,我們將目標函式在\(x\)附近進行泰勒展開
\[ ||f(x+\Delta x)||^2_2 \approx ||f(x)||^2_2+J(x)\Delta x+\frac{1}{2}\Delta x^T H(x) \Delta x \]


這裡的\(J(x)\)\(f(x)\)關於\(x\)的導數(雅可比矩陣),\(H(x)\)是二階導數(海森矩陣)。我們可以選擇保留泰勒公式的一階導數和二階導數,如果保留一階導數,則增量的解就是
\[ \Delta x^* = -J^T(x) \]
它理解起來就是,沿著沿著梯度相反的方向前進,目標函式下降得最快。通常會在這個方向上計算一個步長\(\lambda\),迭代公式表示為
\[ x_{k+1} = x_k - \lambda J^T(x_k) \]
該方法稱為最速梯度下降法。如果保留二階梯度資訊,增量可以表示為
\[ \Delta x^* = \arg \min_{\Delta x} ||f(x)||^2_2+J(x)\Delta x+\frac{1}{2}\Delta x^T H(x) \Delta x \]

\(\Delta x\)求導數並令它等於0,則
\[ J^T+H\Delta x = 0 \]
於是增量的解為
\[ H\Delta x = - J^T \]
這種方法稱為牛頓法,它的迭代公式可以表示為
\[ x_{k+1}=x_k-H^{-1}J \]
牛頓法和最速梯度下降法思想比較簡單,只需要將函式在迭代點附近展開,然後對增量求最小化即可,然後可以通過線性方程直接求的增量的解。這兩種方法的主要缺點為:

  • 最速梯度下降過於貪心,容易走出鋸齒狀,反而增加了迭代次數
  • 牛頓法則需要計算函式的\(H\)矩陣,這在問題規模較大時候非常困難,通常做法是避免去計算\(H\)

下面介紹了高斯牛頓法和列文伯格-馬夸爾特法(LM)法更為實用。

高斯牛頓法

高斯牛頓法的思想是對\(f(x)\)進行一階泰勒展開,注意不是目標函式\(||f(x)||^2_2\)
\[ f(x+\Delta x) \approx f(x) +J(x)\Delta x \]
其中\(J(x)\)是f(x)關於\(x\)的導數,稱為雅可比矩陣,維度為\(m \times n\).於是我們需要
\[ \Delta x^* = \arg \min _{\Delta x}\frac{1}{2}||f(x)+J(x) \Delta x||_2^2 \]
我們繼續對\(\Delta x\)求導並令導函式等於0
\[ \nabla_{\Delta x} \frac{1}{2}||f(x)+J(x) \Delta x||_2^2 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \\ = \nabla_{\Delta x} \frac{1}{2}[f^T(x)f(x)+2f^T(x)J(x)\Delta x+\Delta x^TJ^T(x)J(x)\Delta x] \\ =J^Tf(x)+J^TJ\Delta x =0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \]
從而
\[ J^TJ\Delta x = - J^Tf(x) \]
\(H = J^TJ,g = -J^Tf(x)\),則
\[ H\Delta x = g \]
上述方程稱為高斯牛頓方程或正規方程。對比牛頓法可見,高斯牛頓法採用\(J^TJ\)牛頓法作為牛頓法\(H\)矩陣的近似,從而避免了複雜的計算。原則上,它要求近似的矩陣\(H\)是可逆的(而且是正定的),而實際計算中得到的\(J^TJ\)卻是半正定的。也就是使用高斯牛頓法會出現\(J^TJ\)為奇異或者病態情況,此時增量的穩定性較差,導致演算法不收斂。即使\(H\)非奇異也非病態,如果求得的\(\Delta x\)非常大,也會導致我們採用的區域性近似不夠正確,這樣以來可能不能保證收斂,哪怕是還有可能讓目標函式更大。

即使高斯牛頓法具有它的缺點,但是很多非線性優化可以看作是高斯牛頓法的一個變種,這些演算法結合了高斯牛頓法的優點並修正其缺點。例如LM演算法,儘管它的收斂速度可能比高斯牛頓法更慢,但是該方法健壯性更強,也被稱為阻尼牛頓法。

LM演算法

高斯牛頓法採用二階泰勒展開來近似,只有在展開點附近才會有比較好的近似效果。LM(Levenberg -Marquard)演算法中給變化量\(\Delta x\)新增一個信賴區域來限制\(\Delta x\)的大小,並認為在信賴區域裡面近似是有效的,否則近似不準確。

確定信賴區域一個好的辦法是通過比較近似模型和實際模型的差異來確定,如果差異小,我們就讓範圍儘可能增大;如果差異太大,就該縮小這個範圍。考慮實際模型和近似模型變化量的比值
\[ \rho = \frac{f(x + \Delta x) - f(x)}{J(x) \Delta x} \]
上面式子可以通過\(\rho\)的值來判斷泰勒近似的好壞,其中分子是實際模型的變化量,分母是近似模型的變化量,當

\(\rho\)接近1的時候表明近似模型是非常好的,如果\(\rho\)較小,則實際模型的變化量小於近似模型的變化量,則認為近似模型較差,需要縮小近似範圍;反之,當\(\rho\)較大時,說明實際模型變化量更大,我們需要放大近似範圍。因此\(LM\)演算法可以表示如下

  • (1)給定初始迭代值\(x_0\)以及初始優化半徑\(\mu\).

  • (2)對於第\(k\)次迭代,求解優化問題
    \[ \min_{\Delta x_k} \frac{1}{2}||f(x_k)+J(x_k)\Delta x||^2 \\ s.t. \quad ||D\Delta x_k||^2 \leq \mu. \quad \quad \]

  • (3)計算\(\rho\).

  • (4)若\(\rho > 3/4\),則\(\mu = 2 \mu\).

  • (5)若\(\rho < 1/4\),則\(\mu = 0.5 \mu\).

  • (6)如果\(\rho\)大於某閾值,則認為近似可行。令\(x_{k+1} = x_k + \Delta x_k\).

  • (7)判斷演算法是否收斂。如果不收斂,跳回步驟(2),否則結束。

上面演算法中,\(\mu\)是信賴區域的半徑,其實是一個球形的區域,該約束認為只有在球內才是有效的,帶上矩陣\(D\)後就是一個橢球。

採用拉格朗日乘子將上述問題轉化為一個無約束問題
\[ \min_{\Delta x_k} \frac{1}{2}||f(x_k)+J(x_k)\Delta x_k||^2+\frac{1}{2}\lambda||D\Delta x_k||^2 \]
\(\Delta x_k\)求梯度,得到增量方程
\[ (H+\lambda D^TD)\Delta x=g \]
可以看到,增量方程在搞死牛頓法上多了一項\(\lambda D^TD\),如果令\(D=I\),則簡化版本表示為
\[ (H+\lambda I)\Delta x = g \]
\(\lambda\)較小時,說明\(H\)占主導地位,說明二次近似在該範圍類是比較好的,LM方法更接近於高斯牛頓法;另一方面,當\(\lambda\)較大時,\(\lambda\)占主導地位,LM演算法更接近一階梯度下降演算法,這說明二次近似不夠好。LM演算法的求解方式,可以避免線性方程組的矩陣非奇異和病態等問題,提供更穩定、更準確的解法。

總結

總而言之,非線性優化問題的框架分為Line Search 和Trust Region兩類。Line Search 先固定搜尋方向,然後在該方向上尋找步長,以最速下降法和高斯牛頓法為代表。而Trust Region是先固定搜尋區域,再考慮該區域裡面的最優點,此類方法以LM演算法為代表。