Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 随机梯度下降收敛得太平滑了_Algorithm_Machine Learning_Linear Regression_Gradient Descent_Stochastic Process - Fatal编程技术网

Algorithm 随机梯度下降收敛得太平滑了

Algorithm 随机梯度下降收敛得太平滑了,algorithm,machine-learning,linear-regression,gradient-descent,stochastic-process,Algorithm,Machine Learning,Linear Regression,Gradient Descent,Stochastic Process,作为我作业的一部分,我被要求实现随机梯度下降,以解决线性回归问题(尽管我只有200个训练示例)。我的问题是,随机梯度下降收敛得太平滑了,几乎和批量梯度下降一样,这就引出了我的问题:考虑到通常情况下噪音更大,为什么它看起来如此平滑。是因为我只用了200个例子吗 收敛图: 随机梯度下降加权均方误差:2.78441258841 具有梯度下降权重的均方误差:2.78412631451(与具有正态方程权重的均方误差相同) 我的代码: def mserror(y, y_pred): n = y

作为我作业的一部分,我被要求实现随机梯度下降,以解决线性回归问题(尽管我只有200个训练示例)。我的问题是,随机梯度下降收敛得太平滑了,几乎和批量梯度下降一样,这就引出了我的问题:考虑到通常情况下噪音更大,为什么它看起来如此平滑。是因为我只用了200个例子吗

收敛图:

随机梯度下降加权均方误差:2.78441258841

具有梯度下降权重的均方误差:2.78412631451(与具有正态方程权重的均方误差相同)

我的代码:

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


你的图表没有什么不寻常的地方。您还应该注意,批处理方法收敛所需的迭代次数更少

你可能让神经网络的SGD图模糊了你对SGD“应该”的看法。大多数神经网络是更复杂的模型(难以优化),用于处理更难的问题。这会导致你可能期望的“锯齿状”

线性回归是一个简单的问题,并且有一个凸解。这意味着任何降低错误率的步骤都是朝着最佳解决方案迈出的一步。这比神经网络的复杂度要小得多,这也是为什么你能看到平滑的误差减少的部分原因。这也是为什么您会看到几乎相同的MSE。SGD和batch都将收敛到完全相同的解


如果你想尝试强制一些非平滑,你可以不断提高学习速度,但这是一种愚蠢的练习。最终,您将到达一个不收敛的点,因为您总是采取步骤超越解决方案

您的图表没有什么异常。您还应该注意,批处理方法收敛所需的迭代次数更少

你可能让神经网络的SGD图模糊了你对SGD“应该”的看法。大多数神经网络是更复杂的模型(难以优化),用于处理更难的问题。这会导致你可能期望的“锯齿状”

线性回归是一个简单的问题,并且有一个凸解。这意味着任何降低错误率的步骤都是朝着最佳解决方案迈出的一步。这比神经网络的复杂度要小得多,这也是为什么你能看到平滑的误差减少的部分原因。这也是为什么您会看到几乎相同的MSE。SGD和batch都将收敛到完全相同的解


如果你想尝试强制一些非平滑,你可以不断提高学习速度,但这是一种愚蠢的练习。最终,您将到达一个不收敛的点,因为您总是采取步骤超越解决方案

链接到数据集以防相关链接到数据集以防相关是的,我注意到我的批处理梯度下降收敛的迭代次数较少,尽管每次迭代都比较昂贵(我猜,n倍更昂贵-由于矢量化的优化)。有趣。带均方误差的线性回归不仅有一个解析解,而且非常简单,随机梯度下降法很容易收敛,这就是本文的主题。SGD通常“足够好”满足ML需求,解决方案中不需要很多重要数字。对于其他领域,批处理方法可能更为重要,并且存在像LBFGS这样更智能的批处理方法,可以更好地利用额外的信息。我使用过LBFGS几次,尽管我还没有研究它到底是如何工作的。你能告诉我你所说的“额外信息”是什么意思吗?评论部分不适合讨论这种细节。简而言之,优化比只使用梯度要复杂得多——使用整个数据集计算梯度比使用单个数据点提供更多信息。你可以看看这本免费的书,如果你想了解更多,我会的。谢谢是的,我注意到我的批梯度下降收敛于更少的迭代,尽管每次迭代都比较昂贵(我猜,n倍更昂贵-由于矢量化的优化)。有趣。带均方误差的线性回归不仅有一个解析解,而且非常简单,随机梯度下降法很容易收敛,这就是本文的主题。SGD通常“足够好”满足ML需求,解决方案中不需要很多重要数字。对于其他领域,批处理方法可能更为重要,并且存在像LBFGS这样更智能的批处理方法,可以更好地利用额外的信息。我使用过LBFGS几次,尽管我还没有研究它到底是如何工作的。你能告诉我你所说的“额外信息”是什么意思吗?评论部分不适合讨论这种细节。简而言之,优化比只使用梯度要复杂得多——使用整个数据集计算梯度比使用单个数据点提供更多信息。你可以看看这本免费的书,如果你想了解更多,我会的。谢谢
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