史上最通俗易懂的手写人工神经网络之(二)反向传播算法

在第一篇我们介绍了神经网络的基本概念,包括神经元,神经网络,并且深入理解了多层神经网络的本质是矩阵的乘法这一篇我们的重点将是大名鼎鼎的反向传播算法

上一篇地址:史上最通俗易懂的手写人工神经网络——(一)_卷积神经网络的博客-CSDN博客_手写神经网络

1.误差——理想与现实的差距

如何理解误差,我们举个简单的例子,如下图所示,A向B发射了一枚带导航的足球,按照理论计算这枚足球的目标位置是一个库房,坐标记为A(X1,Y1),但是最终这枚足球击中了库房附近的一个民房B(X2,Y2),也就是足球打偏了,我们把Δδ = B - A,也就是实际坐标与计算坐标的偏差称为误差,那么:误差值 = 真实值 - 理论值

图片来自网络

那么下一次发射足球的话就不能这么发射了,不然就是浪费钱。那么该怎么办呢?

答案是:采用先进的导航方式,修正足球理论计算公式,来使误差变小,这样下次射击的话就会更精确。

对于神经网络,我们也可以做类似的考虑。

比如,我们考虑一个简单情况,即长方体铁块的重量G,G取决于铁块的体积V和密度C.

那么有这样一个简单关系:

扫描二维码关注公众号,回复: 16089113 查看本文章

                                G = C X V

假设我们有1个铁块体积V是1cm³,那么它的理G论值应该是7.860 g/cm³ * 1cm³ = 7.860g

但是我们用精确电子秤测量出的重量是7.870g,这说明了什么,说明了铁块密度并不是等于7.860 g/cm³。

这个时候重量误差:

                Δ = 7.870 - 7.860 = 0.010

如何让计算值更准确呢?调整密度C

我们将C增加0.005,这个时候重量误差:

                Δ = 7.870 - 7.865 =  0.005

我们看到误差减小了。

这里的核心是:

通过正向计算来计算误差,然后以减小误差为目标,调整参数


2.反向传播——从哪里来回哪里去

从上面的铁块的例子,我们明白了误差是会传播的,也就是密度的误差会引起重量的误差ΔG。

如下图所示,一个汽车螺丝误差为5厘米,那么这个误差一定会传递给下游依赖它的东西,如汽车的零件,那么这个误差最终也会传递给汽车,至于怎么传递和传递量那么就视条件而定了。

但是我们设计一般不这么做,我们是先整体设计,再设计零件,这个设计过程和制造组装过程是反的。

如果把汽车零件看作输入,把汽车整体看作输出,那么误差可以从零件传递给汽车整体,这个是从制造和组装的角度看的。但是我们从设计的角度看,汽车整体的误差应该也是由汽车零件误差引起的,所以可以从整体误差向后推算出零件的误差,这样就是一个相反的过程。

所以在这里反向传播就是指误差的反向传播,即从输出的误差,向后推出或者说计算出输入的误差,所以被称为误差的反向传播。

所以反向传播的核心就是:

根据输出误差推算输入误差,然后这一过程不断向上游进行。

        图片来源于网络 

图片来源于网络 


3.神经元的反向传播

为了方便理解,我们先看一个神经元的反向传播,如下图所示为一个神经元,我们知道其输出误差为Δo,那么神经元的反向传播如何理解呢?

很简单,记住一点,输出的误差来源于输入误差。

我们在上一篇文章中知道:

 神经元的基本思想是:所有输入神经元的信号按一定的权重同一时刻叠加到一起,然后叠加的和信号超过一定的阈值时会触发神经元的输出output。

用公式描述一个人工神经元:

output = f(x1*w1+x2*w2+x3*w3+......+xn*wn+b)

1.output为神经元的输出;

2.x1——xn为神经元的n个输入;

3.w1——wn为神经元对应n个输入的权重;

4.b为受外界影响的偏移量;

5.f是激活函数,也就是可以控制输出的函数;

所以输出output的误差Δo从公式我们可以看出来源于x1-xn,既然输出误差来源于n个输入误差,那么每个输入误差是多少呢?它们对输出误差的贡献平均吗?

答案显然不是平均的。

我们从公式可以看到,每一个输入都有一个系数w1-wn,同样的输入x1,显然系数w1越大所贡献的误差越大,为啥,因为系数大了误差就会被放大的更大。

所以输入误差是按系数分配的,系数越大,输入对误差贡献越大,所以这个系数w1-wn可以叫做误差的权重,那么就有误差公式:

                Δoutput = f(Δ* w1 + Δ * w2 + Δ * wn + Δb)

所以反向传播的话,神经元每个输入的误差贡献应该为:

                Δxi = F((wi / (w1 + w2 + wn)) * (Δoutput - Δb))

图片来源于网络


4.神经网络的反向传播

先看一个简单的神经网络,然后我们推广到复杂的神经网络。

如下图所示,为一个有两个输入和两个输出的两层(层1和层2)神经网络.

根据我们前面的分析:输出节点的误差来源于输入误差,误差按权重分配。

我们假设输出两个节点的期望输出至为t1和t2,,o1,o2为其实际输出值,那么

可以得出层2输出节点的误差:

                                                e1 = t1 - o1

                                                e2 = t2 - o2

从图中可以看出:e1和e2都有两个部分来源,e1来源于层1的第一个节点贡献的W11和第二个节点贡献的W21两部分;e2来源于层1的第一个结点的贡献W12部分和第二个节点的W22部分。

根据前面的分析e1可以拆解为:

e1 = W11 / (W11 + W21) * e1 + W21 / (W11 + W21) *  e1

同理

e2 = W12 / (W12 + W22) * e2 + W22 / (W12 + W22) * e2

红色部分是重点,它反映了层1两个节点分别对层2误差的贡献量,这样的话如果我们知道了输出的误差值和前面节点对输出节点的权重值,就可以来计算出前一个节点的对该节点的输入误差,当然也可以计算出前一层每一个节点的输出误差:

层1节点1的输出误差记为E1就等于:

                         E1 = W11 / (W11 + W21) * e1 + W12 / (W12 + W22) * e2

层1节点2的输出误差记为E2就等于:

                        E2 = W21 / (W11 + W21) *  e1 + W22 / (W12 + W22) * e2

如果层1的所有输出误差计算出来了,那么假如层1前面还有层0的话,那么就可以继续用同样的方式计算出层0的输出误差,以此类推

所以:

从最终层输出误差开始向前计算误差,当知道了所有层之间的连接权重的话就可以计算出所有前面层的误差,这个可以简单的理解为误差的反向传播,从后往前计算误差。

我们仔细观察上面E1和E2两个式子,会发现它可以写成下面这样:

 也就是说误差反向传播可以用矩阵乘法来表示,这是一个重点。

即前一层的输出误差等于一个关于权重的矩阵乘以下一层的输出误差。

当然我们也可以根据误差来更新权重。

图片来源于网络 


对于三层神经网络和多层神经网络可以可以同样的方式来计算,不过计算量大一点。但是其反向传播的计算都可以用矩阵来实现,多乘一次矩阵即可。

图片来源于网络

 综上所述,联系我们前一篇所学,可以知道,矩阵乘法既可以表示神经网络,也可与表示误差的反向传播,而且这两种矩阵都与权重有关系,但是这种关系是不同的,由于篇幅有限,这两者的关系,以及如何通过误差来具体更新权重我们下一篇再细说。

 反向传播算法源代码下载地址: python手写神经网络数据和源代码.rar_手写人工神经网络-Python文档类资源-CSDN下载

猜你喜欢

转载自blog.csdn.net/xipengbozai/article/details/124197499