詳解 Deep Learning 的各種優(yōu)化器(二)
本文將介紹各種基于梯度下降的優(yōu)化器,如 Momentum,Adagrad 以及 Adam 的具體細(xì)節(jié)
本文將講解以下概念:
Gradient Descent Batch Gradient Descent Stochastic Gradient Descent(SGD) Min-batch Gradient Descent Momentum Nesterov accelerated gradient(NAG) Adagrad Adadelta RMSprop Adam AdaMax Nadam AMSGrad
4.5 RMSprop
RMSprop 是一個(gè)未被發(fā)表的自適應(yīng)學(xué)習(xí)率算法,該算法由 Geoff Hinton 提出。
RMSprop 和 Adadelta 在相同的時(shí)間內(nèi)分別獨(dú)立提出,均是為了應(yīng)對(duì) Adagrad 的急速下降的學(xué)習(xí)率的問(wèn)題。實(shí)際上,RMSprop 是 Adadelta 的第一個(gè)更新向量的特例:
同樣,RMSprop 將學(xué)習(xí)率分解成一個(gè)平方梯度的指數(shù)衰減的平均。Hinton 建議將 設(shè)置為 0.9,對(duì)于學(xué)習(xí)率 的一個(gè)合適的默認(rèn)值為 0.001。
4.6 Adam
自適應(yīng)矩估計(jì)( Adaptive Moment Estimation,Adam )是另一種每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法。除了類似于 Adadelta 和 RMSprop 存儲(chǔ)一個(gè)指數(shù)衰減的歷史平方梯度的平均值 ,Adam 同時(shí)還保存了一個(gè)歷史梯度的指數(shù)衰減均值 ,類似于動(dòng)量。動(dòng)量可以看成一個(gè)從斜坡上跑下來(lái)的球,而 Adam 的行為就像一個(gè)帶有摩擦力的重球,因此它更喜歡誤差表面上更為平緩的最小值。
我們計(jì)算過(guò)去和過(guò)去平方梯度的衰減均值 和 分別如下:
和 分別對(duì)應(yīng)梯度的一階矩(均值)和二階矩(非確定的方差)的估計(jì),正如該算法的名稱。當(dāng) 和 初始化為 0 向量時(shí),Adam 的作者發(fā)現(xiàn)到它們都偏向于 0 ,尤其是在初始化步驟和當(dāng)衰減率很小的時(shí)候(例如 和 趨向于 1 )
通過(guò)計(jì)算偏差校正的一階矩和二階估計(jì)來(lái)抵消偏差:
正如我們?cè)?Adadelta 和 RMSprop 中看到那樣,他們利用上述公式更新參數(shù),由此生成了 Adam 的更新規(guī)則:
作者建議 取默認(rèn)值為 0.9, 為 0.999, 為 。他們從經(jīng)驗(yàn)上表明 Adam 在實(shí)際中表現(xiàn)很好,同時(shí),與其他的自適應(yīng)學(xué)習(xí)算法相比,其更有優(yōu)勢(shì)。
4.7 AdaMax
AdaMax 是 Adam 的一種變體,此方法對(duì)學(xué)習(xí)率的上限提供了一個(gè)更簡(jiǎn)單的范圍。
在 Adam 中,單個(gè)權(quán)重的更新規(guī)則是將其梯度與當(dāng)前梯度 和過(guò)去梯度的 范數(shù)(標(biāo)量)成反比例縮放:
因此,我們可以推導(dǎo)出 范數(shù):
雖然這樣的變體會(huì)因?yàn)? 值較大而在數(shù)值上變得不穩(wěn)定(這也是為什么 和 范數(shù)在實(shí)際場(chǎng)景中廣泛應(yīng)用的原因),然而,當(dāng) 時(shí), 表現(xiàn)出極其穩(wěn)定的特性。由此,AdaMax 的作者(Kingma and Ba, 2015)展示了由 得到的 擁有更好的穩(wěn)定性。為了與 Adam 相區(qū)分,我們用 表示無(wú)窮范數(shù)約束 :
我們現(xiàn)在將上式插入到 Adam 更新公式:將 替換為 ,得到 AdaMax 的更新規(guī)則:
注意到 依賴于 max 運(yùn)算,所以 AdaMax 不會(huì)像 Adam 中 和 趨向于 0 ,這也是為什么我們不需要去計(jì)算偏差校正。比較合適的參數(shù)設(shè)置:
4.8 Nadam
正如我們所見(jiàn),Adam 可以被視為 RMSprop 和 momentum 的結(jié)合產(chǎn)物:RMSprop 提供歷史平方梯度的指數(shù)衰減均值 ,而 Momentum 提供了歷史梯度的指數(shù)衰減均值 。與此同時(shí)按照前文敘述 NAG(Nesterov accelerated gradient )是優(yōu)于 Momentum 的。
Nadm(Nesterov-accelerated Adaptive Moment Estimation)就算結(jié)合了 Adam 和 NAG 的產(chǎn)物。為了將 NAG 融入 Adam 中,我們需要修改其 Momentum 部分 。
第一步,我們復(fù)習(xí)一下 Momentum 的更新規(guī)則:
其中, 是目標(biāo)函數(shù), 是動(dòng)量的衰減項(xiàng), 是步長(zhǎng)(即為學(xué)習(xí)率),展開(kāi)第三個(gè)等式可得:
以上再次說(shuō)明了當(dāng)前動(dòng)量的前一個(gè)動(dòng)量上前進(jìn)了一步,也在當(dāng)前梯度方向上前進(jìn)了一步。
NAG 在計(jì)算梯度之前用動(dòng)量步驟更新參數(shù)使得其在梯度方向上表現(xiàn)更為準(zhǔn)確。我們只需要修改 NAG 中的梯度 :
Dozat 建議按照如下步驟修改 NAG:與應(yīng)用兩次動(dòng)量步驟不同(一次更新梯度 ,一次更新參數(shù) ),我們直接更新參數(shù):
值得注意的是不同于上面擴(kuò)展動(dòng)量梯度更新規(guī)則方程利用動(dòng)量 , 作者使用了當(dāng)前動(dòng)量向量 去梯度更新。為了加上 Nesterov momentum 到 Adam 中去,作者類似地用當(dāng)前動(dòng)量向量替換之前的動(dòng)量向量。
首先,我們將 Adam 梯度更新規(guī)則列出來(lái)(注意我們不需要修改 ):
展開(kāi)得到:
注意到 是上一步的動(dòng)量向量偏差修正估計(jì),對(duì)此作者進(jìn)行用 如下替換:
為了方便起見(jiàn),作者忽略了分母是 而不是 。這個(gè)方程看起來(lái)與我們上面的擴(kuò)展動(dòng)量更新規(guī)則非常相似。我們現(xiàn)在可以在此之上添加 Nesterov momentum ,只需要簡(jiǎn)單使用當(dāng)前動(dòng)量向量的偏置校正估計(jì) 替換上一步衰減動(dòng)量的偏置估計(jì)校正 ,這樣我們得到 Nadam 的梯度更新規(guī)則
4.9 AMSGrad
當(dāng)自適應(yīng)學(xué)習(xí)率算法成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn),從業(yè)者也注意到例如目標(biāo)檢測(cè)或者機(jī)器翻譯并不是總能收斂到最優(yōu),并被帶有 momentum 的 SGD 超越。
Reddi 等人將這個(gè)問(wèn)題形式化,并且指出過(guò)去平方梯度的指數(shù)移動(dòng)平均值是自適應(yīng)學(xué)習(xí)率算法泛化行為不佳的原因。回顧一下,指數(shù)均值的引入原因:為了防止學(xué)習(xí)率隨著訓(xùn)練變得無(wú)窮小,這是 Adagrad 算法的關(guān)鍵缺陷。然而這種梯度的短期記憶在其他場(chǎng)景中成為障礙。
在 Adam 收斂到次優(yōu)解的設(shè)置中,就已經(jīng)注意到某些 minibatch 提供了大且豐富的梯度,但這些 minibatch 的出現(xiàn)十分罕見(jiàn),指數(shù)平均減弱了它們的影響并導(dǎo)致了收斂性差的問(wèn)題。作者提供了一個(gè)簡(jiǎn)單的凸優(yōu)化問(wèn)題例子中可以觀察到 Adam 有著相同的行為。
為了修復(fù)這種行為,作者提出了一種新的算法 - AMSGrad ,用歷史平方梯度 的最大值而不是指數(shù)均值去更新參數(shù)。 與上面 Adam 中定義相同:
不同于直接使用 (或者偏置校正的 ),作者采用 和 的最大值:
這樣,AMSGrad 算法的結(jié)果就不是一個(gè)遞增的值,這避免了 Adam 所遇到的問(wèn)題。為了簡(jiǎn)單起見(jiàn),作者也刪除了 Adam 中的 debiasing 步驟。完整的帶偏置校正估計(jì)的 AMSGrad 更新規(guī)則如下:
相比于 Adam 作者在小數(shù)據(jù)集以及 CIFAR-10 上觀察到更好的表現(xiàn)。然而,其他的實(shí)驗(yàn)中也展現(xiàn)了相同的或者更壞的表現(xiàn)(相比于 Adam)。AMSGrad 在實(shí)踐中是否能夠始終超越 Adam,還有待觀察。
5. 其他優(yōu)化算法
在 AMSGrad 之后出現(xiàn)了很多其他的優(yōu)化器,包括:
AdamW:修復(fù)了 Adam 的權(quán)重衰減; QHAdam:在更新權(quán)重時(shí)將動(dòng)量項(xiàng)與當(dāng)前梯度解耦,在更新權(quán)重時(shí)將均方梯度項(xiàng)與當(dāng)前平方梯度解耦; AggMo:結(jié)合了多個(gè)動(dòng)量項(xiàng) ;
更多更新的新優(yōu)化器可以參考:An updated overview of recent gradient descent algorithms – John Chen – ML at Rice University (johnchenresearch.github.io)
6. 優(yōu)化器算法可視化

