各種優化器SGD,AdaGrad,Adam,LBFGS都做了什么?
優化的目標是希望找到一組模型參數,使模型在所有訓練數據上的平均損失最小。對於參數的迭代更新\(\theta \leftarrow \theta -\eta g\),主要是從兩個方面,一個是梯度修正\(g\),一個是學習率\(\eta\)調整。基本都是基於歷史的梯度或者學習率進行一個調整。
1. SGD:
用單個訓練樣本的損失來近似平均損失,即每次隨機采樣一個樣本來估計當前梯度,對模型參數進行一次更新。
優點:訓練速度快,內存開銷小。
缺點:SGD每步接受的信息有限,對梯度的估計准確性低,造成目標函數的收斂不穩定伴有震盪甚至出現不收斂。隨機性大,並不保證全局最優化。
2. SGD+Momentum:
動量方法考慮了帶衰減系數的前一步伐,可以加速SGD,抑制震盪。
優點:比SGD收斂更快,目標函數的收斂更穩定,減少在鞍點等的震盪。
缺點:保持慣性,缺乏適應性。梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢 。
3. NAG(Nesterov Accelerated Gradient ):
在SGD+Momentum上增加“提前量”設計,在計算梯度時做了調整,用\(\theta_t-\beta_1 m_{t-1}\)來近似當作參數下一步會變成的值,計算未來可能位置處的梯度而非當前位置的梯度。
優點:改進Momentum方法,防止按照慣性走的太快,會衡量一下梯度做出修正。
4. AdaGrad(Adaptive Gradient Algorithm):
自適應地確定參數的學習速度,對更新頻率低的參數做較大的更新,對更新頻率高的參數做較小的更新。采用“歷史梯度平方和”來衡量不同參數的梯度的稀疏性,取值越小表明越稀疏。
優點:減少學習率的手動調整,更適用於稀疏數據,提高SGD的魯棒性。
缺點:分母會不斷累積,學習率衰減越來越快。
5. RMSProp:
是 Geoff Hinton 提出的一種自適應學習率方法。結合了Momentum的慣性原則,加上AdaGrad對錯誤方向的阻力。但是缺少了Momentum的一部分,因此后面Adam補上這個想法。
RMSprop 和 AdaDelta 都是為了解決 AdaGrad 學習率急劇下降問題的。
優點:解決 AdaGrad 學習率急劇下降。
6. AdaDelta:
針對AdaGrad改進:因為AdaGrad采用所有歷史梯度平方和的平方根做分母,分母隨時間單調遞增,產生的自適應學習速率隨時間衰減的速度過於激進 。AdaDelta 采用指數衰減平均的計算方法,用過去梯度平方的衰減平均值代替他們的求和。 這個分母相當於梯度的均方根 root mean squared (RMS),在數據統計分析中,將所有值平方求和,求其均值,再開平方,就得到均方根值。
優點:不需要提取設定學習速率,使用指數衰減平均計算,防止學習速率衰減過快。
7. Adam:
結合Momentum和AdaGrad的優點,即考慮過去梯度的平方的指數衰減平均值,也保持過去梯度的指數衰減平均值。還包含了偏置修正,修正從0初始化的一階矩和二階矩的估計。
優點:為不同參數產生自適應的學習速率。
8. AdaMax:
Adamax優化器來自於Adam的論文的Section7,該方法是基於無窮范數的Adam方法的變體,對梯度平方的處理由指數衰減平均改為指數衰減求最大值。在Adam中,單個權重的更新規則是將其梯度與當前和過去梯度的\(L^2\)范數(標量)成反比例縮放。作者又將基於\(L^2\)范數的更新規則泛化到基於\(L^p\)范數的更新規則中。
雖然這樣的變體會因為\(p\)的值較大而在數值上變得不穩定,但是在特例中,令\(p\rightarrow\infty\)會得出一個極其穩定和簡單的算法。
由於\(u_t\)依賴於max操作,所以AdaMax不像在Adam中\(m_t\)和\(v_t\)的偏差趨向於0,所以不需要計算\(u_t\)的偏差校正(\(u_0=0\))。
9. AdamW:
在Ilya Loshchilov & Frank Hutter 的論文Decoupled weight decay regularization中,把Adam中的權重衰減和基於損失的梯度更新解耦(AdamW)。發現在Adam這種自適應學習率算法中L2正則化不像在SGD中有效:
- L2正則化和Weight Decay並不等價,只有在標准的SGD下可以把兩者等價。特別當與自適應梯度相結合時,L2正則化導致具有較大歷史參數或梯度幅度的權重比使用權重衰減時更小。
- 使用Adam優化帶L2正則的損失並不有效。如果引入L2正則化項,在計算梯度的時候會加上正則項求梯度的結果。正常的權重衰減是對所有的權重都采用相同的系數進行更新,本身比較大的一些權重對應的梯度也會比較大,懲罰也越大。但由於Adam計算步驟中減去項會有除以梯度平方的累積,使得梯度大的減去項偏小,從而具有大梯度的權重不會像解耦權重衰減那樣得到正則化。 這導致自適應梯度算法的L2和解耦權重衰減正則化的不等價。
而在常見的深度學習庫中只提供了L2正則,並沒有提供權重衰減的實現。這可能就是導致Adam跑出來的很多效果相對SGD with Momentum有偏差的一個原因。大部分的模型都會有L2 regularization約束項,因此很有可能出現Adam的最終效果沒有SGD的好。目前bert訓練采用的優化方法就是AdamW,對除了layernorm,bias項之外的模型參數做weight decay。
Adam的weight decay發生在紫字部分,所以由於\(g^2\)作分母,會使得大的梯度得不到足夠力度的正則化;而AdamW把weight decay放在了綠字部分,所以能有效的正則化。
10. SGDW:
和AdamW類似,是SGD+momentum使用解耦的weight decay(SGDW)。原始的SGD+momentum權重衰減發生在梯度的L2正則化,而SGDW是在更新參數\(\theta_t\)時使用解耦權重衰減。
11. AMSGrad:
偏置修正只是對訓練的開始有用,先不考慮偏置修正。Adam中\(\frac{\eta}{\sqrt{{v_t}+\epsilon}}\)朝着平均梯度方向前進的步幅,隨着訓練會逐漸減少。由於學習率是恆定或遞減的,作者提出的解決方法是通過添加另一個變量來跟蹤梯度平方的指數衰減平均\(v_t\)的最大值,從而迫使\(v_t\)增加。
12. LBFGS:
經典的優化問題中迭代法的一階法(梯度下降法),前面SGD、Adam等都是在一階法的基礎上進行改進,加快收斂速率。二階法(牛頓法)的收斂速度是遠快於一階法的,但是Hessian矩陣求逆的計算復雜度很大,對於目標函數非凸時,二階法有可能會收斂到鞍點。針對二階法的這個問題,提出了BFGS算法,再是低存儲的L-BFGS算法。簡答說L-BFGS和梯度下降、SGD干的同樣的事情。
牛頓法求根\(f(x)=0\)的思路:
- 已知\(f(x)\)下,隨機產生點\(x_0\).
- 由已知的\(x_0\)按照\(x_k=x_{k-1}-\frac{f(x_{k-1})}{f'(x_{k-1})}\)進行\(k\)次迭代。
- 如果\(x_k\)與上一次的迭代結果\(x_{k-1}\)相同或相差小於閾值,那么\(x_k\)就是函數\(f(x)\)的根。
對於機器學習中的最優化問題,大部分要優化的是目標函數的導函數,即求導函數為0的點(駐點)。用牛頓法求導函數為0,轉換迭代公式為:\(x_k=x_{k-1}-\frac{f‘(x_{k-1})}{f'’(x_{k-1})}\)。牛頓法求駐點本質是目標函數\(f(x)\)的二階泰勒展開:\(f(x)\approx f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2\)。對目標函數求導即對近似式求導即\(f'(x_k)+f''(x_k)(x-x_k)=0\),變換后就是上面的迭代公式。
機器學習中優化的目標函數是多元的,\(x,f'(x)\)都是向量,\(f''(x)\)是Hessian矩陣,迭代公式變為下式,\(g_k\)就是\(f'(x_k)\),\(H^{-1}_k\)是二階導數的倒數:
直接求\(H^{-1}_k\)很困難,因此提出BFGS算法:通過迭代法來逼近\(H^{-1}_k\)的算法。
其中\(D_k=H_k^{-1},s_k=x_{k+1}-x_k,y_k=g_{k+1}-g_k\)。
\(D_k\)的迭代公式也很復雜,利用單位矩陣(\(D_0=I\))逐步逼近\(H\)矩陣,每次計算要存儲\(D\)矩陣。如果數據集維度很大,迭代所需要的存儲巨大。
因為無法保存巨大的\(D\)矩陣,提出了L-BFGS算法:
時間換空間的方法:每次計算\(D\)矩陣要迭代計算\(s_k\)和\(y_k\),那存儲所有的\(s_k\)和\(y_k\)就可以。如果要得到\(D_{10}\),用單位矩陣與存儲的\(s_1,\dots,s_{10},y_1,\dots,y_{10}\)計算即可。如果數據集是10000維,存儲大小為\(10000\times 10000\)的\(D_k\),變成存儲10個大小為\(1\times 10000\)的向量\(s_k\)和\(y_k\),有效節省了內容空間。
如果迭代次數很大,內存同樣會不足。設定最大的存儲向量數\(N\),如果\(s_k\)和\(y_k\)迭代超過\(N\),就丟棄第一組\(s_1,y_1\),存儲\(s_2,\dots, s_{N+1}, y_2,\dots, y_{N+1}\),每次丟棄最前邊的\(s_k\)和\(y_k\)。雖然損失了精度,但可以保證使用有限的內存將函數的解通過BFGS算法求得到。
L-BFGS算法,可以看做是對BFGS算法的又一次近似。
優點:收斂速度快、內存開銷少。