我一直在尝试了解反向传播如何与神经网络一起工作,但尚未从技术含量较低的方面找到一个好的解释。
反向传播如何工作?它如何从提供的训练数据集中学习?我将不得不对此进行编码,但在那之前我需要对它有更深入的理解。
我一直在尝试了解反向传播如何与神经网络一起工作,但尚未从技术含量较低的方面找到一个好的解释。
反向传播如何工作?它如何从提供的训练数据集中学习?我将不得不对此进行编码,但在那之前我需要对它有更深入的理解。
反向传播的工作逻辑与前馈非常相似。不同的是数据流的方向。在前馈步骤中,您可以从中观察到输入和输出。您可以向前传播这些值以训练前面的神经元。
在反向传播步骤中,除了输出层中的错误,您无法知道每个神经元中发生的错误。计算输出节点的误差很简单——您可以计算神经元的输出与训练集中该实例的实际输出之间的差异。隐藏层中的神经元必须由此修复它们的错误。因此,您必须将错误值传回给他们。根据这些值,隐藏神经元可以使用前一层的误差加权和来更新它们的权重和其他参数。
可以在此处找到前馈和反向传播步骤的分步演示。
如果你是神经网络的初学者,你可以从Perceptron开始学习,然后进阶到 NN,它实际上是一个多层感知器。
反向传播试图在神经网络的误差面上进行梯度下降,使用动态编程技术调整权重以保持计算的可处理性。
我将尝试用高级术语解释刚才提到的所有概念。
如果你有一个神经网络,比如在输出层有 N 个神经元,这意味着你的输出实际上是一个 N 维向量,并且该向量存在于 N 维空间(或 N 维表面上)。所以执行您正在训练的“正确”输出。您的“正确”答案与实际输出之间的差异也是如此。
这种差异,在适当的条件下(特别是对绝对值的一些考虑)是误差向量,存在于误差表面上。
有了这个概念,您可以将训练神经网络视为调整神经元权重的过程,以使误差函数很小,理想情况下为零。从概念上讲,你用微积分来做到这一点。如果你只有一个输出和一个权重,这很简单——取一些导数,它会告诉你要移动哪个“方向”,并在那个方向上进行调整。
但是你没有一个神经元,你有 N 个神经元,以及更多的输入权重。
原理是一样的,除了不是在直线上使用微积分来寻找你可以在脑海中描绘的斜率,方程变成了你无法轻易描绘的向量代数表达式。梯度一词是一条线上斜率的多维模拟,下降意味着您要向下移动该误差表面,直到误差很小。
但是还有另一个问题——如果你有多个层,你不能轻易地看到一些非输出层的权重与实际输出的变化。
动态编程是一种记账方法,可帮助跟踪正在发生的事情。在最高级别,如果您天真地尝试进行所有这些向量演算,您最终会一遍又一遍地计算一些导数。现代反向传播算法避免了其中一些,碰巧你首先更新输出层,然后是倒数第二层,等等。更新从输出向后传播,因此得名。
所以,如果你有幸之前接触过梯度下降或向量微积分,那么希望它成功了。
反向传播的完整推导可以浓缩为大约一页严格的符号数学,但如果没有高级描述,就很难理解算法的含义。(在我看来,这简直令人生畏。)如果您没有很好地处理向量微积分,那么,抱歉,以上内容可能没有帮助。但是要让反向传播真正起作用,没有必要了解完整的推导。
当我试图理解这些材料时,我发现以下论文(由 Rojas 撰写)非常有帮助,即使它是他书中一章的大 PDF。
我将尝试在不深入研究代码或数学的情况下进行解释。
基本上,您从神经网络计算分类,并与已知值进行比较。这会在输出节点上给您一个错误。
现在,从输出节点,我们有来自其他节点的 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 是您可以设置的参数,以调整它在解决方案上的磨练速度与最终如何(希望)准确地解决它。
如果你看一下计算图就很容易理解了,它给出了如何通过链式法则(基本上就是反向传播)计算成本函数或损失函数 wrto 权重的梯度,然后调整每个权重的机制使用梯度下降的神经网络,其中梯度是由 BackPropogation 计算的。这是根据每个权重对最终成本的影响程度,按比例调整每个权重。在这里解释太多了-但这里是我在制作https://alexcpn.github.io/html的书中的章节https://alexcpn.github.io/html/NN/ml/4_backpropogation/的链接/NN/ 试图以简单的方式解释这一点。