理論基礎(chǔ)
現(xiàn)在比如有兩個(gè)參數(shù)的損失函數(shù)此時(shí)比如我們站在此點(diǎn)上,想要快速到達(dá)谷底(也就是使J函數(shù)達(dá)到極小值)。此時(shí)我們放眼望去,環(huán)望四周,很自然的向此時(shí)坡最陡的方向的下方邁上一步,接著在繼續(xù)重復(fù)我們的過程,直到四周都比當(dāng)下高 (此時(shí))為止,就是走到谷底(J函數(shù)達(dá)到極小值),完成目標(biāo)。
這時(shí)會(huì)不會(huì)有人問為什么會(huì)是極小值。
這時(shí)我們重新找一個(gè)點(diǎn)
跟上面的過程一樣,我們再走一遍
你瞅瞅,是不是到達(dá)另一個(gè)谷底。所以說,這種方法找的是局部的最小值,也就是全局的極小值。這種方法就是梯度下降算法。 此時(shí)介紹梯度下降算法,簡單起見,我們從一個(gè)變量開始,比如此時(shí)我們的損失函數(shù)J是
此時(shí)的導(dǎo)數(shù)值為正數(shù),我們要向它的相反方向走一步,到達(dá)如圖所示點(diǎn)
不斷的重復(fù)上面公式的過程,直到
我們再考慮隨機(jī)點(diǎn)在左邊的情況。比如取點(diǎn)如圖所示:
此時(shí)的J在theta_1點(diǎn)的導(dǎo)數(shù)
此時(shí)我們應(yīng)該向右走,則此時(shí)的表達(dá)式為
更新后
跟上面的過程一樣,直到更新到導(dǎo)數(shù)為0或特別小為止。 由此可見,無論導(dǎo)數(shù)正負(fù),表達(dá)式一樣。所以我們規(guī)定梯度下降算法的更新過程就是
此時(shí)我們具體談?wù)刟lpha:
而alpha取值過大,則還會(huì)有這種情況:
永遠(yuǎn)找不到極小值。
alpha先大后小。(根據(jù)實(shí)驗(yàn)情況而定)
現(xiàn)在我們再回歸到我們的
我們對它進(jìn)行優(yōu)化的表達(dá)式為:
這里有個(gè)誤區(qū),正確的更新過程是這樣的:
等更新完再賦值。
更新完的theta_0在temp1的更新過程中被調(diào)用,此時(shí)已經(jīng)不是之前的theta_0了。切記。
代碼實(shí)踐
這是個(gè)擬合直線的代碼實(shí)現(xiàn)。
我們要將數(shù)據(jù)統(tǒng)一收縮到 [-1 - 1] 之間。
X = ( X - average(X) ) / X.max
Y = ( Y - average(Y) ) / Y.max
為什么要這么做呢?
因?yàn)槿绻蛔隹s小處理,在矩陣運(yùn)算時(shí),非常有可能出現(xiàn)無窮大或者無窮小,導(dǎo)致無法計(jì)算。
縮小處理可以很容易畫出模擬線條。
縮小處理在計(jì)算機(jī)中處理速度更快。
我們看看圖:
這里我設(shè)置a = 0.01是為了下面的模擬直線除數(shù)不為0設(shè)置的。一般情況下,初始化 a = b = 0。(這里a, b就是上面的theta_0,theta_1)
下面進(jìn)行矩陣化:
上面圖片的y1 - y4是預(yù)測值
下面代碼的Y是真實(shí)值
預(yù)測值函數(shù)
擬合線段形成過程
更新過程
最終的線段是
注:代碼實(shí)現(xiàn)以上圖片來自2014stanford機(jī)器學(xué)習(xí)視頻
我的公眾號(hào),喜歡的可以關(guān)注我呀。