【问题标题】:Linear Regression Stochastic Gradient Descent线性回归随机梯度下降
【发布时间】:2022-01-20 17:37:59
【问题描述】:

我正在尝试拟合添加了一些高斯噪声的正弦波 (sin(2 pi x))。我正在使用随机梯度下降算法,我试图拟合的模型在参数中是线性的。我使用了[1 x^1 x^2 ... x^5] 的简单基函数。损失函数是最小二乘损失。

def gradient_descent(phi, Y, W, a):
    N = len(Y)
    for i in range(N):
        dE_dW = (np.matmul(np.array([W]), np.array([phi[i]]).T)[0][0] - Y[i]) * phi[i]
        W = W - a * dE_dW
    return W

为了采样,我正在这样做,

noise_sample = np.random.normal(loc = 0, scale = 0.07, size = sample_size)
for i in range(sample_size):
   x = random.uniform(0.0, 0.5)
   y = sin(x)
   X.append(x), Y.append(y)
X, Y = np.array(X), np.array(Y)
permutation = np.random.permutation(sample_size)
X, Y = X[permutation], Y[permutation]
Y = np.add(Y, noise_sample)

order = 5
phi = np.array([np.ones(sample_size)]).T
for i in range(order):
   phi = np.c_[phi, X ** (i + 1)]
W = np.random.uniform(low=0.0, high=1.0, size=(order+1,))

在这种情况下,我将其作为拟合曲线(橙色)。

当我尝试使用封闭式解决方案获得相同的学位时,

phi_inv = np.matmul(np.linalg.inv(np.matmul(phi.T, phi)), phi.T)
weights = np.matmul(phi_inv, Y.T)

我得到了想要的曲线。是不是我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    这可能是步长/学习率过大a 的问题。您正在计算的梯度只是真实梯度的噪声版本。如果您的步长太大,您几乎只是随机地跳来跳去。当然,如果您选择的太小,您将永远无法达到最佳状态,而只能停留在您开始的位置附近。

    您可以从较大的步长值开始,然后随着时间的推移减小它。您还可以多次迭代您的训练集,或者根据小批量计算梯度,即所有样本的一小部分。在任何情况下,尝试检查梯度是否随着时间的推移而消失,看看你是否正在收敛。如果它下降,还要检查你的损失函数。

    【讨论】: