有人可以向我解释反向传播算法吗?

时间:2012-10-27 00:04:20

标签: algorithm neural-network backpropagation

我最近在Coursera上完成了Ng教授的机器学习课程,虽然我喜欢整个课程,但我从未真正理解用于训练神经网络的反向传播算法。

我理解它的问题是,他只是为完全连接的前馈网络教授它的矢量化实现。我的线性代数是生锈的,我认为如果有人能教我通用算法会更容易理解。也许是以节点为导向的方式。

我会尝试简单地说出问题,但我可能误解了backprop的工作方式,所以如果这没有意义,请忽略它:

对于任何给定节点N,给定输入权重/值,输出权重/值以及N输出的所有节点的误差/成本,如何计算N的“成本”并将其用于更新输入权重?

2 个答案:

答案 0 :(得分:14)

让我们考虑一个反向传播(BP)网络中的节点。它有多个输入,并产生一个输出值。我们希望对训练使用纠错,因此它还会根据节点的误差估计更新权重。

每个节点都有一个偏差值θ。您可以将此视为内部,常数1.0值输入的权重。

激活是加权输入和偏差值的总和。让我们将我们感兴趣的节点称为j,前一层中的节点的值为i,后续层中的节点的值为k。然后激活我们的节点j:

  

net j i (o i ×w ij )+θ j < /子>

也就是说,j的激活值是节点i和相应的权重链接节点i和j的输出乘积加上偏差值的总和。

节点j的输出是激活的传递函数:

  

o j = f(net j

f通常是sigmoid函数。

  

f(net j )= 1 /(1 + e -net j

sigmoid函数易于指定一阶导数:

  

f'(net j )= f(net j )×(1.0 - f(net j ))

无论我们使用何种传递函数,我们都需要知道如何计算其一阶导数。 BP通过链规则通过梯度下降工作,因此这很重要。上面的等式将随着不同的传递函数而不同。

到目前为止,我们知道如何获取输入值,计算激活,计算输出以及计算激活的一阶导数。现在我们需要处理错误和体重调整。

BP中用于节点误差估计的值称为δ。节点的δ与节点激活的一阶导数和它接收的误差项成比例。接收的错误项有两种表述,一种用于输出节点,另一种用于隐藏节点。

一般地,

  

δ= f'(净)×(接收误差)

对于输出节点,

  

δ输出 = f'(净)×(t - o)

其中t是该输出节点的预期值,o是该输出节点的实际输出值。

对于我们的隐藏节点j,它是这样的:

  

δ j = f'(net j )×Σ k (δ k ×w JK

我们节点j的δ,δ j ,是我们传递函数的一阶导数的乘积,给定激活乘以下一层中的增量之和(更接近输出)乘以每个都具有连接重量的值。有了这个,我们就可以计算出如何调整前一层节点的权重(更接近输入)。

  

dw ij = L×o i ×δ j

这里的dw代表“权重的变化”,因此等式所说的是从节点i到节点j的权重变化等于学习参数L的乘积(通常是所有节点的相同值)网络),节点i的输出值,以及节点j的δ(误差项)。

调整偏差值类似于调整重量。

  

j = L×f(θ j )×δ j

dθ表示“θ的变化”。我们必须将传递函数应用于偏差值θ j 以获得类似于节点输出的项。否则,它看起来就像另一个等式。

我应该注意,计算重量变化应该在网络范围内完成,然后在计算完所有变化之后应用这些变化。

答案 1 :(得分:0)

  

对于任何给定节点N,给定输入权重/值,输出   权重/值,以及N输出的所有节点的错误/成本,   我如何计算&#34;成本&#34; N并使用它来更新输入   权重

您从未真正对单个神经元的中间成本函数感兴趣。相反,你对最终产出的成本感兴趣;总是。然后用它来传播背层中神经元一直到前面所需的变化率。