“反向传播算法”过程及公式推导(超直观好懂的Backpropagation)
前言(扯犊子)
自己学习机器学习,深度学习也有好长一段时间了,一直以来都想写点有价值的技术博客,以达到技术分享及记录自己成长的目的,奈何之前一直拖着,近来算是醒悟,打算以后不定时写一写博客,也算是作为自己不断学习,不断进步的记录。既然是写博客,希望自己的博客以后要做到“准确、生动、简洁、易懂”的水平,做到对自己、对读者负责,希望大家多交流,共同进步!
言归正传,想起当时自己刚入门深度学习的时候,当时对神经网络的“反向传播”机制不是很理解(这对理解以后的很多概念来说,很重要!!一定要搞懂!!),当时查了很多资料,花费了很多时间,感谢当时所查阅的很多资料的作者,本篇博客就网络上很多优秀的资料和我个人的理解,争取生动、简单地讲解一下BP算法,希望能够帮助到大家。
定义
首先来一个反向传播算法的定义(转自维基百科):反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)
算法讲解(耐心看)
如果去问一下了解BP算法的人“BP算法怎推导?”,大概率得到的回答是“不就是链式求导法则嘛”,我觉得这种答案对于提问题的人来说没有任何帮助。BP的推导需要链式求导不错,但提问者往往想得到的是直观的回答,毕竟理解才是王道。直观的答案,非图解莫属了。
注:下图的确是反向传播算法,但不是深度学习中的backprop,不过backward的大体思想是一样的,毕竟误差没法从前往后计算啊。(在深度学习中操作的是计算图—Computational graph),如果暂时不理解上面那句话,你可以当我没说过,不要紧~(手动????)
下面通过两组图来进行神经网络前向传播和反向传播算法的讲解,第一组图来自国外某网站,配图生动形象。如果对你来说,单纯的讲解理解起来比较费劲,那么可以参考第二组图——一个具体的前向传播和反向传播算法的例子。通过本篇博客,相信就算是刚刚入门的小白(只要有一点点高等数学基础知识),也一定可以理解反向传播算法!
CASE 1(图示讲解,看不太懂没关系,看第二组图)
首先拿一个简单的三层神经网络来举例,如下:
每个神经元由两部分组成,第一部分(e)是输入值和权重系数乘积的和,第二部分(f(e))是一个**函数(非线性函数)的输出, y=f(e)即为某个神经元的输出,如下:
下面是前向传播过程:
-----------手动分割-----------
-----------手动分割-----------
到这里为止,神经网络的前向传播已经完成,最后输出的y就是本次前向传播神经网络计算出来的结果(预测结果),但这个预测结果不一定是正确的,要和真实的标签(z)相比较,计算预测结果和真实标签的误差(),如下:
下面开始计算每个神经元的误差():
(If propagated errors came from few neurons they are added. The illustration is below: )
下面开始利用反向传播的误差,计算各个神经元的导数,开始反向传播修改权重(When the error signal for each neuron is computed, the weights coefficients of each neuron input node may be modified. In formulas below represents derivative of neuron activation function (which weights are modified). ):
-----------手动分割-----------
-----------手动分割-----------
Coefficient h affects network teaching speed.
到此为止,整个网络的前向,反向传播和权重更新已经完成,推荐参考上面给出的本教程的链接,如果对纯理论讲解较难接受,没关系,强烈推荐第二组图的例子!!!
CASE 2(具体计算举例,嫌麻烦的可直接看这个,强烈推荐!!!!!)
首先明确,“正向传播”求损失,“反向传播”回传误差。同时,神经网络的每层的每个神经元都可以根据误差信号修正每层的权重,只要能明确上面两点,那么下面的例子,只要会一点链式求导规则,就一定能看懂!
BP算法,也叫算法,下面以3层的感知机为例进行举例讲解。
上图的前向传播(网络输出计算)过程如下:(此处为网络的整个误差的计算,误差E计算方法为mse)
上面的计算过程并不难,只要耐心一步步的拆开式子,逐渐分解即可。现在还有两个问题需要解决:
- 误差E有了,怎么调整权重让误差不断减小?
- E是权重w的函数,何如找到使得函数值最小的w。
解决上面问题的方法是梯度下降算法(简单图示如下),大家如有不太懂的可先行查阅别的资料,只要能达到理解线性回归梯度下降算法的水平即可,这里不再赘述。
划重点,划重点,划重点!!!
BP算法的具体例子来喽!!
就算上面的所有东西你都看的迷迷糊糊,通过下面的例子,相信绝大多数人也能很轻松的理解BP算法。如图是一个简单的神经网络用来举例:
下面是前向(前馈)运算(**函数为sigmoid):
下面是反向传播(求网络误差对各个权重参数的梯度):
我们先来求最简单的,求误差E对w5的导数。首先明确这是一个“链式求导”过程,要求误差E对w5的导数,需要先求误差E对out o1的导数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:
导数(梯度)已经计算出来了,下面就是反向传播与参数更新过程:
上面的图已经很显然了,如果还看不懂真的得去闭门思过了(开玩笑~),耐心看一下上面的几张图,一定能看懂的。
如果要想求误差E对w1的导数,误差E对w1的求导路径不止一条,这会稍微复杂一点,但换汤不换药,计算过程如下所示:
至此,“反向传播算法”及公式推导的过程总算是讲完了啦!个人感觉,尤其是第二组图,还算是蛮通俗易懂的,希望能帮助到大家,共同进步!
感觉本篇讲的有点啰嗦了,直接放第二组图可能会更简洁,以后争取改进。
以上
References
http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
https://www.cnblogs.com/charlotte77/p/5629865.html
https://blog.****.net/han_xiaoyang