1.選擇哪一種優化算法並無達成共識 2.具備自適應學習率(以RMSProp 和AdaDelta 爲表明)的算法族表現得至關魯棒,不分伯仲,但沒有哪一個算法能脫穎而出。 3.對於當前流行的優化算法包括括SGD、具動量的SGD、RMSProp、具動量的RMSProp、AdaDelta 和Adam而言,選擇哪個算法彷佛主要取決於使用者對算法的熟悉程度(以便調節超參數) 4.基本不用二階近似優化算法
-SGD算法
SGD實際就是min-batch的實現,爲最基礎的優化算法,當今大部分優化算法都是以SGD爲基礎實現的。詳見 Deep Learning 最優化方法之SGD 1.SGD應用於凸問題時,k次迭代後泛化偏差的數量級是O(1/sqrt(k)),強凸下是O(1/k)。 2.理論上GD比SGD有着更好的收斂率,然而[1]指出,泛化偏差的降低速度不會快於O(1/k)。鑑 於SGD只需少許樣本就能快速更新,這遠超過了緩慢的漸進收斂,所以不值得尋找使用收斂快O(1/k)。 3.可能因爲SGD在學習中增長了噪聲,有正則化的效果 4.在某些硬件上使用特定大小的數組時,運行時間會更少。尤爲是在使用GPU時,一般使用2 的冪 數做爲批量大小能夠得到更少的運行時間。通常,2 的冪數的取值範圍是32 到256,16 有時在嘗試大模型時使用。 5.若是批量處理中的全部樣本能夠並行地處理(一般確是如此),那麼內存消耗和批量大小會 正比。對於不少硬件設施,這是批量大小的限制因素
Momentum引入了動量v,以指數衰減的形式累計歷史梯度,以此來解決Hessian矩陣病態問題 1.動量方法主要是爲了解決Hessian矩陣病態條件問題(直觀上講就是梯度高度敏感於參數空間的某些方向)的。 2.加速學習 3.通常將參數設爲0.5,0.9,或者0.99,分別表示最大速度2倍,10倍,100倍於SGD的算法。 4.經過速度v,來積累了之間梯度指數級衰減的平均,而且繼續延該方向移動: 指數衰減平均, 以alpha爲衰減力度,alpha越大,以前梯度對如今方向的影響也越大
$v \gets \alpha v - \epsilon g$
數組
$\eta \gets \frac{ \epsilon \lVert g \rVert }{1-\alpha}$
網絡
Nesterov是對Momentum的變種。與Momentum不一樣的是,Nesterov先更新參數,再計算梯度 1.Nesterov是Momentum的變種。 2.與Momentum惟一區別就是,計算梯度的不一樣,Nesterov先用當前的速度v更新一遍參數,在用更新的臨時參數計算梯度。 3.至關於添加了矯正因子的Momentum。 4.在GD下,Nesterov將偏差收斂從O(1/k),改進到O(1/k^2) 5.然而在SGD下,Nesterov並無任何改進
這類算法最大的特色就是,每一個參數有不一樣的學習率,在整個學習過程當中自動適應這些學習率。函數
學習率逐參數的除以歷史梯度平方和的平方根,使得每一個參數的學習率不一樣 1.簡單來說,設置全局學習率以後,每次經過,全局學習率逐參數的除以歷史梯度平方和的平方根,使得每一個參數的學習率不一樣 2.效果是:在參數空間更爲平緩的方向,會取得更大的進步(由於平緩,因此歷史梯度平方和較小,對應學習降低的幅度較小) 3.缺點是,使得學習率過早,過量的減小 4.在某些模型上效果不錯。
Karpathy作了一個這幾個方法在MNIST上性能的比較,其結論是: adagrad相比於sgd和momentum更加穩定,即不須要怎麼調參。而精調的sgd和momentum系列方法不管是收斂速度仍是precision都比adagrad要好一些。在精調參數下,通常Nesterov優於momentum優於sgd。而adagrad一方面不用怎麼調參,另外一方面其性能穩定優於其餘方法。
AdaGrad算法的改進。 歷史梯度平方和—>指數衰減的移動平均,以此丟棄遙遠的過去歷史。 1.AdaGrad算法的改進。鑑於神經網絡都是非凸條件下的,RMSProp在非凸條件下結果更好,改變梯度累積爲指數衰減的移動平均以丟棄遙遠的過去歷史。 2.經驗上,RMSProp被證實有效且實用的深度學習網絡優化算法。 相比於AdaGrad的歷史梯度:
$r \gets r + g \odot g$
性能
RMSProp增長了一個衰減係數來控制歷史信息的獲取多少:
$r \gets \rho r + (1 - \rho) g \odot g$
學習
Adam算法能夠看作是修正後的Momentum+RMSProp算法 1.Adam算法能夠看作是修正後的Momentum+RMSProp算法 2.動量直接併入梯度一階矩估計中(指數加權) 3.Adam一般被認爲對超參數的選擇至關魯棒 4.學習率建議爲0.001
算法8.7 Adam算法 Require:步長ε (建議默認爲: 0.001 ) Require:矩估計的指數衰減速率,ρ1和ρ2在區間[0,1)內。( 建議默認爲:分別: 爲0.9和0.999) Require:用於數值穩定的小常數δ ( 建議默認爲: 10-8) Require:初始參數θ 初始化- -階和二階矩變量s=0, r=0 初始化時間步t= 0 while沒有達到中止準則do 從訓練集中採包含m個樣本{.).....},的小批量,對應目標爲yi。 計算梯度: g←VoZ; L(f(x();0), y( n t←t+1 更新有偏一階矩估計: s←p18+(1- A P1)9 Momentum項 更新有偏二階矩估計: r←pr+(1-ρ2)g@ 9RMSProp項 修正一階矩的誤差: 8← 修正二階矩的誤差:分←E 計算更新: 0θ=-∈房。 (逐元素應用操做) 應用更新: θ←θ+ Oθ end while
牛頓法是基於二階泰勒級數展開在某點附近來近似損失函數的優化方法。主要須要求得Hessian矩陣的逆。若是參數個數是k,則計算你所需的時間是O(k^3)因爲在神經網絡中參數個數每每是巨大的,所以牛頓法計算法消耗時間巨大。
共軛梯度(CG)是經過迭代降低的共軛方向(conjugate directions)以有效避免Hessian 矩陣求逆計算的方法。
Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法具備牛頓法的一些優勢,但沒有牛頓法的計算負擔。在這方面,BFGS和CG 很像。然而,BFGS使用了一個更直接的方法近似牛頓更新。用矩陣Mt 近似逆,迭代地低秩更新精度以更好地近似Hessian的逆。
存儲受限的BFGS(L-BFGS)經過避免存儲完整的Hessian 逆的近似矩陣M,使得BFGS算法的存儲代價顯著下降。L-BFGS算法使用和BFGS算法相同的方法計算M的近似,但起始假設是M^(t-1) 是單位矩陣,而不是一步一步都要存儲近似。