更新:更好地解决了这个问题。

我正在尝试以XOR神经网络为例来了解反向传播算法。在这种情况下,有2个输入神经元+ 1个偏差,隐藏层中2个神经元+ 1个偏差和1个输出神经元。

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

computer-science - 了解神经网络的反向传播-LMLPHP
(来源:wikimedia.org)

我正在使用stochastic backpropagation

阅读更多内容后,我发现输出单元的错误会传播到隐藏层...最初这很令人困惑,因为当您到达神经网络的输入层时,每个神经元都会进行错误调整来自隐藏层中的两个神经元。特别是,起初难以掌握错误的分布方式。

步骤1 计算每个输入实例的输出。
步骤2 计算输出神经元(在我们的例子中只有一个)和目标值之间的误差:
computer-science - 了解神经网络的反向传播-LMLPHP
步骤3 我们使用步骤2中的错误来计算每个隐藏单元h的错误:
computer-science - 了解神经网络的反向传播-LMLPHP

“权重kh”是隐藏单元h和输出单元k之间的权重,这很容易混淆,因为输入单元没有与输出单元关联的直接权重。盯着公式看了几个小时后,我开始思考求和的含义,然后我得出的结论是,连接到隐藏层神经元的每个输入神经元的权重都乘以输出误差,然后求和。这是一个合乎逻辑的结论,但是该公式似乎有些困惑,因为它明确指出了“权重kh”(在输出层k和隐藏层h之间)。

我在这里正确理解所有内容吗?有人可以确认吗?

输入层的O(h)是多少?我的理解是,每个输入节点都有两个输出:一个进入隐藏层的第一个节点,另一个进入第二个节点隐藏层。应将两个输出中的哪一个插入公式的O(h)*(1 - O(h))部分?
computer-science - 了解神经网络的反向传播-LMLPHP

最佳答案

您在此处发布的教程实际上做错了。我根据Bishop的两本标准书籍和我的两个有效实现方案对它进行了仔细检查。我将在下面指出确切位置。

要记住的重要一点是,您始终在搜索误差函数相对于单位或权重的导数。前者是增量,后者是您用来更新权重的东西。

如果您想了解反向传播,则必须了解链式规则。这一切都与链条规则有关。如果您不知道它是如何工作的,请查阅Wikipedia-并不难。但是,一旦您了解了派生原理,一切就都准备就绪。 promise ! :)

theE /∂W可以通过链式规则组成∂E/∂o∂o/∂W。 ∂o/∂W很容易计算,因为它只是单位激活/输出相对于权重的导数。 ∂E/∂o实际上​​就是我们所说的增量。 (我假设E,o和W在这里是 vector /矩阵)

我们确实将它们用于输出单位,因为这是我们可以计算误差的地方。 (大多数情况下,我们的误差函数下降到(t_k-o_k)的增量,例如,对于线性输出,则为二次误差函数;对于逻辑输出,则为交叉熵。)

现在的问题是,我们如何获得内部单位的导数?好吧,我们知道一个单元的输出是所有传入单元的权重之和,然后再应用传递函数。因此o_k = f(sum(w_kj * o_j,对于所有j))。

因此,我们要做的是针对o_j推导o_k。由于delta_j =∂E/ jo_j =∂E/∂o_k∂o_k/∂o_j= delta_k∂o_k/ o_j。因此,给定delta_k,我们可以计算delta_j!

我们开工吧。 o_k = f(sum(w_kj * o_j,对于所有j))=>∂o_k/∂o_j= f'(sum(w_kj * o_j,对于所有j)))w_kj = f'(z_k)* w_kj。

对于S形传递函数,它变为z_k(1-z_k)* w_kj。 (这是教程中的错误,作者说o_k(1-o_k)* w_kj!)

关于computer-science - 了解神经网络的反向传播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2190732/

10-11 00:42