梯度下降变化不起作用

Gradient Descent Variation doesn't work

我尝试实现随机梯度下降算法。 第一个解决方案有效:

def gradientDescent(x,y,theta,alpha):
    xTrans = x.transpose()
    for i in range(0,99):
        hypothesis = np.dot(x,theta)
        loss = hypothesis - y
        gradient = np.dot(xTrans,loss)
        theta = theta - alpha * gradient

    return theta

这个解决方案给出了正确的 theta 值,但是下面的算法 不工作:

def gradientDescent2(x,y,theta,alpha):
    xTrans = x.transpose();
    for i in range(0,99):
        hypothesis = np.dot(x[i],theta)
        loss = hypothesis - y[i]
        gradientThetaZero= loss * x[i][0]
        gradientThetaOne = loss * x[i][1]
    theta[0] = theta[0] - alpha * gradientThetaZero
    theta[1] = theta[1] - alpha * gradientThetaOne
    return theta

我不明白为什么解决方案2不起作用,基本上是这样 和第一个算法一样。

我使用以下代码生成数据:

def genData():
    x = np.random.rand(100,2)
    y = np.zeros(shape=100)
    for i in range(0, 100):
        x[i][0] = 1
        # our target variable
        e = np.random.uniform(-0.1,0.1,size=1)
        y[i] = np.sin(2*np.pi*x[i][1]) + e[0]
    return x,y

并按以下方式使用它:

x,y = genData()
theta = np.ones(2)
theta = gradientDescent2(x,y,theta,0.005)
print(theta)

希望你能帮帮我! 最好的问候,菲利克斯

您的第二个代码示例覆盖了对您的观察数据的每次迭代的梯度计算。

在第一个代码片段中,您根据错误(损失函数)在每次循环迭代中正确调整参数。

在第二个代码片段中,您计算​​了每次迭代中的逐点梯度计算,但随后不对其执行任何操作。这意味着您的最终更新实际上只训练最后一个数据点。

相反,如果您通过求和 ( += ) 在循环内累积梯度,它应该更接近您要查找的内容(作为损失函数梯度的表达式,相对于您的参数整个观察集)。