機器學習:梯度下降算法

假如我們有一個數據集: (xi1,xi2,yi)
其中,i是從1到m。數據集總共有m組。

前兩個是自變量,最後一個是因變量。我們可以這樣理解,存在某種關係,使得y會隨着x1和x2的變化而變化。這種理解跟函數是不是很像?實際上,我們確實可以假設存在這樣一個函數,它跟數據集很擬合。所以即使數據集裏沒有的它也可以預測出結果。現在假設有一個線性的函數可以擬合:

hθ(x(i))=θ0+θ1x(i)1+θ2x(i)2

我們希望能得到一組 θ ,使得hθ(x(i)) 所表示的函數圖像跟數據集擬合得很好。那麼,如何刻畫它們的擬合程度呢?

最直接的想法就是利用h(x)與y之間的差異來衡量,即定義一個代價(cost)函數:

J(θ)=12mi=1m(hθ(x(i))y(i))2=12mi=1m(θ0+θ1x(i)1+θ2x(i)2y(i))2

而我們的目標就是,想辦法在這個已知的數據集下,得到一組θ ,使得J(θ) 的值最小。如果把J(θ)θ 在座標軸上畫出來,它就是一個曲面,要找它的最小值,我們當然會想到最低點,要找到最低點,就是對θ 求導,並且讓導數爲0,這樣就找到最低點了。即令:

θjJ(θ)=θj12mi=1m(hθ(x(i))y(i))2=1mi=1m[(hθ(x(i))y(i))x(i)j]=0

這樣我們就可以找出最低點了。

梯度下降算法

在計算機的計算中,我們如何才能找到θ0θ1 使得J(θ) 最小呢?
1 先隨便給θ0θ1 初始化。比如都賦值爲0。
2 改變θ0θ1 ,使得J(θ) 的值慢慢變小,最終收斂到最小。這時候θ0θ1 的值就是我們要的。
僞代碼如下:
while()
{
temp0=θ0 - αθ0J(θ0,θ1)
temp1=θ1 - αθ1J(θ0,θ1)
θ0 =temp0
θ1 =temp1
}
由於每一次的θ0θ1 都是一個具體的數值,所以αθ0J(θ0,θ1) 每一次都可以算出來的。

梯度下降算法的細節改進

特徵縮放(Feature Scaling)

比如有數據集(x(i)1,x(i)2,y(i))
其中有兩個變量,x1和x2,假如x1的變化範圍大概是0~2000,而x2的變換範圍大概是1~5。顯然x1和x2的取值範圍差距很大,在畫代價(cost)函數的時候圖像會很奇怪,利用梯度下降算法找最小值的時候,下降的速度就會很慢,而且容易振盪。爲了解決這個問題,可以使用歸一化。即:

x1=x110002000x2=x225

學習速率α的選擇

α太小,收斂速度就會變慢,太大又有可能不會收斂。只能慢慢嘗試了。

發佈了42 篇原創文章 · 獲贊 185 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章