有人能向我解释一下反向传播算法吗?

10

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

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

我会尝试简单地阐述这个问题,但我可能误解了反向传播的工作原理,所以如果这不合理,请忽略它:

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


1
这是一个非常广泛的问题。你可能会在http://dsp.stackexchange.com上有更好的运气。 - mtrw
6
您可以在http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html找到一份非常好的解释,内含图片。 - Marc Shivers
1
这是一个很好的解释,马克!不过我不太确定我是否理解了差分位。 df(e)/ de是指对整个加权和(e)求导数还是仅对我们要更新其权重的连接的输入求导数?所以说节点具有线性激活功能,那么df(e)/de总是等于1(f(e)=e-->df(e)/de=1)吗?或者它总是等于我们正在更新的权重(f(e)=w1x1+w2x2-->df(e)/dx1=w1)? - Jonathon Ashworth
嘿@J.Ashworth,我现在正在上那门课。能否回答下面的问题?-为什么最后一层的目标函数导数是观察值和预测值之间的差异?假设我们使用sigmoid函数将输入转换为非线性值... - user2543622
我的意思是,我看了逻辑回归目标函数的导数,并理解到该导数等于(预测值之间的差异)×自变量......那么为什么在神经网络的情况下,我们要摆脱自变量,只保留(预测值之间的差异)部分呢? - user2543622
为什么最后一层目标函数的导数是观测值和预测值之间的差异?回答这个问题,让我们问一下,函数关于变量的导数是什么?它是该函数的变化速率-对吧?然后问一下,当您真正期望得到输出 z 时,是什么负责产生输出 y?输出神经元的激活函数。因此,当应该生成观察到的 z 时,激活函数会产生 y。差异当然是函数相对于其输入的变化率。 - Kingz
2个回答

14
让我们考虑反向传播(BP)网络中的一个节点。它有多个输入,并产生一个输出值。我们想使用误差校正进行训练,因此它还将根据节点的误差估计更新权重。
每个节点都有一个偏置值θ。你可以认为这是一个内部常量1.0值输入的权重。
激活是加权输入和偏置值的总和。让我们把我们感兴趣的节点称为j,具有值i的前一层中的节点,以及具有k值的后续层中的节点。然后我们的节点j的激活为:
netj = ∑i (oi × wij) + θj 也就是说,j的激活值是从节点i输出和链接节点i和j的相应权重的乘积之和,再加上偏置值。
我们节点j的输出是激活的传输函数:
oj = f(netj)
f通常是Sigmoid函数。
f(netj) = 1 / (1 + e-netj)
Sigmoid函数有一个易于指定的一阶导数:
f'(netj) = f(netj) × (1.0 - f(netj))
无论使用什么传输函数,我们都需要知道如何计算其一阶导数。BP通过链式法则实现梯度下降,所以这很重要。使用不同的传输函数时,上面的方程将是不同的。
到目前为止,我们知道如何获取输入值,计算激活,计算输出,并计算激活的一阶导数。现在我们需要处理错误和权重调整。
BP中用于节点误差估计的值称为δ。节点的δ与节点的激活的一阶导数和它接收到的误差项成比例。接收到的误差项有两种形式,一种是输出节点,另一种是隐藏节点。
通用地,
δ = f'(net) × (received error)
对于输出节点,
δoutput = f'(net) × (t - o)
其中t是该输出节点的期望值,o是该输出节点的实际输出值。
对于我们的隐藏节点j,它是这样的:

δj = f'(netj) × ∑kk × wjk)

对于我们的节点j,其δ值(δj)是转移函数的导数乘以下一层(靠近输出端)所有δ值乘上它们相连权重的和。有了这个值,我们可以计算如何调整前一层节点(靠近输入端)的权重。

dwij = L × oi × δj

这里的dw代表“权重变化”,所以这个方程表示从节点i到节点j的权重变化等于学习参数L(通常在网络中所有节点的值都相同)、节点i的输出值和节点j的δ值(误差项)三者的乘积。

调节偏置值与调节权重类似。

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

这里的dθ代表“Θ变化”。我们必须对偏置值Θj应用转移函数,才能得到像节点输出一样的项。否则,它看起来就像其他方程一样。

需要注意的是,应该在整个网络上计算权重变化,然后在计算所有变化之后再应用这些变化。


能否解释一下为什么最后一层目标函数的导数是观测值和预测值之间的差异?假设我们使用sigmoid函数将输入转换为非线性值... - user2543622
我的意思是,我看了一下逻辑回归目标函数的导数,并且我理解导数等于(预测之差)* x变量...那么为什么在神经网络的情况下,我们要摆脱x变量,只保留(预测之差)部分? - user2543622
@user2543622,目标函数的导数实际上是该目标函数的梯度,即MSE(通常使用的目标函数)的导数向量。 - Imad
我已经试图理解反向传播算法三天了!我看了几十个例子和教程,虽然它们让我能够复制/粘贴并使其工作,但我找不到实际解释如何为什么它起作用(我想要理解它,而不仅仅是使用它)。这个答案是我找到的最好的解释,逐步用简单易懂的英语进行了分解。这个答案需要更多的赞,以便更容易找到! - jdfinch3

0
对于给定节点N,将输入的权重/值、输出的权重/值以及N输出到的所有节点的错误/代价给出,如何计算N的“代价”并使用它来更新输入权重?
事实上,你从未真正关注单个神经元的中间代价函数。相反,你总是关心最终输出的代价,然后使用它向后传播所需的变化率,一直到前面的神经元。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接