作为我作业的一部分,我被要求实施随机梯度下降以解决线性回归问题(尽管我只有200个训练样例)。我的问题是,随机梯度下降过于平滑,几乎与批量梯度下降完全一致,这让我想到:为什么它看起来如此平滑,考虑到通常情况下噪音更大。是因为我只用了200个例子吗?
趋同图:
具有随机梯度下降权重的MSE:2.78441258841
具有梯度下降权重的MSE:2.78412631451(与具有正态方程的权重的MSE相同)
我的代码:
def mserror(y, y_pred):
n = y.size
diff = y - y_pred
diff_squared = diff ** 2
av_er = float(sum(diff_squared))/n
return av_er
def linear_prediction(X, w):
return dot(X,np.transpose(w))
def gradient_descent_step(X, y, w, eta):
n = X.shape[0]
grad = (2.0/n) * sum(np.transpose(X) * (linear_prediction(X,w) - y), axis = 1)
return w - eta * grad
def stochastic_gradient_step(X, y, w, train_ind, eta):
n = X.shape[0]
grad = (2.0/n) * np.transpose(X[train_ind]) * (linear_prediction(X[train_ind],w) - y[train_ind])
return w - eta * grad
。
def gradient_descent(X, y, w_init, eta, max_iter):
w = w_init
errors = []
errors.append(mserror(y, linear_prediction(X,w)))
for i in range(max_iter):
w = gradient_descent_step(X, y, w, eta)
errors.append(mserror(y, linear_prediction(X,w)))
return w, errors
def stochastic_gradient_descent(X, y, w_init, eta, max_iter):
n = X.shape[0]
w = w_init
errors = []
errors.append(mserror(y, linear_prediction(X,w)))
for i in range(max_iter):
random_ind = np.random.randint(n)
w = stochastic_gradient_step(X, y, w, random_ind, eta)
errors.append(mserror(y, linear_prediction(X,w)))
return w, errors
答案 0 :(得分:0)
您的图表没有任何异常。您还应注意,您的批处理方法需要较少的迭代才能收敛。
您可能会让来自神经网络的SGD图表覆盖您对SGD"应该"看起来像。大多数神经网络都是更复杂的模型(难以优化),可以处理更难的问题。这有助于"锯齿状"你可能会期待。
线性回归是一个简单的问题,并且有一个凸解。这意味着任何可以降低错误率的步骤都可以保证是迈向最佳解决方案的一步。这比并发神经网络要少得多,这也是为什么你看到平滑的错误减少的部分原因。这也是你看到几乎相同的MSE的原因。 SGD和批处理将收敛到完全相同的解决方案。
如果你想尝试强迫一些不平滑,你可以继续提高学习率eta,但这是一种愚蠢的练习。最终,您只是达到了一个不会聚合的地步,因为您总是采取措施超越解决方案。