【问题标题】:Stochastic gradient descent algorithm in MATLABMATLAB中的随机梯度下降算法
【发布时间】:2017-02-18 08:51:33
【问题描述】:

我正在尝试在 MATLAB 中实现随机梯度下降,但我在某个地方出错了。我认为我检查收敛的方式可能不正确(我不太确定如何在每次迭代中更新估计器),但我不确定。我一直在尝试拟合基本的线性数据,但我得到的结果相去甚远,我希望能得到一些帮助。有人能指出我哪里出错了,为什么这不能正常工作?

谢谢!

这是数据设置和通用代码:

clear all;
close all;
clc

N_features = 2;
d = 100;
m = 100;

X_train = 10*rand(d,1);
X_test = 10*rand(d,1);
X_train = [ones(d,1) X_train];
X_test = [ones(d,1) X_test];

y_train = 5 + X_train(:,2) + 0.5*randn(d,1);
y_test = 5 + X_test(:,2) + 0.5*randn(d,1);

gamma = 0.01; %learning rate

[sgd_est_train,sgd_est_test,SSE_train,SSE_test,w] = stoch_grad(d,m,N_features,X_train,y_train,X_test,y_test,gamma);

figure(1)
plot(X_train(:,2),sgd_est_train,'ro',X_train(:,2),y_train,'go')

figure(2)
plot(X_test(:,2),sgd_est_test,'bo',X_test(:,2),y_test,'go')

而真正实现SGD的函数是:

% stochastic gradient descent

function [sgd_est_train,sgd_est_test,SSE_train,SSE_test,w] = stoch_grad(d,m,N_features,X_train,y_train,X_test,y_test,gamma)

    epsilon = 0.01; %convergence criterion
    max_iter = 10000;

    w0 = zeros(N_features,1); %initial guess
    w = zeros(N_features,1); %for convenience

    x = zeros(d,1);
    z = zeros(d,1);

    for jj=1:max_iter;
        for kk=1:d;
            x = X_train(kk,:)';
            z = gamma*((w0'*x-y_train(kk))*x);
            w = w0 - z;
        end

        if norm(w0-w,2)<epsilon
            break;
        else
            w0 = w;
        end
    end

    sgd_est_test = zeros(m,1);
    sgd_est_train = zeros(d,1);

    for ll=1:m;
        sgd_est_test(ll,1) = w'*X_test(ll,:)';
    end

    for ii=1:d;
        sgd_est_train(ii,1) = w'*X_train(ii,:)';
    end

    SSE_test = sum((sgd_est_test - y_test).^2);
    SSE_train = sum((sgd_est_train - y_train).^2);

end

【问题讨论】:

  • 你能描述一下变量吗?他们的意思是什么?我可能会帮上忙,但除非我确切地知道你在做什么,否则我帮不了。
  • 示例:你的更新方程是什么?你能用数学形式给我写出梯度吗?
  • 我测试了一下:我 98% 确信您对 w 的更新是错误的,即 z=.... 行。如果你从数据中去除噪音并给出它工作的确切解决方案。如果你改变一点w0(2),那么它会找到正确的值,但是如果你改变w0(1),那么它就不会收敛。
  • 嗨@AnderBiguri,对此感到抱歉,我对这个网站还很陌生,不知道该写什么。我使用的更新方程是:w = w_0-\gamma (w^Tx_i - y_i)x_i,其中w 是估计器的更新,w_0 是估计器的先前猜测,\gamma 是学习率,x_i 是 @987654332 @th 个特征向量的样本,y_i 是你想学习的函数的ith 个样本。

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


【解决方案1】:

我尝试将学习率降低到 0.001,结果如下:
这告诉我你的算法产生了 y=ax 而不是 y=ax + b 形式的估计(由于某种原因忽略了常数项),而且你需要降低学习率为了收敛。

【讨论】:

  • 我也试过取出 y 截距,你是对的 - 它根本没有得到 y 截距值!但是我也以较低的学习率运行了很多次,尽管它在某些情况下似乎有所帮助,但在其他情况下它仍然会产生奇怪的估计。
猜你喜欢
  • 2016-06-13
  • 2011-07-04
  • 2016-09-25
  • 2021-12-18
  • 2018-12-10
  • 2021-02-20
  • 2020-04-16
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多