梯度下降与随机梯度下降算法的区别

5

我试图使用MNIST手写数字数据集(包括60,000个训练样本)训练前馈神经网络。

每次迭代中,我会对所有训练样本执行反向传播,在每个时期为每个样本执行一次。但运行时间当然太长了。

  • 我运行的算法是梯度下降吗?

我读到过,对于大型数据集,使用随机梯度下降可以显著提高运行时间。

  • 为了使用随机梯度下降,我应该做什么?我只需要随机选择训练样本,在每个随机选择的样本上执行反向传播,而不是我当前使用的时期吗?

1
也许你需要正确选择“学习率”的值。可以在这里找到更多关于SGD的解释。 - vcp
2个回答

12
我会尝试为您解释这个问题的直觉...
最初,在所谓的(批量)梯度下降中进行了更新,这样可以确保权重的每次更新都是朝着“正确”的方向进行的(图 1):即最小化损失函数。

Gradient Descent

随着数据集大小的增长和每个步骤中更复杂的计算,随机梯度下降成为这些情况下的首选。在这里,权重的更新是在处理每个样本时完成的,因此后续的计算已经使用了“改进”的权重。尽管如此,这正是导致它在最小化误差函数方面出现一些偏差的原因(图2)。

enter image description here

在许多情况下,最好使用Mini-batch梯度下降法,结合了两种方法的优点:每次更新权重都使用一小批数据。这样,与随机更新相比,更新的方向有些修正,但比(原始)梯度下降法更经常更新。
【更新】根据要求,以下是二元分类中使用的批量梯度下降伪代码:
error = 0

for sample in data:
    prediction = neural_network.predict(sample)
    sample_error = evaluate_error(prediction, sample["label"]) # may be as simple as 
                                                # module(prediction - sample["label"])
    error += sample_error

neural_network.backpropagate_and_update(error)

在多类标记的情况下,错误表示每个标记的错误数组。
对于随机梯度下降,该代码在给定的迭代次数内运行,或者当误差高于阈值时运行。在for循环内调用neural_network.backpropagate_and_update(),并将样本误差作为参数。

1
非常感谢您提供的详细描述! - kuch11
1
当你说“每次更新权重都是使用一小批数据完成的”时,你的意思是你不会为每个插入到网络中的样本运行反向传播吗? - SomethingSomething
2
没错!你在那个小批次上计算误差,然后使用该误差运行反向传播(就像在传统的批量梯度下降中一样)。正是这个事实(你可以将其视为某种平均方向),使得收敛比随机梯度下降更加平稳。 - Diogo Pinto
2
你如何计算整个批次的误差?你能添加一些伪代码吗?这可能对很多人有帮助。 - SomethingSomething
2
在运行反向传播时,隐藏层神经元的输出对于计算它们的误差非常重要。我应该聚合(即求和或平均)每个隐藏神经元的输出,并使用这个聚合值来计算误差,就像您为输出层神经元演示的那样吗? - SomethingSomething
显示剩余3条评论

4
您描述的新场景(在每个随机选定的样本上执行反向传播)是随机梯度下降法的一种常见“口味”,如此处所述:https://www.quora.com/Whats-the-difference-between-gradient-descent-and-stochastic-gradient-descent 根据该文档,最常见的三种“口味”分别为(您的“口味”为C):
randomly shuffle samples in the training set
for one or more epochs, or until approx. cost minimum is reached:
    for training sample i:
        compute gradients and perform weight updates

B)

for one or more epochs, or until approx. cost minimum is reached:
    randomly shuffle samples in the training set
    for training sample i:
        compute gradients and perform weight updates

C)

for iterations t, or until approx. cost minimum is reached:
    draw random sample from the training set
    compute gradients and perform weight updates

1
太好了,我的想法是正确的,我只需要随机选择样本并对其进行训练... 这听起来非常容易实现。 - kuch11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接