【问题标题】:Weights explode in polynomial regression with gradient descent权重在梯度下降的多项式回归中爆炸
【发布时间】:2020-05-08 02:15:51
【问题描述】:

我刚刚开始学习机器学习,并一直在尝试将多项式拟合到使用正弦曲线生成的数据。我知道如何以封闭的形式做到这一点,但我也试图让它与梯度下降一起工作。 然而,我的体重爆炸到了疯狂的高度,即使有一个非常大的惩罚期限。我究竟做错了什么? 代码如下:

import numpy as np
import matplotlib.pyplot as plt
from math import pi

N = 10
D = 5

X = np.linspace(0,100, N)
Y = np.sin(0.1*X)*50
X = X.reshape(N, 1)


Xb = np.array([[1]*N]).T
for i in range(1, D):
    Xb = np.concatenate((Xb, X**i), axis=1)

#Randomly initializie the weights
w = np.random.randn(D)/np.sqrt(D)

#Solving in closed form works
#w = np.linalg.solve((Xb.T.dot(Xb)),Xb.T.dot(Y))
#Yhat = Xb.dot(w)

#Gradient descent
learning_rate = 0.0001
for i in range(500):
    Yhat = Xb.dot(w)
    delta = Yhat - Y
    w = w - learning_rate*(Xb.T.dot(delta) + 100*w)

print('Final w: ', w)
plt.scatter(X, Y)
plt.plot(X,Yhat)
plt.show()

谢谢!

【问题讨论】:

    标签: python machine-learning regression linear-regression


    【解决方案1】:

    更新 theta 时,您必须将 theta 减去学习权重乘以 theta 除以训练集大小的导数。您还必须将惩罚项除以训练规模集。但主要问题是你的学习率太大。对于未来的调试,打印成本以查看梯度下降是否有效以及学习率是否太小或恰到好处会很有帮助。

    下面是找到最佳 thetas 的 2 次多项式的代码(如您所见,学习率非常小)。我还添加了成本函数。

    N = 2
    D = 2
    
    #Gradient descent
    learning_rate = 0.000000000001
    for i in range(200):
        Yhat = Xb.dot(w)
        delta = Yhat - Y
        print((1/N) * np.sum(np.dot(delta, np.transpose(delta))))
    
        w = w - learning_rate*(np.dot(delta, Xb)) * (1/N)
    

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 1970-01-01
      • 2021-06-23
      • 2021-04-30
      • 2017-06-20
      • 2019-10-09
      • 2021-01-25
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多