gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:29:12 25 4
gpt4 key购买 nike

我用 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;
}

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

我已经尝试过:

  • 将输入和输出值标准化为 [-1, 1] 范围
  • 将输入和输出值标准化为 [0, 1] 范围
  • 标准化输入和输出值,使其平均值 = 0 且 stddev = 1
  • 降低学习率(1e-7 是我达到的最低水平)
  • 拥有完全没有偏差的线性数据集 (y = x * 3)
  • 拥有非零偏差的线性数据集 (y = x * 3 + 2)
  • 使用 -1 到 1 之间的随机非零值初始化权重

尽管如此,权重(this.bthis.m)并未接近任何数据值,并且它们发散至无穷大。

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

<小时/>

更新:这里有一些更多的背景信息,可能有助于找出我的问题到底是什么:

我正在尝试通过线性回归伪神经元进行在线学习,对线性函数的简单近似进行建模。这样,我的参数是:

  • 权重:[this.m, this.b]
  • 输入:[x, 1]
  • 激活函数:恒等函数z(x) = x

因此,我的网络将由 y = this.m * x + this.b * 1 表示,模拟我想要近似的数据驱动函数 (y = 3 * x)。

我想要的是我的网络“学习”参数 this.m = 3this.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.mthis.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

但这似乎根本不正确。

最佳答案

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

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

您的误差函数将用于衡量您与真实值的偏差程度,并且该测量需要保持一致。我使用均方误差作为测量工具(正如您在我的error方法中看到的那样),但我使用的是纯绝对误差(y^ - y) 在训练方法内部测量误差。 您的梯度将取决于此误差函数的选择。因此,仅选择一个并坚持使用它。

其次,简化您的假设以测试问题所在。在这种情况下,我非常清楚要近似的函数是什么 (y = x * 3),因此我手动设置权重 (this.b >this.m) 到正确的值,我仍然看到错误分歧。这意味着权重初始化不是本例中的问题。

经过更多搜索后,我的错误出现在其他地方:将数据输入网络的函数错误地将 3 硬编码值传递到预测输出中(它在数组),所以我看到的振荡是因为网络试图逼近y = 0 * x + 3(this.b = 3this.array)。 m = 0),但由于学习率较小以及误差函数导数中的误差,this.b 无法接近正确的值,使得 this.m 不断跳跃以适应它。

最后,在网络训练时跟踪错误测量,以便您可以深入了解正在发生的情况。这有助于识别简单的过度拟合、大的学习率和简单的错误之间的区别。

关于machine-learning - 线性回归的梯度下降不收敛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42869949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com