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