我尝试在 MNIST 手写数字数据集(包括 60K 训练样本)上训练前馈神经网络。
我每次都迭代所有训练样本,表演反向传播对于每个时期的每个这样的样本。运行时间当然太长了。
我读到对于大型数据集,使用随机梯度下降可以显着提高运行时间。
- 我应该做什么才能使用随机梯度下降?我应该随机挑选训练样本,执行反向传播在每个随机选取的样本上,而不是我当前使用的纪元上?
我会尝试给你一些关于这个问题的直觉......
最初,更新是在您(正确)调用的内容中进行的(批量)梯度下降。这确保了权重的每次更新都是在“正确”的方向上完成的(图 1)。1 https://i.stack.imgur.com/dHlJE.png):最小化成本函数的函数。
随着数据集大小的增长以及每一步计算的复杂化,随机梯度下降在这些情况下成为首选。在这里,权重的更新是在处理每个样本时完成的,因此,后续计算已经使用“改进的”权重。尽管如此,正是这个原因导致它在最小化误差函数时出现了一些误导(图 1)。2 https://i.stack.imgur.com/yBk3p.png).
因此,在许多情况下,最好使用小批量梯度下降,结合了两全其美:权重的每次更新都是使用一小批数据完成的。这样,与随机更新相比,更新的方向在某种程度上得到了纠正,但更新的频率比(原始)的情况要频繁得多梯度下降.
[UPDATE]根据要求,我在下面提供了伪代码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)
(在多类标签的情况下,错误表示每个标签的错误数组。)
该代码将运行给定的迭代次数,或者当误差高于阈值时。对于随机梯度下降,调用神经网络.backpropagate_and_update()被称为内部for循环,以样本误差作为参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)