數學準備

雅可比矩陣(Jacobian):向量對向量的偏導數所構成的矩陣,考慮函數從空間映射到另一個空間(

),則雅可比矩陣形成一個m行n列的矩陣,矩陣元標記爲

。海森矩陣(Hessian):一階導數的雅可比矩陣,因爲二階偏導的連續性,可以交換偏導的先後順序,所以海森矩陣也是實對稱矩陣。方向導數(direction derivative):某個標量對特定方向d(單位向量)上的導數,度量了該標量沿着該方向的變化率,是一個向量。梯度(Gradient):變化率最大的方向導數。鞍點(saddle point):Hessian正定,對應局部極小值,Hessian負定,對應局部最大值,Hessian不定,對應鞍點(注意,這是充分非必要條件)直觀來看,鞍點就是一個方向上是極大值,另一方向卻是極小值。厄米矩陣(Hermitian):對稱矩陣的複數域擴展,實對稱矩陣是厄密矩陣的特例。厄米矩陣可以被對角化。特徵值:矩陣做對角化變換前後,特徵向量被縮放的比例。特徵向量和特徵值是矩陣的固有屬性。

在開始深度學習之前,我們要對深度學習和統計學習的重要工具——優化算法——做一個全面深刻的剖析,首先我們要問:機器學習爲什麼要使用優化算法呢?舉個例子,普通最小二乘的最佳參數表達爲:

雖然我們可以獲得解析表達,但是當數據量變得非常龐大的時候,連計算矩陣的逆都會變得非常慢。同時在很多情況下,我們無法獲得參數的解析表達,就需要採用迭代的方式逼近最佳的參數值。

迭代的方式有很多種,比如座標下降法(coordinate descent),它的想法很簡單,將變量分組然後針對每一組變量的座標方向最小化Loss,循環往復每一組變量,直到到達不再更新Loss的座標點。但即便這樣,座標下降法仍然迭代的非常緩慢,很大一部分原因在於它的搜索方向是固定的,只能沿着座標的方向,而這樣的方向並不能保證是最快的。同時,座標下降需要假設變量之間的影響非常微弱,一個變量的最優不會影響到另一個變量的更新,但這一條件往往很難滿足。

圖爲座標下降應用到兩個參數構成的Loss,我們可以發現,參數只在兩個垂直的方向上進行更新,這是因爲我們看到的contour就處在兩個參數構成的直角座標系中,分別對應着座標的方向。

相較於座標下降,基於梯度是所有方向導數中變化最快的,梯度下降(gradient descent)也被叫做最速下降,對機器學習有些許瞭解的同學會很容易寫出梯度下降的公式:

首先,Loss function一般都是標量,它的雅可比矩陣就是一個列向量,其梯度指明瞭下降的方向,說明沿Loss梯度方向更新參數會得到最大程度的改變,學習率是一個標量,與梯度相乘,指明瞭下降的幅度。

圖爲梯度下降在兩參數構成的Loss,可以發現,參數會沿着垂直於contour的方向進行更新,垂直於contour的方向正是梯度的方向。

Hessian中包含了Loss function的曲率信息,因爲Hessian可以理解爲梯度的雅可比,一個函數的導數衡量的是函數的變化率,所以Hessian衡量的就是梯度的變化率。同時Hessian矩陣由於是厄米矩陣,可以被對角化,它的特徵值和特徵向量可以分別定義爲:

如果特徵向量被正交歸一化,那麼特徵向量d就是基,那麼特徵值就是該方向上的二階導數,兩邊同時乘以特徵向量的轉置,就可以得到:

比如對於鞍點,某個特徵向量所對應的特徵值就是負的,就意味着是這個方向上的極大值點,而另一特徵向量所對應的特徵值就是正的,意味着同時也是另一方向上的極小值點。從數學上來說,鞍點的來源是極大值極小值都要通過導數爲零得到,但不同的方向導數定義在了不同的維度上。

如圖,AB方向和CD方向,二階導數的正負並不一致,產生了X這樣一個鞍點。

其餘的方向的二階導數就可以通過特徵向量來計算,因爲特徵向量可以構成一組基(完備正交),所有向量都可以用這組基進行線性表示,任意方向f可以被表示爲:

所以,任意方向的二階導數都可以得到:

Hessian能夠告訴我們非常重要的一點,隨着參數點的不斷更新,梯度會如何變化。舉個例子,在很多教材上都會講學習率的設定,學習率如果過大,就會在很大的Loss附近震盪,如果太小,需要迭代的次數又太多。

如圖,不同的學習率會對梯度下降的性能造成影響。

那麼,多大的學習率才合適呢?具體到這個例子上,這明顯是一個凸函數(特指向下凸),代表着梯度會變得越來越小,也就是說固定好學習率的前提下,隨着參數點的下降,我們下降的會越來越慢,我們將Loss function做泰勒展開:

假設從

,我們執行了一次梯度下降,那麼就有關係:

將梯度

表示爲g,其帶入泰勒展開式,可以得到:

如果我們將後面兩項寫作一項:

如果中括號裏面的項大於零,那麼Loss 總會減小,比如Hessian的特徵值均爲負,其實對應着極大值點,那麼無論學習率多小,Loss總會下降很大。但是,如果Hessian特徵值均爲正,而且非常大,就意味着極小值附近的曲率非常大,那麼執行梯度下降反而會導致Loss的上升。如果我們希望Loss能下降最多,其實就是希望中括號項越大越好,在Hessian特徵值爲正的情況下,在我們將看作變量,令其一階導數爲零,這樣就求到了極大值(因爲在Hessian特徵值爲正的前提下,二階導數小於零):

就可以得到:

就給出了我們的最優步長。同時,我們可以將Loss function做泰勒展開,展開到二階:

考慮到一階導數爲零的點對應着極值點,我們對上式求一階導數,並令其爲零可得:

這樣就得到了牛頓法(Newton method)的更新公式。牛頓法已經默認使用了一階導數爲零的信息,理想情況下,它只需要從初始參數點迭代一次就可以找到極小值點。同時,它利用了Hessian中的曲率信息,一般而言也要比梯度更快,在下降方向上並不是梯度的方向,從數學上可以看出Hessian乘以梯度,本質上會得到Hessian特徵向量的線性疊加,如果梯度恰好作爲了Hessian的特徵向量,那麼牛頓法和梯度下降的下降方向纔會一致。

如圖,紅線表示梯度下降的路徑,綠線表示牛頓法的路徑。

讀芯君開扒

課堂TIPS

這裏着重強調:優化算法的快慢和計算代價是兩回事情。優化至局部最小值所需要的迭代次數越少,就可以說優化地越快。梯度下降比座標下降快,牛頓法比梯度下降更快,但我們可以非常容易的看到,在每次迭代時,梯度下降需要計算全部樣本的梯度,牛頓法甚至需要計算全部樣本的Hessian,雖然迭代次數減少了,但每次的計算代價卻增加了。

作者:唐僧不用海飛絲

如需轉載,請後臺留言,遵守轉載規範

查看原文 >>
相關文章