參考文章及視頻
耿直哥講AI:https://www.bilibili.com/video/BV18P4y1j7uH/?spm_id_from=333.337.search-card.all.click&vd_source=f6c19848d8193916be907d5b2e35bce8
計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 北京郵電大學(xué) 魯鵬 清晰版合集(完整版):https://www.bilibili.com/video/BV1V54y1B7K3?p=5&vd_source=f6c19848d8193916be907d5b2e35bce8
導(dǎo)言
梯度下降的原理、過(guò)程
一、什么是梯度下降?
梯度下降(Gradient Descent)是一種常用的優(yōu)化算法,主要用于尋找函數(shù)的局部最小值。在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中,我們通常使用梯度下降來(lái)優(yōu)化損失函數(shù),從而找到使損失最小的模型參數(shù)。
梯度在數(shù)學(xué)上可以看作是函數(shù)在某一點(diǎn)的斜率,或者說(shuō)是函數(shù)在該點(diǎn)變化最快的方向。在多維空間中,梯度是一個(gè)向量,指向函數(shù)增長(zhǎng)最快的方向。而"梯度下降"的思想就是,如果我們想找到函數(shù)的最小值,那么從當(dāng)前位置沿著梯度的負(fù)方向,即函數(shù)下降最快的方向,進(jìn)行迭代更新就可能找到這個(gè)最小值。
通俗的來(lái)講就是:
- 想象一下你置身于一個(gè)大山谷中,你的目標(biāo)是找到山谷最低處的位置。但是你沒(méi)有地圖,也不能一下子看到整個(gè)山谷的形狀。所以你只能根據(jù)自己當(dāng)前所處位置的周?chē)闆r來(lái)判斷往哪個(gè)方向走。
- 梯度下降法就像是你通過(guò)觀察地勢(shì)斜率來(lái)下山。你站在某個(gè)位置上,然后觀察周?chē)牡貏?shì)斜率。地勢(shì)斜率的方向指示了最陡下坡的方向,而你的目標(biāo)是下到山谷的最低點(diǎn)。
- 開(kāi)始時(shí),你隨機(jī)選擇一個(gè)位置作為起點(diǎn)。然后你觀察當(dāng)前位置的地勢(shì)斜率,并朝著斜率最陡的方向邁出一步。然后,你再次觀察新位置的地勢(shì)斜率,并再次朝著最陡的方向邁出一步。你不斷重復(fù)這個(gè)過(guò)程,每次都往下坡最陡的方向前進(jìn),直到你無(wú)法再下降或者到達(dá)了山谷的最低點(diǎn)。
- 通過(guò)這種迭代的方式,你能夠一步步地接近山谷的最低點(diǎn),也就是最優(yōu)解。梯度下降法通過(guò)不斷地調(diào)整位置,最終找到了函數(shù)的最小值點(diǎn)(或者最大值點(diǎn))。
如圖所示:
陡峭度=梯度
需要注意的是,梯度下降法中的步長(zhǎng)(學(xué)習(xí)率)很重要。
如果步長(zhǎng)太大,你可能會(huì)錯(cuò)過(guò)最低點(diǎn);
如果步長(zhǎng)太小,你會(huì)花費(fèi)很長(zhǎng)的時(shí)間才能到達(dá)最低點(diǎn)。
所以選擇一個(gè)合適的步長(zhǎng)是梯度下降法的一個(gè)關(guān)鍵因素。
二、梯度下降的運(yùn)行過(guò)程
梯度下降的過(guò)程很直觀,可以分為以下幾個(gè)步驟:
- 初始化參數(shù):給定一個(gè)初始點(diǎn)。
- 計(jì)算梯度:在當(dāng)前點(diǎn),計(jì)算函數(shù)的梯度,即各個(gè)參數(shù)的偏導(dǎo)數(shù)。
- 更新參數(shù):按照以下公式更新參數(shù):θ = θ - α * ?f(θ)。其中,θ代表當(dāng)前的參數(shù),α是學(xué)習(xí)率(決定了步長(zhǎng)的大?。?f(θ)是函數(shù)在θ處的梯度。
- 迭代更新:重復(fù)步驟2和步驟3,直到梯度接近0,或者達(dá)到預(yù)設(shè)的迭代次數(shù)。
這個(gè)過(guò)程會(huì)持續(xù)進(jìn)行,直到找到一個(gè)足夠好的解,或者達(dá)到預(yù)設(shè)的迭代次
批量梯度下降法(BGD)
批量梯度下降(Batch Gradient Descent)是梯度下降算法的一種變體,用于優(yōu)化機(jī)器學(xué)習(xí)模型的參數(shù)。與其他梯度下降算法相比,批量梯度下降在每次迭代中使用整個(gè)訓(xùn)練數(shù)據(jù)集來(lái)計(jì)算梯度和更新參數(shù)。
批量梯度下降通常用于小型數(shù)據(jù)集或參數(shù)空間較小的模型。
- 它的優(yōu)點(diǎn)是能夠更準(zhǔn)確地收斂到全局最優(yōu)解(如果存在),并且在參數(shù)更新方向上相對(duì)穩(wěn)定。
- 然而,由于每次迭代時(shí)都要使用整個(gè)數(shù)據(jù)集,因此它的計(jì)算成本較高。尤其是在大規(guī)模數(shù)據(jù)集上。
隨機(jī)梯度下降法(SGD)
隨機(jī)梯度下降(Stochastic Gradient Descent,SGD)是一種梯度下降算法的變體,用于優(yōu)化機(jī)器學(xué)習(xí)模型的參數(shù)。與批量梯度下降不同,隨機(jī)梯度下降在每次迭代中僅使用一個(gè)樣本來(lái)計(jì)算梯度和更新參數(shù)。
隨機(jī)梯度下降是一種每次迭代僅使用一個(gè)樣本來(lái)計(jì)算梯度并更新參數(shù)的梯度下降算法。
- 它的優(yōu)點(diǎn)是計(jì)算代價(jià)較低,適用于大規(guī)模數(shù)據(jù)集,這一特性有助于算法逃離局部最小值,并具有一定的探索性。
- 然而,由于梯度估計(jì)存在噪音,參數(shù)更新可能不穩(wěn)定。
小批量梯度下降法(MBGD)
小批量梯度下降(Mini-Batch Gradient Descent)是梯度下降算法的一種變體,介于批量梯度下降(Batch Gradient Descent)和隨機(jī)梯度下降(Stochastic Gradient Descent)之間。
它在每次迭代中使用一小批次(mini-batch)的樣本來(lái)計(jì)算梯度和更新參數(shù)。
梯度算法的改進(jìn)
梯度下降算法存在的問(wèn)題
損失函數(shù)特性:一個(gè)方向上變化迅速而在另一個(gè)方向上變化緩慢。
優(yōu)化目標(biāo):從起點(diǎn)處走到底端笑臉處。
梯度下降算法存在的問(wèn)題:山壁間振蕩,往谷底方向的行進(jìn)較慢。
僅增大步長(zhǎng)并不能加快算法收斂速度:相當(dāng)于在振蕩方向加了一個(gè)更大的速度,往山谷方向也加了,但是很小。
動(dòng)量法(Momentum)
動(dòng)量法梯度(Momentum Gradient Descent)下降通過(guò)引入動(dòng)量變量,可以在更新過(guò)程中積累之前的梯度信息,并根據(jù)歷史梯度的趨勢(shì)來(lái)調(diào)整參數(shù)更新的方向和幅度。這樣可以使參數(shù)更新在梯度方向上更加穩(wěn)定,并且可以加速學(xué)習(xí)過(guò)程,尤其在目標(biāo)函數(shù)存在大體量或彎曲的情況下。
目標(biāo)
改進(jìn)梯度下降算法存在的問(wèn)題,即減少震蕩,加速通往谷底
改進(jìn)思想
利用累加歷史梯度信息更新梯度
μ取值范圍[0,1)
- 當(dāng)動(dòng)量系數(shù)μ等于0時(shí),動(dòng)量法梯度下降變?yōu)槠胀ǖ奶荻认陆邓惴āT谶@種情況下,動(dòng)量變量v的更新公式簡(jiǎn)化為:
v = 0 * v + g = g
也就是說(shuō),動(dòng)量變量v只受當(dāng)前梯度的影響,而不考慮歷史梯度信息。參數(shù)更新時(shí),只使用當(dāng)前梯度乘以學(xué)習(xí)率進(jìn)行更新。這樣的更新方式使得參數(shù)更新的方向和幅度完全依賴于當(dāng)前的梯度值。 - 當(dāng)動(dòng)量系數(shù)μ等于1時(shí),動(dòng)量法梯度下降完全依賴于歷史梯度信息。動(dòng)量變量v的更新公式為:
v = 1 * v + g = v + g
動(dòng)量變量v實(shí)際上就是歷史梯度的累積,因?yàn)闅v史梯度乘以1之后仍然是歷史梯度本身。在參數(shù)更新時(shí),只使用動(dòng)量變量v進(jìn)行更新,而不再考慮當(dāng)前梯度的貢獻(xiàn)。 即使g走到平坦局域了為0 了,可是v不為0,則權(quán)值θ還在持續(xù)更新。
建議取0.9,可以將其理解為摩擦系數(shù) v = 0.9v 多次迭代后,v會(huì)接近于0
為什么有效
累加過(guò)程中震蕩方向相互抵消,平坦方向得到加強(qiáng)
動(dòng)量法還有什么效果?
它在參數(shù)更新中引入了動(dòng)量概念,以加速學(xué)習(xí)過(guò)程并幫助跳出局部最優(yōu)解和鞍點(diǎn)。
自適應(yīng)梯度(AdaGrad)
AdaGrad(Adaptive Gradient Algorithm)是一種自適應(yīng)梯度算法,用于在機(jī)器學(xué)習(xí)中優(yōu)化模型的參數(shù)。它根據(jù)參數(shù)的梯度歷史信息自適應(yīng)地調(diào)整學(xué)習(xí)率,使得在訓(xùn)練過(guò)程中較大的梯度得到較小的學(xué)習(xí)率,而較小的梯度得到較大的學(xué)習(xí)率。
AdaGrad算法的核心思想是為每個(gè)參數(shù)維護(hù)一個(gè)梯度的累積平方和,并在參數(shù)更新時(shí)將學(xué)習(xí)率除以這個(gè)累積平方和的平方根。
如何區(qū)分震蕩方式與平坦方向?
梯度幅度的平方較大的方向是震蕩方向;
梯度幅度的平方較小的方向是平坦方向。
震蕩方向和平坦方向的梯度的平方和不斷累加
因?yàn)檎鹗幏较虻奶荻却螅虼死奂悠椒教荻萺不斷變大,所以ε1不斷減小
因?yàn)槠教狗较虻奶荻刃?,因此累加平方梯度r不斷變肖,所以ε2不斷增大
AdaGrad存在的問(wèn)題
由于累加平方梯度r在不斷的變大,在多次迭代后,r會(huì)變得非常大,則ε1和ε2都會(huì)變成一個(gè)非常小的值。失去調(diào)節(jié)作用。
AdaGrad算法具有以下特點(diǎn):
-
自適應(yīng)學(xué)習(xí)率:AdaGrad算法根據(jù)參數(shù)的梯度歷史信息自適應(yīng)地調(diào)整學(xué)習(xí)率。當(dāng)某個(gè)參數(shù)的梯度較大時(shí),其累積平方和較大,學(xué)習(xí)率較?。划?dāng)梯度較小時(shí),累積平方和較小,學(xué)習(xí)率較大。這樣可以保證在訓(xùn)練早期參數(shù)更新幅度較大,而在訓(xùn)練后期逐漸減小。
-
處理稀疏梯度:AdaGrad算法在處理稀疏數(shù)據(jù)集時(shí)表現(xiàn)良好。由于累積平方和的累加,較少出現(xiàn)的參數(shù)梯度將獲得更大的學(xué)習(xí)率,從而更快地進(jìn)行參數(shù)更新。
-
累積平方和的增長(zhǎng):AdaGrad算法累積了梯度的平方和,隨著訓(xùn)練的進(jìn)行,累積平方和會(huì)逐漸增大。這可能導(dǎo)致學(xué)習(xí)率過(guò)度下降,使得訓(xùn)練過(guò)程變得緩慢。為了解決這個(gè)問(wèn)題,后續(xù)的優(yōu)化算法如RMSprop和Adam引入了衰減系數(shù),對(duì)累積平方和進(jìn)行平滑衰減。
RMSProp
RMSprop(Root Mean Square Propagation)是一種自適應(yīng)梯度算法,用于在機(jī)器學(xué)習(xí)中優(yōu)化模型的參數(shù)。它是對(duì)AdaGrad算法的改進(jìn),主要解決AdaGrad算法累積平方梯度過(guò)度增大的問(wèn)題。
RMSprop算法的核心思想是為每個(gè)參數(shù)維護(hù)一個(gè)梯度平方的移動(dòng)平均,并在參數(shù)更新時(shí)使用這個(gè)移動(dòng)平均來(lái)調(diào)整學(xué)習(xí)率。
算法思路:
當(dāng)ρ等于0:不考慮歷史梯度 ,r = 0 * r + (1 - 0)g * g = g * g 僅依靠當(dāng)前的的梯度
- 就把梯度大的降低一些,梯度小的增大一些
當(dāng)ρ等于1:即所有的歷史梯度都考慮進(jìn)來(lái),r = 1 * r + (1 - 1) g * g = r
- 權(quán)值一直不會(huì)變了
建議取0.999, v = 0.999v + 0.001 * g * g 多次迭代后,v會(huì)不斷減小
ADAM梯度下降法
Adam(Adaptive Moment Estimation)是一種自適應(yīng)梯度算法,結(jié)合了動(dòng)量法和RMSprop算法的優(yōu)點(diǎn),用于在機(jī)器學(xué)習(xí)中優(yōu)化模型的參數(shù)。它在訓(xùn)練過(guò)程中自適應(yīng)地調(diào)整學(xué)習(xí)率
算法思路:
修正偏差為什么可以緩解冷啟動(dòng)?
在進(jìn)行第1次更新的時(shí)候:
v初始值為0,μ初始值為0.9
v
(
1
)
=
0
+
0.1
g
v^{(1)} = 0 + 0.1 g
v(1)=0+0.1g
則通過(guò)修正偏差
v
^
1
=
0.1
g
/
1
?
(
0.9
)
1
=
g
\hat{v}^1 = 0.1 g / 1 - (0.9)^1= g
v^1=0.1g/1?(0.9)1=g
解決了開(kāi)始的梯度被減少10倍的問(wèn)題
在進(jìn)行第10次更新的時(shí)候:
修正偏差項(xiàng)就不起作用了
v
^
10
=
v
9
g
/
1
?
(
0.9
)
10
=
v
\hat{v}^{10} = v^9 g / 1 - (0.9)^{10} = v
v^10=v9g/1?(0.9)10=v
所以修正項(xiàng)僅在初期為了解決冷啟動(dòng)的時(shí)候起作用,來(lái)防止初期r = v = 0,更新特別慢的問(wèn)題
總結(jié)
分享一個(gè)動(dòng)態(tài)查看各種梯度梯度算法下降過(guò)程的圖的網(wǎng)站https://www.ruder.io/optimizing-gradient-descent/
這個(gè)博主寫(xiě)的更多更詳細(xì):https://blog.csdn.net/oppo62258801/article/details/103175179?ydreferer=aHR0cHM6Ly93d3cuYmluZy5jb20v
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-732482.html
同時(shí)可以學(xué)習(xí)一下算法的實(shí)現(xiàn):https://zhuanlan.zhihu.com/p/77380412文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732482.html
到了這里,關(guān)于計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí)-全連接神經(jīng)網(wǎng)絡(luò)-詳解梯度下降從BGD到ADAM - [北郵魯鵬]的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!