問題
簡單來說,有一堆實數數據,數據的格式如下:
x1,x2,x3,⋯,xn,y
所有的這些數據稱爲訓練集,其中x稱爲feature,y稱爲target。
現在又有一些數據:
x1,x2,x3,⋯,xn
需要做的是根據這些x的值,推測出y的值。
解決方法
Overdetermined Equations
假設y是x的線性函數(順便說一句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 descent,batch指的是,每次更新θ的時候都需要所有的數據集。這個算法有兩個缺陷:
· 數據集很大時,訓練過程計算量太大;
· 需要得到所有的數據才能開始訓練;
比如一個場景下,我們訓練了一個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個一組進行更新。