導(dǎo)讀一圖勝千言,什么?還是動(dòng)畫,那就更棒啦!本文用了大量的資源來(lái)解釋各種梯度下降法(gradient descents),想給大家直觀地介紹一下這些方法是如何工作的。
一圖勝千言,什么?還是動(dòng)畫,那就更棒啦!
在一個(gè)表面上動(dòng)畫演示5個(gè)梯度下降法: 梯度下降(青色) ,momentum(洋紅色) ,AdaGrad (白色) ,RMSProp (綠色) ,Adam (藍(lán)色)。左坑是全局極小值,右坑是局部極小值
在這篇文章中,我用了大量的資源來(lái)解釋各種梯度下降法(gradient descents),想直觀地介紹一下這些方法是如何工作的。通過(guò)我寫的一個(gè)梯度下降可視化工具(https://github.com/lilipads/gradient_descent_viz)的幫助,希望可以向你展示一些獨(dú)特的見(jiàn)解,或者至少是很多GIF :-)
我假設(shè)大家已經(jīng)對(duì)梯度下降在機(jī)器學(xué)習(xí)中的使用原因和方式有基本的了解。這里的重點(diǎn)是比較這些方法。如果你已經(jīng)熟悉了所有的方法,可以拉到底部觀看一些有趣的“賽馬”。
原版梯度下降(Vanilla Gradient Descent)
讓我們快速?gòu)?fù)習(xí)一下。在機(jī)器學(xué)習(xí)的場(chǎng)景下,梯度下降學(xué)習(xí)的目標(biāo)通常是最小化機(jī)器學(xué)習(xí)問(wèn)題的損失函數(shù)。一個(gè)好的算法能夠快速可靠地找到最小值(也就是說(shuō),它不會(huì)陷入局部極小值、鞍點(diǎn)或高原區(qū)域,而是尋找全局最小值)。
基本的梯度下降算法遵循的思想是,梯度的相反方向指向較低的區(qū)域。所以它在梯度的相反方向迭代。對(duì)于每個(gè)參數(shù) theta,它做如下操作:
delta = - learning_rate * gradient
theta += delta
Theta 是一些需要優(yōu)化的參數(shù)(例如,神經(jīng)網(wǎng)絡(luò)中神經(jīng)元與神經(jīng)元之間連接的權(quán)重,線性回歸特征的系數(shù),等等)。在機(jī)器學(xué)習(xí)優(yōu)化設(shè)置中可能有成千上萬(wàn)個(gè)這樣的 thetas 。Delta 是算法中每次迭代后 theta 的變化量; 希望隨著每次這樣的變化,theta 逐漸接近最優(yōu)值。
由于人類的感知僅限于三維,在我所有的可視化中,假設(shè)我們只有兩個(gè)參數(shù)(或者 thetas)需要優(yōu)化,它們由圖中的 x 和 y 維表示。曲面是損失函數(shù)。我們要找到在曲面最低點(diǎn)的(x,y)組合。這個(gè)問(wèn)題對(duì)我們來(lái)說(shuō)是顯而易見(jiàn)的,因?yàn)槲覀兛梢钥吹秸麄€(gè)曲面。但是這個(gè)球(下降算法)不能,它一次只能走一步,探索周圍的環(huán)境,就像在黑暗中只用手電筒走路一樣。
原版梯度下降法之所以叫原版,是因?yàn)樗话凑仗荻葋?lái)執(zhí)行。下面的方法對(duì)梯度進(jìn)行一些額外的處理,使其更快、更好。
動(dòng)量(Momentum)
帶有動(dòng)量的梯度下降算法(簡(jiǎn)稱動(dòng)量)借鑒了物理學(xué)的思想。想象一下在無(wú)摩擦的碗里滾動(dòng)一個(gè)球。沒(méi)有在底部停止,而是積累的動(dòng)量推動(dòng)它前進(jìn),球繼續(xù)前后滾動(dòng)。
我們可以把動(dòng)量的概念應(yīng)用到我們的原版梯度下降算法中。在每個(gè)步驟中,除了常規(guī)的梯度之外,它還增加了前一步中的移動(dòng)。在數(shù)學(xué)上,它通常表示為:
delta = - learning_rate * gradient + previous_delta * decay_rate (方程1)
theta += delta (方程2)
我發(fā)現(xiàn)如果我稍微修改一下這個(gè)方程,然后跟蹤(衰減的)累積梯度之和,會(huì)更直觀。當(dāng)我們稍后引入 Adam 算法時(shí),這也會(huì)使事情變得更簡(jiǎn)單。
sum_of_gradient = gradient + previous_sum_of_gradient * decay_rate (方程3)
delta = -learning_rate * sum_of_gradient (方程4)
theta += delta (方程5)
(我所做的是分解出學(xué)習(xí)率。為了看到數(shù)學(xué)等價(jià)性,可以用-learning_rate * sum_of_gradient代替方程1中的delta 以得到方程3.)
讓我們考慮兩個(gè)極端情況來(lái)更好地理解這個(gè)衰減率(decay rate)參數(shù)。如果衰減率為0,那么它與原版梯度下降完全相同。如果衰減率是1,那么它就會(huì)像我們開(kāi)始提到的無(wú)摩擦碗的類比一樣,前后不斷地?fù)u擺; 你不會(huì)想要這樣的結(jié)果。通常衰減率選擇在0.8-0.9左右,它就像一個(gè)有一點(diǎn)摩擦的表面,所以它最終會(huì)減慢并停止。
那么,在哪些方面動(dòng)量比原版梯度下降更好呢?在上面的比較中,你可以看到兩個(gè)優(yōu)點(diǎn):
動(dòng)量移動(dòng)得更快(因?yàn)樗e累的所有動(dòng)量)
動(dòng)量有機(jī)會(huì)逃脫局部極小值(因?yàn)閯?dòng)量可能推動(dòng)它脫離局部極小值)。同樣,我們將在后面看到,它也將更好地通過(guò)高原區(qū)
AdaGrad
Adaptive Gradient 算法,簡(jiǎn)稱 AdaGrad,不是像動(dòng)量一樣跟蹤梯度之和,而是跟蹤梯度平方之和,并使用這種方法在不同的方向上調(diào)整梯度。這些方程通常用張量表示。我將避免使用張量來(lái)簡(jiǎn)化這里的語(yǔ)言。對(duì)于每個(gè)維度:
sum_of_gradient_squared = previous_sum_of_gradient_squared + gradient2
delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta += delta
在機(jī)器學(xué)習(xí)優(yōu)化中,一些特征是非常稀疏的。稀疏特征的平均梯度通常很小,所以這些特征的訓(xùn)練速度要慢得多。解決這個(gè)問(wèn)題的一種方法是為每個(gè)特征設(shè)置不同的學(xué)習(xí)率,但這很快就會(huì)變得混亂。
Adagrad 解決這個(gè)問(wèn)題的思路是: 你已經(jīng)更新的特征越多,你將來(lái)更新的就越少,這樣就有機(jī)會(huì)讓其它特征(例如稀疏特征)趕上來(lái)。用可視化的術(shù)語(yǔ)來(lái)說(shuō),更新這個(gè)特征的程度即在這個(gè)維度中移動(dòng)了多少,這個(gè)概念由梯度平方的累積和表達(dá)。注意在上面的一步一步的網(wǎng)格插圖中,如果沒(méi)有重新縮放調(diào)整(1b) ,球大部分會(huì)垂直向下移動(dòng); 如果有調(diào)整(1d) ,它會(huì)沿對(duì)角線方向移動(dòng)。
這個(gè)屬性讓 AdaGrad (以及其它類似的基于梯度平方的方法,如 RMSProp 和 Adam)更好地避開(kāi)鞍點(diǎn)。Adagrad 將采取直線路徑,而梯度下降(或相關(guān)的動(dòng)量)采取的方法是“讓我先滑下陡峭的斜坡,然后才可能擔(dān)心較慢的方向”。有時(shí)候,原版梯度下降可能非常滿足的僅僅停留在鞍點(diǎn),那里兩個(gè)方向的梯度都是0。
RMSProp
然而,AdaGrad 的問(wèn)題在于它非常慢。這是因?yàn)樘荻鹊钠椒胶椭粫?huì)增加而不會(huì)減小。Rmsprop (Root Mean Square Propagation)通過(guò)添加衰減因子來(lái)修復(fù)這個(gè)問(wèn)題。
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
更精確地說(shuō),梯度的平方和實(shí)際上是梯度平方的衰減和。衰減率表明的是只是最近的梯度平方有意義,而很久以前的梯度基本上會(huì)被遺忘。順便說(shuō)一句,“衰減率”這個(gè)術(shù)語(yǔ)有點(diǎn)用詞不當(dāng)。與我們?cè)趧?dòng)量中看到的衰減率不同,除了衰減之外,這里的衰減率還有一個(gè)縮放效應(yīng): 它以一個(gè)因子(1 - 衰減率)向下縮放整個(gè)項(xiàng)。換句話說(shuō),如果衰減率設(shè)置為0.99,除了衰減之外,梯度的平方和將是 sqrt (1-0.99) = 0.1,因此對(duì)于相同的學(xué)習(xí)率,這一步大10倍。
為了看到衰減的效果,在這個(gè)對(duì)比中,AdaGrad (白色)最初與 RMSProp (綠色)差不多,正如調(diào)整學(xué)習(xí)率和衰減率的預(yù)期。但是 AdaGrad 的梯度平方和累計(jì)得非???,以至于它們很快變得非常巨大(從動(dòng)畫中方塊的大小可以看出)。買路費(fèi)負(fù)擔(dān)沉重,最終 AdaGrad 幾乎停止了。另一方面,由于衰變率的原因,RMSProp 一直將方塊保持在一個(gè)可控的大小。這使得 RMSProp 比 AdaGrad 更快。
Adam
最后但并非最不重要的是,Adam (Adaptive Moment Estimation)同時(shí)兼顧了動(dòng)量和 RMSProp 的優(yōu)點(diǎn)。Adam在實(shí)踐中效果很好,因此在最近幾年,它是深度學(xué)習(xí)問(wèn)題的常用選擇。
讓我們來(lái)看看它是如何工作的:
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是一階矩梯度之和(動(dòng)量之和)的衰減率,通常設(shè)置為0.9。Beta2是二階矩梯度平方和的衰減率,通常設(shè)置為0.999。
Adam 的速度來(lái)自于動(dòng)量和RMSProp 適應(yīng)不同方向的梯度的能力。這兩者的結(jié)合使它變得更強(qiáng)大。
結(jié)束語(yǔ)
現(xiàn)在我們已經(jīng)討論了所有的方法,讓我們觀看幾個(gè)比賽,包含所有我們上面提到的下降方法!(有一些不可避免的參數(shù)挑選。最好自己玩一下)
在這個(gè)地形中,有兩座小山阻擋了通往全局極小值的道路。Adam是唯一一個(gè)能夠找到通往全局極小值的算法。無(wú)論以哪種方式調(diào)整參數(shù),至少?gòu)倪@個(gè)起始位置開(kāi)始,沒(méi)有任何其它方法可以到達(dá)那里。這意味著不管是動(dòng)量還是自適應(yīng)梯度都不能單獨(dú)做到這一點(diǎn)。這實(shí)際上是兩者的結(jié)合: 首先,動(dòng)量使Adam越過(guò)了所有其它球停止的局部極小值點(diǎn); 然后對(duì)梯度平方和的調(diào)整使其側(cè)向移動(dòng),因?yàn)檫@是一個(gè)未被探索的方向,導(dǎo)致了它的最終勝利。
這是另一場(chǎng)比賽。在這個(gè)地形中,圍繞著全局極小值有一個(gè)平坦的區(qū)域(高原)。通過(guò)一些參數(shù)調(diào)整,Momentum 和 Adam (多得其動(dòng)量組件)可以到達(dá)中心,而其它方法不能。
總之,梯度下降法算法是一類通過(guò)梯度來(lái)尋找函數(shù)最小點(diǎn)的算法。原版梯度下降只遵循梯度(按學(xué)習(xí)速率進(jìn)行調(diào)整)。改善梯度下降法的兩個(gè)常用工具是梯度之和(一階矩)和梯度平方之和(二階矩)。動(dòng)量利用一階矩的衰減率來(lái)獲得速度。Adagrad 使用沒(méi)有衰減的二階矩來(lái)處理稀疏特征。Rmsprop 使用二階矩的衰減率來(lái)加速 AdaGrad。Adam同時(shí)使用一階矩和二階矩,通常是最好的選擇。還有一些其它的梯度下降算法,比如 Nesterov 加速梯度算法,AdaDelta 算法等等,在本文中沒(méi)有涉及。
最后,展示一下帶著沒(méi)有衰減的動(dòng)量下降。它的路徑構(gòu)成了一個(gè)有趣的模式。沒(méi)有什么實(shí)際的用處,但是在這里展示它只是為了好玩。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4781瀏覽量
101215 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62999 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8442瀏覽量
133110
原文標(biāo)題:梯度下降的可視化解釋(Adam,AdaGrad,Momentum,RMSProp)
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
機(jī)器學(xué)習(xí)新手必學(xué)的三種優(yōu)化算法(牛頓法、梯度下降法、最速下降法)
接地電阻測(cè)試儀怎么使用電位下降法
用基于計(jì)算機(jī)隨機(jī)模擬的下降法求解報(bào)童問(wèn)題
基于梯度下降法和互補(bǔ)濾波的航向姿態(tài)參考系統(tǒng)
![基于<b class='flag-5'>梯度</b><b class='flag-5'>下降法</b>和互補(bǔ)濾波的航向姿態(tài)參考系統(tǒng)](https://file.elecfans.com/web2/M00/49/59/poYBAGKhwKSACcWoAAASrhDqzXk110.jpg)
一種結(jié)合梯度下降法的二層搜索粒子群算法
![一種結(jié)合<b class='flag-5'>梯度</b><b class='flag-5'>下降法</b>的二層搜索粒子群算法](https://file.elecfans.com/web2/M00/49/69/poYBAGKhwK-AfCDjAAAWwY-9JWk366.jpg)
機(jī)器學(xué)習(xí):隨機(jī)梯度下降和批量梯度下降算法介紹
![機(jī)器學(xué)習(xí):隨機(jī)<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>和批量<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>算法介紹](https://file1.elecfans.com//web2/M00/A6/F8/wKgZomUMQYuAHpK5AAFKoyUxcrg756.png)
一文看懂常用的梯度下降算法
機(jī)器學(xué)習(xí)中梯度下降法的過(guò)程
梯度下降算法及其變種:批量梯度下降,小批量梯度下降和隨機(jī)梯度下降
機(jī)器學(xué)習(xí)優(yōu)化算法中梯度下降,牛頓法和擬牛頓法的優(yōu)缺點(diǎn)詳細(xì)介紹
簡(jiǎn)單的梯度下降算法,你真的懂了嗎?
PyTorch教程12.4之隨機(jī)梯度下降
![PyTorch教程12.4之隨機(jī)<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論