反向传播训练算法如何工作?
Posted
技术标签:
【中文标题】反向传播训练算法如何工作?【英文标题】:How does a back-propagation training algorithm work? 【发布时间】:2012-02-19 20:36:08 【问题描述】:我一直在尝试了解反向传播如何与神经网络一起工作,但尚未从技术含量较低的方面找到一个好的解释。
反向传播如何工作?它如何从提供的训练数据集中学习?我将不得不对此进行编码,但在那之前我需要对它有更深入的理解。
【问题讨论】:
如果有人感兴趣,我写了一个关于反向传播如何工作的描述here(我不想转发)。 【参考方案1】:反向传播的工作逻辑与前馈非常相似。不同的是数据流的方向。在前馈步骤中,您可以从中观察到输入和输出。您可以将这些值向前传播以训练前面的神经元。
在反向传播步骤中,除了输出层中的错误,您无法知道每个神经元中发生的错误。计算输出节点的误差很简单 - 您可以计算神经元输出与训练集中该实例的实际输出之间的差异。隐藏层中的神经元必须由此修复它们的错误。因此,您必须将错误值传回给他们。根据这些值,隐藏神经元可以使用前一层的误差加权和来更新它们的权重和其他参数。
可以在here 找到前馈和反向传播步骤的分步演示。
编辑
如果你是神经网络的初学者,你可以从 Perceptron 开始学习,然后进阶到 NN,实际上是 multilayer perceptron。
【讨论】:
【参考方案2】:反向传播算法的高级描述
反向传播试图在神经网络的误差表面上进行梯度下降,使用动态规划技术调整权重以保持计算容易处理。
我将尝试用高级术语解释刚才提到的所有概念。
误差面
如果您的神经网络在输出层中有 N 个神经元,这意味着您的输出实际上是一个 N 维向量,并且该向量存在于 N 维空间中(或位于 N 维表面上) .) 您正在训练的“正确”输出也是如此。您的“正确”答案与实际输出之间的差异也是如此。
在适当的条件下(尤其是对绝对值的一些考虑)的差异是误差向量,存在于误差表面上。
梯度下降
有了这个概念,您可以将训练神经网络视为调整神经元权重的过程,以使误差函数很小,理想情况下为零。从概念上讲,你用微积分来做到这一点。如果你只有一个输出和一个权重,这很简单——取一些导数,它会告诉你要移动哪个“方向”,并在那个方向上进行调整。
但是你没有一个神经元,你有 N 个神经元,以及更多的输入权重。
原理是一样的,除了不是在直线上使用微积分来寻找你可以在脑海中想象的斜率,方程变成了你无法轻易想象的向量代数表达式。 gradient 一词是一条线上 slope 的多维模拟,descent 表示您要向下移动 该错误表面,直到错误很小。
动态编程
不过,还有另一个问题——如果您有多个层,您将无法轻易看到某些非输出层的权重与实际输出的变化。
动态编程是一种记账方法,可帮助跟踪正在发生的事情。在最高层次上,如果你天真地尝试做所有这些向量演算,你最终会一遍又一遍地计算一些导数。现代反向传播算法避免了其中一些,碰巧你首先更新输出层,然后是倒数第二层,等等。更新是从输出向后传播,因此得名。
所以,如果您有幸之前接触过梯度下降或向量微积分,那么希望您成功了。
反向传播的完整推导可以浓缩为大约一页严格的符号数学,但如果没有高级描述,就很难理解算法的含义。 (在我看来,这简直令人生畏。)如果您没有很好地掌握向量微积分,那么,抱歉,以上内容可能没有帮助。但是要让反向传播真正起作用,没有必要了解完整的推导。
当我试图理解这些材料时,我发现以下论文(Rojas 的)非常有帮助,即使它是他书中某一章的大 PDF。
http://page.mi.fu-berlin.de/rojas/neural/chapter/K7.pdf
【讨论】:
【参考方案3】:我会尽量不深入研究代码或数学来解释。
基本上,您从神经网络计算分类,并与已知值进行比较。这会在输出节点出现错误。
现在,从输出节点,我们有 N 个来自其他节点的传入链接。我们将错误传播到输出节点之前的最后一层。然后将其向下传播到下一层(当有多个上行链路时,将错误相加)。然后递归传播到第一个
要调整训练权重,对于每个节点,您基本上执行以下操作:
for each link in node.uplinks
error = link.destination.error
main = learningRate * error * node.output // The amount of change is based on error, output, and the learning rate
link.weight += main * alpha * momentum // adjust the weight based on the current desired change, alpha, and the "momentum" of the change.
link.momentum = main // Momentum is based on the last change.
learningRate 和 alpha 是您可以设置的参数,以调整它在解决方案上的磨练速度与最终(希望)如何准确地解决它。
【讨论】:
我假设权重可以随机选择,显然其值介于 -1 和 1 之间?【参考方案4】:如果你看一下计算图就很容易理解了,它给出了如何通过链式法则(基本上就是反向传播)计算成本函数或损失函数 wrto 权重的梯度,然后调整每个使用梯度下降的神经网络中的权重,其中梯度是由 BackPropogation 计算的。这是根据每个权重对最终成本的影响程度,按比例调整每个权重。在这里解释太多了-但这里是我在制作https://alexcpn.github.io/html/NN/ 的书中的https://alexcpn.github.io/html/NN/ml/4_backpropogation/ 章节的链接 它试图以一种简单的方式来解释这一点。
【讨论】:
以上是关于反向传播训练算法如何工作?的主要内容,如果未能解决你的问题,请参考以下文章