更新:对问题的更佳表述。
我试图通过一个XOR神经网络的例子来理解反向传播算法。在这个例子中,有2个输入神经元+1个偏置,隐藏层有2个神经元+1个偏置,以及1个输出神经元。
A B A XOR B 1 1 -1 1 -1 1-1 1 1-1 -1 -1
(来源: wikimedia.org)
我使用的是随机反向传播。
在进一步阅读后,我发现输出单元的误差会传播到隐藏层…这最初让我感到困惑,因为当你到达神经网络的输入层时,每个神经元都会从隐藏层的两个神经元那里得到一个误差调整。特别是,误差的分配方式起初很难理解。
步骤1 计算每个输入实例的输出。
步骤2 计算输出神经元(在我们的例子中只有一个)与目标值之间的误差:
步骤3 我们使用步骤2中的误差来计算每个隐藏单元h的误差:
‘权重kh’是隐藏单元h和输出单元k之间的权重,这很令人困惑,因为输入单元没有直接与输出单元相关的权重。在盯着公式看了几个小时后,我开始思考求和的含义,我开始得出结论,每个连接到隐藏层神经元的输入神经元的权重都乘以输出误差并求和。这是合乎逻辑的结论,但公式似乎有点令人困惑,因为它明确指出’权重kh’(输出层k和隐藏层h之间的权重)。
我在这里理解得对吗?有人能确认一下吗?
输入层的O(h)是什么?我的理解是,每个输入节点有两个输出:一个进入隐藏层的第一个节点,一个进入隐藏层的第二个节点。这两个输出中的哪一个应该代入O(h)*(1 - O(h))
公式的部分?
回答:
你在这里发布的教程实际上是错误的。我根据Bishop的两本标准书籍和我的两个工作实现进行了双重检查。我将在下面指出具体错误之处。
重要的是要记住,你始终在寻找误差函数相对于单元或权重的导数。前者是增量,后者是你用来更新权重的。
如果你想理解反向传播,你必须理解链式法则。这里都是关于链式法则的。如果你不完全了解它的工作原理,请查看维基百科 – 这并不难。但是一旦你理解了推导,一切都会变得清晰。保证!:)
∂E/∂W可以通过链式法则分解为∂E/∂o ∂o/∂W。∂o/∂W很容易计算,因为它只是单元的激活/输出相对于权重的导数。∂E/∂o实际上是我们所说的增量。(我在这里假设E、o和W是向量/矩阵)
我们确实有输出单元的增量,因为那是我们可以计算误差的地方。(通常我们有一个误差函数,最终归结为(t_k – o_k)的增量,例如对于线性输出的二次误差函数和对于逻辑输出的交叉熵。)
现在的问题是,我们如何获得内部单元的导数?嗯,我们知道一个单元的输出是所有输入单元的加权和,然后应用一个传输函数。所以o_k = f(sum(w_kj * o_j, 对于所有j))。
所以我们要做的就是,求o_k相对于o_j的导数。因为delta_j = ∂E/∂o_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!)