代码之家  ›  专栏  ›  技术社区  ›  Kiril

理解神经网络反向传播

  •  41
  • Kiril  · 技术社区  · 14 年前

    最新情况:更好地阐述了这一问题。

    我试着以异或神经网络为例来理解反向传播算法。在这种情况下,有2个输入神经元+1偏压,2个隐层神经元+1偏压,1个输出神经元。

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

    A sample XOR neural network

    我在用 stochastic backpropagation .

    在多看了一点之后,我发现输出单元的错误会传播到隐藏层…最初,这是令人困惑的,因为当你到达神经网络的输入层时,每个神经元都会从隐藏层的两个神经元得到误差调整。特别是,误差的分布方式一开始很难掌握。

    步骤1 计算每个输入实例的输出。
    步骤2 计算输出神经元(在本例中只有一个)与目标值之间的误差:
    Step 2 http://pandamatak.com/people/anand/771/html/img342.gif
    步骤3 我们使用步骤2中的误差计算每个隐藏单元h的误差:
    Step 3 http://pandamatak.com/people/anand/771/html/img343.gif

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

    我对这里的一切理解正确吗?有人能证实吗?

    输入层的o(h)是多少?我的理解是,每个输入节点都有两个输出:一个进入隐藏层的第一个节点,另一个进入第二个节点隐藏层。两个输出中的哪一个应该插入 O(h)*(1 - O(h)) 公式的一部分?
    步骤3 http://pandamatak.com/people/anand/771/html/img343.gif

    3 回复  |  直到 14 年前
        1
  •  30
  •   bayer    14 年前

    你在这里发布的教程实际上是做错了。我对照Bishop的两本标准书和两个工作实现对它进行了复查。我将在下面指出确切的位置。

    要记住的一件重要的事情是,你总是在寻找误差函数相对于单位或重量的导数。前者是三角形,后者是用来更新权重的。

    如果你想了解反向传播,你必须了解链规则。这都是关于链式规则的。如果你不知道它到底是怎么工作的,去维基百科看看吧-没那么难。但一旦你了解了它们的起源,一切都会发生。答应!:)

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

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

    现在的问题是,我们如何得到内部单位的导数?好吧,我们知道一个单位的输出是所有输入单位的加权和一个传递函数的应用。所以o_k=f(和(w_k j*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(和(w椆k j*o椆j,对于所有j))=>椆椆o椆k/u椆o椆j=f'(和(w椆kj*o椆j,对于所有j))*W椆kj=f'(z椆k)*W椆kj。

    对于乙状结肠传递函数,这就变成了z_k(1-z_k)*w_k。( 这是教程中的错误,作者说o_k(1-o_k)*w_k! )

        2
  •  8
  •   Community Reversed Engineer    7 年前

    我不知道你的问题是什么,但我实际上自己完成了教程,我可以向你保证,除了一个明显的错别字,没有什么不对的。

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

    alt text http://pandamatak.com/people/anand/771/html/img334.gif

    你可能对作者是如何得出这个方程式感到困惑。这实际上是多元链式规则的直接应用。即(以下内容摘自 wikipedia )

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

    alt text

    alt text

    现在想象一下通过归纳论证将链式规则扩展到

    E(Z) ,Z’ ,..,z n ) Z的地方 K 是第k输出层预激活的输出, Z’ K (W) )也就是说,e是z'的函数,z'本身是w的函数 (如果你一开始不明白 认为 非常小心地设置n n。)将链式规则直接扩展到n个变量:

    δE(Z) ,Z’ ,..,z n ) / δW = K δE / δz′ K δz′ K / 增量w

    这是最重要的一步,作者随后再次应用链式规则,这次在总和内展开 δz′ K / δW 术语,即

    δz′ K / δW = δz′ K / δO j δO J / δz J δz J / δW .

    如果你在理解链式规则方面有困难,你可能需要上一门多元微积分的课程,或者阅读教科书中的这一节。

    祝你好运。

        3
  •  3
  •   cjcela    14 年前

    我从步骤3的方程式中看到的是:

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

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

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

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