我正在尝试开发随机梯度下降法,但我不知道它是否100%正确。
这是我使用10,000个元素的训练集获得的一些结果,并且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
最佳答案
没关系。如果您担心选择合适的学习率alpha
,则应该考虑应用行搜索方法。
线搜索是一种在每次迭代中为梯度下降选择最佳学习率的方法,比在整个优化过程中使用固定学习率更好。学习率alpha
的最佳值是一个局部值(从当前theta
沿负梯度的方向)使成本函数最小化的值。
例如,在梯度下降的每次迭代中,从学习速率alpha = 0
开始,然后以固定步长alpha
逐渐增加deltaAlpha = 0.01
。重新计算参数theta
并评估成本函数。由于成本函数是凸的,因此通过增加alpha
(即,通过沿负梯度的方向移动),成本函数将首先开始下降,然后(在某个时候)增加。在那一刻,停止行搜索并获取成本函数开始增加之前的最后一个alpha
。现在,使用该theta
更新参数alpha
。如果cost函数从不开始增加,请在alpha = 1
处停止。
注意:对于较大的正则化因子(lambda = 100
,lambda = 1000
),deltaAlpha
可能太大,并且梯度下降可能会发散。如果是这种情况,请减少deltaAlpha
10次(deltaAlpha = 0.001
,deltaAlpha = 0.0001
),直到获得适合其梯度下降收敛的deltaAlpha
为止。
另外,您应该考虑使用某些除迭代次数以外的终止条件,例如当两个后续迭代中的成本函数之间的差异变得足够小(小于一些epsilon
)时。