深度学习——对于反向传播的理解(举例验证)

BackPropagation是BP神经网络的基础算法,不过相信有很多人对于各种资料上教程书籍上看到的反向传播的推导看的云里雾里,刚开始看花书的时候也是这样,不过之后又带着迷惑查找看了许多讲解,勉强能够看懂了,其中用具体数值代替链式法则公式推导的方法很容易理解,在这里我和大家分享一下。

讲到神经网络,tensor传播图是最为清晰的了,如下所示:

深度学习——对于反向传播的理解(举例验证)

第一层是输入层,包括两个神经元i1,i2,和截距项b1,第二层是隐藏层,包括两个神经元h1,h2,和截距项b2。第三层是输出o1,o2,wi是层与层之间的权重,**函数默认为sigmoid函数。

现在对他们赋上初值,如下图:

深度学习——对于反向传播的理解(举例验证)

其中输入数据 i1=0.05,i2=0.10;

输出数据o1=0.01,o2=0.99

目标:给出输入数据i1,i2(0.05,0.10),使输出尽可能和原始输出接近。

step1 前向传播

1.输入层--->隐藏层:

计算输入神经元h1的加权和:

深度学习——对于反向传播的理解(举例验证)

神经元h1的输出o1(**函数为sigmoid函数):

深度学习——对于反向传播的理解(举例验证)

同理,可计算出神经元h2的输出o2:

深度学习——对于反向传播的理解(举例验证)

2.隐藏层--->输出层:

计算出输出层o1和o2的值:

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

这样,前向传播就结束了,我们看到结果离我们想要的最终结果还有一段距离,下面我们进行反向传播,更新权值参数。

step2 反向传播

1.计算总误差:

总误差(square error)

深度学习——对于反向传播的理解(举例验证)

分别计算o1和o2的误差,结果为两个误差之和:

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

2.隐藏层--->输出层的权值更新:

以w5为例,如果我们想知道w5对于整体误差产生了多少影响,用整体误差对w5偏导求出:(链式法则)

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

下面分别计算这三项:

第1项:

深度学习——对于反向传播的理解(举例验证)

第2项:

深度学习——对于反向传播的理解(举例验证)

第3项:

深度学习——对于反向传播的理解(举例验证)

最后三者相乘:

深度学习——对于反向传播的理解(举例验证)

更新w5权重参数的值:

深度学习——对于反向传播的理解(举例验证)

同理:

深度学习——对于反向传播的理解(举例验证)

3.隐藏层--->隐藏层权值更新:

第1项

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

深度学习——对于反向传播的理解(举例验证)

同理,计算出:

深度学习——对于反向传播的理解(举例验证)

相加得到:

深度学习——对于反向传播的理解(举例验证)

链式法则里的第二项:

深度学习——对于反向传播的理解(举例验证)

第三项:

深度学习——对于反向传播的理解(举例验证)

三者相乘:

深度学习——对于反向传播的理解(举例验证)

更新w1的权值参数:

深度学习——对于反向传播的理解(举例验证)

同理,其他参数:

深度学习——对于反向传播的理解(举例验证)

在上述这个例子第一次迭代时,总误差E(total)由0.298371109下降至0.291027924。迭代10000次之后,总误差为0.000035085,输出为[0.015912196,0.984064734](原预期输出为[0.01,0.99])。