《Deep learning》第四章——數值計算
數值計算
機器學習算法通常需要大量的數值計算。這通常是指通過叠代過程更新解的估計值來解決數學問題的算法,而不是通過解析過程推導出公式來提供正確解的方法。常見的操作包括優化(找到最小化或最大化函數值的參數)和線性方程組的求解。
上溢和下溢
連續數學在數字計算機上的根本困難是,我們需要通過有限數量的位模式來表示無限多的實數。這意味著我們在計算機中表示實數時,幾乎總會引入一些近似誤差。在許多情況下,這僅僅是舍入誤差。舍入誤差會導致一些問題,特別是當許多操作復合時,即使是理論上可行的算法,如果在設計時沒有考慮最小化舍入誤差的累積,在實踐時也可能會導致算法失效。
一種舍入誤差是下溢。當接近零的數被四舍五入為零時發生下溢。許多函數在其參數為零而不是一個很小的正數時才會表現出質的不同。
另一種舍入誤差是上溢。當大量級的數被近似為∞或-∞時發生上溢。進一步的運算通常會導致這些無限值變為非數字。
必須對上溢和下溢進行數值穩定的一個例子是softmax函數
病態條件
條件數:函數相對於輸入的微小變化而變化的快慢程度。輸入被輕微擾動而迅速改變的函數對於科學計算來說可能是有問題的,因為輸入中的舍入誤差可能導致輸出的巨大變化。
考慮函數f(x)=A-1 x.當A∈Rn×n具有特征值分解時,其條件數為max|λi/λj|.這是最大和最小特征值的模之比。當該數很大時,矩陣求逆對輸入的誤差特別敏感。
這種敏感性是矩陣本身的固有特性,而不是矩陣求逆期間舍入誤差的結果。即使我們乘以完全正確的矩陣逆,病態條件的矩陣也會放大預先存在的誤差。
基於梯度的優化方法
大多數深度學習算法都涉及某種形式的優化。優化指的是改變x以最小化或者最大化某個函數f(x)的任務。
我們把要最小化或最大化的函數稱為目標函數或準則,當我們對其進行最小化時,也把它稱為代價函數、損失函數或誤差函數。
我們常用一個上標*表示最小化或最大化函數的x值,如記x*=argminf(x)
當f’(x)=0時,導數無法提供往哪個方向移動的信息。f’(x)=0的點稱為臨界點或駐點。一個局部極小點意味著這個點的f(x)小於所有臨近點,因此不可能通過移動無窮小的步長來減少f(x)。一個局部極大點意味著這個點的f(x)大於所有鄰近點,因此不可能通過移動無窮小的步長來增大f(x)。有些臨近點既不是最小點也不是最大點,這些點稱為鞍點。
使f(x)取得絕對的最小值(相對其他所有值)的點是全局最小點。函數可能只有一個全局最小點或存在多個全局最小點,還可能存在不是全局最優的全局極小點。在深度學習的背景下,我們要優化的函數可能含有許多不是最優的全局極小點,或者還有很多處於非常平坦的區域內的鞍點。尤其是當輸入是多維的時候,所有這些都將使優化變得困難。
針對具有多維輸入的函數,我們需要用到偏導數的概念。偏導數衡量點x處只有xi增加時f(x)如何變化。梯度是相對於一個向量求導的導數:f的導數是包含所有偏導數的向量:記為▽xf(x).
在u(單位向量)方向的方向導數是函數f在u方向的斜率。換句話說,方向導數是函數f(x+αu)關於α的導數(在α=0時取得)。
為了最小化f,我們希望找到使f下降得最快的方向。計算方向導數
顯然在u與梯度方向相反時取得最小。
最速下降/梯度下降:
最速下降在梯度的每一個元素為0時收斂,在某些情況下,我們也許能夠避免運行該叠代算法,並通過解方程▽xf(x)=0直接跳到臨近點。
Jacobian和Hessian矩陣
有時我們需要計算輸入和輸出都為向量的函數的所有偏導數。包含所有這樣的偏導數的矩陣被稱為Jacobian矩陣。具體來說,如果我們有一個函數f:Rm——>Rn,f的Jacobian矩陣J∈Rn×m定義為Ji,j
這裏是用到一階導
有時我們也對二階導數感興趣,這就用到了Hessian矩陣
Hessian矩陣等於梯度的Jacobian矩陣。
微分算子在任何二階偏導連續的點處可交換,也就是他們的順序可以互換:
因此Hessian矩陣在這些點上是對稱的。在深度學習背景下,我們遇到的大多數函數的Hessian幾乎處處都是對稱的。因為Hessian矩陣是實對稱的,我們可以將其分解成一組實特征值和一組特征向量的正交基。在特定方向d上的二階導數可以寫成dTHd.當d是H的一個特征向量時,這個方向的二階導數就是對應的特征值。對於其他的方向d,方向二階導數是所有特征值的加權平均,權重在0和1之間,且與d夾角越小的特征向量的權重越大。最大特征值確定最大二階導數,最小特征值確定最小二階導數。
我們可以通過(方向)二階導數預期一個梯度下降步驟能表現得多好。我們在當前點x(0)處做函數f(x)的近似二階泰勒級數:
僅使用梯度信息的優化算法稱為一階優化算法,如梯度下降。使用Hessian矩陣的優化算法被稱為二階最優化算法,如牛頓法。
因為在深度學習中使用的函數族是相當復雜的,所以深度學習算法往往缺乏保證。在許多其他領域,優化的主要方法是為有限的函數族設計優化算法。
在深度學習背景下,限制函數滿足Lipschitz連續或其導數Lipschitz連續可以獲得一些保證。Lipschitz連續函數的變化速度以Lipschitz常數L為界:
這個屬性允許我們量化我們的假設——梯度下降等算法導致的輸入的微小變化將使輸出只產生微小變化,因此是很有用的。Lipschitz連續性也是相當弱的約束,並且深度學習中很多優化問題經過相對較小的修改後就能變得Lipschitz連續。
最成功的特定優化領域或許是凸優化。凸優化通過更強的限制提供更多的保證。凸優化算法只對凸函數適用,即Hessian處處半正定的函數。因為這些函數沒有鞍點而且其所有局部極小點必然是全局最小點,所以表現很好。然而,深度學習中的大多數問題都難以表示成凸優化的形式。凸優化僅用作一些深度學習算法的子程序。凸優化中的分析思路對證明深度學習算法的收斂性非常有用,然而一般來說,深度學習背景下凸優化重要性大大減少。
約束優化
有時候,在x的所有可能值下最大化或最小化一個函數f(x)不是我們所希望的。相反,我們可能希望在x的某些集合S中找f(x)的最大值或最小值。這被稱為約束優化。在約束優化術語中,集合S內的點x被稱為可行點。
我們常常希望找到在某種意義上小的解。針對這種情況下的常見方法是強加一個範數約束,如||x||≤1
《Deep learning》第四章——數值計算