背景
反向传播是训练神经网络的经常使用方法,以前对此一直了解的不够完全,这篇文章算是让我完全搞懂了反向传播的细节。算法
概观
对于本教程,咱们将使用具备两个输入,两个隐藏的神经元,两个输出神经元的神经网络。此外,隐藏和输出神经元将包括一个偏见。网络
基本结构以下:并发
为了使用一些数字,下面是最初的权重,偏见和培训输入/输出:wordpress
反向传播的目标是优化权重,以便神经网络能够学习如何正确映射任意输入到输出。函数
对于本教程的其他部分,咱们将使用单个训练集:给定输入0.05和0.10,咱们但愿神经网络输出0.01和0.99。学习
前进通行证
首先,让咱们看看神经网络目前预测的是什么,给定0.05和0.10的权重和误差。为此,咱们将经过网络向前馈送这些输入。优化
咱们计算出净输入总到每一个隐藏层神经元,壁球使用的总净输入激活功能(在这里咱们使用的逻辑功能),而后重复上述过程与输出层的神经元。.net
如下是咱们计算总净投入的方法:
而后咱们使用逻辑函数对其进行压缩以得到如下输出:
执行相同的过程,咱们获得:
咱们重复这个过程为输出层神经元,使用隐藏层神经元的输出做为输入。
如下是输出:
并执行相同的过程,咱们获得:
计算总偏差
如今咱们可使用平方偏差函数来计算每一个输出神经元的偏差,并将它们相加获得总偏差:

例如,目标输出为0.01,但神经网络输出为0.75136507,所以其偏差为:
重复这个过程(记住目标是0.99),咱们获得:
神经网络的总偏差是这些偏差的总和:
向后传递
咱们使用反向传播的目标是更新网络中的每一个权重,使它们使实际输出更接近目标输出,从而最大限度地减小每一个输出神经元和整个网络的偏差。
输出层
考虑一下。咱们想知道变化
会影响总偏差,也就是说
。




经过应用链式规则,咱们知道:
在视觉上,这是咱们正在作的事情:
咱们须要找出这个方程中的每一部分。
首先,总偏差相对于输出的变化有多大?





接下来,相对于其总净投入的变化输出多少?
最后,关于变化的总净投入是
多少?
把它放在一块儿:
为了减小偏差,咱们从当前权重中减去这个值(可选地乘以一些学习率eta,咱们将其设置为0.5):
咱们能够重复这个过程当中得到新的权重,
以及
:
在咱们将新权重引入隐含层神经元以后,咱们执行神经网络中的实际更新(即,当咱们继续下面的反向传播算法时,咱们使用原始权重,而不是更新的权重)。
隐藏层
接下来,咱们将继续为新的计算值,向后传递,
,
,和
。
大图片,这是咱们须要弄清楚的:
视觉:
咱们将使用与输出层相似的过程,但略有不一样,以说明每一个隐藏层神经元的输出对多个输出神经元的输出(并所以产生偏差)的贡献。咱们知道这影响到二者
,
所以
须要考虑它对两个输出神经元的影响:
从如下开始:
咱们能够使用咱们以前计算的值来计算:
而且等于
:
将它们插入:
按照相同的过程,咱们获得:
所以:
如今,咱们有,咱们须要弄清楚
,而后
每个权重:
咱们计算总净投入的偏导数,与
咱们对输出神经元所作的相同:
把它放在一块儿:
你也能够看到这写成:
咱们如今能够更新:
重复这些,
和
最后,咱们已经更新了全部的重量!当咱们最初输入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目标)。
若是你已经作到了这一点,并发现上述任何错误,或者能够想出任何方法使将来的读者更清楚,不要犹豫,给我一个笔记。谢谢!