首页 文章

理解神经网络反向传播

提问于
浏览
40

更新:更好地解决问题 .

我试图以XOR神经网络为例来理解反向传播算法 . 对于这种情况,存在2个输入神经元1偏差,隐藏层1偏置中的2个神经元和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 .

在阅读了一点之后我发现输出单元的错误传播到隐藏层...最初这是令人困惑的,因为当你到达神经网络的输入层时,每个神经元都会得到一个错误调整来自隐藏层中的两个神经元 . 特别是,首先很难掌握错误的分配方式 .

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

“权重kh”是隐藏单元h和输出单元k之间的权重,这是令人困惑的,因为输入单元没有与输出单元相关联的直接权重 . 在盯着公式几个小时后,我开始思考求和意味着什么,并且我开始得出结论,连接到隐藏层神经元的每个输入神经元的权重乘以输出误差并总结 . 这是一个合乎逻辑的结论,但公式似乎有点令人困惑,因为它清楚地说明了'权重kh'(在输出层k和隐藏层h之间) .

我在这里正确理解了一切吗?任何人都可以证实吗?

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

3 回答

  • 7

    你在这里发布的教程实际上做错了 . 我仔细检查了Bishop的两本标准书和我的两个工作实现 . 我将在下面指出确切的位置 .

    要记住的一件重要事情是,您始终在搜索单位或重量的误差函数的导数 . 前者是增量,后者是你用来更新权重的 .

    如果您想了解反向传播,您必须了解链规则 . 这都是关于链规则的 . 如果您不知道它是如何工作的,请查看维基百科 - 这并不难 . 但是一旦你理解了这些推导,一切就会到位 . 诺言! :)

    ∂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 .

    对于S形传递函数的情况,这变为z_k(1-z_k)* w_kj . ( Here is the error in the tutorial, the author says o_k(1 - o_k) * w_kj!

  • 3

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

    我将假设您的问题是因为您对后传播 hidden 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'1,z'2,..,z'n)其中z'k是第k个输出层预激活的输出,而z'k(wji)也就是说E是函数z ' and z'本身是wji的一个函数(如果这对你来说非常小心,对于如何设置NN没有意义 . )应用链规则直接扩展到n个变量:

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

    这是最重要的一步,然后作者再次应用链规则,这次在总和范围内扩展δz'k/δwji项,即

    δz'k/δwji=δz'k/δojδoj/δzjδzj/δwji .

    如果您在理解链规则时遇到困难,您可能需要学习多元微积分课程,或阅读教科书中的这一部分 .

    祝好运 .

  • 29

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

    • O_h =此隐藏单元的最后输出(输入层上的O_h是实际输入值)

    • w_kh =此隐藏单元与下一层单元之间的连接权重(朝向输出)

    • delta_k =下一层单位的错误(朝向输出,与前一个子弹相同的单位)

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

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

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

相关问题