kuc*_*h11 4 machine-learning computer-vision neural-network gradient-descent
我尝试在MNIST手写数字数据集上训练前馈神经网络(包括60K训练样本).
我每次迭代所有训练样本,在每个时期对每个这样的样本进行反向传播.运行时当然太长了.
我读到,对于大型数据集,使用Stochastic Gradient Descent可以显着提高运行时间.
Dio*_*nto 12
我会试着给你一些关于这个问题的直觉......
最初,您(正确)调用(批量)渐变下降的内容进行了更新.这确保权重中的每次更新都在"正确"方向上完成(图1):最小化成本函数的方向.
随着数据集大小的增长以及每个步骤中更复杂的计算,随机梯度下降在这些情况下成为首选.这里,在处理每个样本时完成权重的更新,因此,后续计算已经使用"改进的"权重.尽管如此,这个原因导致它在最小化误差函数方面产生一些误导(图2).
因此,在许多情况下,最好使用小批量梯度下降,结合两者的优点:每次更新权重都是使用一小批数据完成的.这样,与随机更新相比,更新的方向在某种程度上得到了纠正,但是比(原始)梯度下降的情况更频繁地更新.
[更新]根据要求,我在下面给出了二进制分类中批量梯度下降的伪代码:
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)
Run Code Online (Sandbox Code Playgroud)
(在多类标记的情况下,error表示每个标签的错误数组.)
此代码在给定次数的迭代中运行,或者在错误高于阈值时运行.对于随机梯度下降,在for循环内调用neural_network.backpropagate_and_update(),并将样本错误作为参数.
您描述的新场景(对每个随机选取的样本执行反向传播)是随机梯度下降的一种常见“风格”,如下所述:https ://www.quora.com/Whats-the-difference- Between-gradient-下降和随机梯度下降
根据本文档,3 种最常见的口味是(您的口味是 C):
A)
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
Run Code Online (Sandbox Code Playgroud)
二)
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
Run Code Online (Sandbox Code Playgroud)
C)
for iterations t, or until approx. cost minimum is reached:
draw random sample from the training set
compute gradients and perform weight updates
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5806 次 |
| 最近记录: |