【问题标题】:Python gradient descent - cost keeps increasingPython梯度下降 - 成本不断增加
【发布时间】:2017-02-07 19:48:10
【问题描述】:

我正在尝试在 python 中实现梯度下降,我的损失/成本随着每次迭代而不断增加。

我看到一些人发布了关于此的帖子,并在此处看到了答案:gradient descent using python and numpy

我相信我的实现是相似的,但看不出我做错了什么以获得爆炸性的成本价值:

Iteration: 1 | Cost: 697361.660000
Iteration: 2 | Cost: 42325117406694536.000000
Iteration: 3 | Cost: 2582619233752172973298548736.000000
Iteration: 4 | Cost: 157587870187822131053636619678439702528.000000
Iteration: 5 | Cost: 9615794890267613993157742129590663647488278265856.000000

我正在网上找到的数据集(LA Heart Data)上对此进行测试:http://www.umass.edu/statdata/statdata/stat-corr.html

导入代码:

dataset = np.genfromtxt('heart.csv', delimiter=",")

x = dataset[:]
x = np.insert(x,0,1,axis=1)  # Add 1's for bias
y = dataset[:,6]
y = np.reshape(y, (y.shape[0],1))

梯度下降:

def gradientDescent(weights, X, Y, iterations = 1000, alpha = 0.01):
    theta = weights
    m = Y.shape[0]
    cost_history = []

    for i in xrange(iterations):
        residuals, cost = calculateCost(theta, X, Y)
        gradient = (float(1)/m) * np.dot(residuals.T, X).T
        theta = theta - (alpha * gradient)

        # Store the cost for this iteration
        cost_history.append(cost)
        print "Iteration: %d | Cost: %f" % (i+1, cost)

计算成本:

def calculateCost(weights, X, Y):
    m = Y.shape[0]
    residuals = h(weights, X) - Y
    squared_error = np.dot(residuals.T, residuals)

    return residuals, float(1)/(2*m) * squared_error

计算假设:

def h(weights, X):   
    return np.dot(X, weights)

实际运行它:

gradientDescent(np.ones((x.shape[1],1)), x, y, 5)

【问题讨论】:

  • 我最好的选择是琐碎的签名问题,因为它似乎走错了方向。

标签: python numpy machine-learning regression gradient-descent


【解决方案1】:

假设你对梯度的推导是正确的,你使用的是:=-,你应该使用的是:-=。不是更新theta,而是将其重新分配给- (alpha * gradient)

编辑(在代码中修复了上述问题之后):

我在我认为正确的数据集上运行了代码,并且能够通过设置 alpha=1e-7 来获得行为成本。如果您运行它进行1e6 迭代,您应该会看到它正在收敛。这个数据集上的这种方法似乎对学习率非常敏感。

【讨论】:

  • 我认为这是我在将内容移至堆栈溢出时的一个小错字。我通过用theta = theta - (alpha * gradient) 替换该行使代码更加明确,但我仍然遇到同样的问题
【解决方案2】:

一般来说,如果你的成本在增加,那么你首先应该检查的是你的学习率是否太大。在这种情况下,速率会导致成本函数跳过最优值并向上增加到无穷大。尝试不同的学习率小值。当我遇到你描述的问题时,我通常会反复尝试 1/10 的学习率,直到找到 J(w) 减小的速率。

另一个问题可能是您的衍生实现中的错误。调试的一个好方法是进行梯度检查,以比较解析梯度与数值梯度。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 2018-09-13
    • 2019-01-31
    • 1970-01-01
    • 2019-04-08
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多