我的随机梯度下降的实现是否正确?

时间:2014-01-25 14:56:11

标签: matlab machine-learning logistic-regression gradient-descent

我正在尝试开发随机梯度下降,但我不知道它是否100%正确。

  • 我的随机梯度下降算法产生的成本有时与FMINUC或批量梯度下降产生的成本相差甚远。
  • 当批量梯度下降成本收敛时,当我设置学习率α为0.2时,我被迫为我的随机实现设置学习率α为0.0001,因为它不会发散。这是正常的吗?

以下是我使用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

3 个答案:

答案 0 :(得分:2)

这非常好。如果您担心选择合适的学习率alpha,则应考虑应用行搜索方法。

线搜索是一种在每次迭代时选择梯度下降的最佳学习率的方法,这比在整个优化过程中使用固定学习率更好。学习率alpha的最佳值是局部(从负梯度方向的当前theta)最小化成本函数。

在梯度下降的每次迭代中,例如,从学习率alpha = 0开始,逐步增加alpha固定步骤deltaAlpha = 0.01。重新计算参数theta并评估成本函数。由于成本函数是凸的,通过增加alpha(即,通过在负梯度的方向上移动),成本函数将首先开始减小然后(在某个时刻)增加。此时停止行搜索并在成本函数开始增加之前采用最后alpha。现在使用theta更新参数alpha。如果成本函数从未开始增加,请停在alpha = 1

注意:对于较大的正则化因子(lambda = 100lambda = 1000),deltaAlpha可能过大且梯度下降偏离。如果是这种情况,请将deltaAlpha减少10次(deltaAlpha = 0.001deltaAlpha = 0.0001),直至找到适合梯度下降收敛的deltaAlpha

此外,您应该考虑使用除迭代次数之外的某些终止条件,例如:当两次后续迭代中的成本函数之间的差异变得足够小时(小于某些epsilon)。

答案 1 :(得分:0)

学习率的值很小。简而言之,当学习率以适当的速率降低并且受到相对温和的假设时,当目标函数时,随机梯度下降几乎肯定会收敛到全局最小值 pseudoconvex ,并且几乎肯定会收敛到本地最小值。这实际上是 Robbins-Siegmund 定理的结果。

  

罗宾斯,赫伯特; Siegmund,David O.(1971)。 “收敛定理   对于非负面的几乎超级鞅和一些应用“   Rustagi,Jagdish S.统计中的优化方法。学术出版社

答案 2 :(得分:-1)

学习率始终在0到1之间。如果您将学习率设置得非常高,那么由于跳过,它会在较小程度上遵循所需的学习率。因此,即使花费更多时间,也需要很小的学习率。输出结果将更有说服力。