《deep learning》學習筆記(8)——深度模型中的優化
機器學習中的演算法涉及諸多的優化問題,典型的就是利用梯度下降法(gradient descent)求使損失函式 J(theta) 下降的模型引數 theta 。在深度學習,尤其是深度神經網路的訓練和預測中,大的模型往往要花上數天甚至是數月的訓練時間,因此雖然模型的優化費事費力,仍然是一個高回報的步驟, 因為好的模型和優化方法可以極大的加速深度學習模型的訓練。在本章中,將主要介紹神經網路優化這一特定問題:尋找神經網路的引數 theta,可以顯著的降低由訓練集誤差項和正則化項組成的代價函式 J(theta) 。
8.1 學習和純優化有什麼不同
在機器學習的問題中,我們關心的是演算法的效能度量 P, 它通常定義於測試集之上而且往往是不可解的,因此,我們採取的策略是間接地優化 P:我們希望通過降低代價函式 J(theta) 的方式來提高 P。而傳統的純優化就是單純的優化目標 J本身。深度學習中,代價函式通常用訓練集上損失函式的期望或者平均 :
[圖片上傳失敗…(image-7fe1ff-1524449135535)]
其中,L是每個樣本的損失函式(loss function), [圖片上傳失敗…(image-d662-1524449135535)] 是輸入x時候的預測的輸出, [圖片上傳失敗…(image-821270-1524449135535)] 是樣本的經驗分佈,在監督學習中,y是目標輸出。上式定義了訓練集上的目標函式,而我們真正希望最小化的是基於資料生成分佈 [圖片上傳失敗…(image-bc3927-1524449135535)] 的期望:
[圖片上傳失敗…(image-d35fae-1524449135535)]
8.1.1 經驗風險最小化
機器學習演算法真正目標是想降低期望誤差,這樣的一個量也叫做風險(risk)
[圖片上傳失敗…(image-e7c42a-1524449135535)]
上式中 m 表示訓練樣本的數目。基於這種評價訓練誤差的訓練過程被稱為經驗風險最小化(empirical risk minimization)
8.1.2 代理損失函式和提前終止
有時候我們的真正損失函式,比如 0-1 分類誤差並無法被有效的優化,此時我們會使用代理損失函式(surrogate loss function)來作為原來目標的替代,而且會帶來好處。比如,正確分類類別的負對數似然通常用作 0-1 損失的替代,。負對數似然允許模型估計給定樣本的類別的條件概率,能夠輸出期望最小分類誤差所對應的型別。有些情況下,代理損失函式可以比原損失函式學到更多的東西,比如對數似然代替 0-1 分類誤差函式時,當訓練集上的誤差達到0之後,測試集上的誤差還可以持續下降,也就是說此時模型可以繼續學習以拉開不同類別直接的距離以提高分類的魯棒性。也就是說,代理損失函式從訓練資料中學到了更多的東西。
另外一個一般優化演算法和機器學習訓練演算法不同的地方是,訓練演算法不會停在區域性極小值點,而且通常機器學習的演算法會提前設定終止條件,當條件滿足時(通常在過擬合之前)演算法就停止,雖然此時代理損失函式仍然有較大的導數。對於純優化來說,終止時導數非常小。
8.1.3 批量演算法和小批量演算法
機器學習演算法的目標函式通常可以分解為訓練樣本上的求和。機器學習中的優化演算法在計算引數的每一次更新時,通常僅僅使用整個代價函式的一部分項來估計代價函式的期望值。例如:
[圖片上傳失敗…(image-173eac-1524449135535)]
最大化這個總和等價於最大化訓練集在經驗分佈上的期望:
[圖片上傳失敗…(image-367f5-1524449135535)]
優化演算法用到的目標函式 J 中用到的大多數屬性也是訓練集上的期望。例如常用的梯度期望:
[圖片上傳失敗…(image-78a1dc-1524449135535)]
準確的計算這個期望的代價非常大,因為需要在訓練集的每個資料上進行以上的計算,計算量非常大。在真正的實踐中,我們通常會隨機取樣少量的樣本,然後計算這些樣本上的平均值。簡單的論證如下:n個樣本的平均值的方差是 [圖片上傳失敗…(image-fd0bad-1524449135535)] ,其中 sigma 是樣本真實的標準差。這個公式表明,當樣本量增大100倍時,相應地只能得到10倍的誤差減小,也就是說回報是低於線性的。如果能夠快速的計算出梯度的估計值,而不是緩慢的計算所有梯度的準確值,大多數演算法會收斂的更快。另外,訓練集的冗餘也使得我們考慮使用小數目的部分樣本進行模型訓練。
使用整個訓練集的優化方法被稱為批量(batch) 或確定性(deterministic)梯度演算法,他們會在每次更新引數時計算所有樣本。通常,“批量梯度下降”指使用全部訓練集,而“批量”單獨出現時,指一組樣本。每次只使用部分樣本的方法被稱為隨機(stochastic)或者線上(online)演算法。線上通常是指從連續產生的資料流(stream)中提取樣本,而不是從一個固定大小的樣本中遍歷多次取樣的情形。大多數深度學習演算法介於兩者之間,使用一個以上但不是全部的訓練樣本,傳統上稱這種方法為小批量(minibatch)或者小批量隨機(minibatch stochastic)方法,現在統稱為隨機(stochastic)方法。
小批量大小由以下因素決定:
- 更大批量產生更精準梯度,但是回報低於線性
- 太小的批量無法充分利用多核架構
- 如果可並行處理,那麼記憶體消耗和批量大小成正比
- 特定大小陣列執行在某些硬體上,執行更快
- 小批量引入噪聲,具有正則化的效果
不同的演算法使用不同的方法從小批量中提取資訊,有些表現好,有些表現不好,原因可能是無法在小批量上面獲取有用資訊,或者是放大了小批量上面的誤差噪聲。
小批量是隨機抽取的這一點非常重要,以防連續遍歷時資料之間的相關性導致梯度估計的相關性。從一組樣本中計算出梯度期望的無偏估計要求這些樣本之間是互相獨立的。通常的做法是在訓練之前,將資料隨機打亂一次後,再按照順序一直往下取 minibatch 就可以了。每個獨立的模型每次遍歷資料時都會使用我們已經提前打亂的資料,這種理論上偏離隨機取樣的方法並沒有給模型訓練帶來怎樣的影響。 小批量隨機梯度下降的一個有趣的事實是,只要沒有重複使用樣本,它將遵循著真實泛化誤差的梯度。線上學習最好體現了隨機梯度下降是最小泛化誤差的原因:所有資料都是新的獨立產生的,而不是原來固定大小的訓練集,這種情況下每次更新的樣本是直接從分佈 p_{data} 中取樣獲得的無偏樣本。
除非資料量非常之大,通常最好是多次遍歷資料集,如果只在第一次隨機打亂資料順序後不再改變順序,只有第一次遍歷資料符合泛化誤差梯度的無偏估計,額外的訓練仍然可以繼續減小訓練誤差而獲得好處。隨著資料集的不斷增大,往往一個數據只會使用一次,甚至只是使用部分訓練集,這時過擬合不再是問題,欠擬合和計算效率成為我們需要考慮的問題。
8.2 神經網路優化中的挑戰
優化通常是一個非常困難的任務,傳統的機器學習會想辦法設計目標函式和約束,使得目標函式是凸函式,從而避免優化過程中出現非凸函式的問題。然而,即使是凸函式,也會遇到優化的問題,本節將主要探討深度學習優化問題中會遇到的挑戰。
8.2.1 病態
在優化凸函式的時候,會遇到Hessian矩陣 H 病態的情況。病態情況一般被認為廣泛存在於神經網路的訓練過程中,體現在隨機梯度下降會“卡”在某些特殊的情況,此時即使很小的更新步長也會增加代價函式。回顧之前的代價函式的二階泰勒展開預測梯度下降的 [圖片上傳失敗…(image-69f034-1524449135535)] 會增加:
[圖片上傳失敗…(image-687d19-1524449135535)]
當 [圖片上傳失敗…(image-e1ccf1-1524449135535)] 超過 [圖片上傳失敗…(image-f81c8a-1524449135535)] 時,梯度的病態會成為問題,很多情況下,梯度的範數不會再訓練中顯著的減小,但是 [圖片上傳失敗…(image-fe0850-1524449135535)] 的增長會超過一個數量級。結果是,儘管梯度很強,但是學習率必須收縮以彌補更強的曲率,因此學習變得非常緩慢。 有些適合於解決其他情況中的病態的技術並不適用於深度神經網路。比如牛頓法在解決帶有病態條件的Hessian矩陣的凸優化問題時,是有效的方法,但是運用到神經網路時需要很大的改動。
8.2.2 區域性極小值
在凸優化問題中,優化問題可以簡化為尋找一個區域性極小值點,因為任何的區域性極小值就是全域性最小值。雖然有些凸函式底部是一個很大的平坦區域,並非單一的極值點,但是應用過程中實際上該區域中每一個極小值點都是一個可以接受的點。所以說,對於凸優化問題來說,找到任何形式的臨界點,就是找到了一個不錯的可行解。而對於非凸函式問題,比如神經網路問題,可能會存在很多的區域性極小值點。
如果一個足夠大的模型可以唯一確定一組模型的引數,那麼我們說該模型是可以辨認的。帶有潛變數的模型往往是不可辨認的,因為互相交換潛變數,可以得到等價的模型。神經網路代價函式具有非常多甚至是無限多的區域性極小值點,而且,由於不可辨識性問題而產生的區域性極小值都有相同的代價函式,因此區域性極小值點並非是非凸帶來的問題。如果區域性極小值點相比全域性最小值點有很大的代價,那麼區域性極小值點會帶來很大的問題。對於實際使用的神經網路,是否存在很多代價很大的區域性極小值點,優化演算法是否會碰到這些極小值點都是尚未解決的公開問題。學者們現在猜想,對於足夠大的神經網路而言,大部分區域性極小值都具有很小的代價函式,我們能不能找到全域性最小點並不重要,重要的是能夠在引數空間裡找到一個代價很小的可以接受的點。
8.2.3 高原、鞍點和其他平坦區域
很多高維非凸函式而言,區域性極值遠少於另一類梯度為零的點:鞍點。在一個鞍點附近,有些方向有更大的代價函式,有些方向有更小的代價函式。在鞍點處,Hessian矩陣同時具有正負特徵值,位於正特徵值對應的特徵向量方向的點比鞍點有更大的代價,負特徵值對應的特徵向量方向的點比鞍點有更小的代價。鞍點是某個方向的橫截面的極大值點,也是另一個方向截面的極小值點。
在低維空間中,區域性極值很常見,而在高維空間中,鞍點則很常見。理論上已經證明,不具有非線性的淺層自編碼器只有全域性極小值和鞍點,沒有代價比全域性極小值更大的區域性極小值點。試驗中發現,梯度下降在很多情況下可以逃離鞍點。對於牛頓法而言,鞍點是一個問題,因為梯度下降旨在朝著“下坡”方向移動,而非明確尋找梯度為0的點。如果不經修改,牛頓法就會跳進一個鞍點。而在高維空間中,鞍點激增,所以以牛頓法為代表的二階方法無法成功取代梯度下降。
8.2.4 懸崖和梯度爆炸
多層神經網路因為有大量的因子相乘,典型的比如迴圈神經網路,因為長的時間序列會有大量因子相乘,這中情況下存在像懸崖一樣的斜率較大的區域,當遇到這種懸崖結構時,梯度更新會很大程度的改變引數的值,進而跳過這樣的區域。不管是從上還是從下接近懸崖,都會產生不好的結果。如果採用啟發式梯度截斷可以避免嚴重的後果。基本想法在於梯度只是指明瞭移動的最佳方向,並沒有指明最佳步長,因此啟發式梯度截斷會減小步長,使得梯度下降不太可能一步走出最陡下降方向的懸崖區域。
8.2.5 長期依賴
在一些算中,當計算圖變得非常深的時候,會面臨一個長期依賴的問題。深層的計算圖不僅存在於前饋網路,也存在於迴圈神經網路中,因為迴圈神經網路要在很長的時間序列的各個時刻重複應用相同操作來構建非常深的計算圖。舉個例子,假如某個計算圖包含一條反覆與矩陣 W 相乘的路徑,那麼 t步之後,相當於乘以 W^t 。假設 W 有特徵分解:
[圖片上傳失敗…(image-d333b8-1524449135535)]
當特徵值 lambda_i 不在 1 附近時,若大於1,則會爆炸,若小於1,則會消失。梯度消失與爆炸問題(vanishing and exploding gradient problem)是指該計算圖上面的梯度會因 [圖片上傳失敗…(image-3386ba-1524449135535)] 發生大幅度的變化。梯度消失使得我們不知道引數朝哪個方向移動可以快速改進代價函式,而梯度爆炸會使得學習不穩定。迴圈網路中使用的相同的矩陣 W 並沒有在前饋網路中使用,因此即使使用非常深的前饋網路,也能避免梯度消失於爆炸問題。
8.2.6 非精確梯度
大多數優化演算法先決條件是我們知道精確的梯度或者是Hessian矩陣,然而在實踐中,往往都是有偏的估計,幾乎所有的深度學習演算法都需要基於取樣的估計,比如小批量資料計算更新梯度。有些情況下,我們希望最小化的目標函式實際上是難以處理的,所以此時我們只能使用近似梯度。大多數神經網路演算法的設計都考慮到了梯度估計的缺陷,所以選擇比真實損失函式更容易估計的代理損失函式來避免這個問題。
8.2.7 區域性和全域性結構間的弱對應
以上討論的大都是單點的性質,如果利用梯度下降在某個方向上損失函式改進很大,但是並沒有指向全域性代價更低的遙遠區域,那麼單點處表現很好,但是全域性表現不佳。有學者認為大部分訓練的執行時間取決於到達最終解的路徑長度,大多數優化研究難點集中於訓練是否找到了全域性最小點,區域性最小點,鞍點,但是在實踐中神經網路並不會達到其中任何一種。
梯度下降和幾乎所有可以有效訓練神經網路的方法,都是基於區域性較小更新。以上的內容都是集中於為何這些區域性範圍更新的正確方向難以計算,但是難以確定區域性下降是否定義通向有效解的足夠短的路徑。目標函式可能有諸如病態條件或不連續梯度的問題,使得梯度為目標函式提供較好近似的區間非常小。有些情況下,區域性下降或許可以定義通向解的路徑,但是該路徑包含很多次更新,因此遵循該路徑會帶來很大的計算代價;還有些情況下,區域性下降完全無法定義通向解的路徑;還有些情況下,區域性移動太過貪心,朝著下坡的方向移動,但是卻和所以可行解越來越遠。
許多現有的研究方法在研究求解具有困難全域性結構的問題時,著力於尋找良好的初始點,而不是在區域性範圍內更新的演算法,因為前者實現目標更加可行。
8.2.8 優化的理論限制
一些理論研究表明,我們為任何神經網路設計的任何優化演算法都有效能限制,但是,這樣的理論上的效能限制並不影響神經網路在實踐中的應用。尋找一個給定規模的網路的可行解是困難的,但在現實情況中,我們可以通過選擇更大的網路,設定更多的引數,輕鬆找到可以接受的解。另外,在神經網路中實踐中,我們不關注某個函式的精確的極小值點,只要求損失減到足夠小以獲得可以接受的泛化誤差即可。理論研究優化演算法的效能上界需要學術界更多的努力。
8.3 基本演算法
以上內容已經講解了神經網路優化的理論指導思想,使用梯度下降和隨機梯度下降,可以很大程度上加速模型的訓練,代價函式會沿著隨機挑選的小批量資料的梯度方向下降。
8.3.1 隨機梯度下降
隨機梯度下降(SGD)及其變種是一般機器學習中應用最多的優化演算法,尤其是在深度學習中。按照資料生成分佈 p_{data} 隨機抽取 m個小批量(獨立同分布,iid)的樣本,通過計算它們梯度的均值,得到梯度的無偏估計。下圖展示了這個演算法的過程:
SGD演算法中的一個關鍵引數是學習率 epsilon_k ,在此之前我們介紹SGD都是使用的固定的學習率,在實踐中,隨著梯度的降低,有必要逐步減小學習率。由於SGD中隨機取樣 minibatch 會引入噪聲源,因此在極小點處梯度並不會消失。而批量梯度下降使用全量資料更新梯度,在接近極小值點時,梯度很小並逐步變為0,因此,批量梯度下降可以使用固定學習率。與之對比,SGD收斂的一個充分條件是:
[圖片上傳失敗…(image-1092d6-1524449135535)]
[圖片上傳失敗…(image-8ae940-1524449135535)]
在實踐中,一般會選擇線性衰減學習率知道第 tau 次迭代:
在第 tau 次迭代之後,一般使 epsilon 保持常數。學習率可以通過實驗誤差的演變曲線來選取,如果初始 epsilon_0 選取的過大,則會出現損失上升和震盪,而如果 epsilon_0 選取的過小,學習過程會過於緩慢。
SGD及其相關的小批量,或者是更廣義的基於梯度優化的線上學習演算法,一個重要的性質是每一步更新的計算時間不依賴與總的訓練樣本的多少。即使總的資料集很大,它也能收斂,而且SGD往往在處理完整個訓練集之前就收斂到可接受的誤差範圍之內。
研究演算法的收斂率,一般會衡量額外誤差(excess error) [圖片上傳失敗…(image-9a0cd-1524449135535)] ,也即當前代價函式超出最低可能代價的量。SGD應用於凸問題時,k步迭代之後誤差的量級是 [圖片上傳失敗…(image-b1d3a3-1524449135535)] ,在強凸情況下誤差量級是 [圖片上傳失敗…(image-204351-1524449135535)] 。在沒有額外假設和輔助資訊之下,以上的界限不能進一步改進。批量梯度下降理論上SGD有更好的收斂率,然而有學者研究指出,泛化誤差的下降速度不會快於 [圖片上傳失敗…(image-152859-1524449135535)] ,因此對於機器學習演算法而言,不值得探索收斂快於 [圖片上傳失敗…(image-a983cb-1524449135535)]的優化演算法,因為往往過快的收斂對應著過擬合。對於大資料集,SGD只需要少量的樣本計算梯度從而實現初始快速更新。但是由SGD損失了常數倍 [圖片上傳失敗…(image-3ed4bd-1524449135535)] 的漸進分析,我們可以在學習中逐漸增大小批量的batch大小,以此權衡並充分利用批量梯度下降和隨機梯度下降兩者的優點。
8.3.2 動量
SGD是最受歡迎的優化演算法,但是其學習過程有時會有點緩慢,動量方法旨在加速學習過程,特別是處理高曲率,小但一致的梯度,或者是帶有噪聲的梯度。動量演算法積累了之前梯度指數級衰減的移動平均,並且繼續沿該方向移動。從形式上看,動量演算法引入了變數 v充當速度角色-代表引數在引數空間移動的方向和速率,速度被認為是負梯度的指數衰減平均。動量這個名詞的引入也是為了類比物理當中的動力概念。超引數 alpha 決定了之前的梯度貢獻衰減得有多快,更新規則如下:
[圖片上傳失敗…(image-54596b-1524449135535)]
速度 v 累積了梯度元素 [圖片上傳失敗…(image-ad7491-1524449135535)] ,相對於 epsilon, alpha 越大,之前梯度對現在方向的影響也越大。
在之前的SGD或者批量梯度下降中,步長只是梯度範數乘以學習率,現在,步長取決於梯度序列的大小和排列,當許多連續的梯度指向相同的方向時,步長最大,如果動量演算法始終觀察到梯度 g ,那麼它會在 -g 的方向上不斷的加速。其中,步長大小為:
[圖片上傳失敗…(image-63fa76-1524449135535)]
因此將動量方法的超引數視為 [圖片上傳失敗…(image-326dd5-1524449135535)] 有助於SGD類比理解。比如, [圖片上傳失敗…(image-f2ae01-1524449135535)] 對應著最大速度10倍於梯度下降演算法。在實踐中,一般 alpha 會取值為0.5, 0.9和0.99,和學習率一樣, alpha 也會隨著時間不斷地調整。一開始取比較小的值,逐漸變大,隨著訓練的深入,調整 alpha 沒有收縮 epsilon 重要。
8.3.3 Nesterov 動量
受Nesterov加速梯度演算法的啟發,Sutskever等人提出了動量演算法的一個變種,更新規則如下:
引數 alpha 發揮了和標準動量方法中類似的作用,Nesterov動量和標準動量之間的區別在於梯度的計算上。Nesterov動量中,梯度計算在施加當前速度之後,可以理解為Nesterov 動量往標準動量方法中添加了一個校正因子。在凸優化問題使用批量梯度下降的情況下,Nesterov 動量將 k 步之後額外誤差收斂率從 [圖片上傳失敗…(image-45126b-1524449135535)] 提高到 [圖片上傳失敗…(image-da0aaa-1524449135535)] ,對SGD沒有改進收斂率。完整的 Nesterov動量演算法如下所示:
8.4 引數初始化策略
有些演算法本質上是非迭代的,只是求解一個點。而有些其他優化演算法本質上是迭代的,應用這類優化問題時,能在可接受的時間內收斂到可接受的解,並且收斂值與初始值無關。深度學習的模型通常是迭代的,因此要求使用者制定一些開始迭代的初始點。另外,深度學習模型又是一個很複雜的問題,以至於大部分演算法的結果收到初始值的影響。初始點能決定演算法是否收斂,有些初始點十分不穩定,使得演算法會遭遇數值困難,並完全失敗。在收斂的情形下,初始點可以決定學習收斂的有多快,以及是否收斂到一個代價高或者低的點。另外,差不多代價的點可以導致區別極大的泛化誤差,初始點可以影響泛化。
現代機器學習乃至深度學習和神經網路的初始化策略是簡單和啟發式的,改進初始化是一項困難的任務。神經網路的優化到目前都沒有被很好的理解。有些初始化策略在神經網路初始化時具有很好的效果,然而我們並沒有理解哪些性質可以在初始化之後得意保持。進一步,有些初始化從優化的觀點是有利的,但是從泛化的角度看是不利的。
目前完全確信的唯一特性是初始引數需要在不同的單元之間“破壞對稱性”。比如,如果具有相同啟用函式的兩個隱藏單元連線到相同的輸入,那麼這些單元必須具有不同的初始化引數。如果他們具有相同的引數,那麼應用到確定性損失和模型的確定性學習演算法之上時將會一直以相同的方式更新這兩個單元。通常來說,最好還是初始化每個單元使其和其他單元計算不同的函式,這或許有助於確保沒有輸入模式丟失在前向傳播的零空間中,也沒有梯度丟失在反向傳播的零空間中。每個單元計算不同的函式的目標促使了引數的隨機初始化。
我們幾乎總是初始化模型的權重為高斯或者均勻分佈中隨機抽取的值,兩者似乎沒有很大的區別,然而初始分佈的大小確實對優化過程的結果和網路的泛化能力都有很大的影響。
更大的初始權重具有更強的破壞對稱性的作用,有助於避免冗餘的單元,也有助於避免在每層線性成分的前向或反向傳播中丟失訊號。如果權重初始太大,那麼會在前向或者反向中產生爆炸的值。對於初始化網路,正則化和優化有著不同的觀點:優化觀點建議權重應該足夠大以成功傳播資訊,正則化則希望引數小一點以降低模型複雜度。
很多啟發式的方法可用於選擇權重的初始大小。一種初始化 m 個輸入和 n 個輸出的全連線層的權重啟發式方法是從分佈
中取樣權重,而 Glorot 和 Bengio 建議使用標準初始化(normalized initialization):
後一種啟發式方法初始化所有的層,目的在於使其處於具有相同啟用方差和使其具有相同的梯度方差之間。雖然這種假設網路是不含有非線性的鏈式矩陣乘法,現實的神經網路會違反這個假設,但是很多設計給線性模型的演算法在非線性模型上面都有很好的效果。
如果計算資源允許,將每層權重的初始值範圍設定為一個超引數通常是一個好主意,比如隨機搜尋來進行引數挑選。是否選擇使用密集或者稀疏初始化也可以設定為一個超引數,當然我們也可以選擇手動搜尋最優初始範圍。以上都是關注權重的初始化,其他引數的初始化通常是更加容易的。初始化偏置的方法必須和初始化權重的方法相協調,通常大部分情況下將偏置設定為0是可行的方案。當然,存在以下這些需要將初始化偏置為非0的情形:
- 偏置作為輸出單元,初始化偏置以獲得正確的輸出邊緣統計通常是有利的
- 有時需要選擇偏置以避免初始化引起太大飽和
- 有時一個單元會控制其他單元能否參與到等式中
上面這些初始化模型引數為常數或者隨機演算法,實踐中還可以利用機器學習來初始化網路引數。一個常用的策略是使用無監督模型訓練出來的引數來初始化監督模型。 即使是在一個不相關的問題上執行監督訓練,往往也會得到一個比隨機初始化更快收斂的初始值(類似於遷移學習)。這些新式的初始化策略有時能夠得到更好的泛化誤差和更快的收斂速度,因為它們編碼了模型初始引數的分佈資訊。之前的其他初始化策略效果也不錯的原因主要在於設定了正確的引數範圍,或者是設定不同單元計算互相不同的引數。
8.5 自適應學習率演算法
學習速率對神經網路的效能有著顯著的影響,損失通常高度敏感於引數空間的某些方向,而對其他因素不敏感。動量演算法可以一定程度上緩解這個問題,但代價是引入了另一個超引數。如果我們相信方向敏感度在某種程度是軸對齊的,那麼給每個引數設定不同的學習率,在模型學習訓練過程中自動適應這些學習率是有道理的。早期的一個模型訓練時候的啟發式演算法 Delta-bar-delta演算法,基於簡單的想法:如果損失對於某個給定模型引數的偏導符號保持不變,那麼學習率應該增大,如果對於該引數的偏導的方向發生了變化,那麼學習率應該減小。這種方法只適用於全批量優化中。本節將介紹最近提出的幾種基於小批量的演算法來自適應模型引數的學習率。
8.5.2 RMSProp
RMSProp由Hinton於2012年提出,用於修改AdaGrad以在非凸設定下效果更好,將梯度積累改變為指數加權的移動平均。AdaGrad設計以讓凸問題能夠快速的收斂。當應用於非凸函式訓練神經網路時,學習軌跡可能穿過了很多不同的結構,最終到達一個區域性是凸碗的結構。AdaGrad根據平方梯度的整個歷史來收縮學習率,學習率很可能在到達這樣的凸碗結構之前就變得太小。而RMSProp使用指數衰減平均,丟棄遙遠過去的歷史,使其能夠在找到凸碗結構後快速收斂,該演算法等效於一個初始化與該碗狀結構的AdaGrad演算法。實踐中和經驗上,RMSProp已經被證明是是一種有效而且實用的深度神經網路優化演算法,目前是深度學習從業者經常採用的優化方法之一。
RMSProp的標準形式和結合Nesterov動量的形式如下圖所示,相比AdaGrad,引入了一個新的超引數 rho ,用來控制移動平均的長度範圍。
8.5.3 Adam
Adam (adaptive moments),在早期演算法的背景下,最好被看成結合RMSProp和具有一些重要區別的動量的變種。首先,在Adam中動量直接併入了梯度一階矩(指數加權)的估計。將動量加入RMSProp最直觀的方法是將動量應用於縮放後的梯度。其次,Adam包括偏置修正,修正從原點初始化的一階矩(動量項)和二階矩(非中心項)。Adam通常被認為對超引數的選擇相當魯棒,儘管學習率有時需要從建議的預設值修改。
8.5.4 選擇正確的優化演算法
本節以上部分討論了一系列通過自適應每個模型引數的學習率以解決優化深度模型中的難題,究竟在實踐中該如何選擇並沒有定論。目前來說,最流行並且使用率很高的優化演算法包括SGD,有動量的SGD,RMSProp,有動量的RMSProp,AdaDelta 和 Adam,選擇哪一個演算法主要取決於使用者對特定演算法的熟悉程度以便調節超引數。
演算法總結:基於動量和基於自適應學習率的優化演算法都是從梯度下降SGD演化而來,演算法的細節之處對比如下圖:
8.6 二階近似方法
本節會討論用於訓練深度神經網路的二階方法。為簡單起見,只討論目標函式為經驗風險(暫時不考慮正則化項)
8.6.1 牛頓法
與一階方法相比,二階方法使用二階導數改進了優化,最廣泛使用的是牛頓法。牛頓法是基於二階泰勒級數展開在某點 theta_0 附近來近似 theta 的方法,忽略了更高階的導數
其中 H 是 J 相對於 theta 的Hessian矩陣在 theta_0 處的估計。如果我們基於上式求解這個函式的臨界點,得到牛頓引數的更新規則
因此,對於區域性的具有正定 H 的二次函式,用 H^{-1} 調整梯度,牛頓法會直接跳到極小值,如果目標函式是凸的但非二次,該更新將是迭代的,得到的相關演算法如下。對於非二次的表面,只要Hessian矩陣保持正定,牛頓法就能夠迭代應用。
牛頓法只適用於Hessian矩陣是正定的情況,而在深度學習中,目標函式的表面通常是非凸的,因此使用牛頓法是有問題的,這種情況下可以通過正則化Hessian矩陣來避免,常用的方法是在Hessian矩陣對角線上增加常數 alpha: