对神经网络梯度体面训练中使用的反向传播方程的符号(a 和 z)和用法感到困惑
Confused by the notation (a and z) and usage of backpropagation equations used in neural networks gradient decent training
我正在编写一个神经网络,但我无法使用反向传播对其进行训练,因此我怀疑我的代码中某处存在 bug/mathematical 错误。我花了很多时间阅读关于反向传播方程应该是什么样子的不同文献,但我对此有点困惑,因为不同的书说的不同,或者至少使用了非常混乱和矛盾的符号。所以,我希望 100% 确定它是如何工作的人可以为我解决这个问题。
反向传播中有两个步骤让我感到困惑。为简单起见,我们假设我只有一个三层前馈网络,因此我们在输入隐藏和隐藏输出之间有连接。我调用到达节点的加权和 z 和相同的值,但在它通过节点的激活函数后 a。
显然,我不允许在图像中嵌入我的问题所涉及的方程式,因此我将不得不 link 像这样:https://i.stack.imgur.com/CvyyK.gif
现在。反向传播时,在计算输出层节点的误差时,是不是:
[等式。 1] Delta_output = (output-target) * a_output 通过激活函数的导数
或者是
[等式。 2] Delta_output = (output-target) * z_output 通过激活函数的导数
而在隐藏层节点的误差计算中,同样的事情,是不是:
[等式。 3] Delta_hidden = a_h 通过对激活函数求导 * sum(w_h*Delta_output)
或者是
[等式。 4] Delta_hidden = z_h 通过对激活函数求导 * sum(w_h*Delta_output)
所以问题基本上是;当运行一个节点的值在反向传播过程中通过激活函数的导数版本时,该值应该表示为它通过激活函数之前还是之后的值(z 还是 a)?
图像中的第一个或第二个方程是否正确,同样图像中的第三或第四个方程是否正确?
谢谢。
您必须在通过激活函数之前用这些值计算导数。所以答案是"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
,取决于你是加还是减权重改变。
如果您在输出节点上使用激活函数,则必须为 tanh(z)
提供激活函数范围内的目标,例如 [-1,1]。
我正在编写一个神经网络,但我无法使用反向传播对其进行训练,因此我怀疑我的代码中某处存在 bug/mathematical 错误。我花了很多时间阅读关于反向传播方程应该是什么样子的不同文献,但我对此有点困惑,因为不同的书说的不同,或者至少使用了非常混乱和矛盾的符号。所以,我希望 100% 确定它是如何工作的人可以为我解决这个问题。
反向传播中有两个步骤让我感到困惑。为简单起见,我们假设我只有一个三层前馈网络,因此我们在输入隐藏和隐藏输出之间有连接。我调用到达节点的加权和 z 和相同的值,但在它通过节点的激活函数后 a。
显然,我不允许在图像中嵌入我的问题所涉及的方程式,因此我将不得不 link 像这样:https://i.stack.imgur.com/CvyyK.gif
现在。反向传播时,在计算输出层节点的误差时,是不是:
[等式。 1] Delta_output = (output-target) * a_output 通过激活函数的导数
或者是
[等式。 2] Delta_output = (output-target) * z_output 通过激活函数的导数
而在隐藏层节点的误差计算中,同样的事情,是不是:
[等式。 3] Delta_hidden = a_h 通过对激活函数求导 * sum(w_h*Delta_output)
或者是
[等式。 4] Delta_hidden = z_h 通过对激活函数求导 * sum(w_h*Delta_output)
所以问题基本上是;当运行一个节点的值在反向传播过程中通过激活函数的导数版本时,该值应该表示为它通过激活函数之前还是之后的值(z 还是 a)?
图像中的第一个或第二个方程是否正确,同样图像中的第三或第四个方程是否正确?
谢谢。
您必须在通过激活函数之前用这些值计算导数。所以答案是"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
,取决于你是加还是减权重改变。
如果您在输出节点上使用激活函数,则必须为 tanh(z)
提供激活函数范围内的目标,例如 [-1,1]。