Я пытаюсь разработать стохастический градиентный спуск, но я не знаю, соответствует ли он на 100%.Является ли моя реализация стохастического градиентного спуска правильной?
- Стоимость, создаваемая моим алгоритмом стохастического градиентного спуска, иногда очень далека от того, который генерируется с помощью FMINUC или спуска градиента партии.
- , в то время как расходы на градиентный градиент партии сходятся, когда я устанавливаю скорость обучения альфа 0,2, я вынужден установить скорость обучения альфа 0,0001 для моей стохастической реализации, чтобы она не расходилась. Это нормально?
Вот некоторые результаты, которые я, полученные с помощью обучающего набора 10000 элементов и num_iter = 100 или 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
Градиент реализации спуска для логистической регрессии
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
Стохастический градиента спуск для логистической регрессии
% 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
Для справки, здесь есть функция логистической регрессии стоимость используется в моем примере
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
Что я понимаю, если, если скорость обучения фиксирована, тогда стоимость будет «колебаться» вокруг глобального минимума, но никогда не дойдет до нее. Поэтому, если мы уменьшим скорость обучения с фиксированной скоростью, например, умножив ее на 0,8, тогда алгоритм будет колебаться все меньше и меньше и в конечном итоге достигнет значения, очень близкого к минимуму. – alexandrekow
Да, вы правы. То, что я сказал, происходит, когда вы используете фиксированную скорость обучения. – NKN