【问题标题】:Is my implementation of stochastic gradient descent correct?我的随机梯度下降的实现是否正确?
【发布时间】:2014-02-16 14:15:23
【问题描述】:

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

  • 我的随机梯度下降算法产生的成本有时与 FMINUC 或批量梯度下降产生的成本相差甚远。
  • 虽然当我将学习率 alpha 设置为 0.2 时批量梯度下降成本会收敛,但我不得不将学习率 alpha 设置为 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

【问题讨论】:

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


    【解决方案1】:

    这很好。如果你担心选择合适的学习率alpha,你应该考虑应用line search方法。

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

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

    注意:对于大的正则化因子(lambda = 100lambda = 1000),deltaAlpha 可能太大而梯度下降发散。如果是这种情况,请将 deltaAlpha 减少 10 倍(deltaAlpha = 0.001deltaAlpha = 0.0001),直到达到梯度下降收敛的适当 deltaAlpha

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

    【讨论】:

      【解决方案2】:

      学习率值较小是有原因的。简而言之,当学习率以适当的速率降低时,并且受到相对温和的假设的影响,当目标函数为 伪凸,否则几乎肯定会收敛到局部最小值。这实际上是 Robbins-Siegmund 定理的结果。

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

      【讨论】:

      • 我的理解是,如果学习率是固定的,那么成本将在全局最小值附近“振荡”,但永远不会达到。这就是为什么如果我们以固定速率降低学习率,例如将其乘以 0.8,那么算法将越来越少地振荡,最终达到非常接近最小值的值。
      • 是的,你是对的。当你使用固定的学习率时,我所说的就会发生。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-09-25
        • 2021-02-20
        • 2011-07-04
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2016-06-13
        • 2018-09-10
        • 1970-01-01
        相关资源
        最近更新 更多