從上圖我們能夠看到這些優(yōu)化器在損失平面的等高線圖( Beale 函數(shù) )隨著時(shí)間的行為。注意到 Adagrad,Adadelta,以及 RMSprop 幾乎立即朝著正確的方向并以同樣的速度收斂,與此同時(shí) Momentum 和 NAG 偏離方向,行為類似球從山上滾下來(lái)的場(chǎng)景。然而相比于 Momentum ,NAG 能夠迅速糾正方向。

第二張圖展示了優(yōu)化算法在鞍點(diǎn)的行為,一個(gè)維度具有正斜率,而另一個(gè)維度具有負(fù)斜率的點(diǎn),正如之前提到的,這對(duì) SGD 造成了困難。注意到,SGD、Momentum 和 NAG 發(fā)現(xiàn)很難打破對(duì)稱性,盡管后者最終設(shè)法逃離了鞍點(diǎn),而 Adagrad、RMSprop 和 Adadelta 迅速下降到負(fù)斜率。
正如我們所看到的,自適應(yīng)學(xué)習(xí)率方法,即 Adagrad、Adadelta、RMSprop 和 Adam 是最合適的,并且為這些場(chǎng)景提供了最好的收斂性。
7. 如何挑選優(yōu)化算法?
那么,我們現(xiàn)在應(yīng)該使用哪個(gè)優(yōu)化器?如果的輸入數(shù)據(jù)稀疏,那么我們可能會(huì)使用其中一種自適應(yīng)學(xué)習(xí)率方法獲得最佳結(jié)果。另一個(gè)好處是我們不需要調(diào)整學(xué)習(xí)率,但可能會(huì)使用默認(rèn)值獲得最佳結(jié)果。
總的來(lái)說(shuō),RMSprop 是 Adagrad 的擴(kuò)展,改進(jìn)其學(xué)習(xí)率急劇下降的問(wèn)題。這和 Adadelta 是一致的,只是 Adadelta 在分子更新規(guī)則中使用參數(shù)均方根進(jìn)行更新。Adam 最終結(jié)合偏置校正和 momentum 到 RMSprop。到目前為止,RMSprop、Adadelta 以及 Adam 是非常相似的算法,在一些相近的場(chǎng)景下都表現(xiàn)十分優(yōu)異。Kingma 等人表明隨著梯度變得更稀疏,它的偏差校正有助于 Adam 在優(yōu)化結(jié)束時(shí)略微優(yōu)于 RMSprop。就此而言,Adam 可能是最佳的整體選擇。
有趣的是,最近的許多論文使用樸素 SGD 沒(méi)有Momentum 且使用簡(jiǎn)單的學(xué)習(xí)率表。正如已經(jīng)顯示的那樣,SGD 通??梢哉业阶钚≈?,但它可能比使用某些優(yōu)化器花費(fèi)的時(shí)間長(zhǎng)得多,更依賴于穩(wěn)健的初始化和模擬退火表,并且可能會(huì)卡在鞍點(diǎn)而不是局部最小值。因此,如果您關(guān)心快速收斂并訓(xùn)練深度或復(fù)雜的神經(jīng)網(wǎng)絡(luò),就應(yīng)該選擇一種自適應(yīng)學(xué)習(xí)率方法。
8. 并行以及分布 SGD
鑒于大規(guī)模數(shù)據(jù)解決方案的普遍性和低成本集群的可用性,分布式 SGD 以進(jìn)一步加速是一個(gè)明確可行的選擇。
SGD 本質(zhì)上是連續(xù)的:一步一步朝著最低值前進(jìn)。它可以提供良好的收斂性,但在超大型數(shù)據(jù)集上可能收斂十分緩慢。相比之下,異步 SGD 速度更快,但 worker 之間的不佳的通信會(huì)導(dǎo)致收斂效果差。此外,作者還可以在一臺(tái)機(jī)器上并行化 SGD,而無(wú)需大型計(jì)算集群。以下是為優(yōu)化并行化和分布式 SGD 提出的算法和架構(gòu)。以下是為優(yōu)化并行化和分布式 SGD 提出的算法和架構(gòu)。
8.1 Hogwild!
Niu 等人介紹了一種更新方案叫做 Hogwild! 。這允許在 CPU 上并行執(zhí)行 SGD 更新。允許處理器在不鎖定參數(shù)的情況下訪問(wèn)共享內(nèi)存。這僅在輸入數(shù)據(jù)稀疏時(shí)才有效,因?yàn)槊看胃轮粫?huì)修改所有參數(shù)的一小部分。他們表明,在這種情況下,更新方案幾乎達(dá)到了最佳收斂速度,因?yàn)樘幚砥鞑惶赡芨采w有用信息。
8.2 Downpour SGD
Downpour SGD 是 Dean 等人使用的 SGD 的異步變體。在 Google 的 DistBelief 框架(TensorFlow 的前身)中。它在訓(xùn)練數(shù)據(jù)的子集上并行運(yùn)行模型的多個(gè)副本。這些模型將它們的更新發(fā)送到一個(gè)參數(shù)服務(wù)器,該服務(wù)器分布在許多機(jī)器上。每臺(tái)機(jī)器負(fù)責(zé)存儲(chǔ)和更新模型參數(shù)的一小部分。但是,由于副本不相互通信,例如通過(guò)共享權(quán)重或更新,它們的參數(shù)不斷面臨發(fā)散的風(fēng)險(xiǎn),阻礙收斂。
8.3 Delay-tolerant Algorithms for SGD
McMahan 和 Streeter 通過(guò)開(kāi)發(fā)不僅適應(yīng)過(guò)去梯度而且適應(yīng)更新延遲的延遲容忍算法,將 AdaGrad 擴(kuò)展到并行設(shè)置。這已被證明在實(shí)踐中運(yùn)作良好。
8.4 TensorFlow
TF 是谷歌開(kāi)源的用于實(shí)施和部署大規(guī)模機(jī)器學(xué)習(xí)模型的框架。它基于他們?cè)?DistBelief 方面的經(jīng)驗(yàn),并且已經(jīng)在內(nèi)部用于在大量移動(dòng)設(shè)備和大規(guī)模分布式系統(tǒng)上執(zhí)行計(jì)算。對(duì)于分布式執(zhí)行,計(jì)算圖被拆分為每個(gè)設(shè)備的子圖,并使用發(fā)送/接收節(jié)點(diǎn)對(duì)進(jìn)行通信。
8.5 Elastic Averaging SGD
zhang 等人。提出了彈性平均 SGD(EASGD),它將異步 SGD 的 worker 的參數(shù)與彈性力聯(lián)系起來(lái),即參數(shù)服務(wù)器存儲(chǔ)的中心變量。這允許局部變量從中心變量進(jìn)一步波動(dòng),這在理論上允許對(duì)參數(shù)空間進(jìn)行更多探索。他們憑經(jīng)驗(yàn)表明,這種增加的探索能力可以通過(guò)尋找新的局部最優(yōu)來(lái)提高性能。
9. 優(yōu)化 SGD 的其他策略
最后,作者介紹了可以與前面提到的任何算法一起使用的其他策略,以進(jìn)一步提高 SGD 的性能。
9.1 混洗和課程式學(xué)習(xí)
通常,我們希望避免以有意義的順序向我們的模型提供訓(xùn)練示例,因?yàn)檫@可能會(huì)使優(yōu)化算法產(chǎn)生偏差。因此,在每個(gè) epoch 之后打亂訓(xùn)練數(shù)據(jù)通常是一個(gè)好辦法。
另一方面,對(duì)于我們旨在逐步解決更難問(wèn)題的某些情況,以有意義的順序提供訓(xùn)練示例實(shí)際上可能會(huì)提高性能和更好的收斂性。建立這種有意義的秩序的方法稱為課程式學(xué)習(xí)。
Zaremba 和 Sutskever 只能訓(xùn)練 LSTM 來(lái)評(píng)估使用課程學(xué)習(xí)的簡(jiǎn)單程序,并表明組合或混合策略(通過(guò)對(duì)樣本排序增加訓(xùn)練難度)比通過(guò)原始策略更好。
9.2 Batch Normalization
為了便于學(xué)習(xí),我們通常通過(guò)用零均值和單位方差初始化參數(shù)的初始值來(lái)規(guī)范化參數(shù)的初始值。隨著訓(xùn)練的進(jìn)行和我們?cè)诓煌潭壬细聟?shù),我們失去了這種歸一化,這會(huì)減慢訓(xùn)練并隨著網(wǎng)絡(luò)變得更深而放大變化。
Batch Normalization 為每個(gè)小批量重新建立這些標(biāo)準(zhǔn)化,并且更改也通過(guò)操作進(jìn)行反向傳播。通過(guò)將歸一化作為模型架構(gòu)的一部分,我們能夠使用更高的學(xué)習(xí)率并且更少關(guān)注初始化參數(shù)。Batch Normalization 還充當(dāng)正則化器,減少(有時(shí)甚至消除)對(duì) Dropout 的需求。
9.3 提前停止訓(xùn)練
根據(jù) Geoff Hinton 的說(shuō)法:"Early stopping (is) beautiful free lunch" (NIPS 2015 Tutorial slides, slide 63)。因此,我們應(yīng)該在訓(xùn)練期間始終查看測(cè)試集上的誤差,如果的測(cè)試集誤差沒(méi)有得到足夠的改善,則及時(shí)停止。
9.4 梯度噪聲
Neelakantan 等人。添加遵循高斯分布的噪聲 到每一次梯度更新:
他們根據(jù)以下規(guī)則對(duì)方差進(jìn)行模擬退火:
他們表明,添加這種噪聲會(huì)使網(wǎng)絡(luò)對(duì)不良初始化更加魯棒,并有助于訓(xùn)練特別深且復(fù)雜的網(wǎng)絡(luò)。他們推測(cè)增加的噪聲使模型有更多機(jī)會(huì)逃脫并找到新的局部最小值,這對(duì)于越深的模型越頻繁。
參考資料
Deep Learning Optimization - Purdue Math An overview of gradient descent optimization algorithms 深度學(xué)習(xí)中的優(yōu)化算法 梯度下降法- 維基百科,自由的百科全書(shū) An Introduction to AdaGrad https://arxiv.org/pdf/1412.6980.pdf
