背景
反向传播是训练神经网络的常用方法。 网上不乏论文试图解释反向传播如何起作用,但很少有包含实际数字的例子。 这篇文章是我试图解释它如何在一个具体的例子里工作,人们可以比较自己的计算,以确保他们正确理解反向传播。


概述

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


基本结构如下:

逐步反向传播示例

为了使用一些数字,下面是最初的权重,偏置和训练输入/输出:

逐步反向传播示例

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


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


前向传播:

首先,让我们看看神经网络在给定权重和偏置以及输入值为0.05和0.10的情况下是预测的是什么?为此,我们将这些输入通过网络向前馈传送。


我们计算出每个隐藏层神经元的总净输入,使用**函数压缩总净输入(这里我们使用logistic函数),然后用输出层神经元重复该过程。(总净投入也被称为一些来源的净投入。)

以下是我们如何计算h_1的总净输入:

逐步反向传播示例

然后我们使用logistic函数对其进行压缩以获得h_1的输出:

逐步反向传播示例

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

逐步反向传播示例

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


以下是o_1的输出:

逐步反向传播示例

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

逐步反向传播示例

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

逐步反向传播示例

有些来源将目标称为理想值,而输出则以实际值。

包含1/2,以便稍后区分时取消指数。 无论如何,结果最终会乘以学习率,所以我们在这里引入一个常数并不影响结果。


例如,o_1的目标输出为0.01,但神经网络输出为0.75136507,因此其错误为:

逐步反向传播示例

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

逐步反向传播示例

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

逐步反向传播示例


反向传递
我们使用反向传播的目标是更新网络中的每个权重,使它们使实际输出更接近目标输出,从而最大限度地减少每个输出神经元和整个网络的误差。

考虑一下, 我们想知道w_5的变化对总误差的影响有多大,也就是逐步反向传播示例(也就是w_5的偏导数或者说是梯度)

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

逐步反向传播示例

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

逐步反向传播示例

我们需要找出这个方程中的每一部分。

首先,总误差相对于输出的变化有多大?

逐步反向传播示例

接下来,o_1的输出相对于其总净投入量有多少变化?

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

逐步反向传播示例

最后,o1的总净投入相对于w_5变化了多少?

逐步反向传播示例

把它放在一起:

逐步反向传播示例

注:你会经常看到这种计算结合三角洲法则的形式:

逐步反向传播示例

逐步反向传播示例

逐步反向传播示例

逐步反向传播示例

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

逐步反向传播示例

逐步反向传播示例

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

逐步反向传播示例

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


隐藏层
接下来,我们将通过计算w_1,w_2,w_3和w_4的新值来继续向后传播。

如图,是我们需要画出来的:

逐步反向传播示例

逐步反向传播示例

我们将使用与输出层类似的过程,但略有不同,以说明每个隐藏层神经元的输出对多个输出神经元的输出(并因此产生误差)的贡献。

We know that 逐步反向传播示例 affects both 逐步反向传播示例 and 逐步反向传播示例 therefore the 逐步反向传播示例 needs to take into consideration its effect on the both output neurons:

逐步反向传播示例

我们可以使用之前计算的值来计算 逐步反向传播示例 :

逐步反向传播示例

 逐步反向传播示例 等于逐步反向传播示例:

逐步反向传播示例

将它们插入:

逐步反向传播示例

使用相同的过程计算 逐步反向传播示例,我们得到:

逐步反向传播示例

因此:

逐步反向传播示例

现在我们得到了 逐步反向传播示例, 我们需要计算每个权重的逐步反向传播示例 和逐步反向传播示例 :

逐步反向传播示例

我们计算与输出神经元相同的对w_1的总净输入的偏导数:

逐步反向传播示例

放在一起:

逐步反向传播示例

你也会看到写成这样:

逐步反向传播示例

我们现在可以更新 逐步反向传播示例:

逐步反向传播示例

重复以上过程计算 逐步反向传播示例逐步反向传播示例逐步反向传播示例

逐步反向传播示例

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






相关文章:

  • 2021-06-27
  • 2021-10-26
猜你喜欢
  • 2021-11-27
  • 2021-08-22
  • 2022-12-23
  • 2021-06-22
  • 2022-12-23
  • 2021-04-11
  • 2021-09-30
相关资源
相似解决方案