理解neural network反向传播
更新:这个问题的一个更好的表述。
我试图理解以异或neural network为例的反向传播algorithm。 对于这种情况,有2个input神经+ 1个偏差,2个神经元在隐层+ 1个偏差,1个输出神经元。
ABA XOR B 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
我正在使用随机反向传播 。
在读了更多的信息之后,我发现输出单元的错误会传播到隐藏的层上……最初这是令人困惑的,因为当你到达neural network的input层时,每个神经元都会得到一个错误调整来自隐藏层中的两个神经元。 特别是错误分布的方式起初难以掌握。
步骤1计算每个input实例的输出。
步骤2计算输出神经元(在我们的情况下只有一个)和目标值(s)之间的误差:
第2步http://pandamatak.com/people/anand/771/html/img342.gif
步骤3我们使用步骤2中的误差来计算每个隐藏单元的误差h:
第3步http://pandamatak.com/people/anand/771/html/img343.gif
“权重kh”是隐藏单元h和输出单元k之间的权重,这很混乱,因为input单元没有与输出单元相关的直接权重。 在看了几个小时的公式之后,我开始思考总结的意思,我开始得出结论,即每个input神经元的权重连接到隐藏层神经元乘以输出误差并总结。 这是一个合乎逻辑的结论,但是这个公式似乎有点混乱,因为它清楚地说明了“权重kh”(输出层k和隐藏层h之间)。
我在这里正确理解一切吗? 有人可以证实这一点吗?
什么是input层的O(H)? 我的理解是,每个input节点都有两个输出:一个input到隐藏层的第一个节点,一个input到第二个节点隐藏层。 哪两个输出应插入公式的O(h)*(1 - O(h))
部分?
第3步http://pandamatak.com/people/anand/771/html/img343.gif
你在这里发布的教程其实是做错了。 我仔细检查了Bishop的两个标准书籍和两个我的工作实现。 我将在下面的地方指出。
一个重要的事情要记住的是,你总是在寻找单位或重量错误函数的衍生物。 前者是三angular洲,后者是你用来更新你的权重。
如果你想了解反向传播,你必须了解链式规则。 这是关于这里的连锁规则。 如果你不知道它是如何工作的,请在维基百科上查看 – 这并不难。 但是一旦你明白了派生,一切都落到了位置上。 诺言! 🙂
∂E/∂W可以通过链式法则组成∂E/∂o∂o/∂W。 ∂o/∂W很容易计算出来,因为它只是单位相对于权重的激活/输出的导数。 ∂E/∂o实际上就是我们所说的三angular洲。 (我假设E,o和W是这里的向量/matrix)
我们确实有他们的输出单位,因为那是我们可以计算的错误。 (大多数情况下,我们有一个误差函数可以归结为(t_k – o_k)的三angular形,例如对于线性输出的情况下的二次误差函数和对于逻辑输出的情况下的交叉熵)。
现在的问题是,我们如何获得内部单位的衍生品? 那么,我们知道一个单位的输出是所有input单位加权的权重,然后是一个传递函数的应用。 所以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!
我们开工吧。 对于所有j,总和(w_kj * o_j))=>∂o_k/∂o_j= f'(和(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! )
我不确定你的问题是什么,但我实际上是通过这个教程,我可以向你保证,除了一个明显的错字,没有什么不正确的。
我将假设你的问题是因为你对如何导出反向传播隐藏的增量而感到困惑。 如果这确实是你的问题,那么请考虑
替代文字http://pandamatak.com/people/anand/771/html/img334.gif
你可能对作者如何导出这个等式感到困惑。 这实际上是多variables链规则的直接应用。 也就是说,(以下摘自维基百科 )
“假设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个variables:
δ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 。
如果您在理解连锁规则时遇到困难,您可能需要参加多元微积分课程,或者阅读课本中的这一部分。
祝你好运。
我从步骤3的等式中读出的是:
- O_h =该隐藏单元的最后一个输出(input层上的O_h是实际input值)
- w_kh =该隐藏单元和下一层单元之间的连接权重(朝向输出)
- delta_k =下一层的单元错误(朝向输出,与之前的项目符号相同)
每个单元只有一个输出,但输出与下一个图层之间的每个链接都是加权的。 所以输出是相同的,但在接收端,如果链路的权重不同,每个单元将收到不同的值。 O_h总是指最后一次迭代的这个神经元的值。 错误不适用于input层,按照定义,input本身没有“错误”。
误差需要逐层计算,从输出端开始计算,因为我们需要N + 1层的误差值来计算层N.你说得对,反向传播中input和输出之间没有直接的联系。
如果违反直觉,我相信方程是正确的。 可能令人困惑的是,在每个单元的正向传播中,我们必须考虑单元左侧的所有单元和链路(input值),但是对于错误传播(反向传播)必须考虑右侧的单元(输出值)正在处理的单位。