Deep learning之梯度下降(BGD/SGD)

問題

簡單來說,有一堆實數數據,數據的格式如下:

x1,x2,x3,⋯,xn,y

所有的這些數據稱爲訓練集,其中x稱爲featurey稱爲target

現在又有一些數據:

x1,x2,x3,⋯,xn

需要做的是根據這些x的值,推測出y的值。

解決方法

Overdetermined Equations

假設yx的線性函數(順便說一句lr中的linear是對於θ而言的,並非針對x),表達爲公式爲:

y=θ0x0+θ1x1+θ2x2+⋯+θnxn

其中x0爲截距(intercept term),其值恆爲1

最容易想到的方法,可以把所有訓練集的數據代入這個公式,得到方程組:

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪y(1)=θ0x(1)0+θ1x(1)1+θ2x(1)2+⋯+θnx(1)ny(2)=θ0x(2)0+θ1x(2)1+θ2x(2)2+⋯+θnx(2)n⋮y(m)=θ0x(m)0+θ1x(m)1+θ2x(m)2+⋯+θnx(m)n

這個方程組有m個方程,n+1個未知數,實際問題中通常是訓練集的個數大於feature個數,也就是說m > n+1,這種情況下的方程組稱爲超定方程組,是不能直接求解的。當然可以像當年歐拉和拉普拉斯最初解決天文計算問題一樣(here),把m個方程組分成n+1組,然後每一組合併成一個方程,得到n+1個方程後再求解。不過問題是怎麼分成n+1組,這個很是adhoc的。

Cost Function

機器學習上解決這個問題的方法是定義一個損失函數:

J(θ)=12∑i=1m(hθ(x(i))−y(i))2

然後選擇適當的θ,使得J(θ)最小。

Batch Gradient Descent(批量梯度下降) 

這個最小化的算法在機器學習中稱爲梯度下降:

·        隨機初始化一組θ值;

·        朝着減少cost function的方向,不斷更新θ值,直到收斂。更新公式爲:

θj:=θj−α∂J(θ)∂θj

其中α爲學習速率(learning rate)

Gradient Descent推導

假設訓練集中只有一個數據,∂J(θ)∂θj計算如下:

∂J(θ)∂θj=∂(12(hθ(x)−y)2)∂θj=2∗12(hθ(x)−y)∗∂(hθ(x)−y)∂θj=(hθ(x)−y)∗∂(hθ(x)−y)∂θj=(hθ(x)−y)∗∂(∑ni=0θixi−y)∂θj=(hθ(x)−y)xj

代入更新公式:

θj=θj−α(hθ(x)−y)xj=θj+α(y−hθ(x))xj

對於有m個數據集的情況可以得到如下公式:

θj:=θj+α∑i=1m(y(i)−hθ(x(i)))x(i)j

Gradient Descent直觀解釋

J(θ)是一個關於θ的多元函數,高等數學的知識說,J(θ)在點P(θ0,θ1,⋯,θn)延梯度方向上升最快。現在要最小化 J(θ),爲了讓J(θ)儘快收斂,就在更新θ時減去其在P點的梯度。

在最終推導出的更新公式中,可以得出以下直觀結論:如果遇到一個數據使得(y−hθ(x))比較小,這時候θ的更新也會很小,這也符合直觀感覺。當一個數據使得差值比較大時,θ的更新也會比較大。

Stochastic Gradient Descent(隨機梯度下降)

以上的討論的算法叫batch gradient descentbatch指的是,每次更新θ的時候都需要所有的數據集。這個算法有兩個缺陷:

·        數據集很大時,訓練過程計算量太大;

·        需要得到所有的數據才能開始訓練;

比如一個場景下,我們訓練了一個lr模型,應用於線上環境,當這個模型跑在線上的時候我們會收集更多的數據。但是上面兩個問題使得我們不能及時更新模型,而這正是隨機梯度下降要解決的問題。

在之前的推導過程中已經給出了sgd的更新公式,只是沒有指出,現正式提出sgd的更新公式:

loop for every (x, y) in training set until convergence:

θj:=θj+α(y−hθ(x))xj

bgd唯一的區別是,無論數據集有多少,每次迭代都只用一個數據。這樣當有新的數據時,直接通過上式更新θ,這就是所謂的online learning。又因爲每次更新都只用到一個數據,所以可以顯著減少計算量。

批量梯度下降是一種對參數的update進行累積,然後批量更新的一種方式。用於在已知整個訓練集時的一種訓練方式,但對於大規模數據並不合適。

隨機梯度下降是一種對參數隨着樣本訓練,一個一個的及時update的方式。常用於大規模訓練集,當往往容易收斂到局部最優解。

說明:因爲最小二乘問題是一個求凸函數極值的問題,它只有一個最優解,沒有所謂的局部最優,所以在這個問題上完全可以大用梯度下降來解

Mini-batchgradient
它還是採用了batch的思路,也就是所有樣本一起更新。和batch不同的是mini,在求解方向的時候選擇了一部分樣本一起更新,這樣就減少了計算量,同時它又不像SGD那樣極端只使用一個樣本,所以保證了方向的精確性。一句話總結就是,mini-batch是一個位於BGD和SGD之間的算法,精度比BGD低,比SGD高,速度比BGD快,比SGD慢(這個結論只是單從公式上分析,沒有實證)。
看下面的迭代公式,則是10個一組進行更新。

 

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