任何人都可以推荐一个网站或给我简要介绍一下在神经网络中反向传播是如何实现的吗?我了解基本概念,但不确定如何编写代码。
我发现的许多资源只是简单地展示了方程式,而没有给出任何解释他们为什么这样做,而且变量名也让人很难找到。
示例:
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) 是常用传递函数的导数,即 sigmoid 函数。(其他传递函数并不少见,并且需要重写首先具有 sigmoid 的代码而不是导数。函数和导数之间的不匹配可能意味着训练不会收敛。)节点具有“激活”值,该值通过传递函数提供以获得输出 o,例如
o = f(activation)
主要是反向传播使用梯度下降,误差通过应用链式法则反向传播。对于输出与预期值不直接可比的隐藏节点,问题是信用分配之一,或者如果你愿意的话,可以责备。我们从已知和可比较的输出节点开始。误差与输出的一阶导数乘以预期输出和实际输出之间的原始误差值成正比。
因此,更具象征意义,我们将该行写为
delta[j] = f'(activation_j) * (t_j - o_j)
其中 f 是您的传递函数,f' 是它的一阶导数。
再回到隐藏层,节点的误差是它对下一层发现的误差的估计贡献。因此,来自后续层的增量乘以连接权重,然后将这些乘积相加。该总和乘以隐藏节点激活的一阶导数以获得隐藏节点的增量,或者
delta[j] = f'(activation_j) * Sum(delta[k] * w_jk)
其中 j 现在引用一个隐藏节点,k 引用后续层中的一个节点。
关于neural-network - 神经网络反向传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2073504/