为什么我的Gradient错了(Coursera,Logistic回归,Julia)?

时间:2016-05-06 09:28:43

标签: gradient julia logistic-regression gradient-descent

我正在尝试从朱莉娅的Coursera进行Logistic回归,但它不起作用。

用于计算渐变的Julia代码:

sigmoid(z) = 1 / (1 + e ^ -z)

hypotesis(theta, x) = sigmoid(scalar(theta' * x))

function gradient(theta, x, y)
    (m, n) = size(x)
    h = [hypotesis(theta, x[i,:]') for i in 1:m]
    g = Array(Float64, n, 1)
    for j in 1:n
        g[j] = sum([(h[i] - y[i]) * x[i, j] for i in 1:m])
    end
    g
end

如果使用此渐变,则会产生错误的结果。无法弄清楚原因,代码似乎是正确的。

full Julia script。在这个脚本中,使用我的Gradient Descent实现和使用内置的Optim包计算出最佳的Theta,结果是不同的。

2 个答案:

答案 0 :(得分:5)

渐变是正确的(达到标量倍数,正如@roygvib指出的那样)。问题在于梯度下降。

如果你在梯度下降期间查看成本函数的值,你会看到很多NaN, 这可能来自指数: 降低步长(例如,到1e-5)将避免溢出, 但是你必须经常增加迭代次数(可能是10_000_000)。

更好(更快)的解决方案是让步长变化。 例如,可以将步长乘以1.1 如果一步后成本函数改善了 (最佳状态仍然朝这个方向看很远:我们可以走得更快), 如果没有,则将其除以2(我们走得太快,最后超过最小值)。

还可以在渐变方向上进行线搜索,以找到最佳步长 (但这很耗时,可以用近似值代替,例如,Armijo的规则)。

重新调整预测变量也有帮助。

答案 1 :(得分:4)

我尝试使用以下例程将OP代码中的cost_j()function grad_num( theta, x, y ) g = zeros( 3 ) eps = 1.0e-6 disp = zeros( 3 ) for k = 1:3 disp[:] = theta[:] disp[ k ]= theta[ k ] + eps plus = cost_j( disp, x, y ) disp[ k ]= theta[ k ] - eps minus = cost_j( disp, x, y ) g[ k ] = ( plus - minus ) / ( 2.0 * eps ) end return g end 的数值导数(这是最小化的目标函数)进行比较

cost_j( theta, x, y )

但是从这两个例程中获得的梯度值似乎并不一致(至少在最小化的初始阶段)...所以我手动导出了m的渐变,从中看起来似乎#/ OP's code # g[j] = sum( [ (h[i] - y[i]) * x[i, j] for i in 1:m ] ) #/ modified code g[j] = sum( [ (h[i] - y[i]) * x[i, j] for i in 1:m ] ) / m 的除法缺失:

alpha

因为我不太确定上面的代码和表达是否真的正确,你能自己检查一下吗??

但事实上,无论我是使用原始渐变还是校正渐变,程序都会收敛到相同的最小值(0.2034977016,几乎与从Optim获得的相同),因为两个渐变仅仅是乘法因子!由于收敛速度非常慢,我还根据Vincent的建议自适应地修改了步长function gradient_descent(x, y, theta, alpha, n_iterations) ... c = cost_j( theta, x, y ) for i = 1:n_iterations c_prev = c c = cost_j( theta, x, y ) if c - c_prev < 0.0 alpha *= 1.01 else alpha /= 1.05 end theta[:] = theta - alpha * gradient(theta, x, y) end ... end (这里我使用了更加适中的加速/减速值):

optimal_theta = gradient_descent( x, y, [0 0 0]', 1.5e-3, 10^7 )[ 1 ]

并将此例程称为

cost_j

{{1}}与迭代步骤的变化如下所示。enter image description here