反向传播示例详解

反向传播是训练神经网络的常用方法。这篇文章是我尝试解释它是如何工作的一个具体例子,人们可以比较他们自己的计算,以确保他们正确理解反向传播。

概述

对于本教程,我们将使用具有两个输入,两个隐藏神经元,两个输出神经元的神经网络。此外,隐藏和输出神经元将包括偏差。

这是基本结构:

反向传播示例详解

为了得到一些可用的数字,以下是初始权重、偏差和训练输入/输出:

反向传播示例详解

反向传播的目标是优化权重,以便神经网络可以学习如何正确地将任意输入映射到输出。

对于本教程的其余部分,我们将使用单个训练集:给定输入0.05和0.10,我们希望神经网络输出0.01和0.99。

Forward Pass

首先,让我们看看神经网络目前在给定上面的权重和偏差以及0.05和0.10的输入时预测的内容。要做到这一点,我们要把这些输入信息传送到网络上。

我们计算出每个隐藏层神经元的总网络输入,使用激活函数压缩总网络输入(这里我们使用logistic 函数),然后对输出层神经元重复这个过程。

下面是计算h1的总净输入的方法:

反向传播示例详解

然后我们使用logistic函数压缩它以获得输出h1:

反向传播示例详解

执行相同的过程,h1我们得到:

反向传播示例详解

我们使用隐藏层神经元的输出作为输入,对输出层神经元重复此过程。

这是输出o1:

反向传播示例详解

并执行相同的过程o2:

反向传播示例详解

计算总误差

我们现在可以使用平方误差函数计算每个输出神经元的误差,并将它们相加以得到总误差:

反向传播示例详解

1/2包含在内,这样我们以后求导时指数就消去了。不管怎样,最终的结果是乘以一个学习率所以我们在这里引入一个常数并不重要。

例如,o1的目标输出为0.01,而神经网络的输出为0.75136507,因此其误差为:

反向传播示例详解

重复o2(记住目标是0.99)这个过程,我们得到:

反向传播示例详解

神经网络的总误差是这些误差的总和:

反向传播示例详解

Backwards Pass

我们使用反向传播的目标是更新神经网络中的每个权重,以便它们使实际输出更接近目标输出,从而最小化每个输出神经元和整个网络的误差。

输出层

考虑的例句。我们想知道变化的例句对总误差的影响程度,也就是说

反向传播示例详解

被理解为“

反向传播示例详解

相对于w5的偏导数”。你也可以说“关于w5的梯度”。

通过应用链式法则则,我们知道:

反向传播示例详解

在视觉上,这是我们正在做的事情:

反向传播示例详解

我们需要弄清楚这个等式中的每个部分。

首先,总误差相对于输出变化了多少?

反向传播示例详解

-(target-out)有时表示为 out-target

当我们采用总误差对out_o1求偏导数时,

反向传播示例详解

变为零,因为out_o1不影响它,这意味着我们采用的是常数的导数,即零。

接下来,o1相对于总净输入的变化输出多少呢?

logistic 函数的偏导数是输出乘以1减去输出:

反向传播示例详解

最后,o1的总净输入相对于w5变化了多少呢?

反向传播示例详解

把它们放在一起:

反向传播示例详解

反向传播示例详解

为了减少误差,我们从当前的权重中减去这个值(可选地乘以某个学习率,eta,我们将其设置为0.5):

反向传播示例详解

一些 使用α(alpha)来表示学习率,有些η(eta),有些甚至使用ε(epsilon)。

我们可以重复这个过程中获得新的权重w_6,w_7以及w_8:

反向传播示例详解

在我们将新权重导入隐藏层神经元之后,我们在神经网络中执行实际更新(即,当我们继续下面的反向传播算法时,我们使用原始权重,而不是更新的权重)。

隐藏层

接下来,我们将通过计算w1、w2、w3和w4的新值继续backwards。

重点,这是我们需要弄清楚的:

反向传播示例详解

视觉上:

反向传播示例详解

我们将使用与输出层类似的过程,但略微不同,因为每个隐藏层神经元的输出都会影响多个输出神经元的输出(因此也会产生误差)。我们知道out_h1会影响两者out_o1和out_o2,因此需要考虑它对两个输出神经元的影响:

反向传播示例详解

开始:

反向传播示例详解

我们使用前面计算的值来计算:

反向传播示例详解

反向传播示例详解

所以:

反向传播示例详解

做相同处理,我们得到:

反向传播示例详解

因此:

反向传播示例详解

反向传播示例详解

我们计算总的净输入对h1的偏导数,对于w1,就像我们对输出神经元所做的一样:

反向传播示例详解

把它们放在一起:

反向传播示例详解

您可能还会看到以下内容:

反向传播示例详解

我们现在可以更新w1:

反向传播示例详解

重复这些w2,w3和w4

反向传播示例详解

最后,我们更新了所有权重!当我们最初fed forward 0.05和0.1输入时,神经网络上的误差是0.298371109。在第一轮反向传播之后,总误差现在降至0.291027924。它可能看起来不多,但是在重复此过程10,000次之后,例如,错误直线下降到0.0000351085。此时,当我们fed forward 0.05和0.1时,两个输出神经元产生0.015912196(对比0.01目标)和0.984065734(对比0.99目标)。

相关推荐