https://www.jianshu.com/p/964345dddb70算法
1、前言网络
这是一场以偏差(Error)为主导的反向传播(Back Propagation)运动,旨在获得最优的全局参数矩阵,进而将多层神经网络应用到分类或者回归任务中去。函数
前向传递输入信号直至输出产生偏差,反向传播偏差信息更新权重矩阵。这两句话很好的形容了信息的流动方向,权重得以在信息双向流动中获得优化,这让我想到了北京城的夜景,车辆川流不息,车水马龙,你来我往(* ॑꒳ ॑* )⋆*。学习
至于为何会提出反向传播算法,我直接应用梯度降低(Gradient Descent)不行吗?想必你们确定有过这样的疑问。答案确定是不行的,纵然梯度降低神通广大,但却不是万能的。梯度降低能够应对带有明确求导函数的状况,或者说能够应对那些能够求出偏差的状况,好比逻辑回归(Logistic Regression),咱们能够把它看作没有隐层的网络;但对于多隐层的神经网络,输出层能够直接求出偏差来更新参数,但其中隐层的偏差是不存在的,所以不能对它直接应用梯度降低,而是先将偏差反向传播至隐层,而后再应用梯度降低,其中将偏差从末层往前传递的过程须要链式法则(Chain Rule)的帮助,所以反向传播算法能够说是梯度降低在链式法则中的应用。优化
2、举个栗子3d
为了帮助较好的理解反向传播概念,对它有一个直观的理解,接下来就拿猜数字游戏举个栗子。orm
2.1 两人猜数字blog
这一过程类比没有隐层的神经网络,好比逻辑回归,其中小黄帽表明输出层节点,左侧接受输入信号,右侧产生输出结果,小蓝猫则表明了偏差,指导参数往更优的方向调整。因为小蓝猫能够直接将偏差反馈给小黄帽,同时只有一个参数矩阵和小黄帽直接相连,因此能够直接经过偏差进行参数优化(实纵线),迭代几轮,偏差会下降到最小。游戏
2.2 三人猜数字深度学习
这一过程类比带有一个隐层的三层神经网络,其中小女孩表明隐藏层节点,小黄帽依然表明输出层节点,小女孩左侧接受输入信号,通过隐层节点产生输出结果,小蓝猫表明了偏差,指导参数往更优的方向调整。因为小蓝猫能够直接将偏差反馈给小黄帽,因此与小黄帽直接相连的左侧参数矩阵能够直接经过偏差进行参数优化(实纵线);而与小女孩直接相连的左侧参数矩阵因为不能获得小蓝猫的直接反馈而不能直接被优化(虚棕线)。但因为反向传播算法使得小蓝猫的反馈能够被传递到小女孩那进而产生间接偏差,因此与小女孩直接相连的左侧权重矩阵能够经过间接偏差获得权重更新,迭代几轮,偏差会下降到最小。
3、完整流程
上边的栗子从直观角度了解了反向传播,接下来就详细的介绍其中两个流程前向传播与反向传播,在介绍以前先统一一下标记。
3.1 数学标记
3.2 前向传播
如何将输入层的信号传输至隐藏层呢,以隐藏层节点c为例,站在节点c上日后看(输入层的方向),能够看到有两个箭头指向节点c,所以a,b节点的信息将传递给c,同时每一个箭头有必定的权重,所以对于c节点来讲,输入信号为:
同理,节点d的输入信号为:
因为计算机善于作带有循环的任务,所以咱们能够用矩阵相乘来表示:
因此,隐藏层节点通过非线性变换后的输出表示以下:
同理,输出层的输入信号表示为权重矩阵乘以上一层的输出:
一样,输出层节点通过非线性映射后的最终输出表示为:
输入信号在权重矩阵们的帮助下,获得每一层的输出,最终到达输出层。可见,权重矩阵在前向传播信号的过程当中扮演着运输兵的做用,起到承上启下的功能。
3.3 反向传播
既然梯度降低须要每一层都有明确的偏差才能更新参数,因此接下来的重点是如何将输出层的偏差反向传播给隐藏层。
其中输出层、隐藏层节点的偏差如图所示,输出层偏差已知,接下来对隐藏层第一个节点c做偏差分析。仍是站在节点c上,不一样的是此次是往前看(输出层的方向),能够看到指向c节点的两个蓝色粗箭头是从节点e和节点f开始的,所以对于节点c的偏差确定是和输出层的节点e和f有关。
不难发现,输出层的节点e有箭头分别指向了隐藏层的节点c和d,所以对于隐藏节点e的偏差不能被隐藏节点c霸为己有,而是要服从按劳分配的原则(按权重分配),同理节点f的偏差也需服从这样的原则,所以对于隐藏层节点c的偏差为:
同理,对于隐藏层节点d的偏差为:
为了减小工做量,咱们仍是乐意写成矩阵相乘的形式:
你会发现这个矩阵比较繁琐,若是可以简化到前向传播那样的形式就更好了。实际上咱们能够这么来作,只要不破坏它们的比例就好,所以咱们能够忽略掉分母部分,因此从新成矩阵形式为:
仔细观察,你会发现这个权重矩阵,实际上是前向传播时权重矩阵w的转置,所以简写形式以下:
不难发现,输出层偏差在转置权重矩阵的帮助下,传递到了隐藏层,这样咱们就能够利用间接偏差来更新与隐藏层相连的权重矩阵。可见,权重矩阵在反向传播的过程当中一样扮演着运输兵的做用,只不过此次是搬运的输出偏差,而不是输入信号(咱们不生产偏差,只是偏差的搬运工(っ̯ -。))。
4、链式求导
第三部分大体介绍了输入信息的前向传播与输出偏差的后向传播,接下来就根据求得的偏差来更新参数。
首先对隐藏层的w11进行参数更新,更新以前让咱们从后往前推导,直到预见w11为止:
所以偏差对w11求偏导以下:
求导得以下公式(全部值已知):
同理,偏差对于w12的偏导以下:
一样,求导得w12的求值公式:
同理,偏差对于偏置求偏导以下:
带入上述公式为:
接着对输入层的w11进行参数更新,更新以前咱们依然从后往前推导,直到预见第一层的w11为止(只不过此次须要往前推的更久一些):
所以偏差对输入层的w11求偏导以下:
同理,输入层的其余三个参数按照一样的方法便可求出各自的偏导,在这再也不赘述。
在每一个参数偏导数明确的状况下,带入梯度降低公式便可(不在重点介绍):
至此,利用链式法则来对每层参数进行更新的任务已经完成。
5、引入delta
利用链式法则来更新权重你会发现其实这个方法简单,但过于冗长。因为更新的过程能够看作是从网络的输入层到输出层从前日后更新,每次更新的时候都须要从新计算节点的偏差,所以会存在一些没必要要的重复计算。其实对于已经计算完毕的节点咱们彻底能够直接拿来用,所以咱们能够从新看待这个问题,从后往前更新。先更新后边的权重,以后再在此基础上利用更新后边的权重产生的中间值来更新较靠前的参数。这个中间变量就是下文要介绍的delta变量,一来简化公式,二来减小计算量,有点动态规划的赶脚。
接下来用事实说话,你们仔细观察一下在第四部分链式求导部分偏差对于输出层的w11以及隐藏层的w11求偏导以及偏置的求偏导的过程,你会发现,三个公式存在相同的部分,同时隐藏层参数求偏导的过程会用到输出层参数求偏导的部分公式,这正是引入了中间变量delta的缘由(其实红框的公式就是delta的定义)。
你们看一下经典书籍《神经网络与深度学习》中对于delta的描述为在第l层第j个神经元上的偏差,定义为偏差对于当前带权输入求偏导,数学公式以下:
所以输出层的偏差能够表示为(上图红色框公式):
隐藏层的偏差能够表示为(上图蓝色框公式):
同时对于权重更新的表示为(上图绿色框公式):
其实对于偏置的更新表示为(上图红色框):
上述4个公式其实就是《神经网络与深度学习》书中传说的反向传播4大公式(详细推导证实可移步此书):
仔细观察,你会发现BP1与BP2相结合就能发挥出最大功效,能够计算出任意层的偏差,只要首先利用BP1公式计算出输出层偏差,而后利用BP2层层传递,就无敌了,这也正是偏差反向传播算法的原因吧。同时对于权重w以及偏置b咱们就能够经过BP3和BP4公式来计算了。
至此,咱们介绍了反向传播的相关知识,一开始看反向传播资料的时候总以为相对独立,这个教材这么讲,另外一篇博客又换一个讲法,始终不能很好的理解其中的含义,到目前为止,思路相对清晰。咱们先从大体流程上介绍了反向传播的前因后果,接着用链式求导法则来计算权重以及偏置的偏导,进而咱们推出了跟经典著做同样样儿的结论,所以本人以为较为详细,应该对初学者有必定的借鉴意义,但愿对你们有所帮助