反向传播(Backpropagation) 是训练神经网络的一种常见手段。在 神经网络基础 这一节里,咱们提到,肯定好每一个神经节点的权重(weight)与误差(bias)以后,就能经过前馈(feedforward)肯定神经网络的输出,但这只是输出预测值。咱们还须要根据预测值,来 反推 各个权重与误差须要如何调整,以使得预测值和指望值偏差更小。这就是反向传播所作的事情。网络
要弄明白反向传播是如何工做的,以一个具体例子计算是最简单直接的。假设现有一个 3 层的神经网络以下:函数
假设现有同样本,输入为 0.一、0.5,指望输出为 0.九、0.1。咱们初始权重、初始误差如图所示:post
接下来咱们经过这个样本的训练,来调整初始权重。学习
首先咱们经过前馈来肯定神经网络的输出,也就是预测值。回顾一下神经节点的输入输出,它的输入是上一层各个节点经过权重与误差计算的结果,咱们记为 z;它的输出是 z 通过 激活函数(activation functions)产生的输出,记为 a。通式以下:cdn
其中,激活函数定义为blog
先不用过于纠结公式的各个字符的含义,暂时只须要知道计算方法便可。get
带入得:it
同理算出输出层:io
这样咱们完成了一次前馈的计算,获得了神经网络的两个预测值(output),但这和样本的指望值(target)有必定的偏差。咱们使用 平方偏差函数(squared error function)计算偏差 C,通式为:function
带入值为:
也就是说,神经网络的预测值与实际值有 0.248076212 偏差,咱们的目标就是经过调节权重和误差,让这个偏差更小。
反向传播实际上就是一个求导的过程。若是咱们要知道如何经过改变 ,使得总偏差能变小,这其实就是求总偏差 C 对
求偏导。根据链式法则
这个公式的含义实际上就是 的改变能对 C 形成的影响,接下来分别求等式右边的三个部分。
首先由于
其中 与
无关,因此 C 对
求偏导为
接下来求 ,而
因此
又
因此带入可得
最后,咱们再看 ,由于
因此
综上,
为了使偏差更小,咱们使用 减去这个数,这里引入一个较小的 学习速率(learning rate),用来控制梯度降低的速度,这里取 0.5,则:
另外,计算误差也是同样的道理,以 b3 举例
而
因此
则
因此
同理,咱们能够计算出新的 、
、
、
、
,再根据公式计算出新的
、
、
、
、
、
。这样,咱们就完成了一次反向传播。