10

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

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

我将尝试简单地表述问题,但我可能误解了反向传播的工作原理,所以如果这没有意义,请忽略它:

对于任何给定的节点 N,给定输入权重/值、输出权重/值以及 N 输出到的所有节点的错误/成本,我如何计算 N 的“成本”并使用它来更新输入重量?

4

2 回答 2

14

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

每个节点都有一个偏差值 θ。您可以将其视为对内部恒定 1.0 值输入的权重。

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

j = ∑<sub>i (o i × w ij ) + θ j

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

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

o j = f(净j )

f 通常是 sigmoid 函数。

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

sigmoid 函数有一个易于指定的一阶导数:

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

无论我们使用什么传递函数,我们都需要知道如何计算它的一阶导数。BP 通过链式法则通过梯度下降工作,所以这很重要。上面的方程会随着不同的传递函数而不同。

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

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

一般来说,

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

对于输出节点,

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

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

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

δ j = f'(net j ) × ∑<sub>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以获得类似于节点输出的术语。否则,它看起来就像另一个等式。

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

于 2012-12-04T17:28:57.857 回答
0

对于任何给定的节点 N,给定输入权重/值、输出权重/值以及 N 输出到的所有节点的错误/成本,我如何计算 N 的“成本”并使用它来更新输入重量?

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

于 2015-10-03T02:06:38.403 回答