目錄
SGD(with Nesterov Acceleration)= NAG
記在前面:本文是Adam那麼棒,爲什麼還對SGD念念不忘 (1)的閱讀筆記。
---------------------------------------------------------------------------------------------------------------------------------
優化算法發展回顧:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam
---------------------------------------------------------------------------------------------------------------------------------
優化算法通用框架
--定義:
---------------目標函數:f(w)
---------------優化參數:w
---------------初始學習率:
--迭代優化過程【對每個epoch t】:
---------------1. 計算目標函數關於當前參數wt的梯度:
---------------2. 根據歷史梯度計算一階動量和二階動量:
---------------3. 計算當前時刻的下降梯度:
---------------4. 根據下降梯度進行更新:
步驟3、4對於各個算法都是一致的,主要的差別就體現在1和2上。
SGD 系列:固定學習率的優化算法
SGD
此時,2步驟變爲:,帶入3步驟得到:
SGD缺點:下降速度慢,可能會在溝壑的兩邊持續震盪,停留在一個局部最優點。
SGD (with Momentum) = SGD-M
梯度下降過程引入慣性,來抑制SGD震盪。
SGD基礎上,引入一階動量:
--------可以認爲:這是一個加權求平均的過程,當前時刻的一階動量等於,經β1加權的前一時刻的一階動量 與 經(1-β1)加權的當前時刻的梯度。
一階動量是各個時刻梯度方向的指數移動平均值,約等於最近 1/(1-β1) 個時刻的梯度向量和的平均值。也就是說,t 時刻的下降方向,不僅由當前點的梯度方向決定,而且由此前累積的下降方向決定。
--------原文解釋的理解:如下圖公式,可以看到,當前t時刻的一階動量,通過對g1,..,gt所有梯度分佈進行指數移動加權得到,也就是“各個時刻梯度方向的指數移動平均值”。
--------即:t時刻的下降方向,由g1, g2, g3, …, gt的梯度方向共同決定。
--------經驗值爲0.9,這就意味着下降方向即η,主要是此前累積的下降方向,並略微偏向當前時刻的下降方向。想象高速公路上汽車轉彎,在高速向前的同時略微偏向,急轉彎可是要出事的。
--------例子解釋:如下,t=10時,g1…gt的加權值依次增大,即當前t時刻的下降方向主要是此前累積的下降方向,並略微偏向當前時刻的下降方向。
上面截圖中,=0.9,改變=0.8,計算t=10的權重如下,可以看到,此時,更加偏向當前時刻的下降方向。
SGD(with Nesterov Acceleration)= NAG
SGD的另一個問題:困在局部最優的溝壑裏震盪。
需要改進:不能停留在當前位置,要去觀察未來的方向,而要向前一步、多看一步、看遠一些。
改進方法:在SGD、SGD-M 的基礎上的進一步改進,改進點在於步驟 1,改動如下:
再用改動的步驟 1 計算步驟 2 中當前時刻的累積動量。
思想:SGD-M中已知,時刻 t 的主要下降方向由累積動量決定。自己的梯度方向說了也不算,那與其看當前梯度方向,不如先看看如果跟着累積動量走了一步,那個時候再怎麼走。
(source: http://cs231n.github.io/neural-networks-3)
自適應學習率的優化算法
SGD及其變種:無二階動量,以同樣的學習率更新每個參數。
二階動量:可以實現“自適應學習率”。
思想:經常更新的參數,需要學習速度慢一些,穩定些;偶爾更新的參數,需要學習速率大一些,多學點。
AdaGrad
二階動量:可以度量歷史更新頻率,表示如下,可以解釋爲以往所有梯度值的平方和,即越大表示經常更新,需要放慢點,越小表示不經常更新,需要放快些:
因爲步驟3的下降梯度爲:,因此,此時的實質學習率由α變成了α/Vt。爲避免分母爲0,會在分母上加一個小的平滑項。
因此,分母恆大於0,而且參數更新越頻繁,二階動量越大,學習率就越小。
AdaGrad 方法在稀疏數據場景下表現非常好。
缺陷:過於激進。因爲單調遞增,學習率會單調遞減至0,可能會使訓練過程提前結束,即便後續還有數據也無法學到必要的知識。
AdaDelta / RMSProp
針對 AdaGrad 過於激進的改進策略:不累積全部歷史梯度,而只關注過去一段時間窗口的下降梯度。這也就是 AdaDelta 名稱中Delta的來歷。
思路:和上述SGD-M思路一樣,指數移動平均值大約就是過去一段時間的平均值。從下面公式看到,與SGD-M不一樣的是,此處 加權的是 的平方。
這就避免了二階動量持續累積、導致訓練過程提前結束的問題了。
Adam / Nadam
Adam
Adam和Nadam:前述方法的集大成者。
-------SGD + 一階動量 = SGD-M ;
-------SGD + 二階動量 = AdaGrad / AdaDelta
-------SGD + 一階動量 + 二階動量 = Adam = Adaptive + Momentum
其中,SGD-M的一階動量是: ==【公式1】
-------AdaGrad的二階動量是: ==【公式2】
【公式1】和【公式2】就是優化算法裏面最常見的兩個超參數β1和β2。前者控制一階動量,越大表示對以前積累梯度考慮的越多,越小表示越偏重於當前的梯度下降方向;後者控制二階動量,同樣地,越大表示對以前梯度方向考慮的越多。
β1=0 時 Adam 特例化爲 AdaGrad / AdaDelta。
Nadam
-------SGD + 一階動量 + 二階動量 = Adam = Adaptive + Momentum
-------SGD + 一階動量 + Nesterov +二階動量 = NAG +二階動量 = Adam + Nesterov = Nadam
其中,在Adam公式基礎上,對步驟1重新計算梯度:
Adam 兩宗罪
1. 可能不收斂
《On the Convergence of Adam and Beyond》,通過反例證明了Adam在某些情況下可能會不收斂。
SGD【沒有二階動量,學習率恆定,但有學習率衰減策略】和AdaGrad【二階動量不斷積累,學習率遞減】,因此,這兩種方法學習率都會衰減,會最終收斂到0,模型也得已收斂。
但,AdaDelta 和 Adam 因爲是固定時間窗口內的累積,隨着時間窗口的變化,遇到的數據可能發生鉅變,從而Vt會鉅變(非單調變化)。從而導致學習率震盪,模型無法收斂。
改進策略:對二階動量的變化進行控制,避免上下波動。
這樣保證了:,從而學習率單調遞減。
2. 可能錯過全局最優解
- 神經網絡多參數、經常是將輸入映射到一個更高維度的空間,而這個空間的目標函數可能是非凸的,高高低低,探索多次都可能不能得到最優,從而停止訓練。
相關文章:
《The Marginal Value of Adaptive Gradient Methods in Machine Learning》UC Berkeley。自適應學習率算法可能會對前期出現的特徵過擬合,後期纔出現的特徵很難糾正前期的擬合效果。這個文章給的例子很極端,在實際情況中未必會出現。
《Improving Generalization Performance by Switching from Adam to SGD》CIFAR-10。 試着對Adam的學習率的下界進行控制,發現效果好了很多。
於是,提出了一個用來改進Adam的方法:前期用Adam,享受Adam快速收斂的優勢;後期切換到SGD,慢慢尋找最優解。
Adam + SGD 組合策略
- 主流的觀點認爲:Adam等自適應學習率算法對於稀疏數據具有優勢,且收斂速度很快;但精調參數的SGD(+Momentum)往往能夠取得更好的最終結果。
------於是,有了思考:Adam先粗調,SGD後精調。但,先後中間的時間怎麼決定??
-----回答:Improving Generalization Performance by Switching from Adam to SGD
Adam 下降方向:
SGD下降方向:
解釋:因爲SGD下降慢,而Adam走得快,因此,SGD下降方向必定可以分解爲 Adam下降方向及其正交方向上的兩個方向之和。
因此,Adam+ SGD方法走的路==gk黑色線方向+pk藍色線方向。
------如何確定SGD的學習率?
------SGD(pk藍色線)在Adam方向上的投影(gk紅色線),應該正好等於Adam的下降方向:,得到。
-------爲了減少噪聲影響,使用移動平均值修正對學習率的估計:
這裏直接複用了Adam的 beta 參數。
-------何時進行算法的切換?
---------當 SGD的相應學習率的移動平均值基本不變的時候,即
不過,這一時機是不是最優的切換時機,作者並沒有給出數學證明,只是通過實驗驗證了效果,切換時機還是一個很值得深入研究的話題。
優化算法常用tricks
- 剛入門,優先考慮:SGD+Nesterov Momentum或者Adam。
- 選擇熟悉的算法。
- 充分了解數據。---模型非常稀疏,則優先考慮自適應學習率算法Adam等。
- 根據需求選擇。--快速驗證,Adam,模型上線或者結果發佈前,精調的SGD進行模型的極致優化。
- 先用小數據集實驗。有論文研究指出,隨機梯度下降算法的收斂速度和數據集的大小的關係不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一個具有代表性的小數據集進行實驗,測試一下最好的優化算法,並通過參數搜索來尋找最優的訓練參數。
- 考慮不同算法的組合。先用Adam進行快速下降,而後再換到SGD進行充分的調優。切換策略可以參考本文介紹的方法。
- 數據集一定要充分的打散(shuffle)。這樣在使用自適應學習率算法的時候,可以避免某些特徵集中出現,而導致的有時學習過度、有時學習不足,使得下降方向出現偏差的問題。
- 訓練過程中持續監控訓練數據和驗證數據上的目標函數值以及精度或者AUC等指標的變化情況。對訓練數據的監控是要保證模型進行了充分的訓練——下降方向正確,且學習率足夠高;對驗證數據的監控是爲了避免出現過擬合。
- 制定一個合適的學習率衰減策略。可以使用定期衰減策略,比如每過多少個epoch就衰減一次;或者利用精度或者AUC等性能指標來監控,當測試集上的指標不變或者下跌時,就降低學習率。
參考