Czy moja implementacja gradientu stochastycznego jest poprawna?

Próbuję rozwinąć stochastyczne zejście gradientowe, ale nie wiem, czy jest w 100% poprawne.

Koszt generowany przez mój stochastyczny algorytm gradientu zejścia jest czasami bardzo daleki od kosztu generowanego przez gradient gradientu FMINUC lub Batch.podczas gdy koszt spadku gradientu wsadowego zbiega się, gdy ustawię szybkość uczenia alfa 0,2, jestem zmuszony ustawić szybkość uczenia alfa 0,0001, aby moja implementacja stochastyczna nie rozbiegła się. Czy to normalne?

Oto kilka wyników uzyskanych dzięki zestawowi treningowemu 10 000 elementów i num_iter = 100 lub 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

Implementacja gradientu zstępującego dla regresji logistycznej

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

Implementacja gradientu stochastycznego dla regresji logistycznej

% 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

Dla odniesienia, tutaj jest funkcja kosztu regresji logistycznej używana w moim przykładzie

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

questionAnswers(3)

yourAnswerToTheQuestion