五:最優(yōu)化方法:梯度下降(20191202-1208)

0x00 內(nèi)容

梯度下降:實(shí)現(xiàn)梯度下降、線(xiàn)性回歸中的梯度下降

隨機(jī)梯度下降:相關(guān)代碼即調(diào)用

0x01??梯度下降法(回顧四:0x04?梯度下降法)

最小二乘法求損失函數(shù)的最小值,但是這只是一個(gè)特例。大多數(shù)復(fù)雜復(fù)雜情況下,損失函數(shù)就需要用到“梯度算法”。

從損失值出發(fā),去更新參數(shù),且要大幅降低計(jì)算次數(shù)。

多元函數(shù)的導(dǎo)數(shù)(derivative)就是梯度(gradient),分別對(duì)每個(gè)變量進(jìn)行微分,然后用逗號(hào)分割開(kāi),梯度是用括號(hào)包括起來(lái),說(shuō)明梯度其實(shí)一個(gè)向量。

解決局部最低點(diǎn)方案,:首先隨機(jī)產(chǎn)生多個(gè)初始參數(shù)集,然后分別對(duì)每個(gè)初始參數(shù)集使用梯度下降法,直到函數(shù)值收斂于某個(gè)值,最后從這些值中找出最小值,這個(gè)找到的最小值被當(dāng)作函數(shù)的最小值。

0x02??梯度下降之前需要使用歸一化(回顧四:0x05)

真實(shí)數(shù)據(jù)整體不在一個(gè)規(guī)模上,解決的方式,就是在梯度下降之前進(jìn)行數(shù)據(jù)歸一化。

0x03?速度更快的隨機(jī)梯度下降法

批量梯度下降法BGD(Batch Gradient Descent):每次更新參數(shù)時(shí)計(jì)算所有樣本,通過(guò)對(duì)數(shù)據(jù)集所有樣本的計(jì)算來(lái)求解梯度的方向。這種方法在數(shù)據(jù)量很大時(shí)計(jì)算的時(shí)間成本很高。

隨機(jī)梯度下降法SGD(stochastic gradient descent):每次迭代使用一個(gè)樣本來(lái)對(duì)參數(shù)進(jìn)行更新。雖然不是每次迭代得到的損失函數(shù)都向著全局最優(yōu)方向,但是大的整體的方向是向全局最優(yōu)解的,最終的結(jié)果往往是在全局最優(yōu)解附近。(相比于批量梯度,這樣的方法更快,結(jié)果也是可以接受的。)

3.1 隨機(jī)取值的公式推導(dǎo)

從數(shù)學(xué)的角度來(lái)看:將批量梯度下降損失函數(shù)(J(θ)=MSE(y,y^))求導(dǎo)后矩陣,乘以m。(樣本數(shù)量求和這一操作去掉)得:

注意,得到的向量是搜索方向,不是梯度方向,因此已經(jīng)不算是函數(shù)的梯度了。

3.2 隨機(jī)下降與學(xué)習(xí)率的取值

隨機(jī)梯度下降過(guò)程就是:每次隨機(jī)取出一個(gè)i,得到一個(gè)向量,沿著這個(gè)隨機(jī)產(chǎn)生的向量的方向進(jìn)行搜索,不停的迭代,得到的損失函數(shù)的最小值。

批量搜索,那么每次都是沿著一個(gè)方向前進(jìn);隨機(jī)梯度下降法則不能保證隨機(jī)選擇的方向是損失函數(shù)減小的方向(更不能保證一定是減小速度最快的方向),所以搜索路徑會(huì)呈現(xiàn)隨機(jī)特性。即隨機(jī)梯度下降有著不可預(yù)知性。

隨機(jī)梯度下降法的過(guò)程中,學(xué)習(xí)率η是逐漸遞減。因?yàn)槿绻麑W(xué)習(xí)率取一個(gè)固定值,可能會(huì)導(dǎo)致已經(jīng)在最小值附近的點(diǎn)θ,由于固定步長(zhǎng)(點(diǎn)θ的取值)跳出這個(gè)點(diǎn)的范圍。

設(shè)計(jì)一個(gè)函數(shù),使學(xué)習(xí)率η隨著下降循環(huán)次數(shù)的增加而減小。(分子變?yōu)槌?shù)t0,并在分母上增加一個(gè)常數(shù)項(xiàng)t1緩解初始情況下,學(xué)習(xí)率變化太大的情況,且更靈活。)η=t0/(Ii ter+t1)

