我最近完成了吴教授关于coursera的机器学习课程,虽然我喜欢整个课程,但我从来没有真正理解过训练神经网络的反向传播算法。
我理解它的问题是,他只教过完全连接的前馈网络的矢量化实现。我的线性代数已经生锈了,如果有人能教我通用算法,我想会更容易理解。可能是以节点为导向。
我试着简单地表达这个问题,但我可能会误解backprop是如何工作的,所以如果这没有意义,请忽略它:
对于任何给定的节点n,给定输入权重/值、输出权重/值以及n输出到的所有节点的误差/成本,如何计算n的“成本”并使用它更新输入权重?
最佳答案
让我们考虑反向传播(bp)网络中的一个节点。它有多个输入,并产生一个输出值。我们希望在训练中使用错误校正,因此它也将基于节点的错误估计更新权重。
每个节点都有一个偏移值θ。您可以将其视为一个内部的、常数为1.0值的输入的权重。
激活是加权输入和偏差值的总和。让我们将感兴趣的节点称为j,前一层的节点值为i,后一层的节点值为k。
netj=∑i(oi×wij)+θj
也就是说,j的激活值是节点i的输出与对应的权重链接节点i和j的乘积之和,加上偏置值。
节点j的输出是激活的传递函数:
OJ=F(净)
f通常是乙状结肠的功能。
f(netj)=1/(1+e-netj)
sigmoid函数有一个易于指定的一阶导数:
f’(netj)=f(netj)×(1.0-f(netj))
不管我们使用什么传递函数,我们都需要知道如何计算它的一阶导数。bp通过链式规则进行梯度下降,这一点很重要。对于不同的传递函数,上面的方程是不同的。
到目前为止,我们知道如何获得输入值,计算激活,计算输出,以及计算激活的一阶导数。现在我们需要处理误差和重量调整。
bp中用于节点误差估计的值称为δ。节点的δ与节点激活的一阶导数及其接收到的误差项成正比。对于接收到的错误项,有两种公式,一种是输出节点,另一种是隐藏节点。
一般来说,
δ=f’(净)×(接收误差)
对于输出节点,
δ输出=f’(净)×(t-o)
其中t是该输出节点的期望值,o是该输出节点的实际输出值。
对于我们隐藏的节点j,它是这样的:
δj=f'(netj)×∑k(δk×wjk)
节点j的δj,δj,是传递函数的一阶导数的乘积,给定的激活乘以下一层(接近输出)的增量之和,再乘以连接权值。有了它,我们可以计算如何调整前一层节点的权重(更接近输入)。
dwij=l×oi×δj
这里的dw表示“权重的变化”,所以方程表示的是,从节点i到节点j的权重变化等于学习参数l(通常网络中所有节点的值相同)、节点i的输出值和节点j的δ(误差项)的乘积。
调整“偏移”值类似于调整权重。
dθj=l×f(θj)×δj
这里的dθ表示“θ的变化”。我们必须将传递函数应用于偏置值θj,才能得到类似节点输出的项。否则,它看起来就像另一个等式。
我应该注意,计算权重的变化应该在网络范围内完成,然后在计算完所有这些变化后应用这些变化。