多层神经网络上的反向传播

时间:2018-06-20 09:48:21

标签: c# neural-network deep-learning backpropagation

我正在使用c#制作神经网络系统,而无需使用任何库或Accord.Net。但是我坚持如何支持传播我的错误。我是否必须包括已经传播到下一层的所有层,或者仅上一层进入方程式?

编辑以获取更多信息:

我的网络结构主要是动态的。它使用用户输入创建一个神经网络,其中每个层有多少层和节点数。它具有基于使用的数据集创建的输入和输出层。它可以在图层上使用线性,S形,正切或relu激活函数,并且可以在每个图层上混合使用它们。

我确实了解反向传播的工作原理及其用法。但是我看到的每个示例都只能在具有1个输入,1个隐藏和1个输出层的3层结构上使用它。他们计算输出层误差并更新其权重。然后他们计算包含输出层的隐藏层的误差。

我的问题从这里开始。它们不会显示出是否仅包括隐藏层之前的层(认为是您从右向左进行反向传播),还是直到误差层包括输出层之前的所有层。

可视化

输入层--->隐藏层1 --->隐藏层2 --->输出层

在此示例中,当我计算隐藏层1的错误和权重更新时,我仅包含隐藏层2还是隐藏层2 +输出层?

1 个答案:

答案 0 :(得分:1)

我想知道您所说的“包含”是什么意思。反向传播应该计算梯度。梯度是每个变量相对于损失函数的导数(您称其为误差,但该术语并不十分精确。这不是误差,它是一个斜率)。计算完梯度后,所有参数(“权重”)都会立即更新。

计算梯度本质上是数值微分。如果您有a * b = c,则同时拥有abcgradient(c),那么很容易计算出a的梯度和bgradient(a) = b * gradient(c))。

因此,您将渐变逐层向后推。对于每一层,您只需要下一层的渐变。 TensorFlow等框架会自动为您执行此操作。该技术适用于任何计算图,而不仅适用于您描述的结构的神经网络。首先了解沿计算图的数值微分的一般概念,可以轻松理解神经网络的特殊情况。