梯度下降算法

前言:

上次寫過一篇關於貝葉斯概率論的數學,最近時間比較緊,coding的任務比較重,不過還是抽空看了一些機器學習的書和視頻,其中很推薦兩個:一個是 stanford的machine learning公開課,在verycd可下載,可惜沒有翻譯。不過還是可以看。另外一個是prml-pattern recognition and machine learning, Bishop的一部反響不錯的書,而且是2008年的,算是比較新的一本書了。

前幾天還準備寫一個分佈式計算的系列,只寫了個開頭,又換到寫這個系列了。以後看哪邊的心得更多,就寫哪一個系列吧。最近乾的事情比較雜,有跟機器學習相關的,有跟數學相關的,也有跟分佈式相關的。

這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關的論文可就看不懂了,這個系列主要將會着重於去機器學習的數學描述這個部分,將會覆蓋但不一定侷限於迴歸、聚類、分類等算法

梯度定義:

向量微積分中,標量場梯度是一個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。

迴歸與梯度下降:

迴歸在數學上來說是給定一個點集,能夠用一條曲線去擬合之,如果這個曲線是一條直線,那就被稱爲線性迴歸,如果曲線是一條二次曲線,就被稱爲二次迴歸,迴歸還有很多的變種,如locally weighted迴歸,logistic迴歸,等等,這個將在後面去講。

用一個很簡單的例子來說明迴歸,這個例子來自很多的地方,也在很多的open source的軟件中看到,比如說weka。大概就是,做一個房屋價值的評估系統,一個房屋的價值來自很多地方,比如說面積、房間的數量(幾室幾廳)、地 段、朝向等等,這些影響房屋價值的變量被稱爲特徵(feature),feature在機器學習中是一個很重要的概念,有很多的論文專門探討這個東西。在 此處,爲了簡單,假設我們的房屋就是一個變量影響的,就是房屋的面積。

假設有一個房屋銷售的數據如下:

面積(m^2)  銷售價錢(萬元)

123            250

150            320

87              160

102            220

…               …

這個表類似於帝都5環左右的房屋價錢,我們可以做出一個圖,x軸是房屋的面積。y軸是房屋的售價,如下:

image

如果來了一個新的面積,假設在銷售價錢的記錄中沒有的,我們怎麼辦呢?

我們可以用一條曲線去儘量準的擬合這些數據,然後如果有新的輸入過來,我們可以在將曲線上這個點對應的值返回。如果用一條直線去擬合,可能是下面的樣子:

image

綠色的點就是我們想要預測的點。

首先給出一些概念和常用的符號,在不同的機器學習書籍中可能有一定的差別。

房屋銷售記錄表 - 訓練集(training set)或者訓練數據(training data), 是我們流程中的輸入數據,一般稱爲x

房屋銷售價錢 - 輸出數據,一般稱爲y

擬合的函數(或者稱爲假設或者模型),一般寫做 y = h(x)

