Numpy 多元线性回归的学习率太低

Numpy 多元线性回归的学习率太低,numpy,machine-learning,linear-regression,learning-rate,Numpy,Machine Learning,Linear Regression,Learning Rate,我正在尝试为scikit学习中的boston数据集构建一个多元线性回归模型 我使用随机梯度下降(SGD)来优化模型。似乎我必须使用非常小的学习率(0.000000001)来进行模型学习。如果我使用更大的学习率,模型将无法学习,并偏离NaN或inf 下面是我的问题: 使用这样小的学习率可以吗?或者我下面的代码有问题吗 验证数据集的丢失似乎减少了,增加了一段时间,然后又减少了。这种情况下,我的模型陷入过度拟合问题,但幸运地逃脱了由于SGD的不稳定性的力量相比,批梯度下降法 这是我的密码: 从skle

我正在尝试为scikit学习中的
boston
数据集构建一个多元线性回归模型

我使用随机梯度下降(SGD)来优化模型。似乎我必须使用非常小的学习率(0.000000001)来进行模型学习。如果我使用更大的学习率,模型将无法学习,并偏离NaN或inf

下面是我的问题:

  • 使用这样小的学习率可以吗?或者我下面的代码有问题吗
  • 验证数据集的丢失似乎减少了,增加了一段时间,然后又减少了。这种情况下,我的模型陷入过度拟合问题,但幸运地逃脱了由于SGD的不稳定性的力量相比,批梯度下降法
  • 这是我的密码:

    从sklearn导入数据集
    将numpy作为np导入
    将matplotlib.pyplot作为plt导入
    def损失(x、y、w):
    预测y=x@w
    返回np.sqrt(np.mean(np.square((y-predict_y)))
    def状态(w):
    w=np.挤压(w)
    打印(“w=[”,end=”“)
    对于范围(14)内的i:
    如果(i==13):
    打印(w_[i],end=“]”)
    其他:
    打印(w_[i],end=“,”)
    打印()
    培训损失=损失(培训x、培训y、培训w)
    验证损失=损失(验证x、验证y、w)
    打印(“培训损失=”+str(培训损失))
    打印(“验证丢失=“+str(验证丢失))
    培训_预测_y=培训_x@w
    验证\预测\ y=验证\ x@w
    打印({:^40s}{:^40s})。格式(“培训”、“验证”)
    打印({:^20s}{:^20s}{:^20s}{:^20s})。格式(“预测y”、“真实y”、“预测y”、“真实y”))
    对于范围(10)内的i:
    打印(“{:^20f}{:^20f}{:^20f}{:^20f}”)。格式(float(training_predict_y[i])、float(training_y[i])、float(validation_predict_y[i])、float(validation_y[i]))
    打印()
    def绘图(标题、数据):
    标题(标题)
    plt.绘图(范围(长度(数据)),数据)
    plt.savefig(标题+“.png”,dpi=300)
    plt.show()
    np.random.seed(2020)#用于一致性
    #资料
    dataset=datasets.load_boston()
    x=dataset.data
    y=dataset.target
    #重新格式化数据
    x=np.连接((np.ones((x.shape[0],1)),x),轴=1)#x0=1인 열 추가
    y轴=np。展开尺寸(y轴=1)
    #将数据分为训练集和验证集
    训练x=x[0:406,:]
    培训y=y[0:406,:]
    验证x=x[406:506,:]
    验证_y=y_[406:506,:]
    #初始化w
    w=np.random.rand(x_uu.shape[1],1)
    打印(“培训前…”)
    现状(w)
    #超参数
    纪元=100000
    lr=0.000000001
    培训损失=[]
    验证损失=[]
    数据数量=训练形状[0]
    对于范围内的历元(历元):
    对于范围内的i(数据数量):
    样本=训练x[i:i+1,:]
    真y=训练y[i:i+1,:]
    预测y=样本@w
    #计算梯度
    梯度=-(2/sample.shape[0])*sample.T@(真y-预测y)
    #更新w
    w=w-lr*梯度
    培训损失=损失(培训x、培训y、培训w)
    验证损失=损失(验证x、验证y、w)
    培训损失。追加(培训损失)
    验证损失。追加(验证损失)
    打印(“培训后…”)
    现状(w)
    情节图(“培训损失-新加坡元”,培训损失)
    图(“验证损失-新加坡元”,验证损失)
    
    下面是验证数据集的损失曲线。
    之所以学习率如此之低,是因为我没有规范化输入数据。如果要素的比例不同,则必须规范化数据。我规范化了数据,并且我可以以合理的学习率(0.001)学习模型