Spark 排序算法系列之 GBTs 基礎:三種梯度下降演算法
在機器學習領域,梯度下降演算法分為三種
-
批量梯度下降演算法(BGD,Batch gradient descent algorithm)
-
隨機梯度下降演算法(SGD,Stochastic gradient descent algorithm)
-
小批量梯度下降演算法(MBGD,Mini-batch gradient descent algorithm)
批量梯度下降演算法
BGD是最原始的梯度下降演算法,每一次迭代使用全部的樣本,即權重的迭代公式中(公式中用
θ 代替
這裡的m代表所有的樣本,表示從第一個樣本遍歷到最後一個樣本。
特點:
-
能達到全域性最優解,易於並行實現
-
當樣本數目很多時,訓練過程緩慢
隨機梯度下降演算法
SGD的思想是更新每一個引數時都使用一個樣本來進行更新,即公式(1)中m為1。每次更新引數都只使用一個樣本,進行多次更新。這樣在樣本量很大的情況下,可能只用到其中的一部分樣本就能得到最優解了。
但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向。
特點:
-
訓練速度快
-
準確度下降,並不是最優解,不易於並行實現
小批量梯度下降演算法
MBGD的演算法思想就是在更新每一引數時都使用一部分樣本來進行更新,也就是公式(1)中的m的值大於1小於所有樣本的數量。
相對於隨機梯度下降,Mini-batch梯度下降降低了收斂波動性,即降低了引數更新的方差,使得更新更加穩定。相對於批量梯度下降,其提高了每次學習的速度。並且其不用擔心記憶體瓶頸從而可以利用矩陣運算進行高效計算。一般而言每次更新隨機選擇[50,256]個樣本進行學習,但是也要根據具體問題而選擇,實踐中可以進行多次試驗,選擇一個更新速度與更次次數都較適合的樣本數。mini-batch梯度下降可以保證收斂性,常用於神經網路中
補充
在樣本量較小的情況下,可以使用批量梯度下降演算法,樣本量較大的情況或者線上,可以使用隨機梯度下降演算法或者小批量梯度下降演算法。
在機器學習中的無約束優化演算法,除了梯度下降以外,還有前面提到的最小二乘法,此外還有牛頓法和擬牛頓法。
梯度下降法和最小二乘法相比,梯度下降法需要選擇步長,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是計算解析解。如果樣本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有優勢,計算速度很快。但是如果樣本量很大,用最小二乘法由於需要求一個超級大的逆矩陣,這時就很難或者很慢才能求解解析解了,使用迭代的梯度下降法比較有優勢。
梯度下降法和牛頓法/擬牛頓法相比,兩者都是迭代求解,不過梯度下降法是梯度求解,而牛頓法/擬牛頓法是用二階的海森矩陣的逆矩陣或偽逆矩陣求解。相對而言,使用牛頓法/擬牛頓法收斂更快。但是每次迭代的時間比梯度下降法長。
sklearn中的SGD
sklearn官網上查了一下,並沒有找到BGD和MBGD的相關文件,只是看到可SGD的,感興趣的可以直接去官網看英文文件,點選SGD檢視: SGD ,這也有一箇中文的 SGD
In [1]: from sklearn.linear_model import SGDClassifier In [2]: X = [[0., 0.], [1., 1.]] In [3]: y = [0, 1] In [4]: clf = SGDClassifier(loss="hinge", penalty="l2") In [5]: clf.fit(X, y) Out[5]: SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5, random_state=None, shuffle=True, verbose=0, warm_start=False) In [6]:clf.predict([[2., 2.]]) Out[6]: array([1]) In [7]: clf.coef_ Out[7]: array([[ 9.91080278,9.91080278]]) In [8]: clf.intercept_ Out[8]: array([-9.97004991])
參考:
-
https://www.cnblogs.com/pinard/p/5970503.html
-
http://blog.csdn.net/uestc_c2_403/article/details/74910107