8. 深度學習實踐:優化

NN的優化:尋找NN上的一組參數,可顯著降低代價函數,該代價函數通常包括整個訓練集上的性能評估和額外的正則化項。

1. 批量算法和小批量算法

和一般優化算法不同,ML算法的目標函數通常可分解爲訓練樣本上的總和。ML中的優化算法在計算參數的每一次更新時,通常僅使用整個代價函數中的一部分項來估計代價函數的期望值。

爲什麼僅僅使用一部分來估計?

n個樣本均值的標準差是 δ/n ,其中 δ 是樣本值真實的標準差。分母表示使用更多樣本來估計梯度的方法的回報是低於線性的。例如,一個基於100個樣本,一個基於10000個樣本。後者需要的計算量是前者的100倍,但僅降低了10倍的均值標準差。因此如果快速計算梯度估計值,而非緩慢的計算準確值,則算法會收斂得更快。

另一個動機:訓練集的冗餘。最壞極端情況下,訓練集所有樣本相同,則使用單個樣本就可以計算出正確的梯度。實踐中不太可能遇到最壞,但大量樣本存在冗餘是真的,其對梯度做出了相似的貢獻。

使用整個訓練集的優化算法被稱爲:批量(batch)梯度算法,或者確定性梯度算法。批量梯度下降 指的是使用全部訓練集。批量 單獨出現則指一組樣本。

每次僅使用單個樣本的優化算法,被稱爲 隨機,或者 在線。在線含義:通常是指從連續產生樣本的數據流中抽取樣本的情況,而非從一個固定大小的訓練集中遍歷多次採樣的情況。

大多數DL上的算法介於二者之間,使用多於一個,而又不是全部的訓練樣本,稱爲 小批量,或者 小批量隨機。簡單的統稱爲 隨機方法。

小批量的大小決定有幾個因素:並行處理的內存消耗和批量大小成正比;極小批量難以充分利用多核架構;特定大小的數組在某些硬件上更快;更大批量計算更精確的梯度估計但回報小於線性。

小批量需要隨機抽取。從一組樣本中計算出梯度期望的無偏估計,要求這些樣本是獨立的。我們希望兩個連續的梯度估計是互相獨立的,因此兩個連續的小批量樣本也應該是彼此獨立的。實踐中通常初始打亂樣本順序,然後重複使用該順序即可。

很多ML上優化問題可分解爲並行計算不同樣本上獨立的更新。在計算一個小批量樣本上的最小化目標函數的更新時,同時可以計算其他小批量樣本上的更新。

小批量隨機梯度下降的一個有趣動機:只要沒有重複使用樣本,它將遵循着真實泛化誤差的梯度。初始打亂順序,多次遍歷更新參數下,第一次遍歷可計算真實泛化誤差的無偏估計,第二次遍歷估計將會是有偏的。

在線學習 / 隨機梯度下降:每個樣本都是從數據流中抽取出來的,學習器好像是一個每次都看到新樣本的人,每個樣本都來自數據生成分佈,而不是使用大小固定的數據集。則樣本永遠不會重複,每次更新用的樣本都是從分佈中採樣獲得的無偏樣本。

2. 神經網絡優化中的挑戰

凸優化是我們喜歡的,但NN總會遇到非凸的。因此優化問題變得複雜,諸多挑戰。

2.1 病態

病態條件:函數對於輸入被輕微擾動而迅速改變。矩陣參數本身固有的敏感性導致。最突出的是Hessian矩陣 H 的病態。病態問題一般認爲存在NN訓練過程中,體現在隨機梯度下降會卡在某些情況,即使很小的步長也會增加代價函數。

成功訓練的NN中,梯度顯著增加。而不是我們所期望的那樣隨訓練過程收斂到臨界點而減小。監測梯度範數和驗證集上分類誤差。

這裏寫圖片描述

病態時,儘管梯度很強,學習會變得非常緩慢。因爲學習率必須收縮以彌補更強的曲率。

2.2 局部極小值

NN是非凸函數,有可能存在多個局部極小值,但似乎並不是非凸帶來的問題。

模型可辨識性問題:如果一個足夠大的訓練集可唯一確定一組模型參數,則該模型是可辨識的。帶有潛變量的模型通常不可辨識,如NN,因爲可相互交換得到等價模型,稱爲權重空間對稱性。

這些模型可辨識性問題意味着:NN代價函數具有無限多(換組參數得到一個新的等價模型)的局部極小值。所有這些因不可辨識性產生的局部極小值都有相同的代價函數值,因此這些局部極小值並非是非凸帶來的問題。

是否存在大量代價很高的局部極小值,優化時是否會碰到它們,均尚未解決。學者們猜想:大部分局部極小值都具有很小的代價函數,能不能找到真正的全局最小點不重要,找到一個代價很小的點即可。(人的美好意志)

有人將NN優化中的所有困難均歸結於局部極小值。不合適的。一種排除局部極小值是主要問題的檢測方法是:畫出梯度範數隨時間的變化。局部極小值,則有梯度範數縮小到一個微小值。那麼,若梯度範數沒縮到微小值,則該問題就不是因着局部極小值的。

