Ist meine Umsetzung der stochastic gradient descent korrekt?

Ich versuche mich zu entwickeln stochastic gradient descent, aber ich weiß nicht, ob es 100% korrekt ist.

  • Die Kosten erzeugt, die durch meine stochastic gradient descent Algorithmus ist manchmal sehr weit von dem durch Sie erzeugten FMINUC oder Batch gradient descent.
  • während batch gradient descent Kosten konvergieren, wenn ich ein learning rate alpha von 0,2, bin ich gezwungen, mich zu setzen, einen Lern-rate-alpha 0,0001 für meine Stochastik-Umsetzung für es nicht zu divergieren. Ist das normal?

Hier sind einige Ergebnisse, die ich mit einem Trainingssatz von 10.000 Elemente und num_iter = 100 oder 500

    FMINUC : 
    Iteration  #100 | Cost: 5.147056e-001

    BACTH GRADIENT DESCENT  500 ITER
    Iteration #500 - Cost = 5.535241e-001

    STOCHASTIC GRADIENT DESCENT 100 ITER
    Iteration #100 - Cost = 5.683117e-001  % First time I launched
    Iteration #100 - Cost = 7.047196e-001  % Second time I launched

Gradient-descent-Implementierung für Logistische regression

J_history = zeros(num_iters, 1); 

for iter = 1:num_iters 

    [J, gradJ] = lrCostFunction(theta, X, y, lambda);
    theta = theta - alpha * gradJ;
    J_history(iter) = J;

    fprintf('Iteration #%d - Cost = %d... \r\n',iter, J_history(iter));
end

Stochastic gradient descent-Implementierung für Logistische regression

% number of training examples
m = length(y);

% STEP1 : we shuffle the data
data = [y, X];
data = data(randperm(size(data,1)),:);
y = data(:,1);
X = data(:,2:end);

for iter = 1:num_iters 

     for i = 1:m
        x = X(i,:); % Select one example
        [J, gradJ] = lrCostFunction(theta, x, y(i,:), lambda);
        theta = theta - alpha * gradJ;
     end

     J_history(iter) = J;
     fprintf('Iteration #%d - Cost = %d... \r\n',iter, J);

end

Für Referenz, hier ist die Logistische regression die Kosten-Funktion in meinem Beispiel

function [J, grad] = lrCostFunction(theta, X, y, lambda)

m = length(y); % number of training examples

% We calculate J    
hypothesis = sigmoid(X*theta); 
costFun = (-y.*log(hypothesis) - (1-y).*log(1-hypothesis));    
J = (1/m) * sum(costFun) + (lambda/(2*m))*sum(theta(2:length(theta)).^2);

% We calculate grad using the partial derivatives
beta = (hypothesis-y); 
grad = (1/m)*(X'*beta);
temp = theta;  
temp(1) = 0;   % because we don't add anything for j = 0  
grad = grad + (lambda/m)*temp; 
grad = grad(:);

end
InformationsquelleAutor alexandrekow | 2014-01-25
Schreibe einen Kommentar