权重在具有梯度下降的多项式回归中爆炸

问题描述 投票:2回答:1

我刚刚开始学习机器学习,并一直在尝试将多项式拟合正弦曲线生成的数据。我知道如何以封闭形式进行此操作,但我也尝试使其与梯度下降一起使用。但是,即使罚款期非常长,我的体重也达到了惊人的高度。我究竟做错了什么?这是代码:

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个回答
0
投票

更新theta时,您必须取theta并将其减去学习权重乘以theta的导数除以训练集大小]。您还必须将刑期除以训练规模集。但是主要的问题是您的学习率太大。对于以后的调试,打印成本以查看梯度下降是否有效以及学习率是否太小或恰好是有帮助的。

以下是用于二阶多项式的代码,该代码找到了最佳的theta(如您所见,学习率确实很小)。我还添加了成本函数。

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)
© www.soinside.com 2019 - 2024. All rights reserved.