1. 程式人生 > >2017年深度學習優化演算法最新進展:改進SGD和Adam方法

2017年深度學習優化演算法最新進展:改進SGD和Adam方法

2017年深度學習優化演算法最新進展:如何改進SGD和Adam方法

轉載的文章,把個人覺得比較好的摘錄了一下

AMSGrad 這個前期比sgd快,不能收斂到最優。

sgdr 餘弦退火的方案比較好

最近的一些研究(Dozat and Manning, 2017[13]、Laine and Aila, 2017[16])通過實驗發現,調低β2值,影響了Adam方法中過去平方梯度的指數移動平均值的貢獻度。一般來說,β2的預設值為0.999,設定為0.99或0.9後,在不同任務中表現更好,這表明可能存在指數移動平均值的問題。

關於這個,在yolov3的環境裡,我試了一下,沒有發現更好

Zhang在2017年的一個研究表明[2],在調整學習率退火方案和動量引數後,該SGD方法的效能與Adam有得一拼,而且收斂速度更快。另一方面,我們可能認為Adam方法中學習率的自適應性可能模仿了學習速率退火,但是一個明確的退火方案仍然是有幫助的。因為,如果我們把SGD方法中的學習率退火新增到Adam中,它能在機器翻譯任務中表現得比SGD方法更好,且更快地收斂[4]。

事實上,學習率退火方案似乎是一種新的特徵工程,因為我們發現,改進的學習率退火方案能改善模型的最終收斂效能。Vaswani等人在2017年給出了一個有趣的例子[14]。在模型調參時,通常需要進行大規模的超引數優化,這個文章的創新點在於也把學習率退火方案當作是要優化的具體焦點。作者使用了Adam方法,其中β1= 0.9,和非預設引數β2= 0.98、ε=10-9,這可以說對學習率η來說是最精細的退火方案之一:

深度學習的基本目標,就是尋找一個泛化能力強的最小值,模型的快速性和可靠性也是一個加分點。

隨機梯度下降(SGD)方法是1951年由Robbins和Monro提出的[1],至今已有60年曆史。在當前的深度學習研究中,這種方法至關重要,一般被用在反向傳播過程中。

近年來,研究人員提出一些新的優化演算法,使用了不同方程來更新模型引數。2015年Kingma和Ba提出的Adam方法[18],可看作是目前最常用的優化演算法之一。這表明,從機器學習工作者的角度來說,深度學習優化中的最佳方法在很大程度上是保持不變的。

然而,今年還有很多新的方法提出,這可能會影響接下來在模型優化中所使用的方法。在這篇文章中,Ruder從他的角度,介紹了深度學習優化方法中一些振奮人心的工作和可能的發展方向。閱讀這篇文章時,要熟悉SGD方法和自適應學習率方法,如Adam方法。

改進Adam方法

儘管,像Adam這樣的自適應學習率方法使用十分廣泛,但是,在物體識別[17]和機器翻譯 [3]等研究任務中,很多前沿的研究成果仍然在使用傳統的帶動量SGD方法。

Wilson等人在最新研究中[15]給出一些理由來說明,與帶動量SGD方法相比,自適應學習率方法會收斂於不同的極小值,且結果通常不大理想。從經驗上得出,在物體識別、字元級語言建模和句法分析等任務中,自適應學習率方法得到的極小值通常比帶動量SGD方法得到的極小值要差。這似乎與直覺相反,因為Adam方法有很好的收斂機制,且其自適應學習率會比傳統的SGD方法表現得更好。但是,Adam和其他自適應學習率方法也有一些侷限性。

解耦權值衰減

在一些資料集上,Adam方法的泛化能力比帶動量SGD方法要差的一個可能原因是權值衰減(weight decay)。權值衰減常被用於影象分類問題中,即在每次引數更新後,把衰減率Wt與權重θt相乘,其中衰減率Wt略小於1:

這能防止權重變得過大。因此,權值衰減也可以理解為一種L2正則化項,這取決於施加在Loss上的權值衰減率Wt:

權值衰減方法一般可作為上述的正則化項,或是直接修改梯度,通常在很多神經網路庫中有呼叫函式。在動量和Adam演算法的更新方程中,通過與其他衰減項相乘來修改梯度值時,所以權值衰減與L2正則化不一樣。因此,Loshchilov和Hutter在2017年提出“解耦權值衰減”[19],與原始定義相同,在每次引數更新後通過這種方法來更新梯度。