0x04 BGD&SGD效果比較

梯度下降算法主要比較運(yùn)行時(shí)間迭代次數(shù)這兩個(gè)指標(biāo)。

不同:

1.表達(dá)式為:X_b_i.T.dot(X_b_i.dot(theta) - y_i) * 2(傳遞的不是整個(gè)矩陣Xb和整個(gè)向量y,而是其中一行X_b_i、其中的一個(gè)數(shù)值y_i)

2.內(nèi)置學(xué)習(xí)率:η=t0/(Ii ter+t1)

3.終止循環(huán)條件:循環(huán)次數(shù)達(dá)到上限

代碼中隨機(jī)梯度下降,只使用1/3。并且隨機(jī)梯度下降中只考慮的1/3的樣本量,且得到的結(jié)果一定達(dá)到了局部最小值的范圍內(nèi)。

批量梯度下降法BGD(Batch Gradient Descent)

優(yōu)點(diǎn):全局最優(yōu)解;易于并行實(shí)現(xiàn);

缺點(diǎn):當(dāng)樣本數(shù)據(jù)很多時(shí),計(jì)算量開(kāi)銷(xiāo)大,計(jì)算速度慢。

隨機(jī)梯度下降法SGD(stochastic gradient descent)

(每次迭代使用一個(gè)樣本來(lái)對(duì)參數(shù)進(jìn)行更新)

優(yōu)點(diǎn):計(jì)算速度快;

缺點(diǎn):收斂性能不好 。

0x05 ? 梯度下降另外一種調(diào)試方式

一種簡(jiǎn)單的方法,能夠?qū)μ荻认陆捣ㄖ星筇荻鹊墓酵茖?dǎo)進(jìn)行調(diào)試。?

以一維為例,求某一點(diǎn)(紅色)相應(yīng)的梯度值(導(dǎo)數(shù)),就是曲線(xiàn)在這個(gè)點(diǎn)上切線(xiàn)的斜率??梢允褂镁嚯x該點(diǎn)左右兩側(cè)的兩個(gè)藍(lán)色點(diǎn)的連線(xiàn)的斜率,作為紅點(diǎn)處切線(xiàn)斜率。

從數(shù)學(xué)上來(lái)看比較直觀,每個(gè)維度上都要求兩次帶入,因此時(shí)間復(fù)雜度變高了。作為一個(gè)調(diào)試的手段,在還未完成時(shí),可以使用小數(shù)據(jù)量,進(jìn)行計(jì)算,得到最終結(jié)果。(然后再通過(guò)推導(dǎo)公式的方式得到的梯度結(jié)果,是否和其相同。)在求梯度的時(shí)候,可以用這種通用的debug方式先在小數(shù)據(jù)集上對(duì)求導(dǎo)公式進(jìn)行檢驗(yàn)。

0xFF 總結(jié)

批量梯度下降法BGD(Batch Gradient Descent),每次對(duì)所有樣本都看一遍,缺點(diǎn)是慢,缺點(diǎn)是穩(wěn)定。

隨機(jī)梯度下降法SGD(stochastic gradient descent),每次隨機(jī)看一個(gè),優(yōu)點(diǎn)是快,缺點(diǎn)是不穩(wěn)定。

小批量梯度下降法 MBGD(Mini-Batch Gradient Descent),優(yōu)點(diǎn):減少了計(jì)算的開(kāi)銷(xiāo)量,降低了隨機(jī)性。(在每次更新時(shí)用b個(gè)樣本,其實(shí)批量的梯度下降就是一種折中的方法,用一些小樣本來(lái)近似全部。)

代碼相關(guān):

1.Jupyter中使用IPython的魔法(Magic)命令“%%time”表示代碼塊用時(shí),必須首行。

參考閱讀:

1.《還不了解梯度下降法?看完這篇就懂了!》(回顧四)

2.《手動(dòng)實(shí)現(xiàn)梯度下降(可視化)》?(回顧四)

3.《線(xiàn)性回歸中的梯度下降》?(回顧四)

4.《速度更快的隨機(jī)梯度下降法》

5.《梯度下降番外:非常有用的調(diào)試方式及總結(jié)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容