0

我試圖在MATLAB中實現隨機梯度下降,但我在某處出錯了。我認爲,也許我檢查收斂的方式是不正確的(我不太清楚如何更新每次迭代的估計量),但我不確定。我一直在努力去適應基本的線性數據,但是我得到的結果相當遙遠,我希望得到一些幫助。有人能夠指出我要出錯的地方,以及爲什麼這不能正常工作?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 
+0

你能否描述一下變量?他們的意思是什麼?我可能會幫忙,但除非我知道你是如何做事的。 –

+0

例如:你的更新方程是什麼?你能用數學形式給我寫梯度嗎? –

+0

我測試了一下:我有98%的確信你的'w'更新是錯誤的,即'z = ....'行。如果您從數據中刪除噪音並給出確切的解決方案,它就可以工作。如果你改變一下'w0(2)',那麼它會找到正確的值,但是如果你改變'w0(1)',那麼它將不會收斂。 –

回答

0

我試圖降低在0.001的學習速度,並導致該: Imgur
這告訴我你的算法產生的形式估計y = a x而不是y = a x + b(出於某種原因忽略了常數項),並且還需要降低學習率以便收斂。

+0

我也嘗試拿出y截距,你說得對 - 它根本沒有得到y截距值!但是我也運行過很多次,學習率較低,儘管它在某些情況下似乎有所幫助,但它在其他情況下仍然會產生奇怪的估計。 – poppy3345