机器学习中梯度下降算法的实际应用和技巧
當(dāng)在現(xiàn)實(shí)生活中的遇到問(wèn)題時(shí),我們總是希望找到最佳的解決方案。制造軟件產(chǎn)品也是一樣的道理,最優(yōu)化的程序才是最理想的產(chǎn)品。
最優(yōu)化意味著獲得最佳輸出。它既是一個(gè)數(shù)學(xué)的重要分支,也在現(xiàn)實(shí)生活中有著重要的作用。現(xiàn)代的計(jì)算機(jī)科學(xué)和人工智能科學(xué)把最優(yōu)化作為一個(gè)重要的領(lǐng)域來(lái)研究。我們也認(rèn)為人工智能的一些算法,就是模擬了人類(lèi)尋求實(shí)際問(wèn)題最優(yōu)解的過(guò)程。例如,利用人工智能算法設(shè)計(jì)軟件,配合外部的電子設(shè)備例如攝像頭識(shí)別人臉;利用數(shù)據(jù)挖掘和神經(jīng)網(wǎng)絡(luò)算法來(lái)尋找投資的最佳時(shí)機(jī)等等,都是利用了最優(yōu)化的原理。
機(jī)器學(xué)習(xí)中的最優(yōu)化和其他學(xué)科的應(yīng)用比起來(lái)有輕微的差異。一般來(lái)說(shuō),在優(yōu)化的同時(shí),我們確切地知道數(shù)據(jù)的外觀以及我們想要改進(jìn)的地方。 但是在機(jī)器學(xué)習(xí)中,我們不知道“新數(shù)據(jù)”是怎么樣的,更別提對(duì)其進(jìn)行優(yōu)化了。為了解決這個(gè)問(wèn)題,在機(jī)器學(xué)習(xí)中,我們對(duì)訓(xùn)練數(shù)據(jù)(training data)執(zhí)行優(yōu)化,并檢查由此新創(chuàng)造出的驗(yàn)證數(shù)據(jù)(validation data)。
最優(yōu)化的廣泛應(yīng)用
- 機(jī)械學(xué):設(shè)計(jì)航空航天產(chǎn)品的表面;
- 經(jīng)濟(jì)學(xué):成本最小化;
- 物理學(xué):量子計(jì)算中的優(yōu)化時(shí)間;
- 決定最佳運(yùn)輸路線,貨架空間優(yōu)化等等。
許多流行的機(jī)器算法都依賴(lài)于線性回歸,k最近鄰,神經(jīng)網(wǎng)絡(luò)等技術(shù)。優(yōu)化的應(yīng)用是無(wú)限的,因此它成為了學(xué)術(shù)界和工業(yè)界廣泛研究的課題。在本文中,我們將介紹一種稱(chēng)為梯度下降(Gradient Descent)的優(yōu)化技術(shù)。 這是機(jī)器學(xué)習(xí)時(shí)最常用的優(yōu)化技術(shù)。
1.什么是梯度下降?
我們來(lái)看一下經(jīng)典的登山示例:假設(shè)你在山頂,你必須到達(dá)山谷最低點(diǎn)的一個(gè)湖。 但是你被蒙住眼睛,看不到你的目標(biāo)。 那么,你會(huì)采取什么方法到達(dá)湖邊?
最簡(jiǎn)單的方法是檢查你附近的地面,找到土地向下傾斜的方向。 這是你該邁出第一步的方向。 沿著下坡路線一直走,很有可能你會(huì)到達(dá)湖泊。下圖表示你走過(guò)的路:
現(xiàn)在我們來(lái)用數(shù)學(xué)術(shù)語(yǔ)來(lái)描述一下這個(gè)場(chǎng)景。
假設(shè)我們想要找出學(xué)習(xí)算法的最佳參數(shù)(θ0)和(θ1)。與上面的登山示例類(lèi)似,當(dāng)我們繪制成本空間J(θ)函數(shù)的3D圖像時(shí)發(fā)現(xiàn)了類(lèi)似的山脈和山谷。當(dāng)z軸代表成本J(θ),x軸和z軸分別對(duì)應(yīng)參數(shù)θ0和θ1時(shí),丘陵由紅色地區(qū)代表成本高,而山谷以藍(lán)色地區(qū)代表成本低。成本空間不過(guò)是算法在某個(gè)參數(shù)選擇特定值時(shí)的表現(xiàn)。
現(xiàn)在主要有兩種類(lèi)型的梯度下降算法:
1.1 數(shù)據(jù)攝入基準(zhǔn)法
全批梯度下降算法一次使用所有數(shù)據(jù)來(lái)計(jì)算梯度,而隨機(jī)梯度下降算法可以在計(jì)算梯度時(shí)進(jìn)行采樣。
1.2 分化技巧基準(zhǔn)法
梯度下降需要通過(guò)成本函數(shù)J(θ)的微分方程來(lái)計(jì)算梯度。我們可以使用一階微分或二階微分。
2.執(zhí)行梯度下降法所面臨的挑戰(zhàn)
梯度下降是一種適用于大多數(shù)情況的技術(shù)。但也有時(shí)候梯度下降也不能正常工作,或完全不能工作。發(fā)生這種情況時(shí)有三個(gè)主要原因:
2.1 來(lái)自數(shù)據(jù)的挑戰(zhàn)
- 如果數(shù)據(jù)的排列方式會(huì)造成非凸優(yōu)化問(wèn)題(non-convex optimization problem),使用梯度下降來(lái)執(zhí)行優(yōu)化會(huì)非常困難。
- 即使在優(yōu)化凸優(yōu)化問(wèn)題時(shí),也可能存在許多最小值。最低點(diǎn)稱(chēng)為全局最小值(Global Minima),其余點(diǎn)稱(chēng)為局部最小值(Local Minima)。我們的目標(biāo)是在避免局部最小值的同時(shí)到達(dá)全局最小值。
- 還有鞍點(diǎn)(Saddle Point)問(wèn)題。這是數(shù)據(jù)中梯度為零但不是最優(yōu)點(diǎn)的點(diǎn)。目前并沒(méi)有具體的方法來(lái)避免這一點(diǎn),這仍然是一個(gè)非常活躍的研究領(lǐng)域。
2.2 來(lái)自梯度的挑戰(zhàn)
- 如果梯度下降執(zhí)行的不正確,則可能導(dǎo)致像梯度消失(vanishing gradient)或梯度爆炸(exploding gradient)之類(lèi)的問(wèn)題。這些問(wèn)題會(huì)在梯度過(guò)小或過(guò)大時(shí)發(fā)生,導(dǎo)致算法不會(huì)收斂(Converge)。
2.3 來(lái)自實(shí)際應(yīng)用難度的挑戰(zhàn)
- 大多數(shù)神經(jīng)網(wǎng)絡(luò)從業(yè)人員不大關(guān)注實(shí)際應(yīng)用。但是網(wǎng)絡(luò)的資源利用率之類(lèi)的事情也是非常重要的。在實(shí)施梯度下降時(shí),具體需要多少資源是非常重要的。如果內(nèi)存對(duì)于應(yīng)用程序來(lái)說(shuō)太小就一定會(huì)失敗。
- 此外,梯度下降算法對(duì)于浮點(diǎn)和硬件/軟件的要求也很高。
3.梯度下降算法的變體
最常用的梯度下降算法及其實(shí)施。
3.1 Vanilla(香草)梯度下降法
這是梯度下降技術(shù)的最簡(jiǎn)單形式。香草意味著純粹/沒(méi)有任何摻假。其主要特點(diǎn)是通過(guò)采用成本函數(shù)的梯度向最小值方向不斷邁出小步。它的偽代碼如下:
update = learning_rate * gradient_of_parameters parameters = parameters - update復(fù)制代碼我們通過(guò)獲取舊參數(shù)的梯度來(lái)不斷更新參數(shù)。把它乘以一個(gè)學(xué)習(xí)速率(learning_rate,一個(gè)常數(shù)),表明我們想要達(dá)到最低點(diǎn)的速度。學(xué)習(xí)速率是一個(gè)超參數(shù)(hyper-parameter),在選擇它的大小時(shí)應(yīng)該十分小心謹(jǐn)慎。
3.2動(dòng)量梯度下降(Gradient Descent with Momentum)
通過(guò)調(diào)整Vanilla算法,可以在每次進(jìn)行下一步之前注意前一步驟。
update = learning_rate * gradient velocity = previous_update * momentum parameter = parameter + velocity – update 復(fù)制代碼在這里,update與香草梯度下降法相同。 但是引入了一個(gè)名為velocity的新術(shù)語(yǔ),它考慮了之前的update和一個(gè)稱(chēng)為momentum的常量。
3.3 Adagrad
Adagrad使用自適應(yīng)技術(shù)進(jìn)行學(xué)習(xí)速率的更新。 這個(gè)算法根據(jù)以前所有迭代的梯度變化情況來(lái)改變學(xué)習(xí)速率。偽代碼如下:
grad_component = previous_grad_component + (gradient * gradient) rate_change = square_root(grad_component)+epsilon adapted_learning_rate = learning_rate * rate_change update = adapted_learning_rate * gradient parameter = parameter – update 復(fù)制代碼其中,epsilon是一個(gè)常量,用于保持學(xué)習(xí)速率的變化率。
3.4 Adam
Adam是一種基于Adagrad的自適應(yīng)技術(shù),進(jìn)一步緩解了它的不足。 換句話說(shuō),它就是 Momentum + Adagrad。偽代碼如下:
adapted_gradient = previous_gradient + ((gradient – previous_gradient) * (1 – beta1)) gradient_component = (gradient_change – previous_learning_rate) adapted_learning_rate = previous_learning_rate + (gradient_component * (1 – beta2)) update = adapted_learning_rate * adapted_gradient parameter = parameter – update 復(fù)制代碼其中,beta1和beta2是常量,用于檢查梯度和學(xué)習(xí)速率的變化。
4.梯度下降算法的實(shí)際應(yīng)用
使用python進(jìn)行梯度下降的基本應(yīng)用。
接下來(lái)我們使用梯度下降優(yōu)化來(lái)找到深度學(xué)習(xí)模型的最佳參數(shù),并將其用于圖像識(shí)別問(wèn)題。 我們的問(wèn)題是:識(shí)別來(lái)自給定的28×28圖像里的數(shù)字。準(zhǔn)備的圖片中,有一部分圖像用于訓(xùn)練,其余部分用于測(cè)試模型。
如下是定義Vanilla梯度下降的主要代碼:
params = [weights_hidden, weights_output, bias_hidden, bias_output] def sgd(cost, params, lr=0.05):grads = T.grad(cost=cost, wrt=params)updates = []for p, g in zip(params, grads):updates.append([p, p - g * lr])return updates updates = sgd(cost, params) 復(fù)制代碼我們來(lái)拆分理解一下這段代碼。定義函數(shù)sgd作為cost,params和lr的因變量,它和如前所述的J(θ)同出一轍;而之前的θ0,θ1在這里是深度學(xué)習(xí)算法的參數(shù)和學(xué)習(xí)速率。 我們將默認(rèn)學(xué)習(xí)速率設(shè)置為0.05,但該值可隨時(shí)被更改。
然后我們定義了關(guān)于成本函數(shù)J(θ)的參數(shù)的梯度。 在這里,我們使用theano庫(kù)來(lái)找到相應(yīng)梯度,并且我們將theano作為T(mén)導(dǎo)入
grads = T.grad(cost=cost, wrt=params) 復(fù)制代碼最后把所有可能的參數(shù)更新,這里應(yīng)使用Vanilla梯度下降。
我們可以使用這個(gè)函數(shù)來(lái)為神經(jīng)網(wǎng)絡(luò)找到最佳參數(shù)。 在使用這個(gè)函數(shù)時(shí),該神經(jīng)網(wǎng)絡(luò)出色地完成了任務(wù),如下所示:
在這個(gè)應(yīng)用中,梯度下降法為深度學(xué)習(xí)算法找到了最優(yōu)參數(shù)。
5.應(yīng)用梯度下降的實(shí)用技巧
上面提到的每個(gè)梯度下降算法都有其優(yōu)點(diǎn)和缺點(diǎn)。下面的一些小提示可能會(huì)幫助您選擇正確的算法。
- 為了快速建立原型,請(qǐng)使用Adam / Adagrad等自適應(yīng)技術(shù)。他們很短時(shí)高效,并且不需要太多的超參數(shù)調(diào)整。
- 要獲得最佳效果,您應(yīng)該使用Vanilla梯度下降法或Momentum。雖然計(jì)算速度超級(jí)慢,但是這些結(jié)果大多比自適應(yīng)技術(shù)得來(lái)的結(jié)果更準(zhǔn)確。
- 如果數(shù)據(jù)很小并且適合一次迭代,則可以使用二階技術(shù),如l-BFGS。因?yàn)槎A技術(shù)對(duì)于足夠小的數(shù)據(jù)的處理非常快速和準(zhǔn)確。
神經(jīng)網(wǎng)絡(luò)無(wú)法成功學(xué)習(xí)的原因有很多。但是如果可以找到算法出錯(cuò)的地方,對(duì)未來(lái)的工作還是非常有幫助的。
在應(yīng)用梯度下降法時(shí),有以下幾點(diǎn)常見(jiàn)注意事項(xiàng):
- 錯(cuò)誤率 - 應(yīng)該在特定迭代后檢查訓(xùn)練錯(cuò)誤率、測(cè)試錯(cuò)誤率,并確保它們都成減小趨勢(shì)。如果錯(cuò)誤率并未減小,算法很有可能出了問(wèn)題。
- 隱藏層中的梯度流 - 檢查是否有梯度消失或梯度爆炸的問(wèn)題。
- 學(xué)習(xí)速率 - 使用自適應(yīng)技術(shù)時(shí)應(yīng)該檢查。
希望您閱讀本文后,將熟練掌握有關(guān)梯度下降及其變體的基礎(chǔ)知識(shí)。希望你覺(jué)得我對(duì)這些算法的實(shí)際應(yīng)用的解讀也有所幫助!
轉(zhuǎn)載于:https://juejin.im/post/5c94d60b5188252db02e4ce2
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的机器学习中梯度下降算法的实际应用和技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA集合框架中的常用集合及其特点、适
- 下一篇: postman模拟登录接口