2

谁能推荐一个网站或简要介绍如何在 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);

谢谢。

4

4 回答 4

9

的目的

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 现在引用了后续层中的隐藏节点和 ka 节点。

于 2012-12-04T16:18:35.700 回答
2

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

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

于 2010-01-15T17:32:53.380 回答
1

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

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

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

于 2010-01-15T17:32:14.707 回答
0

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

于 2010-01-15T17:33:58.093 回答