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 可能会聚没有数据规范化,但这是主观的数据在手。因此,你的假设是不正确的。