訓練數據的條目數(#training set), 一條訓練數據是由一對輸入數據和輸出數據組成的

輸入數據的維度(特徵的個數,#features),n

下面是一個典型的機器學習的過程,首先給出一個輸入數據,我們的算法會通過一系列的過程得到一個估計的函數,這個函數有能力對沒有見過的新數據給出一個新的估計,也被稱爲構建一個模型。就如同上面的線性迴歸函數。

image

我們用X1,X2..Xn 去描述feature裏面的分量,比如x1=房間的面積,x2=房間的朝向,等等,我們可以做出一個估計函數:

image

θ在這兒稱爲參數,在這兒的意思是調整feature中每個分量的影響力,就是到底是房屋的面積更重要還是房屋的地段更重要。爲了如果我們令X0 = 1,就可以用向量的方式來表示了:

image

我們程序也需要一個機制去評估我們θ是否比較好,所以說需要對我們做出的h函數進行評估,一般這個函數稱爲損失函數(loss function)或者錯誤函數(error function),描述h函數不好的程度,在下面,我們稱這個函數爲J函數

在這兒我們可以做出下面的一個錯誤函數:

image

這個錯誤估計函數是去對x(i)的估計值與真實值y(i)差的平方和作爲錯誤估計函數,前面乘上的1/2是爲了在求導的時候,這個係數就不見了。

如何調整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一種完全是數學描述的方法,在stanford機器學習開放課最後的部分會推導最小二乘法的公式的來源,這個來很多的機器學習和數學書 上都可以找到,這裏就不提最小二乘法,而談談梯度下降法。

梯度下降法是按下面的流程進行的:

1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。

2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。

爲了更清楚,給出下面的圖:

image 這是一個表示參數θ與誤差函數J(θ)的關係圖,紅色的部分是表示J(θ)有着比較高的取值,我們需要的是,能夠讓J(θ)的值儘量的低。也就是深藍色的部分。θ0,θ1表示θ向量的兩個維度。

在上面提到梯度下降法的第一步是給θ給一個初值,假設隨機給的初值是在圖上的十字點。

然後我們將θ按照梯度下降的方向進行調整,就會使得J(θ)往更低的方向進行變化,如圖所示,算法的結束將是在θ下降到無法繼續下降爲止。

image 當然,可能梯度下降的最終點並非是全局最小點,可能是一個局部最小點,可能是下面的情況:

image

上面這張圖就是描述的一個局部最小點,這是我們重新選擇了一個初始點得到的,看來我們這個算法將會在很大的程度上被初始點的選擇影響而陷入局部最小點

下面我將用一個例子描述一下梯度減少的過程,對於我們的函數J(θ)求偏導J:(求導的過程如果不明白,可以溫習一下微積分)

image

下面是更新的過程,也就是θi會向着梯度最小的方向進行減少。θi表示更新之前的值,-後面的部分表示按梯度方向減少的量,α表示步長,也就是每次按照梯度減少的方向變化多少。

image 一個很重要的地方值得注意的是,梯度是有方向的,對於一個向量θ,每一維分量θi都可以求出一個梯度的方向,我們就可以找到一個整體的方向,在變化的時候,我們就朝着下降最多的方向進行變化就可以達到一個最小點,不管它是局部的還是全局的。

用更簡單的數學語言進行描述步驟2)是這樣的:

image 倒三角形表示梯度,按這種方式來表示,θi就不見了,看看用好向量和矩陣,真的會大大的簡化數學的描述啊。



隨機梯度下降(Stochastic gradient descent)和 梯度下降(Batch gradient descent )的公式對比、實現對比

梯度下降法先隨機給出參數的一組值,然後更新參數,使每次更新後的結構都能夠讓損失函數變小,最終達到最小即可。在梯度下降法中,目標函數其實可以看做是參數的函數,因爲給出了樣本輸入和輸出值後,目標函數就只剩下參數部分了,這時可以把參數看做是自變量,則目標函數變成參數的函數了。梯度下降每次都是更新每個參數,且每個參數更新的形式是一樣的,即用前一次該參數的值減掉學習率和目標函數對該參數的偏導數(如果只有1個參數的話,就是導數),爲什麼要這樣做呢?通過取不同點處的參數可以看出,這樣做恰好可以使原來的目標函數值變低,因此符合我們的要求(即求函數的最小值)。即使當學習速率固定(但不能太大),梯度下降法也是可以收斂到一個局部最小點的,因爲梯度值會越來越小,它和固定的學習率相乘後的積也會越來越小。在線性迴歸問題中我們就可以用梯度下降法來求迴歸方程中的參數。有時候該方法也稱爲批量梯度下降法,這裏的批量指的是每一時候參數的更新使用到了所有的訓練樣本。

首先我們來定義輸出誤差,即對於任意一組權值向量,那它得到的輸出和我們預想的輸出之間的誤差值。定義誤差的方法很多,不同的誤差計算方法可以得到不同的權值更新法則,這裏我們先用這樣的定義:


上面公式中D代表了所有的輸入實例,或者說是樣本,d代表了一個樣本實例,od表示感知器的輸出,td代表我們預想的輸出。

這樣,我們的目標就明確了,就是想找到一組權值讓這個誤差的值最小,顯然我們用誤差對權值求導將是一個很好的選擇,導數的意義是提供了一個方向,沿着這個方向改變權值,將會讓總的誤差變大,更形象的叫它爲梯度。




既然梯度確定了E最陡峭的上升的方向,那麼梯度下降的訓練法則是:


梯度上升和梯度下降其實是一個思想,上式中權值更新的+號改爲-號也就是梯度上升了。梯度上升用來求函數的最大值,梯度下降求最小值。


這樣每次移動的方向確定了,但每次移動的距離卻不知道。這個可以由步長(也稱學習率)來確定,記爲α。這樣權值調整可表示爲:


關於學習率

下降的步伐大小非常重要,因爲如果太小,則找到函數最小值的速度就很慢,如果太大,則可能會出現震盪。

如果學習速率過大,這每次迭代就有可能出現超調的現象,會在極值點兩側不斷髮散,最終損失函數的值是越變越大,而不是越來越小。在損失函數值——迭代次數的曲線圖中,可以看到,該曲線是向上遞增的。當然了,當學習速率過大時,還可能出現該曲線不斷震盪的情形。如果學習速率太小,這該曲線下降得很慢,甚至在很多次迭代處曲線值保持不變。那到底該選什麼值呢?這個一般是根據經驗來選取的,比如從…0.0001,0.001,.0.01,0.1,1.0…這些參數中選,看那個參數使得損失值和迭代次數之間的函數曲線下降速度最快。有定步長和可變步長兩種策略。



Feature Scaling

此種方法應用於梯度下降,爲了加快梯度下降的執行速度;由於梯度下降法是按照梯度方向來收斂到極值的,如果輸入樣本各個維數的尺寸不同(即範圍不同),則這些參數的構成的等高線不同的方向胖瘦不同,這樣會導致參數的極值收斂速度極慢。因此在進行梯度下降法求參數前,需要先進行feature scaling這一項,一般都是把樣本中的各維變成0均值,即先減掉該維的均值,然後除以該變量的range。
思想:將各個feature的值標準化,使得取值範圍大致都在-1<=x<=1之間;

常用的方法是Mean Normalization,即

多變量



隨機梯度下降

普通的梯度下降算法在更新迴歸係數時要遍歷整個數據集,是一種批處理方法,這樣訓練數據特別忙龐大時,可能出現如下問題:

1)收斂過程可能非常慢;

