neural-network - 神经网络反向传播?

标签 neural-network backpropagation

任何人都可以推荐一个网站或给我简要介绍一下在神经网络中反向传播是如何实现的吗?我了解基本概念,但不确定如何编写代码。

我发现的许多资源只是简单地展示了方程式,而没有给出任何解释他们为什么这样做,而且变量名也让人很难找到。

示例:

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/

相关文章:

python - pytorch损失如何与模型参数联系起来?

machine-learning - 神经网络中的单位是什么(反向传播算法)

matlab - 反向传播公式似乎无法实现

python - 带有 TensorFlow 的简单前馈神经网络无法学习

machine-learning - tensorflow.python.framework.errors_impl.InvalidArgumentError : Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool'

artificial-intelligence - 可以用 2x2x1 神经网络无偏差解决 XOR 问题?

nlp - Keras SimpleRNN 输入形状和掩蔽

python - 为什么在 Pytorch 中,当我复制网络权重时,它会在反向传播后自动更新?

algorithm - 反向传播可以同时训练两个异或问题吗?

python - 使用 Keras 扩充 CSV 文件数据集