我正在编写一个神经网络,但是我无法使用反向传播训练它,所以我怀疑我的代码中某处存在错误/数学错误。我花了很多时间阅读关于反向传播方程式的不同文献,但由于不同的书籍说不同的东西,或者至少使用了令人困惑和矛盾的符号,我对它有点困惑。所以,我希望那个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 )?
图像中的第一个或第二个等式是否正确,图像中的第三个或第四个等式是否正确?
感谢。
答案 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.0
,delta_output = output - target
或delta_output = target - output
,具体取决于您是否添加或减去重量变化
如果您在输出节点上使用和激活功能,则您必须提供激活函数范围内的目标,如[{1}}的[-1,1]。