49

更新:问题的更好表述。

我试图以 XOR 神经网络为例来理解反向传播算法。对于这种情况,有 2 个输入神经元 + 1 个偏置,隐藏层中的 2 个神经元 + 1 个偏置,以及 1 个输出神经元。

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

一个样本 XOR 神经网络
(来源:wikimedia.org

我正在使用随机反向传播

在阅读了更多内容后,我发现输出单元的误差被传播到隐藏层......最初这很令人困惑,因为当你到达神经网络的输入层时,每个神经元都会得到一个误差调整来自隐藏层中的两个神经元。尤其是误差的分布方式,一开始很难掌握。

第 1 步计算每个输入实例的输出。
第 2 步计算输出神经元(在我们的例子中只有一个)和目标值之间的误差:第 3 步我们使用第 2 步的误差来计算每个隐藏单元 h 的误差:
第2步

第 3 步

“权重 kh”是隐藏单元 h 和输出单元 k 之间的权重,这很容易混淆,因为输入单元没有与输出单元相关的直接权重。盯着公式看了几个小时后,我开始思考求和是什么意思,我开始得出结论,连接到隐藏层神经元的每个输入神经元的权重乘以输出误差并求和. 这是一个合乎逻辑的结论,但公式似乎有点混乱,因为它清楚地表示了“权重 kh”(在输出层 k 和隐藏层 h 之间)。

我在这里正确理解一切吗?有人可以证实这一点吗?

输入层的 O(h) 是多少?我的理解是每个输入节点都有两个输出:一个进入隐藏层的第一个节点,一个进入第二个节点隐藏层。两个输出中的哪一个应该插入O(h)*(1 - O(h))公式的部分?
第 3 步

4

3 回答 3

34

您在此处发布的教程实际上做错了。我对照 Bishop 的两本标准书籍和我的两本工作实现仔细检查了它。我将在下面指出确切的位置。

要记住的重要一点是,您总是在寻找误差函数关于单位或重量的导数。前者是增量,后者是您用来更新权重的。

如果你想了解反向传播,你必须了解链式法则。这都是关于链式法则的。如果您不知道它是如何工作的,请查看 wikipedia - 这并不难。但是,一旦您了解了推导,一切就都到位了。承诺!:)

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

我们确实将它们用于输出单元,因为这是我们可以计算误差的地方。(大多数情况下,我们有一个误差函数,它归结为 (t_k - o_k) 的 delta,例如对于线性输出的二次误差函数和逻辑输出的交叉熵。)

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

所以我们要做的是,根据 o_j 推导出 o_k。因为 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。

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

于 2010-02-04T16:12:51.430 回答
8

我不确定您的问题是什么,但实际上我自己已经完成了该教程,我可以向您保证,除了一个明显的错字之外,它没有任何不正确之处。

我会假设您的问题是因为您对反向传播隐藏增量的派生方式感到困惑。如果这确实是您的问题,那么请考虑

替代文字
(来源:pandamatak.com

您可能对作者如何得出这个等式感到困惑。这实际上是多元链式法则的直接应用。即,(以下内容来自维基百科

“假设 z = f(u, v) 的每个参数是一个双变量函数,使得 u = h(x, y) 和 v = g(x, y),并且这些函数都是可微的。那么链式规则看起来像:

替代文字

替代文字 "

现在想象通过归纳论证将链式法则扩展为

E(z' 1 ,z' 2 ,..,z' n ) 其中z' k是第k个输出层预激活的输出,z' k (w ji ) 也就是说E是一个函数z' 和 z' 本身是 w ji的函数(如果这对您来说没有意义,请仔细考虑如何设置 NN。)将链式规则直接扩展到 n 个变量:

δE(z' 1 ,z' 2 ,..,z' n ) / δw ji = Σ k δE / δz' k δz' k / δw ji

那是最重要的一步,然后作者再次应用链式法则,这次在 sum 内展开δz' k / δw ji项,即

δz' k / δw ji = δz' k / δo j δo j / δz j δz j / δw ji

如果您在理解链式法则方面有困难,您可能需要学习一门多元微积分课程,或者阅读教科书中的此类部分。

祝你好运。

于 2010-06-22T17:25:17.970 回答
3

我从第 3 步的方程式中读到的是:

  1. O_h = 这个隐藏单元的最后一个输出(输入层上的O_h是实际输入值)
  2. w_kh = 此隐藏单元与下一层单元之间的连接权重(朝向输出)
  3. delta_k = 下一层单元的误差(朝向输出,与前一个项目符号的单元相同)

每个单元只有一个输出,但输出和下一层之间的每个链接都被加权。所以输出是一样的,但是在接收端,如果链接的权重不同,每个单元会收到不同的值。O_h 总是指最后一次迭代的这个神经元的值。错误不适用于输入层,因为根据定义,输入本身没有“错误”。

误差需要从输出端开始逐层计算,因为我们需要第N+1层的误差值来计算第N层。你是对的,在反向传播中输入和输出之间没有直接联系。

我相信这个等式是正确的,如果违反直觉的话。可能令人困惑的是,在每个单元的前向传播中,我们必须考虑单元左侧的所有单元和链接(输入值),但对于错误传播(反向传播),我们必须考虑右侧的单元(输出值)正在处理的单元。

于 2010-02-03T22:14:50.193 回答