花書第一談之數值計算

  • 2019 年 10 月 6 日
  • 筆記

花書第一談之數值計算

0.導語

今天開刷花書第四章:數值計算

這一章主要講的是:機器學習的一些問題,有一部分可以通過數學推導的方式直接得到用公式表達的解析解,但對絕大多數的問題來說,解析解是不存在的,需要使用迭代更新的方法求數值解。然而實數的精度是無限的,而電腦能夠表達的精度是有限的,這就涉及到許多數值計算方法的問題。因此機器學習中需要大量的數值運算,通常指的是迭代更新求解數學問題。常見的操作包括優化演算法線性方程組的求解。

1.上溢和下溢

  • 上溢

當大數量級的數被近似為+∞或−∞時,進一步的運算容易導致這些無限值為非數字。

  • 下溢

由於電腦進行數值計算時精度有限,下溢是在四捨五入為零時發生。例如:當零做除數時,會返回非數值,對零取對數則會得到−∞。

對上溢和下溢需要進行數值穩定。例如softnax函數:

若xi是都是很小的負數,exp(xi)會發生下溢,分母會變為0,則softmax函數值變為0。當xi是很大的正數,exp(xi)會發生上溢,同樣會導致結果未定義。這兩種情況都可以通過

來解決。這樣子解決保證了分子exp最大參數時為0,避免了上溢,,同樣分母至少有一個值為1的項,排除了下溢。

但是還有一個小問題:分子中的下溢仍然可以導致整體表達式被計算為零,比如計算log(softmax(x)),若傳遞的softmax(x)下溢為0,則log後則被錯誤的得到−∞。因此必須實現一個單獨的函數,並以數值穩定的方式計算log softmax。

2.病態條件

條件數用於表徵當輸入發生微小變化時,函數變化的快慢程度

考慮函數:

具有特徵分解時,條件數為:

條件數較大時,求逆對於輸入誤差特別敏感。

這是矩陣本身的特性,與電腦精度無關。

3.基於梯度的優化方法

3.1 基本概念

優化是指通過改變x來最大化或最小化函數f(x)。

在深度學習中,通常都是用最小化函數拉進行優化,對於最大化任務則可以通過最小化−f(x)來完成。 表示為:

而f(x)稱為目標函數,或者準則,或者損失函數,再或者代價函數,或誤差函數

3.2 梯度下降演算法

對於函數 y=f(x) ,我們通常用 f'(x) 或

來表示其導數。導數代表了f(x)在x處的斜率,即假如我們將x改變一個小量

通過上述我們知道,導數告訴我們如何更改x來微調地改善y。

梯度下降演算法:我們想要尋找f(x)的最小值,假設我們初始位置是 x ,那我們下一次想要找的新的x的位置為

比如對於一個簡單的二次函數

其導數為 f'(x)=x , 在x>0時,f'(x)也大於零,所以新的位置應往左邊走,使f(x)更小,對於x<0時,f'(x)小於零,因此新的位置應往右邊走,最終我們會得到在x=0時有最小值f(x)=0。

我們發現f(x')與f(x)的值相同,這個點稱作臨界點(critical point),它可能是局域最大點(local maximum)如果f(x)比其它周圍的值都高,也可能是局域最小點(local minimum)如果f(x)比其他周圍的值都低,也可能是鞍點(saddle point)即既不是局域極大點也不是極小點。

矢量導數,稱作梯度(gradient)。假設我們有函數

為f(x)在矢量x所在點相對於xi坐標的f(x)的變化率,我們可以用一個矢量來表示相對於所有坐標的導數,標記為

。而梯度下降演算法的公式就可以表示為

,其中 是學習率(learning rate),表示了每次步進的幅度。通常我們將其選為一個較小的常數,但直觀上講,當初始時我們可能離極值點比較遠,我們可以用比較大的學習率,而接近於極值點時我們需要較小的學習率否則f(x)就可能來回波動而收斂很慢。

3.3 梯度之上:雅可比和海森矩陣

什麼是雅克比矩陣?

有的時候我們的映射函數可能輸入和輸出均是矢量,即

,這時候為表示所有輸出與輸入各坐標的偏導數,我們就需要雅可比矩陣(Jacobian matrix),

,定義為:

什麼是海森矩陣?

有的時候我們可能還需要求某一個函數的二階導數,對於

,其對於xj求偏導後再對xi求偏導可以表示為

,對於所有的i,j的偏導數的組合,我們可以用海森矩陣(Hessian matrix)H(f)(x)表示,其中

我們可以將其看做梯度的雅可比矩陣。

二階導數代表了什麼意義呢?

它可以看做是曲線斜率隨輸入的變化,是一種對曲線曲率的測量。

(1)二階導數可以告訴我們梯度下降演算法的效果。

(2)二階導數也可以用來判斷一個臨界點是否是極小值點,極大值點或是鞍點.

什麼是牛頓法?

對於多維空間,我們也可以看出一階梯度下降演算法的局限性,如果不同方向上的曲率不同,則某些方向上導數改變很快,而另一些方向上導數改變很小,由於梯度下降演算法並沒有考慮二階梯度,它並不知道該選取哪個方向才能更快的到達極值點。同樣的,如果不同方向的曲率不同,我們如何選取合適的學習率也成了一個難題,某些方向上曲率大,就會產生在曲線的兩個山坡上來回振動而不能一直趨近山坳的現象,限制了我們只能選取很小的學習率,如下圖所示:

為了解決這一缺陷,我們需要利用二階導數,這就是牛頓方法。多維情況下的二階泰勒展開為

使f(x)相對於x的導數為零,可得更新公式

牛頓方法會比梯度下降演算法更快的到達極值點。

4.約束優化

約束極值如何處理?

有的時候,我們不僅僅是要在全域里求某個函數的極值點,而是要在某條件的集合中求條件極值。

這時候我們可以利用KKT演算法有限制條件的極值問題轉化為無限制條件的極值問題,然後我們就可以用之前處理無限制條件的極值問題的方法來解決這個問題。

KKT演算法可以看做是是拉格朗日乘子法的一種推廣形式。

實例

假設我們要求f(x)的極值,其限制條件為

,其中

為等式限制條件,

為不等式限制條件。

對於每一個限制條件,我們可以引入新的KKT乘子

,這些變數被稱為KTT乘子。廣義拉格朗日式子:

我們通過優化無約束的廣義拉格朗日解決約束最小化問題,即求出

與如下函數有相同的最優目標函數值和最優集x

這是因為當約束滿足時,即

而違反任意約束時, 最大值為零

而違反任意約束時,

由此我們也可以得出拉格朗日式子取極值的必要條件:

  • 廣義Lagrangian的梯度為零。
  • 所有關於x和KKT乘子的約束都滿足。
  • 不等式約束顯示的」互補鬆弛性」:

一個應用KKT的實例是對於線性最小二乘問題(linear least square),我們想要求在限制條件為

的極小值。我們可以將其轉化為拉格朗日式子

而轉化為解決

的問題。具體細節,參見書實例部分。