0

我正在研究多层感知器,一种神经网络。当我阅读反向传播算法时,我看到一些作者建议在计算特定层的所有错误后立即更新权重,但另一位作者解释说我们需要在获得所有层的所有错误后更新权重。什么是正确的做法?

第一种方法:

function void BackPropagate(){
    ComputeErrorsForOutputLayer();
    UpdateWeightsOutputLayer();
    ComputeErrorsForHiddenLayer();
    UpdateWeightsHiddenLayer();
}

第二种方法:

function void BackPropagate(){
    ComputeErrorsForOutputLayer();
    ComputeErrorsForHiddenLayer();
    UpdateWeightsOutputLayer();
    UpdateWeightsHiddenLayer();
}

感谢一切。

4

3 回答 3

5

我很确定您在这里误解了这个概念。两种可能的策略是:

  • 在计算一个输入向量所有错误后更新权重
  • 在计算所有输入向量所有误差后更新权重

这和你写的完全不同。这两种方法是样本/批处理策略,各有利弊,由于简单,第一种方法在实现中更为常见。

关于您的“方法”,第二种方法是唯一正确的方法,“传播”误差的过程只是计算误差函数导数的计算简化,学习的(基本)过程是最速下降法。如果您仅计算部分维度(输出层)的导数,在方向上执行一步,然后根据新值重新计算误差导数,则不会执行梯度下降。唯一可以接受第一种方法的情况是,当您的权重更新不干扰您的错误计算时,那么使用什么顺序并不重要,因为它们是独立的。

于 2013-08-25T15:46:15.297 回答
3

@lejlot的回答是完全正确的

您的问题实际上是指两种主要方法:


批量反向传播

在计算所有输入向量的所有误差后更新权重。

在线反向传播

在计算一个输入向量的所有错误后更新权重。

还有第三种方法称为随机反向传播,它实际上只是一种带有随机选择训练模式序列的在线反向传播。




时间复杂度

平均而言,批量反向传播方法是收敛最快的方法 - 但最难实现。在这里查看一个简单的比较。




在计算下层的增量之前,不可能改变输出层的权重:

Here you can see the mathmatical equation for calculating the derivative 
of the Error with respect to the weights. (using Sidmoid)
O_i = the layer below   # ex: input
O_k = the current layer # ex: hidden layer
O_o = the layer above   # ex: output layer

在此处输入图像描述

As you can see, the dE/dW depends on the weights of the layer above. 
So you may not alter them before calculating the deltas for each layer.
于 2013-08-25T21:22:10.363 回答
-1

在批量或在线反向传播之间进行选择的问题是不同的。

您的问题是合理的,我认为这两种方法都很好。这两种方法在许多时期几乎相似,但即使每个人都使用第一种,第二种方法看起来也好一点。

PS:第二种方法仅适用于在线反向传播

于 2017-06-23T08:40:01.173 回答