虽然我不完全理解您的示例,但反向传播的问题相当普遍。在具有严格分层前馈和一个输出节点的最简单情况下:
首先,您需要向前传播信息。看起来您可能已经有了这个,但是请确保您跟踪压缩函数之后每个节点的值是什么,让我们称之为 o,并为每个节点保留一个。
前向传播完成后,对于反向传播,您需要计算误差。这就是预期和给定之间的差异。另外将这个乘以导数,以便为以后的更新提供一个方向(导数的推导很复杂,但使用很简单)。
Error[output] = (Expected - Actual) * o(1 - o)
然后通过网络将每个节点的误差向后传播。这给出了每个节点对错误的“责任”的估计。所以每个节点的误差是下一层所有节点的误差,由每个链路上的权重加权。同样,我们乘以导数,所以我们有方向。
Error[hidden] = Sum (Error[output]*weight[hiddenToOutput]) * o(1 - o)
根据需要对每一层链接(输入到隐藏、隐藏到隐藏、隐藏到输出)重复此操作。
最后,通过更新链接上的权重来进行训练。为此,我们结合了获得最终更新所需的所有信息。
Weight[hiddenToOutput] = weight[hiddenToOutput] + learningRate * error[output] * input
其中 input 是进入链接的值(即来自上一层的 'o',而 error 来自下一层), learningRate 是一些小的数字(例如 0.01),以限制我们更新的大小。对 weight[inputToHidden] 等层进行了类似的计算。
(((注意:这假设了 sigmoid 压缩函数))
希望这可以帮助。更多信息可以在很多地方找到。我从 Tom M. Mitchell 的机器学习中学习。它有一个很好的伪代码部分。