gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:56 32 4
gpt4 key购买 nike

我正在尝试开发随机梯度下降法,但我不知道它是否 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开始,以固定步长deltaAlpha = 0.01逐渐增加alpha > 例如。重新计算参数 theta 并评估成本函数。由于成本函数是凸的,通过增加 alpha(即,通过向负梯度方向移动)成本函数将首先开始减少,然后(在某个时刻)增加。在那一刻停止线搜索并在成本函数开始增加之前取最后一个 alpha 。现在用 alpha 更新参数 theta。如果成本函数永远不会开始增加,请在 alpha = 1 处停止。

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

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

关于matlab - 我对随机梯度下降的实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352101/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com