求解方程時,除了用牛頓法,可否使用梯度下降法?

求解[
fleft(x
ight)=0
]時,我們一般會用牛頓法:

[
x_{k+1}=x_{k}-left[f^{prime}left(x_{k}
ight)
ight]^{-1}fleft(x_{k}
ight)
]

然而,假如我們把這個看成一個最優化的問題:

[
Jleft(x
ight)=frac{1}{2}fleft(x
ight)^{T}fleft(x
ight)
]

那能否用梯度下降法來求解呢?假如可以的話,那它的形式是

egin{align*}
x_{k+1}  =x_{k}-frac{partial J}{partial x}left(x_{k}
ight)\
  =x_{k}-f^{prime}left(x_{k}
ight)^{T}fleft(x_{k}
ight)
end{align*}

看起來與牛頓法的形式非常相似,不過不用求梯度的逆[
left[f^{prime}left(x_{k}
ight)
ight]^{-1}
]。所以問題來了:

  1. 第二種方法真的可行嗎?
  2. 兩種方法是否有某種內在的聯繫?

(如果表述有不清楚或者不準確的地方,歡迎幫忙修改問題描述。)


  1. 兩種方法都是可以的。如果我沒有記錯的話,第二種formulation是MATLAB的函數fsolve裡面採用的。然後fsolve可以選擇各種不同的優化演算法(基於包括Newton和梯度下降等不同方法的演算法)作為option.

    詳見: Solve system of nonlinear equations

  2. 關於Newton方法和梯度下降法的區別,我是這樣理解的:

    梯度下降法的思路是沿著梯度下降方向搜索求解。所以這裡只需要梯度信息,不需要求逆運算。

    Newton方法的思路是在每一步都嘗試用一個線性函數l(x) 去逼近 f(x) 。線性化逼近的過程中會出現梯度。接著,對這個線性函數進行求解。這也就是為什麼會出現對於梯度的求逆運算。

    由此可見兩種方法都用到了梯度,都是gradient-based。然而,雖然他們表達式看起來有些類似,但是他們實際使用梯度的思路是不同的。這兩種方法各有特點,網上有很多相關資料可以參考, 在此我就不評論了。


今天看書《應用非線性控制》slotine,發現了一個地方,特地再回來回答一下,供參考。

在自適應控制參數更新的方法中,就有專門的一個條目叫做『梯度下降法』,中文版章節是8.7.3


SDM, 我的理解是:

x_{k+1} = x_{k} + alpha * d_{k}

其中,d_{k}=-g_{k} ,(gradient)表示搜索的方向; alpha 為搜尋的步長(例如line search),表示前進的距離。

只回答第二個問題:

兩者是有聯繫的。

SDM 是進行泰勒一階展開,然後求導(gradient)。如果只考慮一維的情況,初中數學告訴我們最小值在邊界或者在gradient = 0 的地方。

Newton method 也是泰勒展開,但是他是二階的, 其他東西都一樣。

如果Hessian能高效的求出來, Newton很快,非常快,特別快。如果不能,那麼可以嘗試quasi newton。

SDM很穩定,但是如果目標函數比較噁心,那麼速度會比較慢。

加個圖:

你可以看到,越靠近最優的點, SDM速度越慢,每次搜索前進的距離越短,效率越低。Newton method 可能只需要幾次搜索就能找到最優值。

再附一個比較:

參考: Practical Optimization - Algorithms and Engineering | Andreas Antoniou | Springer

跑題了。。。。


推薦閱讀:

如何證明一個數的數根(digital root)就是它對9的餘數?
程序員工作後看演算法書有用嗎?效果怎樣?
一道阿里前端筆試題,求思路?
什麼樣的題目解出來可以是這樣的二維碼?
蛇形圍欄能否解決交通擁堵問題?這種設計思路說明什麼問題?

TAG:演算法 | 數學 | 最優化 | 梯度下降 |