帶動量和權值衰減的SGD方法(SGDW)按照以下方式更新梯度:

其中,η為學習率,第二個方程的第三項為解耦權值衰減。同樣地,我們得到帶權值衰減的Adam方法(AdamW):

其中,mt和m̂t是第一時刻的偏差和偏差校正估計值,vt和v̂t是第二時刻的偏差和偏差校正估計值,β1和β2是相應的衰減率,且加入相同的權值衰減項。作者表示,這種方法大幅提高了Adam方法的泛化能力,且在影象分類資料集上與帶動量SGD方法效果相當。

另外,它將學習率的選擇過程與權值衰減的選擇過程分離開,這能更好地實現超引數優化,因為超引數間不再互相依賴。它還把優化器的實現與權值衰減的實現過程分開,這有助於構建更簡潔和可重用的程式碼,參考fast.ai AdamW/SGDW implementation(https://github.com/fastai/fastai/pull/46/files)。

固定指數移動平均值

最近的一些研究(Dozat and Manning, 2017[13]、Laine and Aila, 2017[16])通過實驗發現,調低β2值,影響了Adam方法中過去平方梯度的指數移動平均值的貢獻度。一般來說,β2的預設值為0.999,設定為0.99或0.9後,在不同任務中表現更好,這表明可能存在指數移動平均值的問題。

ICLR 2018正在稽核的一篇文章On the Convergence of Adam and Beyond(https://openreview.net/forum?id=ryQu7f-RZ)研究了這個問題,指出過去平方梯度的指數移動平均值是自適應學習率方法泛化能力不佳的另一個原因。自適應學習速率方法的核心,是通過過去平方梯度的指數移動平均值來更新引數,例如Adadelta,RMSprop和Adam。研究指數平均的貢獻度,這個思路的動機性很好,能防止學習率隨著訓練而變得極小,這也是Adagrad方法的關鍵缺陷。但是,梯度的短期記憶性在其他情況下變成了阻礙。

在Adam方法收斂到一個次優解時,我們觀察到一些小批次樣本貢獻了大幅且有效的資訊梯度,但是這種情況很少發生,指數平均後減小了它們的影響,導致模型收斂性差。作者給出了一個簡單的凸優化問題,可以看到Adam方法中也存在這種現象。

作者提出了一種新演算法AMSGrad來解決這個問題,它使用過去平方梯度的最大值來更新引數,而不是先前的指數平均。AMSGrad方法的更新過程如下,這裡不帶有偏差校正估計:

實驗表明,在小資料集和CIFAR-10資料集上,這種方法的效能比Adam方法更好。

調整學習率

在許多情況下,我們不需要改進和調整模型結構,而是該調整超引數。在語言建模中的一些最新研究表明,與更復雜的模型相比,調整LSTM引數[20]和正則化引數[21]就可以得到最先進的效能。

在深度學習優化中,一個重要的超引數就是學習率η。實際上,在SGD方法中,需要構建一個合適的學習率退火方案,來得到一個良好的收斂最小值。人們會認為,像Adam這樣的自適應學習率方法,對不同的學習率更具有魯棒性,因為這些方法能自我更新學習率。但是,即使對於這些方法,好的學習率和最佳的學習率也可能有很大的差別(Andrej Karpathy‏Verified account說最佳學習率是3e-4 https://twitter.com/karpathy/status/801621764144971776)。

Zhang在2017年的一個研究表明[2],在調整學習率退火方案和動量引數後,該SGD方法的效能與Adam有得一拼,而且收斂速度更快。另一方面,我們可能認為Adam方法中學習率的自適應性可能模仿了學習速率退火,但是一個明確的退火方案仍然是有幫助的。因為,如果我們把SGD方法中的學習率退火新增到Adam中,它能在機器翻譯任務中表現得比SGD方法更好,且更快地收斂[4]。

事實上,學習率退火方案似乎是一種新的特徵工程,因為我們發現,改進的學習率退火方案能改善模型的最終收斂效能。Vaswani等人在2017年給出了一個有趣的例子[14]。在模型調參時,通常需要進行大規模的超引數優化,這個文章的創新點在於也把學習率退火方案當作是要優化的具體焦點。作者使用了Adam方法,其中β1= 0.9,和非預設引數β2= 0.98、ε=10-9,這可以說對學習率η來說是最精細的退火方案之一:

其中dmodel是模型引數的數目,且warmup_steps為4000。

Smith等人在2017年的另一篇論文[5]揭示了學習率和批次大小間的一個有趣關聯。這兩個超引數通常被認為是相互獨立的,但是他們發現,減小學習率相當於增加批次大小,而後者能提高並行訓練速度。反過來想,我們可以減少模型更新次數,並通過提高學習率和縮放批次大小來提高訓練速度。這個發現影響到大規模深度學習的訓練過程,可在不需要超引數調整的前提下,重新調整現有的訓練計劃。

熱重啟(warm restarts) 帶重啟的SGD方法

另一個最近提出的有效方法是SGDR[6],Loshchilov和Hutter用熱重啟方式來替代學習率退火制度,來改進SGD方法。在每次重啟時,學習率初始化為某個值,然後逐漸減少。重要的是,這種重啟可隨時進行,因為優化不是從頭開始,而是從模型在上一個步驟收斂的引數開始的。關鍵在於,通過一個積極的餘弦退火方案來調整學習率,這會很快地降低學習率,如下所示:

其中ηimin和ηimax是第i次訓練時學習率的變化區間,Tcur表示從上次重啟後已完成的迭代次數,且Ti規定了下一次重啟的迭代次數。與常規的學習率退火方案相比,熱重啟方法(Ti=50,Ti=100和Ti=200)的效能如圖1所示。

圖1:加入熱重啟的學習率方法效能變化

重啟後,用一個高的初始學習率能從根本上把引數從先前收斂的最小值彈射到損失函式曲面的不同區域。這種積極的退火機制使模型能快速收斂到一個新且更好的解決方案。作者通過觀察還發現,使用熱重啟的隨機梯度下降方法的所需時間比學習率退火機制少了2〜4倍,並能達到相當或更好的效能。

使用熱重啟的學習率退火也叫做迴圈變化學習率,最初由Smith[22]提出。fast.ai學生給出了另外兩篇文章,討論了熱重啟和迴圈變化學習率,地址如下:

https://medium.com/@bushaev/improving-the-way-we-work-with-learning-rate-5e99554f163b

http://teleported.in/posts/cyclic-learning-rate/

快照整合(Snapshot ensembles)

快照整合是一種最近由Huang提出的巧妙方法[7],即在訓練單個模型時使用熱重啟來組裝一個集合,且基本上無額外的代價。這種方法可以訓練一個單模型,按照之前看到的餘弦退火制度收斂,然後儲存模型引數,並進行熱重啟,重複這些步驟M次。最後,所有儲存的模型快照形成一個集合。在圖2中可以看到,常用的SGD優化在誤差曲面上的效能與快照整合過程的效能差異。

圖2:SGD與快照整合

一般來說,整合是否成功取決於組合中每個模型的多樣性。因此,快照整合依賴於餘弦退火方案的能力,使得模型在每次重啟後能夠收斂到不同的區域性最優值。作者證明,這在實踐中是成立的,在CIFAR-10、CIFAR-100和SVHN上取得了很好的效果。

帶重啟的Adam方法

熱重啟最初在Adam方法中並不適用,因為它的權值衰減不正常。在固定權值衰減後,Loshchilov和Hutter在2017年同樣地把熱重啟擴充套件到Adam中。其中,ηimin= 0,ηimax= 1,得到:

建議開始時選取較小的Ti(迭代次數在1-10之間),並在每次重啟時將其乘以一個係數Tmult,如2。

學習優化

去年最有趣的論文之一是Andrychowicz等人撰寫的Learning to learn by gradient descent by gradient descent,也是reddit網友選出的“2016年最佳論文”[23]。他們訓練了LSTM優化器,用於在訓練主要模型時更新引數。不幸的是,學習單獨的LSTM優化器,或是使用預先訓練好的LSTM優化器進行優化,都會大大增加模型訓練的複雜度。

今年還有一篇很有影響力的“learning to learn”論文,使用LSTM來生成特定領域語言的模型結構[24]。雖然搜尋過程需要大量的資源,但是所發現的結構可以用來取代已有的結構。這個搜尋過程已經被證明是有效的,並且在語言建模方面取得最先進的效果,並且在CIFAR-10上取得了很有競爭力的結果。

同樣的搜尋策略也可以應用於任何已經被手工定義其關鍵過程的其他領域,其中一個領域就是深度學習的優化演算法。正如以前所看到的,優化演算法十分符合這個規則:它們都使用了過去梯度的指數移動平均值(如動量)和過去平方梯度的指數移動平均值(如Adadelta,RMSprop,Adam)的組合[25]。

Bello等人[8]定義了一個特定領域的語言,由對優化有用的基元組成,如這些指數移動平均值。然後,他們從所有可能的更新規則空間中取樣更新規則,使用此更新規則來訓練模型,並基於測試集上訓練模型的效能來更新RNN控制器。完整流程如圖3所示。

圖3:神經優化搜尋

特別是,他們還定義了兩個更新方程,即PowerSign和AddSign。PowerSign的更新公式如下:

其中,α是一個超引數,通常設為e或者2;f(t)設為1,或是衰減函式(隨著時間步t重新執行線性、迴圈或衰減),其中mt是過去梯度的移動平均值。通常,設定α= e,且無衰減。注意到,更新通過αf(t)或1 /αf(t)來縮放梯度,取決於梯度方向和移動平均值是否一致。這表明,這種類似動量的過去梯度和當前梯度之間的相似性是優化深度學習模型的關鍵資訊。

AddSign定義如下:

其中,α通常設定為1或2,與上面類似,這次的尺度更新為α+f(t)或α−f(t),取決於梯度方向的一致性。作者指出,PowerSign和AddSign在CIFAR-10上的表現優於Adam、RMSprop和帶動量SGD方法,並能很好地轉換到其他任務中,如ImageNet分類和機器翻譯。

理解泛化

優化問題與泛化能力是密切相關的,因為模型收斂的最小值決定了模型的泛化能力。因此,優化問題的進展與理解這種極小值泛化能力的理論進展是密切相關的,且能更深入地理解深度學習中的泛化能力。

但是,我們對深度神經網路泛化能力的理解仍然很淺顯。最近的研究表明,可能是區域性極小值的數量隨引數數量呈指數型增長[9]。考慮到目前深度學習結構中引數數量巨大,這樣的模型能收斂且泛化能力較好,特別是考慮到它們可以完全記住隨機輸入[10],這似乎看起來很神奇[10]。

Keskar等人[11]認為最小值的銳度是泛化能力不佳的原因,他們還特別指出,批次梯度下降所找到的尖銳極小值具有較高的泛化誤差。這是直觀的,因為我們通常會希望這個函式是平滑的,出現尖銳極小值表明相應誤差曲面的高度不規則性。然而,近期研究表明,銳度可能不是一個好的指標,因為它表明區域性最小值能夠很好地泛化[12],而且Eric Jang的Quora答案中也討論了這些內容,連結如下:

https://www.quora.com/Why-is-the-paper-%E2%80%9CUnderstanding-Deep-Learning-Requires-Rethinking-Generalization%E2%80%9D-important/answer/Eric-Jang?srid=dWc3

有一篇ICLR 2018投稿論文(https://openreview.net/forum?id=r1iuQjxCZ),通過一系列消融分析,表明一個模型在啟用空間中對單個方向有依賴性,即單個單元或特徵圖譜的啟用是其泛化能力的良好預測。他們證明,這種模式適用於不同資料集上的訓練模型,以及不同程度的標籤損壞。他們還發現,加入Dropout並沒有助於解決這個問題,而批次歸一化阻礙了單方面的依賴性。

雖然以上這些研究表明仍然有很多我們不知道的深度學習優化知識,但要記住,收斂性保證和在凸優化中的很多現有工作和思路,在一定程度上也可應用於非凸優化問題中。NIPS 2016上大量的優化教程對該領域很多理論工作進行了很好的綜述。

結論

我希望上面內容能很好地總結過去一年在深度優化問題中一些令人信服的發展。如果還有其他漏掉的方面,或是文章中有錯誤,請聯絡我。

文中提到的25篇文獻,可以去原文文末自取:http://ruder.io/deep-learning-optimization-2017/