1. 程式人生 > 其它 >帶動量的隨機梯度下降法_隨機梯度下降法介紹及其引數講解

帶動量的隨機梯度下降法_隨機梯度下降法介紹及其引數講解

技術標籤:帶動量的隨機梯度下降法

演算法介紹

3a5bae61d831aaf077d32c0ef8a499a2.png

簡單來說,梯度下降就是從山頂找一條最短的路走到山腳最低的地方。但是因為選擇方向的原因,我們找到的的最低點可能不是真正的最低點。如圖所示,黑線標註的路線所指的方向並不是真正的地方。

既然是選擇一個方向下山,那麼這個方向怎麼選?每次該怎麼走?

先說選方向,在演算法中是以隨機方式給出的,這也是造成有時候走不到真正最低點的原因。

如果選定了方向,以後每走一步,都是選擇最陡的方向,直到最低點。

總結起來就一句話:隨機選擇一個方向,然後每次邁步都選擇最陡的方向,直到這個方向上能達到的最低點。

在機器學習演算法中,有時候需要對原始的模型構建損失函式然後通過優化演算法對損失函式進行優化,以便尋找到最優的引數,使得損失函式的值最小。而在求解機器學習引數的優化演算法中,使用較多的就是基於梯度下降的優化演算法(Gradient Descent,GD)。

演算法優勢

優點:效率。在梯度下降法的求解過程中,只需求解損失函式的一階導數,計算的代價比較小,可以在很多大規模資料集上應用。

缺點:求解的是區域性最優值,即由於方向選擇的問題,得到的結果不一定是全域性最優。步長選擇,過小使得函式收斂速度慢,過大又容易找不到最優解。

引數介紹

sklearn.linear_model.SGDRegressor(loss='squared_loss',*,penalty='l2',alpha=0.0001,l1_ratio=0.15,fit_intercept=True,max_iter=1000,tol=0.001,shuffle=True,verbose=0,epsilon=0.1,random_state=None,learning_rate='invscaling',eta0=0.01,power_t=0.25,early_stopping=False,validation_fraction=0.1,n_iter_no_change=5,warm_start=False,average=False)

引數

  1. loss:str,default='squared_loss',要使用的損失函式。可能的值是'squared_loss'、'huber'、'epsilon_unsensitive'或'squared_epsilon_unsensitive'普通平方表示擬合的最小平方。'huber'修改了'squared_loss',通過從平方損失切換到超過epsilon距離的線性損失,減少了對異常值的校正。'epsilon_unsensitive'忽略小於epsilon的錯誤,並且是線性的;這是SVR中使用的損失函式。'squared_epsilon_unsensitive'是相同的,但在ε的公差後變為平方損失。

  2. penalty:{'l2','l1','elasticnet'}, default='l2'。 要使用的懲罰(又名正則化術語)。預設為'l2',這是線性支援向量機模型的標準正則化器。'l1'和'elasticnet'可能會給模型(特徵選擇)帶來'l2'無法實現的稀疏性。

  3. alpha:float,default=0.0001。乘以正則項的常數。值越大,正則化越強。當學習率設為“最優”時,也用於計算學習率。

  4. l1_ratio:float,default=0.15。彈性網路混合引數,0<=l1<=1。l1_ratio=0對應於L2懲罰,l1_ratio=1到l1。僅當懲罰為“elasticnet”時使用。

  5. fit_intercept:bool,default=True。是否應該估計截距。如果為False,則假定資料已經居中。

  6. max_iter:int,default=1000。訓練資料的最大傳遞次數(也稱為epochs)。它隻影響擬合方法中的行為,而不影響部分擬合方法中的行為。

  7. tol:float,default=1e-3。停止標準。如果不是“無”,則當(損失>最佳損失-公差)更改連續的時間段時,培訓將停止。

  8. shuffle:bool,default=True。是否在每個epoch之後對訓練資料進行shuffle。

  9. verbose:int,default=0。詳細程度。

  10. epsilon:float,default=0.1。Epsilon不敏感損失函式中的Epsilon;僅當損失為'huber'、'epsilon_insensitive'或'squared_Epsilon_unsensitive'時。對於huber,它決定了一個閾值,在這個閾值下,準確的預測就變得不那麼重要了。對於epsilon-insensitive,如果當前預測與正確標籤之間的任何差異小於此閾值,則將忽略這些差異。

  11. random_state:int,RandomState instance,default=None。當shuffle設定為True時,用於洗牌資料。為跨多個函式呼叫的可複製輸出傳遞一個int。

  12. learning_rate:string,default='invscaling'。學習率方法:

    1).constant:eta=eta0

    2).optimal:eta=1.0/(alpha*(t+t0)),其中t0由LeonBottou提出的啟發式方法選擇。

    3).invscaling:eta=eta0/pow(t,功率)

    4).adaptive:eta=eta0,只要訓練持續減少。每次n_iter_no_change連續時間未能減少tol的訓練損失或未能增加tol的驗證分數(如果提前停止為真),則當前學習率除以5。

  13. eta0:double,default=0.01。'constant'、'invscaling'或'adaptive'規則的初始學習率。預設值為0.01。

  14. power_t:double,default=0.25。逆標度學習率的指數。

  15. early_stopping:bool,default=False。驗證分數沒有提高時,是否使用提前停止終止培訓。如果設定為True,則當分數方法返回的驗證分數沒有至少提高tol時,它將自動保留一部分訓練資料作為驗證,並終止訓練。

  16. validation_fraction:float,default=0.1。作為早期停機驗證設定的培訓資料的比例。必須介於0和1之間。僅在“早停”為真時使用。

  17. n_iter_no_change:int,default=5。在提前停止之前沒有改進的迭代次數。

  18. warm_start:bool,default=False。當設定為True時,將上一個呼叫的解決方案重用為fit作為初始化,否則,只需刪除以前的解決方案。當warm_start為True時,反覆呼叫fit或partial_fit會導致與一次性呼叫fit時不同的解決方案,這是因為資料的無序處理方式。如果使用動態學習率,學習率將根據已經看到的樣本數進行調整。呼叫fit重置此計數器,而partial_fit將導致增加現有計數器。

  19. average:bool or int,default=False。當設定為True時,計算所有更新的平均SGD權重,並將結果儲存在coef_u屬性中。如果設定為大於1的整數,則在看到的樣本總數達到平均值後開始平均。所以average=10將在看到10個樣本後開始平均。

