1. 程式人生 > >【優化演算法】梯度之上:基於 Jacobian 和 Hessian 矩陣的優化演算法

【優化演算法】梯度之上:基於 Jacobian 和 Hessian 矩陣的優化演算法

上篇說的,僅僅基於梯度的優化演算法稱為 一階優化演算法(first-order optimization algorithms), 比如最典型的 梯度下降法;很多時候,僅僅使用一階的梯度資訊效果是不夠優良的,還需要考慮梯度的梯度, 也就是 二階優化演算法(second-order optimization algorithms), 二階優化演算法基於的是 Hessian 矩陣, 比較典型的方法如 牛頓法。

先來回顧一下 梯度,Jacobian 矩陣 和 Hessian 矩陣 的關係。開始!
二階導數(second derivative),即導數的導數,表達的是一階導數如何隨著輸入的變化而變化。一階導數,表徵的是曲線的斜率

, 同理我們可以認為二階導數,表徵的是曲線(或曲面)的曲率. 藉助物理來理解,就是函式表徵的是位移和時間的對應關係,一階導數就是速度,二階導數就是加速度。

  • 對於一個一次函式而言,比如 y=kx, 其一階導數就是常數k, 而二階導數就是 0, 或者說勻速直線運動,速度恆定,沒有加速度。
  • 對於一個二次函式而言,比如自由落體運動 y=12gx2, 其一階導數就是xt, 二階導數就是常數 g, 也就是說有隨x變化的斜率和固定的曲率,或者說有固定的加速度然後有隨時間變化的速度。

回到優化演算法中,我們之前使用的梯度下降法,相當於以當前的速度勻速直線前進一個δx

時間,作為估計的 y^, 當然這個和真實的y 肯定是有差距的。二階導數資訊就可以用來預知這個差距的大小:

  • 如果二階導數/曲率0, 也就是沒有加速度,勻速直線運動,那麼我們用梯度進行預測就是很準確的。
  • 如果二階導數/曲率 為負, 也就是減速運動,那麼我們用梯度進行預測的值就會比真實值大。
  • 如果二階導數/曲率 為正, 也就是加速運動, 那麼我們用梯度進行預測的值就會比真實值小。

對於多元函式,二階函式有很多,我們將這些導數合併成為 Hessian 矩陣。由於微分運算元在任何二階偏導連續的點處都可以交換,因此 Hessian 矩陣在這些點上是對稱的。在深度學習背景中,我們遇到的大多數的 Hessian 矩陣基本都是對稱的。而由於Hessian 矩陣是實對稱的,我們可以將其分解為一組實特徵值和一組特徵向量的正交基。那麼在特定方向

d 上的 二階導數就可以寫成 dTHd。 當 dH 的一個特徵向量時,這個方向的二階導數就是對應的特徵值。對於其他的方向 d , 方向二階導數就是所有特徵值的加權平均,權重(0,1),且與 d夾角越小的特徵向量的權重越大。最大特徵值確定最大二階導數,最小特徵值確定最小二階導數。

下面我們定量的來看一下,通過二階導數如何衡量一個梯度下降步驟表現的有多好。我們在當前點 x(0) 處做函式f(x)的近似二階泰勒展開

f(x)f(x(0))+(xx(0))Tg+12(xx(0))TH(xx(0)), 其中 g 是梯度, Hx(0)處的Hessian矩陣。如果我們引入引數學習率 ε, 那麼新的點 x 將會是 x(0)εg。 帶入上式,可得 f(x(0)εg)f(x(0))εgTg+12ε2gTHg .

其中有三項,

  • 函式的原始值
  • 函式斜率導致的預期改善
  • 函式曲率導致的校正

當最後一項太大時,函式值是可能向上移動的。

  • gTHg 為 0 或者負數時候,近似的泰勒級數增加表明增加 ε 將永遠使 f 下降。在理論上,這種情況下我們應該把步長儘量調大,然而在實踐中,泰勒級數不會在 ε 很大的時候依然保持準確,因此在這個情況下我們必須採取更具啟發式的選擇。
  • gTHg 為正數時,通過計算可得,使得近似泰勒級數下降最多的最優步長是
    ε=gTggTHg

最壞的情況下,g