每个节点都有其权重集。实现和公式通常使用矩阵乘法,这会让你忘记这样一个事实,即从概念上讲,每个节点都有自己的一组权重,但它们确实如此。
每个节点返回一个值,该值被发送到下一层中的每个节点。因此,层上的节点h
接收num(h - 1)
输入,其中num(h - 1)
是层中的节点数h - 1
。让这些输入为x1, x2, ..., xk
。然后神经元返回:
x1*w1 + x2*w2 + ... + xk*wk
或者这个函数。所以每个神经元都有自己的一组权重。
让我们考虑一下图像中的网络。假设我们有一些训练实例,最顶层的神经元应该输出1
其他的0
。
所以我们的目标是:
y = [1 0 0 0]
我们的实际输出是(为简单起见,忽略 softmax):
y^ = [0.88 0.12 0.04 0.5]
所以它已经做得很好了,但我们仍然必须做反向传播来让它变得更好。
现在,我们的输出增量是:
y^ - y = [-0.12 0.12 0.04 0.5]
您将使用 delta 更新最顶层神经元的权重,使用 delta 更新-0.12
第二个神经元的权重,0.12
依此类推。
请注意,每个输出神经元的权重都会使用这些值进行更新:这些权重都会增加或减少以接近正确的值(0
或1
)。
现在,请注意每个输出神经元的输出取决于隐藏神经元的输出。所以你还必须更新这些。这些将使用每个输出神经元的增量进行更新(有关更新公式,请参见此处的第 7 页)。这就像在取导数时应用链式法则。
你是对的,对于给定的隐藏神经元,有一场“拔河”正在进行,每个输出神经元的错误都以自己的方式发展。但这是正常的,因为隐藏层必须学会满足所有输出神经元。这是随机初始化权重和使用多个隐藏神经元的原因。
它是适应给出最终答案的输出层,因为输出节点的权重彼此独立,所以它可以做到这一点。隐藏层必须受到所有输出节点的影响,并且必须学会适应所有输出节点。