了解神经网络的反向传播
machine-learning
neural-network
6
0

更新:对该问题的更好表达。

我试图以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步计算输出神经元(在我们的例子中只有一个)和目标值之间的误差:
第2步
步骤3我们使用步骤2中的误差来计算每个隐藏单位h的误差:
第三步

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我不确定您的问题是什么,但是我实际上是亲自完成了该教程,并且可以向您保证,除了一个明显的错别字之外,没有什么不对的。

我将假设您的问题是因为您对反向传播隐藏增量的获取方式感到困惑。如果确实是您的问题,请考虑

替代文字
(来源: pandamatak.com

您可能对作者如何推导此方程感到困惑。这实际上是多元链规则的直接应用。即,(以下内容摘自Wikipedia

“假设z = f(u,v)的每个自变量是一个二变量函数,使得u = h(x,y)和v = g(x,y),并且这些函数都是可微的。然后链式规则如下所示:

替代文字

替代文字

现在,假设通过归纳参数将链式规则扩展为

E(Z“1,Z” 2,...,Z“n),其中Z” k是第k个输出层预活化的输出,和z” K(瓦特JI)也就是说,E是一个函数在Z“和Z”本身就是w的应用直接推广到n个变量的链式法则的功能(如果没有在任何意义你最先想到非常仔细地约NN是如何设置。):

δE(Z '1,Z' 2,...,Z'N)/ΔW =ΣķδE/ΔZ kΔZ” K /ΔW

这是最重要的一步,笔者再次应用链式法则,这个时间的总和内扩大ΔZ” K /ΔW 来看,这是

ΔZ“K /ΔW =ΔZ” K /ΔOĴΔO 焦耳 /ΔZĴΔZ 焦耳 /ΔW

如果您在理解链式规则时遇到困难,则可能需要学习多元演算课程,或在教科书中阅读此类章节。

祝好运。

收藏
评论

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

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

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

theE /∂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_j推导o_k。因为delta_j =∂E/ jo_j = kE /∂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!

收藏
评论

我从第3步的方程式中得出的是:

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

每个单元只有一个输出,但是输出和下一层之间的每个链接都经过加权。因此输出是相同的,但是在接收端,如果链接的权重不同,则每个单元将收到不同的值。 O_h始终引用该神经元在最后一次迭代中的值。错误不适用于输入层,因为根据定义,输入本身没有“错误”。

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号