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


谢谢。

最佳答案

的目的


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


是为了找到反向传播网络中输出节点的错误。

o表示节点的输出,t是节点的预期输出值。

术语(o *(1.0-o)是所用的常见传递函数的S形函数的导数。(其他传递函数并不罕见,并且需要重写具有S形一阶导数的代码。函数和导数之间的不匹配可能意味着训练不会收敛。)该节点具有“激活”值,该值通过传递函数馈入以获得输出o,例如


o = f(激活)


最主要的是,反向传播使用梯度下降,而误差通过应用链式规则而向后传播。对于隐藏节点的输出不能直接与期望值进行比较的问题,这可能是信用分配之一,或者是您要怪的问题。我们从已知的和可比较的输出节点开始。误差与输出的一阶导数乘以预期输出与实际输出之间的原始误差值成比例。

因此,更具象征意义的是,我们将该行写为


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


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

再回到隐藏层,节点处的错误是其对在下一层发现的错误的估计贡献。因此,将后一层的增量乘以连接权重,然后将这些乘积相加。该总和乘以隐藏节点的激活的一阶导数即可得出隐藏节点的增量,或者


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


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

08-25 01:15