詳解梯度下降法的三種形式BGD,SGD以及MBGD
1.批量梯度下降法BGD原理講解
2.隨機(jī)梯度下降法SGD原理講解
3.小批量梯度詳解MBGD原理講解
4.具體實(shí)例以及三種實(shí)現(xiàn)方式代碼詳解
5.三種梯度下降法的總結(jié)
在應(yīng)用機(jī)器學(xué)習(xí)算法時(shí),我們通常采用梯度下降法來(lái)對(duì)采用的算法進(jìn)行訓(xùn)練。其實(shí),常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優(yōu)缺點(diǎn)。
下面我們以線性回歸算法來(lái)對(duì)三種梯度下降法進(jìn)行比較。
一般線性回歸函數(shù)的假設(shè)函數(shù)為:
對(duì)應(yīng)的損失函數(shù)為:
(這里的1/2是為了后面求導(dǎo)計(jì)算方便)
下圖作為一個(gè)二維參數(shù)(theta0,theta1)組對(duì)應(yīng)能量函數(shù)的可視化圖:
下面我們來(lái)分別講解三種梯度下降法
1批量梯度下降法BGD
我們的目的是要誤差函數(shù)盡可能的小,即求解weights使誤差函數(shù)盡可能小。首先,我們隨機(jī)初始化weigths,然后不斷反復(fù)的更新weights使得誤差函數(shù)減小,直到滿足要求時(shí)停止。這里更新算法我們選擇梯度下降算法,利用初始化的weights并且反復(fù)更新weights:
這里代表學(xué)習(xí)率,表示每次向著J最陡峭的方向邁步的大小。為了更新weights,我們需要求出函數(shù)J的偏導(dǎo)數(shù)。首先當(dāng)我們只有一個(gè)數(shù)據(jù)點(diǎn)(x,y)的時(shí)候,J的偏導(dǎo)數(shù)是:
則對(duì)所有數(shù)據(jù)點(diǎn),上述損失函數(shù)的偏導(dǎo)(累和)為:
再最小化損失函數(shù)的過(guò)程中,需要不斷反復(fù)的更新weights使得誤差函數(shù)減小,更新過(guò)程如下:
那么好了,每次參數(shù)更新的偽代碼如下:
由上圖更新公式我們就可以看到,我們每一次的參數(shù)更新都用到了所有的訓(xùn)練數(shù)據(jù)(比如有m個(gè),就用到了m個(gè)),如果訓(xùn)練數(shù)據(jù)非常多的話,是非常耗時(shí)的。
下面給出批梯度下降的收斂圖:
從圖中,我們可以得到BGD迭代的次數(shù)相對(duì)較少。
2隨機(jī)梯度下降法SGD
由于批梯度下降每跟新一個(gè)參數(shù)的時(shí)候,要用到所有的樣本數(shù),所以訓(xùn)練速度會(huì)隨著樣本數(shù)量的增加而變得非常緩慢。隨機(jī)梯度下降正是為了解決這個(gè)辦法而提出的。它是利用每個(gè)樣本的損失函數(shù)對(duì)θ求偏導(dǎo)得到對(duì)應(yīng)的梯度,來(lái)更新θ:
更新過(guò)程如下:
隨機(jī)梯度下降是通過(guò)每個(gè)樣本來(lái)迭代更新一次,對(duì)比上面的批量梯度下降,迭代一次需要用到所有訓(xùn)練樣本(往往如今真實(shí)問(wèn)題訓(xùn)練數(shù)據(jù)都是非常巨大),一次迭代不可能最優(yōu),如果迭代10次的話就需要遍歷訓(xùn)練樣本10次。
但是,SGD伴隨的一個(gè)問(wèn)題是噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優(yōu)化方向。
隨機(jī)梯度下降收斂圖如下:
我們可以從圖中看出SGD迭代的次數(shù)較多,在解空間的搜索過(guò)程看起來(lái)很盲目。但是大體上是往著最優(yōu)值方向移動(dòng)。
3min-batch 小批量梯度下降法MBGD
我們從上面兩種梯度下降法可以看出,其各自均有優(yōu)缺點(diǎn),那么能不能在兩種方法的性能之間取得一個(gè)折衷呢?既算法的訓(xùn)練過(guò)程比較快,而且也要保證最終參數(shù)訓(xùn)練的準(zhǔn)確率,而這正是小批量梯度下降法(Mini-batch Gradient Descent,簡(jiǎn)稱MBGD)的初衷。
我們假設(shè)每次更新參數(shù)的時(shí)候用到的樣本數(shù)為10個(gè)(不同的任務(wù)完全不同,這里舉一個(gè)例子而已)
更新偽代碼如下:
4實(shí)例以及代碼詳解
這里參考他人博客,創(chuàng)建了一個(gè)數(shù)據(jù),如下圖所示:
待訓(xùn)練數(shù)據(jù)A、B為自變量,C為因變量。
我希望通過(guò)這些訓(xùn)練數(shù)據(jù)給我訓(xùn)練出一個(gè)線性模型,用于進(jìn)行下面數(shù)據(jù)的預(yù)測(cè),test集合如下:
比如我們給出(3.1,5.5)希望模型預(yù)測(cè)出來(lái)的值與我們給定的9.5的差別是多少?這不是重點(diǎn),重點(diǎn)是我們訓(xùn)練模型過(guò)程中的參數(shù)更新方法(這是我們這篇文章的重點(diǎn))批梯度下降以及隨機(jī)梯度下降代碼如何實(shí)現(xiàn)。
下面分別來(lái)講:
首先我們看批梯度下降法的代碼如下:
這里有可能還是比如抽象,為了讓大家更好的弄懂理解這倆個(gè)重要的方法,我下面結(jié)合例子,一行一行代碼解釋:
我們看隨機(jī)梯度下降法的代碼如下:
與批梯度下降最大的區(qū)別就在于,我們這里更新參數(shù)的時(shí)候,并沒(méi)有將所有訓(xùn)練樣本考慮進(jìn)去,然后求和除以總數(shù),而是我自己編程實(shí)現(xiàn)任取一個(gè)樣本點(diǎn)(代碼中random函數(shù)就能清楚看到),然后利用這個(gè)樣本點(diǎn)進(jìn)行更新!這就是最大的區(qū)別!
那么到這個(gè)時(shí)候,我們也非常容易知道小批量隨機(jī)梯度下降法的實(shí)現(xiàn)就是在這個(gè)的基礎(chǔ)上,隨機(jī)取batch個(gè)樣本,而不是1個(gè)樣本即可,掌握了本質(zhì)就非常容易實(shí)現(xiàn)!
下面給出這個(gè)線性模型所有代碼,訓(xùn)練,預(yù)測(cè)以及結(jié)果供參考:由于公眾號(hào)對(duì)代碼排版很不友好,整個(gè)代碼我用貼圖片表示,如果需要源代碼文件,歡迎留言,私信yizhen20133868!
除去上面?zhèn)z個(gè)方法的代碼實(shí)現(xiàn),還有預(yù)測(cè),以及主邏輯代碼如下:
預(yù)測(cè)代碼:
主邏輯代碼:
最后運(yùn)行結(jié)果為:
說(shuō)明與我們給定的真實(shí)值是完全對(duì)應(yīng)的。
5三種梯度下降方法的總結(jié)
1.批梯度下降每次更新使用了所有的訓(xùn)練數(shù)據(jù),最小化損失函數(shù),如果只有一個(gè)極小值,那么批梯度下降是考慮了訓(xùn)練集所有數(shù)據(jù),是朝著最小值迭代運(yùn)動(dòng)的,但是缺點(diǎn)是如果樣本值很大的話,更新速度會(huì)很慢。
2.隨機(jī)梯度下降在每次更新的時(shí)候,只考慮了一個(gè)樣本點(diǎn),這樣會(huì)大大加快訓(xùn)練數(shù)據(jù),也恰好是批梯度下降的缺點(diǎn),但是有可能由于訓(xùn)練數(shù)據(jù)的噪聲點(diǎn)較多,那么每一次利用噪聲點(diǎn)進(jìn)行更新的過(guò)程中,就不一定是朝著極小值方向更新,但是由于更新多輪,整體方向還是大致朝著極小值方向更新,又提高了速度。
3.小批量梯度下降法是為了解決批梯度下降法的訓(xùn)練速度慢,以及隨機(jī)梯度下降法的準(zhǔn)確性綜合而來(lái),但是這里注意,不同問(wèn)題的batch是不一樣的,聽(tīng)?zhēng)熜指艺f(shuō),我們nlp的parser訓(xùn)練部分batch一般就設(shè)置為10000,那么為什么是10000呢,我覺(jué)得這就和每一個(gè)問(wèn)題中神經(jīng)網(wǎng)絡(luò)需要設(shè)置多少層,沒(méi)有一個(gè)人能夠準(zhǔn)確答出,只能通過(guò)實(shí)驗(yàn)結(jié)果來(lái)進(jìn)行超參數(shù)的調(diào)整。
好了,本篇文章要講的已經(jīng)講完了,真心希望對(duì)大家理解有幫助,歡迎大家指錯(cuò)交流!
參考:
梯度下降算法以及其Python實(shí)現(xiàn)
[Machine Learning] 梯度下降法的三種形式BGD、SGD以及MBGD
致謝:郭江師兄,曉明師兄,德川
近期文章預(yù)告:
《詳解K近鄰算法》
《詳解貝葉斯分類以及代碼實(shí)現(xiàn)》
《詳解增強(qiáng)學(xué)習(xí)MDP過(guò)程》
開(kāi)通了[自然語(yǔ)言處理與機(jī)器學(xué)習(xí)]公眾號(hào),記錄自己在cs,ml,nlp中的學(xué)習(xí)所得,不保證是很難得知識(shí),但一定是我理解的干貨,歡迎按住下面二維碼掃描關(guān)注!
聯(lián)系客服