由符号(a和z)以及在神经网络梯度体面训练中使用的反向传播方程的使用混淆

时间:2016-10-29 19:39:13

标签: neural-network backpropagation

我正在编写一个神经网络,但是我无法使用反向传播训练它,所以我怀疑我的代码中某处存在错误/数学错误。我花了很多时间阅读关于反向传播方程式的不同文献,但由于不同的书籍说不同的东西,或者至少使用了令人困惑和矛盾的符号,我对它有点困惑。所以,我希望那个100%确定知道如何运作的人可以为我清除它。

反向传播有两个步骤使我感到困惑。让我们假设为了简单起见我只有一个三层前馈网络,因此我们在输入隐藏和隐藏输出之间建立了连接。我将到达节点 z 的加权和调用相同的值,但是在它通过节点的激活函数 a 之后即可。

显然我不允许使用我的问题所关注的方程式嵌入图像,因此我必须将其链接为:https://i.stack.imgur.com/CvyyK.gif

现在。在反向传播期间,当计算输出层节点中的错误时,是:

[公式1] Delta_output =(输出目标)* a_output通过激活函数的导数

或者是

[公式2] Delta_output =(输出目标)* z_output通过激活函数的导数

在隐藏层中节点的错误计算过程中,同样的事情是:

[公式3] Delta_hidden = a_h通过激活函数的导数* sum(w_h * Delta_output)

或者是

[公式4] Delta_hidden = z_h通过激活函数的导数* sum(w_h * Delta_output)

所以问题基本上是;当在反向传播期间通过激活函数的衍生版本运行节点的值时,该值应该表示为它在通过激活函数之前或之后的值( z a )?

图像中的第一个或第二个等式是否正确,图像中的第三个或第四个等式是否正确?

感谢。

1 个答案:

答案 0 :(得分:0)

您必须在通过激活函数之前使用值计算衍生物。所以答案是" z"。

一些激活函数简化了导数的计算,如tanh

a = tanh(z)

derivative on z of tanh(z) = 1.0 - tanh(z) * tanh(z) = 1.0 - a * a

这种简化可能会导致您所讨论的混乱,但这是另一种激活功能而不会产生混淆:

a = sin(z)
derivative on z of sin(z) = cos(z) 

您可以在维基百科上找到激活函数及其衍生物的列表:activation function

某些网络在输出节点上没有激活功能,因此导数为1.0delta_output = output - targetdelta_output = target - output,具体取决于您是否添加或减去重量变化

如果您在输出节点上使用和激活功能,则您必须提供激活函数范围内的目标,如[{1}}的[-1,1]。