我正在研究MultiLayer Perceptrons,一种神经网络。当我阅读有关反向传播算法的文章时,我看到一些作者建议在我们计算特定图层的所有错误后立即更新权重,但另一位作者解释说我们需要在获得所有图层的所有错误后更新权重。什么是正确的方法?
第一种方法:
function void BackPropagate(){
ComputeErrorsForOutputLayer();
UpdateWeightsOutputLayer();
ComputeErrorsForHiddenLayer();
UpdateWeightsHiddenLayer();
}
第二种方法:
function void BackPropagate(){
ComputeErrorsForOutputLayer();
ComputeErrorsForHiddenLayer();
UpdateWeightsOutputLayer();
UpdateWeightsHiddenLayer();
}
感谢您的一切。
答案 0 :(得分:2)
我很确定你在这里误解了这个概念。两种可能的策略是:
这与你所写的完全不同。这两种方法都是样本/批处理策略,两者都有其优缺点,由于简单性,第一种方法在实现中更为常见。
关于你的“方法”,第二种方法是唯一正确的,“传播”错误的过程只是错误函数的计算导数的计算简化,以及(基本)过程学习是最陡峭的下降方法。如果仅为部分维度(输出图层)计算导数,请在方向上执行步骤,然后根据新值重新计算误差导数,而不是执行梯度下降。唯一可以接受第一种方法的方法是,当您的权重更新不会干扰您的错误计算时,使用哪种顺序并不重要,因为它们是独立的。
答案 1 :(得分:2)
@lejlot的答案完全正确
批量反向传播
计算所有输入向量的所有错误后更新权重。
在线反向传播
计算一个输入向量的所有错误后更新权重。
第三种方法称为随机反向传播,它实际上只是一种随机选择训练模式序列的在线反向传播。
平均而言,批量反向传播方法是收敛最快的方法 - 但最难实现。 See a simple comparison here.
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.
答案 2 :(得分:-1)
在批量或在线反向传播之间选择问题是不同的。
你的问题是合法的,我认为这两种方法都很好。 这两种方法在许多时代几乎相似,但即使每个人都使用第一种,第二种看起来也会好一点。
PS:第二个approch仅适用于在线反向传播