梯度下降优化算法概述
- 本文原文是 An overview of gradient descent optimization algorithms,同時作者也在 arXiv 上發了一篇同樣內容的 論文。
- 本文結合了兩者來翻譯,但是閱讀原文我個人建議讀博客中的,感覺體驗更好點。
- 文中括號中或者引用塊中的 斜體字 為對應的英文原文或者我自己注釋的話(會標明
譯者注),否則為原文中本來就有的話。 - 為方便閱讀,我在引用序號后加了所引用論文的題目,用 斜體字 表示,例如 Learning rate schedules [11,A stochastic approximation method] 。
- 水平有限,如有錯誤歡迎指出。翻譯盡量遵循原文意思,但不意味著逐字逐句。
- 本文也放在 我 GitHub 上的 awesome-posts 項目 上,選取數據科學和機器學習領域內比較好的英文文章進行翻譯,歡迎各位 star 。
Abstract
梯度下降算法雖然最近越來越流行,但是始終是作為一個「黑箱」在使用,因為對他們的優點和缺點的實際解釋(practical explainations)很難實現。這篇文章致力于給讀者提供這些算法工作原理的一個直觀理解。在這篇概述中,我們將研究梯度下降的不同變體,總結挑戰,介紹最常見的優化算法,介紹并行和分布式設置的架構,并且也研究了其他梯度下降優化策略。
Introduction
梯度下降是最流行的優化算法之一,也是目前優化神經網絡最常用的算法。同時,每一個最先進的深度學習庫都包含了梯度下降算法的各種變體的實現(例如 lasagne,caffe,keras)。然而始終是作為一個「黑箱」在使用,因為對他們的優點和缺點的實際解釋很難實現。這篇文章致力于給讀者提供這些算法工作原理的一個直觀理解。我們首先介紹梯度下降的不同變體,然后簡單總結下在訓練中的挑戰。接著,我們通過展示他們解決這些挑戰的動機以及如何推導更新規則來介紹最常用的優化算法。我們也會簡要介紹下在并行和分布式架構中的梯度下降。最后,我們會研究有助于梯度下降的其他策略。
著目標函數的下坡方向來達到一個山谷。如果你對梯度下降不熟悉,你可以在 這里 找到一個很好的關于優化神經網絡的介紹。
Gradient descent variants
依據計算目標函數梯度使用的數據量的不同,有三種梯度下降的變體。根據數據量的大小,我們在參數更新的準確性和執行更新所需時間之間做了一個權衡。
Batch gradient descent
由于為了一次參數更新我們需要在整個訓練集上計算梯度,導致 BGD 可能會非常慢,而且在訓練集太大而不能全部載入內存的時候會很棘手。BGD 也不允許我們在線更新模型參數,即實時增加新的訓練樣本。
下面是 BGD 的代碼片段:
for i in range(nb_epochs): params_grad = evaluate_gradient(loss_function, data, params) params = params - learning_rate * params_grad 其中 nb_epochs 是我們預先定義好的迭代次數(epochs),我們首先在整個訓練集上計算損失函數關于模型參數 params 的梯度向量 params_grad。其實目前最新的深度學習庫都已經提供了關于一些參數的高效自動求導。如果你要自己求導求梯度,那你最好使用梯度檢查(gradient checking),在 這里 查看關于如何進行合適的梯度檢查的提示。
然后我們在梯度的反方向更新模型參數,而學習率決定了每次更新的步長大小。BGD 對于凸誤差曲面(convex error surface)保證收斂到全局最優點,而對于非凸曲面(non-convex surface)則是局部最優點。
Stochastic gradient descen
BGD 對于大數據集來說執行了很多冗余的計算,因為在每一次參數更新前都要計算很多相似樣本的梯度。SGD 通過一次執行一次更新解決了這種冗余。因此通常 SGD 的速度會非常快而且可以被用于在線學習。SGD 以高方差的特點進行連續參數更新,導致目標函數嚴重震蕩,如圖 1 所示。
圖 1:SGD 震蕩,來自 Wikipedia
BGD 能夠收斂到(局部)最優點,然而 SGD 的震蕩特點導致其可以跳到新的潛在的可能更好的局部最優點。已經有研究顯示當我們慢慢的降低學習率時,SGD 擁有和 BGD 一樣的收斂性能,對于非凸和凸曲面幾乎同樣能夠達到局部或者全局最優點。
代碼片段如下,只是加了個循環和在每一個訓練樣本上計算梯度。注意依據 這里 的解釋,我們在每次迭代的時候都打亂訓練集。
for i in range(nb_epochs): np.random.shuffle(data) for example in data: params_grad = evaluate_gradient(loss_function, example, params) params = params - learning_rate * params_grad Mini-batch gradient descent
這樣做有兩個好處:
- 減小參數更新的方差,這樣可以有更穩定的收斂。
- 利用現在最先進的深度學習庫對矩陣運算進行了高度優化的特點,這樣可以使得計算 mini-batch 的梯度更高效。
代碼片段如下,我們每次使用 mini-batch 為 50 的樣本集來進行迭代:
for i in range(nb_epochs): np.random.shuffle(data) for batch in get_batches(data, batch_size=50): params_grad = evaluate_gradient(loss_function, batch, params) params = params - learning_rate * params_grad Challenges
標準的 MBGD 并不保證好的收斂,也提出了一下需要被解決的挑戰:
- 選擇一個好的學習率是非常困難的。太小的學習率導致收斂非常緩慢,而太大的學習率則會阻礙收斂,導致損失函數在最優點附近震蕩甚至發散。
- Learning rate schedules [11,A stochastic approximation method] 試圖在訓練期間調整學習率即退火(annealing),根據先前定義好的一個規則來減小學習率,或者兩次迭代之間目標函數的改變低于一個閾值的時候。然而這些規則和閾值也是需要在訓練前定義好的,所以也不能做到自適應數據的特點 [10,Learning rate schedules for faster stochastic gradient search]。
- 另外,相同的學習率被應用到所有參數更新中。如果我們的數據比較稀疏,特征有非常多不同的頻率,那么此時我們可能并不想要以相同的程度更新他們,反而是對更少出現的特征給予更大的更新。
- 對于神經網絡來說,另一個最小化高度非凸誤差函數的關鍵挑戰是避免陷入他們大量的次局部最優點(suboptimal)。Dauphin 等人 [19,Identifying and attacking the saddle point problem in high-dimensional non-convex optimization] 指出事實上困難來自于鞍點而不是局部最優點,即損失函數在該點的一個維度上是上坡(slopes up)( 譯者注:斜率為正 ),而在另一個維度上是下坡(slopes down)( 譯者注:斜率為負 )。這些鞍點通常被一個具有相同誤差的平面所包圍,這使得對于 SGD 來說非常難于逃脫,因為在各個維度上梯度都趨近于 0 。
Gradient descent optimization algorithms
接下來,我們將會概述一些在深度學習社區常用的算法,這些算法解決了我們前面提到的挑戰。我們不會討論實際上在高維數據集上不可行的算法,例如二階方法中的 牛頓法。
Momentum
SGD 在遇到溝壑(ravines)會比較困難,即在一個維度上比另一個維度更陡峭的曲面 [1,Two problems with backpropagation and other steepest-descent learning procedures for networks] ,這些曲面通常包圍著局部最優點。在這些場景中,SGD 震蕩且緩慢的沿著溝壑的下坡方向朝著局部最優點前進,如圖 2 所示。
圖 2:不帶動量的 SGD
動量(Momentum)[2,On the momentum term in gradient descent learning algorithms] 是一種在相關方向加速 SGD 的方法,并且能夠減少震蕩,如圖 3 所示。
圖 3:帶動量的 SGD
它在當前的更新向量中加入了先前一步的狀態:
Nesterov accelerated gradient
然而,一個球盲目的沿著斜坡下山,這不是我們希望看到的。我們希望有一個聰明的球,他知道將要去哪并可以在斜坡變成上坡前減速。
圖 4:Nesterov 更新,來自 G. Hinton’s lecture 6c
可以在 這里 查看對 NAG 的另一種直觀解釋,此外 Ilya Sutskever 在他的博士論文中也給出了詳細解釋 [9,Training Recurrent neural Networks] 。
現在我們已經能夠依據誤差函數的斜率來調整更新,并加快 SGD 的速度,此外我們也想根據每個參數的重要性來決定進行更大還是更小的更新。
Adagrad
Adagrad [3,Adaptive Subgradient Methods for Online Learning and Stochastic Optimization] 就是這樣一種解決這個問題的基于梯度的優化算法:根據參數來調整學習率,對于不常見的參數給予更大的更新,而對于常見的給予更小的更新。因此,Adagrad 非常適用于稀疏數據。Dean 等人 [4,Large Scale Distributed Deep Networks] 發現 Adagrad 能夠大幅提高 SGD 的魯棒性,并在 Google 用其訓練大規模神經網絡,這其中就包括 在 YouTube 中學習識別貓。除此之外,Pennington 等人 [5,Glove: Global Vectors for Word Representation] 使用 Adagrad 來訓練 GloVe 詞嵌入,因為罕見的詞匯需要比常見詞更大的更新。
Adagrad 最大的一個優點是我們可以不用手動的調整學習率。大多數實現使用一個默認值 0.01 。
Adagrad 主要的缺點是分母中累積的平方和梯度:由于每一個新添加的項都是正的,導致累積和在訓練期間不斷增大。這反過來導致學習率不斷減小,最終變成無限小,這時算法已經不能再繼續學習新東西了。下面的這個算法就解決了這個問題。
Adadelta
使用 Adadelta 時我們甚至不需要指定一個默認的學習率,因為它已經不在更新規則中了。
RMSprop
RMSprop 是一種未發布的自適應學習率的方法,由 Geoff Hinton 在 Lecture 6e of his Coursera Class 中提出。
RMSprop 和 Adadelta 在同一時間被獨立地發明出來,都是為了解決 Adagrad 的學習率遞減問題。事實上 RMSprop 與我們上面討論過的 Adadelta 的第一個更新向量一模一樣:
Adam
AdaMax
Nadam
Visualization of algorithms
下面的兩個動畫(來自 Alec Radford)提供了對當前優化算法行為的直觀解釋。也可以在 這里 查看 Karpathy 對這些動畫的描述和對我們討論過的算法的解釋。
圖 5:在損失曲面等值線上的 SGD 優化
在圖 5 中我們可以看到他們在損失曲面的等值線上(the Beale function)隨時間的變化趨勢。注意到 Adadelta 、Adagrad 和 RMSprop 幾乎立即開始在正確的方向下降并收斂速度幾乎一樣快,然而動量和 NAG 則「脫軌」了。不過由于 NAG 的「向前看」能力使其很快的糾正方向并朝著最小點前進。
譯者注:方便起見我把 Beale 函數的圖像和解析式放在這里。
?
圖 6:在鞍點處的 SGD 優化
圖 6 顯示了在鞍點處的算法行為,即該點在一個方向斜率為正,其他方向斜率為負,正如我們之前提到的這對于 SGD 是一個難點。注意到 SGD 、動量和 NAG 很難打破對稱性,盡管后兩者最終逃離的鞍點,但是 Adagrad 、RMSprop 和 Adadelta 很快朝著斜率為負的方向前進了。
可以看到自適應學習率的方法,例如 Adagrad 、Adadelta 、RMSprop 和 Adam 在這些場景中是最合適的并且提供了最好的收斂。
Which optimizer to use?
那么,你應該使用哪種優化算法呢?如果你的數據比較稀疏,那么使用自適應學習率的算法很可能會讓你得到最好的結果。另外一個好處是你不用去調節學習率,使用默認的設置可能就會讓你達到最好的效果。
總的來說,RMSprop 是 Adagrad 的一種擴展,用來解決后者學習率逐漸遞減的問題。它和 Adadelta 非常像,除了 Adadelta 在更新規則的分子上使用參數更新的 RMS (譯者注:均方誤差)。Adam 最終在 RMSprop 的基礎上加了偏差修正和動量。在這方面,RMSprop 、Adadelta 和 Adam 非常相似,在相似的環境下也表現地一樣好。Kingma 等人 [15,Adam: a Method for Stochastic Optimization] 表示隨著梯度越來越稀疏,Adam 的偏差修正使其略微優于 RMSprop 。在這個方面總體上來說 Adam 可能是最好的選擇。
有趣的是,許多最近的論文僅僅使用普通的不帶動量 SGD 和一個簡單的學習率退火機制(annealing schedule)。正如我們前面所討論的,SGD 通常會找到最優點,但是相比其他一些優化算法可能花費的時間比較長,更依賴于一個好的初始化和退火機制,而且也可能陷入鞍點而不是局部最優點。所以,如果你比較關心收斂速度并且在訓練一個深度或者復雜的神經網絡,你應該選擇一個自適應學習率算法。
Parallelizing and distributing SGD
鑒于大數據解決方案的普及以及低價集群的可用性,使用分布式 SGD 來進一步加速訓練是一個很明顯的選擇。SGD 本質上是按順序執行的:我們一步一步朝著最優點前進。SGD 提供了較好的收斂但是在大數據集上可能會速度較慢。相反,異步執行 SGD 比較快,但是 worker 之間不理想的通信可能會造成比較差的收斂。另外,我們也可以不需要大型計算集群,在一臺機器上并行執行 SGD 。下面是目前提出的用于優化并行和分布式 SGD 的算法和架構。
Hogwild!
Niu 等人 [23,Hogwild! : A Lock-Free Approach to Parallelizing Stochastic Gradient Descent] 引入了一個更新機制稱為 Hogwild!,可以在 CPU 上并行執行 SGD 。處理器可以在不鎖參數的情況下訪問共享內存。由于沒次更新只修改一部分參數,所以這種方法只適合于輸入數據比較稀疏的情況。他們表明在這種情況下該方法可以達到幾乎最優的收斂速度,因為處理器是不太可能覆蓋有用信息的。
Downpour SGD
Downpour SGD 是一種 SGD 的異步變體,由 Dean 等人 [4,Large Scale Distributed Deep Networks] 在谷歌的 DistBelief 框架(TensorFlow 的前身)中使用。它在訓練數據的子集上并行的運行一個模型的多個副本。這些模型將他們的更新發送到一個參數服務器,他們分布在多個機器上。每個機器只負責存儲和更新全部模型參數的一部分。然而由于這些機器并不需要相互通信,例如共享權重或者更新,導致他們的參數一直有發散的風險,阻礙收斂。
Delay-tolerant Algorithms for SGD
McMahan 和 Streeter [12,Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning] 通過開發一個延遲容忍(delay-tolerant)算法來擴展 Adagrad 使其并行化,該算法不僅自適應歷史梯度,而且也更新延遲(delays)。在實際中也被證明該方法很有效。
TensorFlow
TensorFlow [13,TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed System] 是 Google 最近開源的用于實現和部署大規模機器學習模型的框架。TensorFlow 基于他們使用 DistBelief 的經驗,并且已經在內部使用,用于在大范圍的移動設備和大規模分布式系統上執行計算。分布式執行中,一個計算圖針對每一個設備被拆分成多個子圖,使用發送/接收節點對進行通信。
Elastic Averaging SGD
Zhang 等人 [14,Deep learning with Elastic Averaging SGD] 提出了 Elastic Averaging SGD(EASGD),將異步 SGD 中每個 worker 參數用一個「彈力」(elastic force)連接起來,即一個由參數服務器保存的中心變量。這允許本地變量在中心變量附近進一步震蕩,這理論上可以在更大的參數空間中進行探索。他們以經驗證明這種增加的探索能力可以尋找新的局部最優點從而提升性能。
Additional strategies for optimizing SGD
最后,我們介紹一些可以和前面討論的算法一起使用的策略,用以進一步提升 SGD 的性能。對于一些其他常用的技巧,可以參見 [22,Efficient BackProp. Neural Networks: Tricks of the Trade] 。
Shuffling and Curriculum Learning
通常,我們想要避免給模型提供的訓練數據是有特定順序的,因為這會使模型帶有偏見。因此,每次迭代完之后打亂訓練數據是一個很好地想法。
但是另一方面,有些情況下我們想要逐步解決更難的問題,我們將訓練數據以一種有意義的順序提供給模型,這可能會提升性能和得到更好的收斂。構建這種有意義的順序的方法稱為課程學習(Curriculum Learning)[16,Curriculum learning] 。
Zaremba 和 Sutskever [17,Learning to Execute] 只能訓練 LSTMs 來評估使用課程學習的簡單程序,而且表明組合或者混合的方法要比單一方法更有效,通過增加難度來排序樣本。
Batch normalization
為方便學習,我們一般會正規化(normalize)參數的初始值,以 0 均值和單位方差來初始化。隨著訓練的進行和我們將參數更新到不同的程度,我們損失了這種正規化,導致訓練速度變慢并且隨著網絡越來越深,這種影響被漸漸放大。
Batch normalization [18,Batch Normalization : Accelerating Deep Network Training by Reducing Internal Covariate Shift] 重新為每一個 mini-batch 建立了這種正規化并且變化也會隨著這個操作反向傳播。通過在模型中加入正規化,我們可以使用更高的學習率而且不用太關心參數的初始化。Batch normalization 此外也扮演者正則化的角色,可以減少(甚至有些時候消除)Dropout 的需要.
Early stopping
根據 Geoff Hinton: “Early stopping (is) beautiful free lunch“(NIPS 2015 Tutorial slides,slide 63),你應該在訓練時時刻監視著驗證集誤差,并且在你的驗證集誤差不再足夠地降低時停止訓練。
Gradient noise
他們表明添加這個噪聲使得網絡對較差的初始化更具有魯棒性并且尤其對訓練深度和復雜的網絡很有幫助。他們懷疑添加的噪聲使得模型有更多機會逃離和找到新的局部最優點,這在深度模型中很常見。
Conclusion
本文中,我們首先看了梯度下降的 3 中變體,其中 mini-batch 梯度下降最流行。我們然后研究了幾種最常使用的用于優化 SGD 的算法:動量,Nesterov accelerated gradient,Adagrad,Adadelta,RMSprop,Adam 以及為優化異步 SGD 的不同算法。最后,我們考慮了用于提升 SGD 性能的其他策略,例如 shuffling 與 curriculum learning,batch normalization 以及 early stopping。我希望這篇文章可以給你提供一個關于不同優化算法的行為和動機的直觀理解。
References
- Sutton, R. S. (1986). Two problems with backpropagation and other steepest-descent learning procedures for networks. Proc. 8th Annual Conf. Cognitive Science Society.
- Qian, N. (1999). On the momentum term in gradient descent learning algorithms. Neural Networks : The Official Journal of the International Neural Network Society, 12(1), 145–151. http://doi.org/10.1016/S0893-6080(98)00116-6
- Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121–2159. Retrieved from http://jmlr.org/papers/v12/duchi11a.html
- Dean, J., Corrado, G. S., Monga, R., Chen, K., Devin, M., Le, Q. V, … Ng, A. Y. (2012). Large Scale Distributed Deep Networks. NIPS 2012: Neural Information Processing Systems, 1–11. http://doi.org/10.1109/ICDAR.2011.95
- Pennington, J., Socher, R., & Manning, C. D. (2014). Glove: Global Vectors for Word Representation. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing, 1532–1543. http://doi.org/10.3115/v1/D14-1162
- Zeiler, M. D. (2012). ADADELTA: An Adaptive Learning Rate Method. Retrieved from http://arxiv.org/abs/1212.5701
- Nesterov, Y. (1983). A method for unconstrained convex minimization problem with the rate of convergence o(1/k2). Doklady ANSSSR (translated as Soviet.Math.Docl.), vol. 269, pp. 543– 547.
- Bengio, Y., Boulanger-Lewandowski, N., & Pascanu, R. (2012). Advances in Optimizing Recurrent Networks. Retrieved from http://arxiv.org/abs/1212.0901
- Sutskever, I. (2013). Training Recurrent neural Networks. PhD Thesis.
- Darken, C., Chang, J., & Moody, J. (1992). Learning rate schedules for faster stochastic gradient search. Neural Networks for Signal Processing II Proceedings of the 1992 IEEE Workshop, (September), 1–11. http://doi.org/10.1109/NNSP.1992.253713
- H. Robinds and S. Monro, “A stochastic approximation method,” Annals of Mathematical Statistics, vol. 22, pp. 400–407, 1951.
- Mcmahan, H. B., & Streeter, M. (2014). Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning. Advances in Neural Information Processing Systems (Proceedings of NIPS), 1–9. Retrieved from http://papers.nips.cc/paper/5242-delay-tolerant-algorithms-for-asynchronous-distributed-online-learning.pdf
- Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., … Zheng, X. (2015). TensorFlow : Large-Scale Machine Learning on Heterogeneous Distributed Systems.
- Zhang, S., Choromanska, A., & LeCun, Y. (2015). Deep learning with Elastic Averaging SGD. Neural Information Processing Systems Conference (NIPS 2015), 1–24. Retrieved from http://arxiv.org/abs/1412.6651
- Kingma, D. P., & Ba, J. L. (2015). Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, 1–13.
- Bengio, Y., Louradour, J., Collobert, R., & Weston, J. (2009). Curriculum learning. Proceedings of the 26th Annual International Conference on Machine Learning, 41–48. http://doi.org/10.1145/1553374.1553380
- Zaremba, W., & Sutskever, I. (2014). Learning to Execute, 1–25. Retrieved from http://arxiv.org/abs/1410.4615
- Ioffe, S., & Szegedy, C. (2015). Batch Normalization : Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv Preprint arXiv:1502.03167v3.
- Dauphin, Y., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S., & Bengio, Y. (2014). Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. arXiv, 1–14. Retrieved from http://arxiv.org/abs/1406.2572
- Sutskever, I., & Martens, J. (2013). On the importance of initialization and momentum in deep learning. http://doi.org/10.1109/ICASSP.2013.6639346
- Neelakantan, A., Vilnis, L., Le, Q. V., Sutskever, I., Kaiser, L., Kurach, K., & Martens, J. (2015). Adding Gradient Noise Improves Learning for Very Deep Networks, 1–11. Retrieved from http://arxiv.org/abs/1511.06807
- LeCun, Y., Bottou, L., Orr, G. B., & Müller, K. R. (1998). Efficient BackProp. Neural Networks: Tricks of the Trade, 1524, 9–50. http://doi.org/10.1007/3-540-49430-8_2
- Niu, F., Recht, B., Christopher, R., & Wright, S. J. (2011). Hogwild! : A Lock-Free Approach to Parallelizing Stochastic Gradient Descent, 1–22.
- Dozat, T. (2016). Incorporating Nesterov Momentum into Adam. ICLR Workshop, (1), 2013–2016.
- Duchi et al. [3] give this matrix as an alternative to the full matrix containing the outer products of all previous gradients, as the computation of the matrix square root is infeasible even for a moderate number of parameters dd.
總結
以上是生活随笔為你收集整理的梯度下降优化算法概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梯度下降理解和梯度下降计算检查斯坦福
- 下一篇: torch中的copy()和clone(