0

我正在嘗試使用隨機梯度下降作爲求解器來實現Python中嶺迴歸的解決方案。我對SGD代碼如下:在Python中使用隨機梯度下降進行嶺迴歸

def fit(self, X, Y): 
    # Convert to data frame in case X is numpy matrix 
    X = pd.DataFrame(X) 

    # Define a function to calculate the error given a weight vector beta and a training example xi, yi 

    # Prepend a column of 1s to the data for the intercept 
    X.insert(0, 'intercept', np.array([1.0]*X.shape[0])) 

    # Find dimensions of train 
    m, d = X.shape 

    # Initialize weights to random 
    beta = self.initializeRandomWeights(d) 
    beta_prev = None 

    epochs = 0 
    prev_error = None 
    while (beta_prev is None or epochs < self.nb_epochs): 
     print("## Epoch: " + str(epochs)) 
     indices = range(0, m) 
     shuffle(indices) 
     for i in indices: # Pick a training example from a randomly shuffled set 
      beta_prev = beta 
      xi = X.iloc[i] 
      errori = sum(beta*xi) - Y[i] # Error[i] = sum(beta*x) - y = error of ith training example 
      gradient_vector = xi*errori + self.l*beta_prev 
      beta = beta_prev - self.alpha*gradient_vector 
     epochs += 1 

我在測試這個數據不是標準化的,我的實現總是與所有的權重爲無限遠,即使我初始化加權向量低值結束。只有當我將學習速率alpha設置爲一個非常小的值〜1e-8時,算法纔會以加權向量的有效值結束。

我的理解是,標準化/縮放輸入功能僅有助於縮短收斂時間。但是如果這些特徵沒有被標準化,那麼該算法不應該整體上不會收斂。我的理解是否正確?

回答

0

你的假設是不正確的。

很難回答這個問題,因爲有很多不同的方法/環境,但我會嘗試提及一些觀點。

正常化

  • 當一些方法不標度不變的(我認爲每一個線性迴歸是不是),你真的應該標準化您的數據
    • 我認爲你只是忽略了這一點,因爲調試/分析
  • 正常化您的數據不僅與收斂時間有關,結果也會有所不同(想想損失-f油膏;大的價值可能會對小的損失產生更多的損失)!

融合

  • 有大概是多少講述的歸一化/非規範化的數據很多方法收斂,但你的情況比較特殊:只
    • SGD的收斂理論保證收斂到一些局部最小值(在你的凸 - opt問題中的全局最小值),用於某些超參數(學習率和學習時間表/衰減)的挑戰
    • 即使優化標準化數據,如果這些參數錯誤,SGD也會失敗!
      • 這是SGD最重要的缺點之一;對超參數的依賴
    • 作爲SGD是基於梯度和步長,非規範化的數據有沒有實現這一融合可能是一個巨大的影響!
1

您可以檢查從scikit-learn's隨機梯度下降的文檔,該算法的缺點之一是,它是特徵縮放敏感。通常,基於梯度的優化算法在歸一化數據上收斂得更快。

此外,歸一化對迴歸方法有利。

每個步驟中係數的更新將取決於每個功能的範圍。此外,正則化術語將受到大特徵值的嚴重影響。

SGD 可能會聚沒有數據規範化,但這是主觀的數據在手。因此,你的假設是不正確的。