【问题标题】:Gradient Descent Variation doesn't work梯度下降变化不起作用
【发布时间】:2023-03-18 20:14:02
【问题描述】:

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

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)

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

【问题讨论】:

  • 如果你用 print、shape 和 break 语句调试你的代码,你就会明白为什么它们不一样
  • 我正确理解:解决方案 1(您发布的第一个代码 sn-p)不是随机梯度下降,但解决方案 2 是您尝试更改解决方案 1让它变成随机梯度下降?另外,在你的genData代码中,为什么要设置x[i][0]=1,所以x的整个第一列都是1?
  • 第一列是1,因为x0 = 1

标签: python numpy gradient-descent


【解决方案1】:

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

在第一个代码 sn-p 中,您根据误差(损失函数)在每次循环迭代中适当调整参数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2016-10-31
    • 2017-06-05
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多