反向传播训练(Backpropagation)一个神经网络是一种常见的方法。网上并不缺乏介绍反向传播是如何工做的论文。但不多包括一个用实际数字的例子。这篇文章是我试图解释它是如何工做的和一个具体的例子。
你们能够对比本身的计算,以确保他们正确理解反向传播。php
您能够到 Github 尝试我写的一个反向传播算法Python脚本。python
一个交互式可视化显示神经网络学习过程, 能够看看个人神经网络可视化网站。git
果你发现本教程有用,想继续学习神经网络及其应用,我强烈推荐看看Adrian Rosebrock的优秀教程Getting Started with Deep Learning and Pythongithub
对于本教程,咱们将使用一个有 2 个输入神经元、2 个隐藏的神经元和 2 个输出神经元的神经网络。此外,隐藏层和输出层将包括一个 误差神经元(Bias)。
这里的基本结构:
算法
让咱们看看目前神经网络给定的误差、权重和输入的0.05和0.10。为此咱们要养活这些输入提早虽然网络。网络
咱们算出每一个隐藏神经元的总输入,再利用总输入做为激活函数(这里咱们使用 Sigmoid 函数)的变量,而后在输出层神经元重复这一步骤。函数
这是咱们如何计算h1
总输入:学习
而后使用 Sigmoid 函数计算h1
输出:优化
同理得h2
输出:网站
咱们对输出层神经元重复这个过程,使用隐层神经元的输出做为输入。
这是o1
的输出:
同理得o2
输出:
咱们如今能够计算每一个输出神经元平方偏差和:
例如,o1
预期输出为 0.01,但实际输出为0.75136507,所以他的偏差是:
重复这个过程获得o2
(预期输出是0.99)的偏差是
所以,神经网络的总偏差为
反向传播的目标是更新链接的权重以使每一个神经元的实际输出更加接近预期输出,从而减小每一个神经元以及整个网络的偏差。
考虑一下ω5
,咱们但愿知道ω5
的改变对偏差的影响有大多,称为
ω5
求偏导数)
o1
的输出变化对总偏差的影响有多大?
咱们用总偏差对
求偏导数时, ![]()
的值变为 0 ,由于 ![]()
不会影响 ![]()
o2
的偏差。
下一步,o1
总输入的变化对于o1
的输出的影响有多大?
最后,计算 ω5
的变化对o1
总输入的影响有多大?
将这三者放在一块儿:
Delta规则——权值的修正量等于偏差乘以输入
咱们也能够将这个计算过程组合成 δ规则 的形式:(1) ![]()
令(2) ![]()
由于![]()
因此(3) ![]()
联立(1)(2)(3)得
![]()
![]()
为了减小偏差,咱们从当前权重减去这个值(学习率可自定义,这里咱们设置为0.5):
重复这个过程,咱们能够获得权重 ω6
, ω7
, 和 ω8
:
咱们在获得新的隐藏层神经元的输入权重以后再更新 ω6
, ω7
, 和 ω8
(也就是说,在进行反向传播的时候咱们使用旧的权重值)
接下来,咱们将继续向后传播,计算新值ω1
, ω2
, ω3
, 和 ω4
。
全局来讲,咱们须要计算
out_h1
将同时影响
out_o1
和
out_o2
(为方便表示,这里用下划线表示下标,下同)。所以
out_h1
对每一个输出神经元的影响:
先从
而后
ω5
,由于:
讲二者代入
同理得:
所以,
如今咱们计算好了
而后咱们计算
接下来咱们计算h1
的总输入对ω1
求偏导数:
综上所述,
你也能够这么写
![]()
![]()
![]()
如今咱们能够更新ω1
了:
重复该过程计算 ω1
, ω2
, 和 ω3
:
最后,咱们已经更新全部的权重! 咱们最初提出 0.05 和 0.1 的输入,网络上的偏差为 0.298371109 。第一轮反向传播以后,如今总偏差降至 0.291027924 。它可能看起来没有调整太多。可是在这个过程重复 10000 次以后,好比说,偏差降到0.000035085。在这一时刻,当咱们输入0.05和0.1时,两个输出神经元分别输出0.015912196 ( vs 预期 0.01) and 0.984065734 (vs 预期 0.99) 。
若是你作到这一步,发现任何错误或者能想到更通俗易懂的说明方法,请加我公众号 jinkey-love 交流。