導讀一圖勝千言,什么?還是動畫,那就更棒啦!本文用了大量的資源來解釋各種梯度下降法(gradient descents),想給大家直觀地介紹一下這些方法是如何工作的。
一圖勝千言,什么?還是動畫,那就更棒啦!
在一個表面上動畫演示5個梯度下降法: 梯度下降(青色) ,momentum(洋紅色) ,AdaGrad (白色) ,RMSProp (綠色) ,Adam (藍色)。左坑是全局極小值,右坑是局部極小值
在這篇文章中,我用了大量的資源來解釋各種梯度下降法(gradient descents),想直觀地介紹一下這些方法是如何工作的。通過我寫的一個梯度下降可視化工具(https://github.com/lilipads/gradient_descent_viz)的幫助,希望可以向你展示一些獨特的見解,或者至少是很多GIF :-)
我假設大家已經對梯度下降在機器學習中的使用原因和方式有基本的了解。這里的重點是比較這些方法。如果你已經熟悉了所有的方法,可以拉到底部觀看一些有趣的“賽馬”。
原版梯度下降(Vanilla Gradient Descent)
讓我們快速復習一下。在機器學習的場景下,梯度下降學習的目標通常是最小化機器學習問題的損失函數。一個好的算法能夠快速可靠地找到最小值(也就是說,它不會陷入局部極小值、鞍點或高原區域,而是尋找全局最小值)。
基本的梯度下降算法遵循的思想是,梯度的相反方向指向較低的區域。所以它在梯度的相反方向迭代。對于每個參數 theta,它做如下操作:
delta = - learning_rate * gradient
theta += delta
Theta 是一些需要優化的參數(例如,神經網絡中神經元與神經元之間連接的權重,線性回歸特征的系數,等等)。在機器學習優化設置中可能有成千上萬個這樣的 thetas 。Delta 是算法中每次迭代后 theta 的變化量; 希望隨著每次這樣的變化,theta 逐漸接近最優值。
由于人類的感知僅限于三維,在我所有的可視化中,假設我們只有兩個參數(或者 thetas)需要優化,它們由圖中的 x 和 y 維表示。曲面是損失函數。我們要找到在曲面最低點的(x,y)組合。這個問題對我們來說是顯而易見的,因為我們可以看到整個曲面。但是這個球(下降算法)不能,它一次只能走一步,探索周圍的環境,就像在黑暗中只用手電筒走路一樣。
原版梯度下降法之所以叫原版,是因為它只按照梯度來執行。下面的方法對梯度進行一些額外的處理,使其更快、更好。
動量(Momentum)
帶有動量的梯度下降算法(簡稱動量)借鑒了物理學的思想。想象一下在無摩擦的碗里滾動一個球。沒有在底部停止,而是積累的動量推動它前進,球繼續前后滾動。
我們可以把動量的概念應用到我們的原版梯度下降算法中。在每個步驟中,除了常規的梯度之外,它還增加了前一步中的移動。在數學上,它通常表示為:
delta = - learning_rate * gradient + previous_delta * decay_rate (方程1)
theta += delta (方程2)
我發現如果我稍微修改一下這個方程,然后跟蹤(衰減的)累積梯度之和,會更直觀。當我們稍后引入 Adam 算法時,這也會使事情變得更簡單。
sum_of_gradient = gradient + previous_sum_of_gradient * decay_rate (方程3)
delta = -learning_rate * sum_of_gradient (方程4)
theta += delta (方程5)
(我所做的是分解出學習率。為了看到數學等價性,可以用-learning_rate * sum_of_gradient代替方程1中的delta 以得到方程3.)
讓我們考慮兩個極端情況來更好地理解這個衰減率(decay rate)參數。如果衰減率為0,那么它與原版梯度下降完全相同。如果衰減率是1,那么它就會像我們開始提到的無摩擦碗的類比一樣,前后不斷地搖擺; 你不會想要這樣的結果。通常衰減率選擇在0.8-0.9左右,它就像一個有一點摩擦的表面,所以它最終會減慢并停止。
那么,在哪些方面動量比原版梯度下降更好呢?在上面的比較中,你可以看到兩個優點:
動量移動得更快(因為它積累的所有動量)
動量有機會逃脫局部極小值(因為動量可能推動它脫離局部極小值)。同樣,我們將在后面看到,它也將更好地通過高原區
AdaGrad
Adaptive Gradient 算法,簡稱 AdaGrad,不是像動量一樣跟蹤梯度之和,而是跟蹤梯度平方之和,并使用這種方法在不同的方向上調整梯度。這些方程通常用張量表示。我將避免使用張量來簡化這里的語言。對于每個維度:
sum_of_gradient_squared = previous_sum_of_gradient_squared + gradient2
delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta += delta
在機器學習優化中,一些特征是非常稀疏的。稀疏特征的平均梯度通常很小,所以這些特征的訓練速度要慢得多。解決這個問題的一種方法是為每個特征設置不同的學習率,但這很快就會變得混亂。
Adagrad 解決這個問題的思路是: 你已經更新的特征越多,你將來更新的就越少,這樣就有機會讓其它特征(例如稀疏特征)趕上來。用可視化的術語來說,更新這個特征的程度即在這個維度中移動了多少,這個概念由梯度平方的累積和表達。注意在上面的一步一步的網格插圖中,如果沒有重新縮放調整(1b) ,球大部分會垂直向下移動; 如果有調整(1d) ,它會沿對角線方向移動。
這個屬性讓 AdaGrad (以及其它類似的基于梯度平方的方法,如 RMSProp 和 Adam)更好地避開鞍點。Adagrad 將采取直線路徑,而梯度下降(或相關的動量)采取的方法是“讓我先滑下陡峭的斜坡,然后才可能擔心較慢的方向”。有時候,原版梯度下降可能非常滿足的僅僅停留在鞍點,那里兩個方向的梯度都是0。
RMSProp
然而,AdaGrad 的問題在于它非常慢。這是因為梯度的平方和只會增加而不會減小。Rmsprop (Root Mean Square Propagation)通過添加衰減因子來修復這個問題。
sum_of_gradient_squared = previous_sum_of_gradient_squared * decay_rate+ gradient2 * (1- decay_rate)
delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta += delta
更精確地說,梯度的平方和實際上是梯度平方的衰減和。衰減率表明的是只是最近的梯度平方有意義,而很久以前的梯度基本上會被遺忘。順便說一句,“衰減率”這個術語有點用詞不當。與我們在動量中看到的衰減率不同,除了衰減之外,這里的衰減率還有一個縮放效應: 它以一個因子(1 - 衰減率)向下縮放整個項。換句話說,如果衰減率設置為0.99,除了衰減之外,梯度的平方和將是 sqrt (1-0.99) = 0.1,因此對于相同的學習率,這一步大10倍。
為了看到衰減的效果,在這個對比中,AdaGrad (白色)最初與 RMSProp (綠色)差不多,正如調整學習率和衰減率的預期。但是 AdaGrad 的梯度平方和累計得非常快,以至于它們很快變得非常巨大(從動畫中方塊的大小可以看出)。買路費負擔沉重,最終 AdaGrad 幾乎停止了。另一方面,由于衰變率的原因,RMSProp 一直將方塊保持在一個可控的大小。這使得 RMSProp 比 AdaGrad 更快。
Adam
最后但并非最不重要的是,Adam (Adaptive Moment Estimation)同時兼顧了動量和 RMSProp 的優點。Adam在實踐中效果很好,因此在最近幾年,它是深度學習問題的常用選擇。
讓我們來看看它是如何工作的:
sum_of_gradient = previous_sum_of_gradient * beta1 + gradient * (1 - beta1) [Momentum]
sum_of_gradient_squared = previous_sum_of_gradient_squared * beta2 + gradient2 * (1- beta2) [RMSProp]
delta = -learning_rate * sum_of_gradient / sqrt(sum_of_gradient_squared)
theta += delta
Beta1是一階矩梯度之和(動量之和)的衰減率,通常設置為0.9。Beta2是二階矩梯度平方和的衰減率,通常設置為0.999。
Adam 的速度來自于動量和RMSProp 適應不同方向的梯度的能力。這兩者的結合使它變得更強大。
結束語
現在我們已經討論了所有的方法,讓我們觀看幾個比賽,包含所有我們上面提到的下降方法!(有一些不可避免的參數挑選。最好自己玩一下)
在這個地形中,有兩座小山阻擋了通往全局極小值的道路。Adam是唯一一個能夠找到通往全局極小值的算法。無論以哪種方式調整參數,至少從這個起始位置開始,沒有任何其它方法可以到達那里。這意味著不管是動量還是自適應梯度都不能單獨做到這一點。這實際上是兩者的結合: 首先,動量使Adam越過了所有其它球停止的局部極小值點; 然后對梯度平方和的調整使其側向移動,因為這是一個未被探索的方向,導致了它的最終勝利。
這是另一場比賽。在這個地形中,圍繞著全局極小值有一個平坦的區域(高原)。通過一些參數調整,Momentum 和 Adam (多得其動量組件)可以到達中心,而其它方法不能。
總之,梯度下降法算法是一類通過梯度來尋找函數最小點的算法。原版梯度下降只遵循梯度(按學習速率進行調整)。改善梯度下降法的兩個常用工具是梯度之和(一階矩)和梯度平方之和(二階矩)。動量利用一階矩的衰減率來獲得速度。Adagrad 使用沒有衰減的二階矩來處理稀疏特征。Rmsprop 使用二階矩的衰減率來加速 AdaGrad。Adam同時使用一階矩和二階矩,通常是最好的選擇。還有一些其它的梯度下降算法,比如 Nesterov 加速梯度算法,AdaDelta 算法等等,在本文中沒有涉及。
最后,展示一下帶著沒有衰減的動量下降。它的路徑構成了一個有趣的模式。沒有什么實際的用處,但是在這里展示它只是為了好玩。
-
神經網絡
+關注
關注
42文章
4771瀏覽量
100719 -
函數
+關注
關注
3文章
4327瀏覽量
62573 -
機器學習
+關注
關注
66文章
8406瀏覽量
132567
原文標題:梯度下降的可視化解釋(Adam,AdaGrad,Momentum,RMSProp)
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論