当前位置: 首页 > 知识库问答 >
问题:

线性回归不收敛的梯度下降

西门飞翮
2023-03-14

我用JavaScript实现了一个非常简单的线性回归和梯度下降算法,但是在查阅了多个源代码并尝试了几件事情之后,我无法使它收敛。

数据是绝对线性的,只是数字0到30作为输入,x*3作为正确的输出来学习。

这就是梯度下降背后的逻辑:

train(input, output) {
  const predictedOutput = this.predict(input);
  const delta = output - predictedOutput;

  this.m += this.learningRate * delta * input;
  this.b += this.learningRate * delta;
}

predict(x) {
  return x * this.m + this.b;
}

我从不同的地方取了公式,包括:

  • 乌达城深度学习基金会纳米学位的练习
  • 吴恩达的线性回归梯度下降课程(也在这里)
  • 斯坦福CS229讲义
  • 我从卡内基梅隆大学找到的其他PDF幻灯片

我已经试过了:

  • 将输入和输出值标准化为[-1,1]范围
  • 将输入和输出值标准化为[0,1]范围
  • 规范化输入和输出值,使其平均值为0,标准差为1
  • 降低学习率(1e-7与我之前一样低)
  • 具有完全没有偏差的线性数据集(y=x*3
  • 具有非零偏差的线性数据集(y=x*32
  • 使用-1和1之间的随机非零值初始化权重

然而,权重(this. bthis. m)不接近任何数据值,并且它们发散为无穷大。

我显然做错了什么,但我不知道是什么。

更新:这里有更多的上下文,可能有助于找出我的问题到底是什么:

我试图通过线性回归伪神经元的在线学习来建模线性函数的简单近似。因此,我的参数是:

  • 权重:[code>this.m,this.b][/li>

因此,我的净值将用y=表示。这个。b*1,模拟我想要近似的数据驱动函数(y=3*x)。

我想要的是让我的网络“了解”这个参数。m=3和。b=0,但我似乎陷入了局部极小值。

我的误差函数是均方误差:

error(allInputs, allOutputs) {
  let error = 0;
  for (let i = 0; i < allInputs.length; i++) {
    const x = allInputs[i];
    const y = allOutputs[i];
    const predictedOutput = this.predict(x);
    const delta = y - predictedOutput;

    error += delta * delta;
  }

  return error / allInputs.length;
}

我更新权重的逻辑是(根据我到目前为止检查的来源)wi-=alpha*dError/dwi

为了简单起见,我将把我的权重称为this. m和this. b,这样我们就可以把它与我的JavaScript代码联系起来。我还将调用y^的预测值。

从这里开始:

error = y - y^
      = y - this.m * x + this.b

dError/dm = -x
dError/db = 1

因此,将其应用于权重校正逻辑:

this.m += alpha * x
this.b -= alpha * 1

但这似乎根本不正确。


共有1个答案

尹弘壮
2023-03-14

我终于找到了问题的症结所在,我现在回答我自己的问题,希望它也能帮助这方面的初学者。

首先,正如萨沙所说,我有一些理论上的误解。您的调整包括输入值逐字逐句,这可能是正确的,但正如他所说的,它应该已经是渐变的一部分。这一切都取决于您对错误函数的选择。

你的误差函数将是衡量你用什么来衡量你与真实值的差距,这种衡量需要保持一致。我使用均方误差作为度量工具(如您在我的误差方法中看到的),但我在训练方法中使用纯绝对误差(y^-y)来度量误差。您的梯度将取决于此错误函数的选择。所以只选择一个并坚持下去。

第二,简化你的假设,以测试什么是错误的。在本例中,我非常清楚要近似的函数是什么(y=x*3),因此我手动将权重(this.bthis.m)设置为正确的值,并且仍然看到了误差偏差。这意味着在这种情况下,权重初始化不是问题。

在进一步搜索之后,我的错误出现在其他地方:将数据送入网络的函数错误地将一个3硬编码值传递到预测输出中(它在数组中使用了错误的索引),因此我看到的振荡是因为网络试图接近y=0*x 3this.b=3this.m=0),但由于学习率低和误差函数导数中的误差,this.b无法接近正确的值,使得this.m进行大范围跳跃以适应它。

最后,在您的网络训练过程中跟踪错误测量,这样您就可以对正在发生的事情有一些了解。这有助于识别简单的过度拟合、高学习率和简单错误之间的差异。

 类似资料:
  • 我试图在java中实现线性回归。我的假设是θ0θ1*x[i]。我试图计算θ0和θ1的值,使成本函数最小。我正在用梯度下降来找出值- 在 在收敛之前,这种重复是什么?我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么? 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激。

  • 我试图在MatLab中实现一个函数,该函数使用牛顿法计算最佳线性回归。然而,我陷入了一个问题。我不知道如何求二阶导数。所以我不能实施它。这是我的密码。 谢谢你的帮助。 编辑:: 我用一些纸和笔解决了这个问题。你所需要的只是一些微积分和矩阵运算。我找到了二阶导数,它现在正在工作。我正在为感兴趣的人分享我的工作代码。

  • 我试图实现梯度下降的线性回归,如本文(https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931)所述。我已经严格遵循了实现,但是经过几次迭代后,我的结果会溢出。我试图得到这个结果大约: y=-0.02x 8499.6。 代码: 在这里,它可以在围棋场上工作:https://play.go

  • 我正在学习机器学习/线性回归的Coursera课程。下面是他们如何描述用于求解估计OLS系数的梯度下降算法: 因此,他们对系数使用,对设计矩阵(或他们称之为特征)使用,对因变量使用。它们的收敛准则通常是RSS梯度的范数小于容差ε;也就是说,他们对“不收敛”的定义是: 我很难让这个算法收敛,我想知道在我的实现中是否忽略了一些东西。下面是代码。请注意,我还通过statsmodels回归库运行了我在其中

  • 好的,那么这个算法到底意味着什么呢? 据我所知: i) 阿尔法:梯度下降的步骤有多大。 ii)现在,∑{hTheta[x(i)]-y(i)}:指给定θ值的总误差。 误差是指预测值{hTheta[x(i)]}与实际值之间的差值。[y(i)] σ{hTheta[x(i)]-y(i)}给出了所有训练示例中所有误差的总和。 结尾的Xj^(i)代表什么? 在为多元线性回归实现梯度下降时,我们是否在执行以下操

  • 在机器学习课程https://share.coursera.org/wiki/index.php/ML:Linear_Regression_with_Multiple_Variables#Gradient_Descent_for_Multiple_Variables中,它说梯度下降应该收敛。 我正在使用scikit学习的线性回归。它不提供梯度下降信息。我已经看到了许多关于stackoverflow