top of page
アンカー 1

一、前文回顾

上一节实现了神经网络的自主学习,但是发现训练速度超级慢,一个最简单的双层神经网络训练一次都大概需要好几天时间,显然这不科学。今天我们就要说说为什么不科学。


二、数值微分计算

我们计算损失函数微分的时候,是按照数学求微分那样对每个权重参数求偏微分,这也叫数值微分。比如第一层有786*50=39200个参数,这就需要39200次微分计算,第二层有50*10=500个参数,需要500次微分计算,大的神经网络会有百万级别的参数,这会导致大量的微分计算,一次学习会花费几年的时间,显然在这种情况下人工智能就是人工智障了。为了解决这个棘手的问题,便有人提出了误差逆传播算法,这个算法有多厉害呢。就好比你给了一个还只会钻木取火的原始人一套微波炉。


三、误差逆传播算法

为了更直观的了解误差逆传播算法,我们先举个简单的例子。假如小D去超市买水果,分别买了两个苹果个三个梨,一个苹果10块钱,一个梨15块钱,那么总共小D这一趟总共消费10*2+15*3=65,我们用一个图来表示



那么假如苹果涨了1块钱,最终小D要多付多少钱?换而言之,就是苹果价格发生细微的变化,最终支付额会发生多少变化?到这里聪明的你可能已经发现,这不就是求最终支付额这个函数相对于变量苹果价格的微分?没错,但是怎么求呢?除了前面提到的数值微分,还有一种方法就是误差逆传播算法。先说说误差逆传播算法相比数值微分的好处,那就是一次逆传播可以计算出所有参数相对于损失函数的微分,会大大提高微分计算的效率。在说这个算法之前,我们需要先了解微分的链式法则。


四、链式法则

假如下面有两个函数

那么函数z相对与变量x的微分

直接计算的话貌似不知如何下手,那么我们稍微改一下

这下子看起来就简单很多了,因为我们知道

那么


这就是微分的链式法则。


五、逆传播

逆传播就是节点(加法或者平方等等)的输入信号(x,y或者t),乘以该节点的偏微分并传播给下个节点。比如图里面的平方节点在逆传播时的输入信号是


然后在乘以偏微分


传播给下个节点,同理每个节点在逆传播的信号都可以求出来。


图里面蓝色箭头代表信号的正传播,黑色箭头代表信号的逆传播。在此基础上,我们可以推理出加法和乘法的逆传播算法

1.加法的逆传播


通过图可以看出来,加法的逆传播就是把输入信号原封不动的传给下个节点。

2.乘法的逆传播



通过图可以看出来,乘法的逆传播就是输入信号乘以顺传播时的输入信号。


六、继续买水果

再返回到一开始的买苹果的例子,假设逆传播输入信号为1,则可以逆推出每个节点的微分


这个到底有什么意义?如果我们把输入的四个信号(苹果个数a,苹果价格b,梨的个数c,梨的价格d)分别看作四个变量,那么最终金额就可以看作一个关于这四个变量的函数(假设为f(a,b,c,d)),而逆推法求出来的就是每个参数的变化分别的最终金额产生多大的影响,也就是函数f(a,b,c,d)对于每个参数的微分值。具体到上面的图就是:

  • 苹果个数每增加1,最终金额会上涨10块钱,更严格的来讲应该是苹果个数发生变化x的话,那么最终价格会发生10x的变化。

  • 苹果价格每增加1,最终金额会上涨2块钱。

  • 梨的价格每增加1,最终金额会上涨3块钱

  • 梨的个数每增加1,最终金额会上涨15块钱


七、总结

误差逆传播算法就是先将输入实例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果。然后计算输出层的误差,再将误差逆向传播至隐层神经元。最后根据隐层神经元的误差来对权重参数进行调整,该迭代过程循环进行,直到达到某些停止条件位置(如训练误差已达到一个很小的值)。 它意义就是一次逆推我们就可以求出每个节点每个参数的微分,不用去通过遍历一个个去求,这会大大减少神经网络的训练时间。

bottom of page