屬性

  1. coef_:ndarray of shape(n_features,)。為特徵指定的權重。

  2. intercept_:ndarray of shape(1,)。截距項。

  3. average_coef_:ndarray of shape(n_features,)。分配給特徵的平均權重。僅當average=True時可用。

  4. average_intercept_:ndarray of shape(1,)。平均截距項。僅當average=True時可用。

  5. n_iter_:int。達到停止條件之前的實際迭代次數。

  6. t_:int。訓練期間進行的體重更新次數。與(n_iter_u*n_示例)相同。

方法

  1. densify():將係數矩陣轉換為密集陣列格式。

  2. fit(X, y[,coef_init, intercept_init, …]):用隨機梯度下降擬合線性模型。

  3. get_params([deep]):獲取此估計器的引數。

  4. partial_fit(X,y[,sample_weight]):對給定樣本執行一個隨機梯度下降的歷元。

  5. predict(X):用線性模型預測。

  6. score(X, y[,sample_weight]):返回預測的決定係數R^2。

  7. set_params(**kwargs):設定並驗證估計器的引數。

  8. sparsify():將係數矩陣轉換為稀疏格式。

調優方法

具體的損失函式可以通過 loss引數設定。SGDRegressor支援以下的損失函式:

  1. loss='squared_loss':Ordinary least squares(普通最小二乘法)

  2. loss='huber':Huber loss for robust regression(Huber迴歸)

  3. loss='epsilon_insensitive':linear Support Vector Regression(線性支援向量迴歸)

Huber和epsilon-insensitive損失函式可用於robustregression(魯棒迴歸)。不敏感區域的寬度必須通過引數epsilon來設定。這個引數取決於目標變數的規模。

SGDRegressor支援ASGD(平均隨機梯度下降)作為SGDClassifier。均值化可以通過設定average=True來啟用。

對於利用了squaredloss(平方損失)和l2 penalty(l2懲罰)的迴歸,在 Ridge 中提供了另一個採取averaging strategy(平均策略)的SGD變體,其使用了隨機平均梯度(SAG)演算法。

適用場景

隨機梯度下降(SGD)是一種簡單但非常有效的方法,多用用於支援向量機、邏輯迴歸等凸損失函式下的線性分類器的學習。並且SGD已成功應用於文字分類和自然語言處理中經常遇到的大規模和稀疏機器學習問題。

SGD既可以用於分類計算,也可以用於迴歸計算。

demo示例

import numpy as npfrom sklearn.linear_model import SGDRegressorfrom sklearn.pipeline import make_pipelinefrom sklearn.preprocessing import StandardScalern_samples, n_features = 10, 5rng = np.random.RandomState(0)y = rng.randn(n_samples)X = rng.randn(n_samples, n_features)#Alwaysscaletheinput.Themostconvenientwayistouseapipeline.reg=make_pipeline(StandardScaler(), SGDRegressor(max_iter=1000,tol=1e-3))reg.fit(X, y)#Pipeline(steps=[('standardscaler',StandardScaler()), ('sgdregressor',SGDRegressor())])import numpy as npfromsklearnimportlinear_modelX=np.array([[1,1],[1,2],[2,2],[2,3]])#y=1*x_0+2*x_1+3y=np.dot(X,np.array([1,2]))+3model = linear_model.SGDRegressor(loss='huber', max_iter=1000, tol=1e-3)model.fit(X,y)