我正在尝试运行渐变下降并且在使用完全相同的数据时无法获得与八度内置fminunc相同的结果
我的代码是
%for 5000 iterations
for iter = 1:5000
%%Calculate the cost and the new gradient
[cost, grad] = costFunction(initial_theta, X, y);
%%Gradient = Old Gradient - (Learning Rate * New Gradient)
initial_theta = initial_theta - (alpha * grad);
end
当给定示例(X,y)和参数(theta)时,costFunction会计算成本和梯度。
一个内置的八度函数fminunc也调用了costFunction,并且使用相同的数据在更少的迭代中找到了更好的答案。
鉴于octave使用相同的成本函数,我假设costFunction是正确的。
我尝试降低学习率,以防我达到局部最小值并增加迭代次数,成本停止下降所以我认为它似乎找到了最小值,但最终theta仍然有更大成本并没有接近准确
即使fminunc正在使用更好的算法,梯度下降最终会在足够的迭代次数和更低的学习率下找到相同的答案吗?
或者任何人都可以看到我做错了什么?
感谢您的帮助。
答案 0 :(得分:2)
您的评论错误,但算法很好。
在梯度下降中很容易陷入数值问题,然后我建议执行特征归一化。
另外,如果您不确定自己的学习率,请尝试动态调整。类似的东西:
best_cost = Inf;
best_theta = initial_theta;
alpha = 1;
for iter = 1:500
[cost, grad] = costFunction(best_theta, X_reg, y);
if (cost < best_cost)
best_theta = best_theta - alpha * grad;
best_cost = cost;
else
alpha = alpha * 0.99
end
end
此外,请记住,不同的答案可以给出相同的决策边界。例如,假设h(x)= x(0)+ theta(1)* x(1)+ theta(2)* x(2)这些答案给出相同的边界:
theta = [5, 10, 10];
theta = [10, 20, 20];