在Python中使用随机梯度下降的岭回归

vnjpjtjt  于 2023-06-20  发布在  Python
关注(0)|答案(3)|浏览(124)

我正在尝试使用随机梯度下降作为求解器在Python中实现岭回归的解决方案。我的SGD代码如下:

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设置为一个非常小的值~ 1 e-8时,算法才能得到有效的权重向量值。
我的理解是,规范化/缩放输入功能只有助于减少收敛时间。但是,如果特征没有归一化,则该算法不应该不能作为整体收敛。我的理解是否正确?

vdgimpew

vdgimpew1#

您可以从scikit-learn's Stochastic Gradient Descent文档中检查该算法的缺点之一是它对 * 特征缩放 * 敏感。通常,基于梯度的优化算法在归一化数据上收敛得更快。
此外,归一化对于回归方法是有利的。
在每个步骤期间对系数的更新将取决于每个特征的范围。此外,正则化项将受到大特征值的严重影响。
SGD可能在没有数据归一化的情况下收敛,但这对手头的数据是主观的。因此,你的假设是不正确的。

svmlkihl

svmlkihl2#

你的假设不正确。
很难回答这个问题,因为有很多不同的方法/环境,但我会尝试提到一些要点。

规范化

  • 当一些方法不是尺度不变的(我认为每个线性回归都不是),你真的应该规范化你的数据
  • 我认为您只是因为调试/分析而忽略了这一点
    • 规范化数据不仅与收敛时间相关,结果也会有所不同(考虑损失函数内的影响;大的值可能会对小的值造成更多的损失)!*

收敛

  • 关于标准化/非标准化数据的许多方法的收敛性可能有很多要说的,但你的情况是特殊的:
  • SGD的收敛理论只保证收敛到一些局部最小值(=凸优化问题中的全局最小值),用于某些超参数(学习率和学习时间表/衰减)
    • 当这些参数不正确时,即使使用SGD优化规范化数据也会失败!*
  • 这是新加坡元最重要的缺点之一;超参数依赖
  • 由于SGD是基于梯度和步长的,因此非规范化数据可能会对无法实现这种收敛产生巨大影响!
vc6uscn9

vc6uscn93#

为了使SGD在线性回归中收敛,步长应小于2/s,其中s是矩阵的最大奇异值(参见https://en.m.wikipedia.org/wiki/Least_mean_squares_filter中均值部分的收敛性和稳定性),在岭回归的情况下,它应该小于2 *其中p是岭罚,并且n是矩阵中的行数,因为岭回归是一种用于线性回归的谱正则化,其将每个奇异值v改变为(1 + p * n/v)。
归一化矩阵的行(或损失函数的梯度)会更改损失函数,以使每个样本具有相等的权重,并更改矩阵的奇异值,以便您可以选择接近1的步长(请参见https://en.m.wikipedia.org/wiki/Least_mean_squares_filter中的NLMS部分)。根据您的数据,它可能需要较小的步长或允许较大的步长。这完全取决于归一化是否增加或减少矩阵的最大奇异值。
但请注意,在决定是否规范化行时,不应只考虑收敛速度(由最大奇异值和最小奇异值之间的比率确定)或平均值的稳定性,但也要考虑它如何改变损失函数以及新的损失函数是否符合您的需求有时候正常化是有道理的但有时候(例如,当你想为不同的样本赋予不同的重要性时,或者当你认为信号的更大能量/范数意味着更好的信噪比时)标准化是没有意义的。

相关问题