我的Gradient Descent算法有什么问题

时间:2014-10-31 12:04:41

标签: algorithm matlab optimization machine-learning gradients

您好我正在尝试为函数实现渐变下降算法:

enter image description here

算法的起点是w =(u,v)=(2,2)。学习率为eta = 0.01且bound = 10 ^ -14。这是我的MATLAB代码:

function [resultTable, boundIter] = gradientDescent(w, iters, bound, eta)
% FUNCTION [resultTable, boundIter] = gradientDescent(w, its, bound, eta)
% 
% DESCRIPTION: 
% - This function will do gradient descent error minimization for the
% function E(u,v) = (u*exp(v) - 2*v*exp(-u))^2.
%
% INPUTS: 
% 'w' a 1-by-2 vector indicating initial weights w = [u,v]
% 'its' a positive integer indicating the number of gradient descent
% iterations
% 'bound' a real number indicating an error lower bound
% 'eta' a positive real number indicating the learning rate of GD algorithm
%
% OUTPUTS: 
% 'resultTable' a iters+1-by-6 table indicating the error, partial
% derivatives and weights for each GD iteration
% 'boundIter' a positive integer specifying the GD iteration when the error
% function got below the given error bound 'bound'
% 


% The error function 
E = @(u,v) (u*exp(v) - 2*v*exp(-u))^2;

% Partial derivative of E with respect to u 
pEpu = @(u,v) 2*(u*exp(v) - 2*v*exp(-u))*(exp(v) + 2*v*exp(-u));
% Partial derivative of E with respect to v 
pEpv = @(u,v) 2*(u*exp(v) - 2*v*exp(-u))*(u*exp(v) - 2*exp(-u));

% Initialize boundIter
boundIter = 0;
% Create a table for holding the results
resultTable = zeros(iters+1, 6);
% Iteration number
resultTable(1, 1) = 0;
% Error at iteration i
resultTable(1, 2) = E(w(1), w(2));
% The value of pEpu at initial w = (u,v)
resultTable(1, 3) = pEpu(w(1), w(2));
% The value of pEpv at initial w = (u,v)
resultTable(1, 4) = pEpv(w(1), w(2));
% Initial u
resultTable(1, 5) = w(1);
% Initial v
resultTable(1, 6) = w(2);

% Loop all the iterations
for i = 2:iters+1

    % Save the iteration number
    resultTable(i, 1) = i-1; 
    % Update the weights
    temp1 = w(1) - eta*(pEpu(w(1), w(2)));
    temp2 = w(2) - eta*(pEpv(w(1), w(2)));
    w(1) = temp1;
    w(2) = temp2;
    % Evaluate the error function at new weights
    resultTable(i, 2) = E(w(1), w(2));
    % Evaluate pEpu at the new point 
    resultTable(i, 3) = pEpu(w(1), w(2));
    % Evaluate pEpv at the new point
    resultTable(i, 4) = pEpv(w(1), w(2));
    % Save the new weights
    resultTable(i, 5) = w(1);
    resultTable(i, 6) = w(2);
    % If the error function is below a specified bound save this iteration
    % index
    if E(w(1), w(2)) < bound
        boundIter = i-1;
    end

end

这是我的机器学习课程中的练习,但由于某种原因,我的结果都是错误的。代码中肯定有问题。我已经尝试过调试和调试它并且没有发现任何问题...有人能够确定我的问题在哪里吗?...换句话说,你可以检查代码是否是给定函数的有效梯度下降算法?

如果我的问题太清楚或者您需要更多信息,请告诉我。)

感谢您的努力和帮助! =)

这是我五次迭代的结果以及其他人得到的结果:

  

参数:w = [2,2],eta = 0.01,bound = 10 ^ -14,iters = 5

enter image description here

3 个答案:

答案 0 :(得分:4)

正如下面讨论的问题:我会说其他错误...你的最小化导致E(u,v)的值更小,检查:

E(1.4,1.6) = 37.8 >> 3.6 = E(0.63, -1.67)

答案 1 :(得分:4)

不是一个完整的答案,但我们去吧:

我在你的代码中添加了一个绘图部分,所以你可以看到最新情况。

u1=resultTable(:,5);
v1=resultTable(:,6);
E1=E(u1,v1);
E1(E1<bound)=NaN;
[x,y]=meshgrid(-1:0.1:5,-5:0.1:2);Z=E(x,y);
surf(x,y,Z)

hold on
plot3(u1,v1,E1,'r')
plot3(u1,v1,E1,'r*')

enter image description here 结果表明您的算法正在为该函数做正确的事情。所以,正如其他人所说,或者其他所有人都错了,或者你没有使用正确的方程式。

答案 2 :(得分:2)

(我为不仅仅是评论而道歉,但我是新手,无法发表评论。)

看来您的算法正在做正确的事情。你想要确定的是,每一步能量都在缩小(就是这样)。有几个原因导致你的数据点可能与班级中的其他人不一致:他们可能是错的(你或班上的其他人),他们可能从不同的点开始,他们可能使用不同的步长(你是什么)我打电话给eta。)

理想情况下,您不希望对迭代次数进行硬编码。您希望继续,直到达到局部最小值(希望是全局最小值)。要检查这一点,您希望两个偏导数都为零(或非常接近)。此外,为确保您处于当地最小值(不是当地最大值或马鞍点),您应该检查E_uu * E_vv - E_uv ^ 2的符号以及E_uu的符号:http://en.wikipedia.org/wiki/Second_partial_derivative_test细节(二阶导数测试,在顶部)。如果您发现自己处于局部最大值或鞍点,则渐变将告诉您不要移动(因为偏导数为0)。既然你知道这不是最优的,你必须干扰你的解决方案(有时称为模拟退火)。

希望这有帮助。