2.3 鞍點

鞍點:附近某些點比鞍點有更大的代價,其他點則有更小的代價。

這裏寫圖片描述

鞍點處的海森矩陣同時具有正負特徵值。正特徵值對應的特徵向量方向的點比鞍點代價更大,負特徵值對應的特徵向量方向的點有更小的代價。

多類隨機函數有這些性質:低維空間中局部極小值很普遍。高維空間中局部極小值很罕見,鞍點較常見。海森矩陣在局部最小值處,僅有正特徵值。鞍點處則同時具有正負特徵值。試想這麼個情況:特徵值的正負號由拋硬幣決定,一維時很容易得到正面朝上一次而取得局部極小點。n維時要拋n次硬幣都正面朝上的難度大,鞍點就多了。

2014年實驗證明,NN中也存在包含很多高代價鞍點的損失函數。鞍點激增對訓練有何影響呢?僅用梯度信息的一階優化算法,還不清楚。實驗中,梯度下降似乎可以在很多情況下逃離鞍點。可視化顯示,突出的鞍點附加,代價函數都是平坦的,權重都爲0,藍線軌跡可以迅速逸出該區間。

這裏寫圖片描述

對於牛頓法,目標是尋找梯度爲0的點。若無適當修改,牛頓法會跳進一個鞍點。高維空間中鞍點的激增,或許可解釋NN中二階方法無法成功取代梯度下降。

2.4 懸崖、梯度爆炸

多層NN中通常包含由幾個參數連乘導致的參數空間中的尖銳非線性,類似於懸崖。

這裏寫圖片描述

當參數接近懸崖區域時,非線性會產生非常大的導數,梯度下降更新使得參數彈射地非常遠,可能會無效化已完成的大量優化工作(俗話說,步子大了容易扯着蛋,大概就是這個意思吧)。懸崖在RNN中較常見,此類模型會設計到多個因子的連乘。

啓發式梯度截斷:梯度並未指明最佳步長,僅說明了無限小區域內的最佳方向。那麼,當傳統的梯度下降算法建議更新很大一步時,啓發式梯度截斷會干涉來減小步長,從而使其不太可能走出懸崖區域。

2.5 長期依賴

當計算圖變得極深時,NN優化算法面臨的一大難題:長期依賴問題——即由於變深的結構,模型喪失了學習到先前信息的能力,優化極其困難。特別是在RNN中,很長時間序列中各個時刻重複應用相同操作來構建很深的計算圖,模型參數共享,問題更爲凸顯。

例如,某個計算圖中包含一條反覆與矩陣 W 相乘的路徑,則 t 步後,則有:
這裏寫圖片描述

當特徵值 λi 不在1附近時,量級上大於1則會爆炸,小於1則會消失。

梯度消失(彌散)和梯度爆炸問題:指該計算圖上的梯度會因爲 diag(λ)t 大幅度變化。梯度消失令我們難以知道參數朝哪個方向移動能改進代價函數,學習陷於停滯。梯度爆炸使得學習不穩定,懸崖問題就是梯度爆炸的案例。之前看過,sigmoid等函數的飽和區域,梯度流過時乘上很小值,也造成梯度彌散。

額外的, xTWt 的效果:最終會丟棄 x 中所有與 W 的主特徵向量正交的部分。因矩陣連乘後,大特徵值很大,小特徵值很小了,起到過濾作用。

RNN在各時間步上使用相同矩陣連乘,FNN沒有,因此即使非常深層的FNN一定程度上能避免梯度消失和爆炸問題。

2.6 非精確梯度

實踐中通常噪聲存在,則不能得到精確的梯度,只能近似解決。第三部分更高級的模型彙總用到。作者未展開。

2.7 局部和全局結構間的弱對應

前面討論的問題,均關於損失函數在單個點上的性質——例如一個下降方向不明顯的鞍點使得很難更新當前步。若該方向局部改進很大,但並未指向代價低得多的遙遠區域,即使單點處克服困難,全局仍表現不佳。這就是局部和全局的弱對應。

Goodfellow在2015年提出,大部分訓練的運行時間取決於到達解決方案的軌跡長度。

這裏寫圖片描述

上圖中,即使沒有局部極小值和鞍點,最終還是不能找到一個良好值。造成這種困難主要原因是:初始化在「山」的錯誤一側,無法遍歷。高維空間中,學習算法通常可以環繞過高山,但軌跡可能很長,導致訓練時間過長。

現有研究在求解具有 困難全局結構 的問題時,旨在 尋求良好初始值,而非開發非局部範圍更新的算法。實踐表明,NN似乎不會到達任何一種臨界點——全局最小點,局部極小點,鞍點(圖8.2中看到梯度範數實際越來越大),甚至,這些點可能壓根不存在。因此最終建議是:研究怎樣選取更佳的初始化點。

2.8 優化的理論限制

我們目前爲NN設計的任何優化算法都有性能限制的。但是這不影響NN在實踐中的應用,我們找到一個 可接受解 就行了,這樣做更現實些。