【问题标题】:Wrong weights using batch gradient descent使用批量梯度下降的错误权重
【发布时间】:2016-06-21 01:48:03
【问题描述】:

我正在使用二维数据进行线性回归,但我无法获得回归线的正确权重。 以下代码似乎有问题,因为 回归线的计算权重不正确。 使用太大的数据值(x 约为 80000)会导致权重为 NaN。将数据从 0 缩放到 1,会导致权重错误,因为 回归线与数据不匹配。

function [w, epoch_batch, error_batch] = batch_gradient_descent(x, y)

% number of examples
q = size(x,1);

% learning rate
alpha = 1e-10;

w0 = rand(1);
w1 = rand(1);

curr_error = inf;
eps = 1e-7;

epochs = 1e100;
epoch_batch = 1;
error_batch = inf;
for epoch = 1:epochs
    prev_error = curr_error;
    curr_error = sum((y - (w1.*x + w0)).^2);
    w0 = w0 + alpha/q * sum(y - (w1.*x + w0));
    w1 = w1 + alpha/q * sum((y - (w1.*x + w0)).*x);
    if ((abs(prev_error - curr_error) < eps))
        epoch_batch = epoch;
        error_batch = abs(prev_error - curr_error);
        break;
    end
end

w = [w0, w1];

你能告诉我我在哪里犯了错误,因为对我来说,经过几个小时的尝试,它似乎是正确的。

数据:

x
   35680
   42514
   15162
   35298
   29800
   40255
   74532
   37464
   31030
   24843
   36172
   39552
   72545
   75352
   18031

y
    2217
    2761
     990
    2274
    1865
    2606
    4805
    2396
    1993
    1627
    2375
    2560
    4597
    4871
    1119

这是绘制数据的代码:

figure(1)
% plot data points
plot(x, y, 'ro');
hold on;
xlabel('x value');
ylabel('y value');
grid on;

% x vector from min to max data point
x = min(x):max(x);
% calculate y with weights from batch gradient descent
y = (w(1) + w(2)*x);
% plot the regression line
plot(x,y,'r');

可以使用较小的学习率alpha = 1e-10 找到未缩放数据集的权重。 但是,当将数据从 0 缩放到 1 时,我仍然很难获得匹配的权重。

缩放_x =

0.4735
0.5642
0.2012
0.4684
0.3955
0.5342
0.9891
0.4972
0.4118
0.3297
0.4800
0.5249
0.9627
1.0000
0.2393

scaled_y_en =

0.0294
0.0366
0.0131
0.0302
0.0248
0.0346
0.0638
0.0318
0.0264
0.0216
0.0315
0.0340
0.0610
0.0646
0.0149

【问题讨论】:

  • 你能给出一些示例数据来调用函数吗?
  • 我添加了未缩放的数据,这导致权重的 NaN 值。从 0 缩放到 1,通过除以最大值,返回与数据不匹配的错误权重。
  • 你正试图精确地最小化这个函数?
  • 很可能错误在w1 = w1 + alpha/q * sum((y - (w1.*x + w0)).*x);,因为这条线不会使sum(y - (w1.*x + w0))变小,因此它与最小化方向相反。
  • 我想在所有样本(j = 1 to q) 上最小化成本函数J(w) = sum(yj - h_w(xj))^2。在哪里h_w(xj) = w1*x + w0.

标签: matlab machine-learning linear-regression gradient-descent


【解决方案1】:

问题在于w1,因为你给它的权重太大了。你不应该给 w0w1 相同的学习步骤,因为一个不乘以 x

如果我用alpha^4/q 替换alpha/q(因为随机选择),那么它会收敛:

【讨论】:

  • 0.01 不够小。
  • @evolved 不一定,不是。您正在给一个任意的、用户指定的学习率,它取决于数据的规模。这就是大多数算法使用标准化数据的原因。
  • @evolved 是的......真的,这里没有魔法发生。一般情况下,如果归一化,[0.01-0.5]的值就不错了,不过你只需要试一试....
  • 我还建议使用零均值和单位方差标准化您的数据,以便算法可以更快地收敛。但是,权重将与归一化数据相关,因此如果要执行任何预测,则必须获取此数据并使用训练数据的均值和方差对其进行归一化。这个帖子可能会提供更多见解:stackoverflow.com/questions/35419882/… - 但是,它是用于逻辑回归而不是线性的,但更新规则几乎相同。
  • @evolved 看看 ray 要说什么,他知道这些。
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 2019-08-28
  • 2020-08-06
  • 2021-01-23
  • 2020-04-28
  • 2013-02-08
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多