2)如果誤差曲面上有多個局極小值,那麼不能保證這個過程會找到全局最小值。

爲了解決上面的問題,實際中我們應用的是梯度下降的一種變體被稱爲隨機梯度下降。


上面公式中的誤差是針對於所有訓練樣本而得到的,而隨機梯度下降的思想是根據每個單獨的訓練樣本來更新權值,這樣我們上面的梯度公式就變成了:


經過推導後,我們就可以得到最終的權值更新的公式:


有了上面權重的更新公式後,我們就可以通過輸入大量的實例樣本,來根據我們預期的結果不斷地調整權值,從而最終得到一組權值使得我們的SIGMOID能夠對一個新的樣本輸入得到正確的或無限接近的結果。


這裏做一個對比

設代價函數爲



批量梯度下降


參數更新爲:

         

i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。所以更新一個θj需要遍歷整個樣本集




隨機梯度下降

參數更新爲:

        

i是樣本編號下標,j是樣本維數下標,m爲樣例數目,n爲特徵數目。所以更新一個θj只需要一個樣本就可以。



Batch Gradient Descent: You need to run over every training example before doing an update, which means that if you have a large dataset, you might spend much time on getting something that works. 

Stochastic gradient descent, on the other hand, does updates every time it finds a training example, however, since it only uses one update, it may never converge, although you can still be pretty close to the minimum.  


1.如果函數是凸的,那麼梯度下降會收斂到最小值(因爲只有一個極小值,它就是最小值)。

對於一般問題來說,梯度下降能找到最小值是個概率事件。

2.批量梯度下降算法可以得到全局最小值但是算法複雜度變成了n*n

3.隨機梯度下降算法很可能得到的是全局最小值附近的值

http://www.cnblogs.com/gongxijun/p/5890548.html




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章