【问题标题】:Neural Network Backpropagation?神经网络反向传播?
【发布时间】:2011-01-05 14:54:38
【问题描述】:

谁能推荐一个网站或简要介绍如何在 NN 中实现反向传播?我了解基本概念,但不确定如何编写代码。

我发现的许多资料都只是简单地显示了方程式,而没有解释为什么要这样做,而且变量名很难找到。

例子:

void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
  int j;
  double o, t, errsum;

  errsum = 0.0;
  for (j = 1; j <= nj; j++) {
    o = output[j];
    t = target[j];
    delta[j] = o * (1.0 - o) * (t - o);
    errsum += ABS(delta[j]);
  }
  *err = errsum;

}

在那个例子中,有人能解释一下

delta[j] = o * (1.0 - o) * (t - o);

谢谢。

【问题讨论】:

标签: neural-network backpropagation


【解决方案1】:

目的

delta[j] = o * (1.0 - o) * (t - o);

是在反向传播网络中找到一个输出节点的误差。

o代表节点的输出,t是节点输出的期望值。

术语 (o * (1.0 - o) 是常用传递函数 sigmoid 函数的导数。(其他传递函数并不少见,需要先重写具有 sigmoid 的代码)取而代之的是导数。函数和导数之间的不匹配可能意味着训练不会收敛。)节点具有“激活”值,该值通过传递函数得到输出 o,例如

o = f(激活)

主要是反向传播使用梯度下降,并且错误通过应用链式法则进行反向传播。对于输出与预期值不直接可比的隐藏节点,问题是信用分配或责备之一。我们从已知和可比较的输出节点开始。误差被认为与输出的一阶导数乘以预期输出和实际输出之间的原始误差值成正比。

所以更具象征意义的是,我们将这一行写成

delta[j] = f'(activation_j) * (t_j - o_j)

其中 f 是您的传递函数,f' 是它的一阶导数。

再回到隐藏层,一个节点的误差是它对下一层发现的误差的估计贡献。因此,来自后续层的增量乘以连接权重,然后将这些乘积相加。该总和乘以隐藏节点激活的一阶导数,得到隐藏节点的增量,或

delta[j] = f'(activation_j) * Sum(delta[k] * w_jk)

其中 j 现在引用一个隐藏节点,而 k 引用后续层中的一个节点。

【讨论】:

    【解决方案2】:

    基本上,反向传播的作用是在训练数据上运行网络,观察输出,然后调整节点的值,从输出节点迭代回到输入节点。

    【讨论】:

      【解决方案3】:

      (t-o) 是网络输出中的错误,因为t 是目标输出,o 是实际输出。它以标准化形式存储在delta 数组中。用于规范化的方法取决于实现,o * ( 1.0 - o ) 似乎正在这样做(我对这个假设可能是错误的)。

      这个归一化的误差是为整个训练集累积来判断训练何时完成的:通常是当errsum低于某个目标阈值时。

      【讨论】:

        【解决方案4】:

        其实,如果你知道理论,程序应该很容易理解。您可以阅读本书并使用铅笔做一些简单的示例,以找出传播的确切步骤。这是实现数值程序的一般原则,您必须在小案例中了解细节。

        如果你了解 Matlab,我建议你阅读一些 Matlab 源代码(例如here),它比 C 更容易理解。

        对于您问题中的代码,名称非常不言自明,输出可能是您的预测数组,目标可能是训练标签数组,增量是预测值和真实值之间的误差,它也可以用作要更新到权重向量中的值。

        【讨论】:

          猜你喜欢
          • 2015-03-03
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 2013-04-26
          • 2016-09-19
          • 2014-03-15
          • 2018-05-17
          相关资源
          最近更新 更多