我正在尝试开发随机梯度下降法,但我不知道它是否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
    

    最佳答案

    没关系。如果您担心选择合适的学习率alpha,则应该考虑应用行搜索方法。

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

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

    注意:对于较大的正则化因子(lambda = 100lambda = 1000),deltaAlpha可能太大,并且梯度下降可能会发散。如果是这种情况,请减少deltaAlpha 10次(deltaAlpha = 0.001deltaAlpha = 0.0001),直到获得适合其梯度下降收敛的deltaAlpha为止。

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

    10-07 19:45
    查看更多