精华内容
下载资源
问答
  • 反向传播算法及其梯度扩散前言最近开始认真学习了下反向传播算法和梯度传递的问题,其本质是导数的链式法则的应用,由此可以分析出为什么sigmoid激活函数不适合用于做多层网络的激活函数,可以考虑联系我的另一篇...

    反向传播算法及其梯度扩散

    前言

    最近开始认真学习了下反向传播算法和梯度传递的问题,其本质是导数的链式法则的应用,由此可以分析出为什么sigmoid激活函数不适合用于做多层网络的激活函数,可以考虑联系我的另一篇关于激活函数的文章。如有谬误,请联系指正。转载请注明出处。

    联系方式: e-mail: FesianXu@gmail.com

    QQ: 973926198

    github: https://github.com/FesianXu

    完整代码开源: click me || 其中的sigmoid_base_BP.py


    神经网络

    要知道什么是反向传播算法,我们还是要从神经网络开始将起。神经网络如图所示。

    218a37349089674d0e19f29e31db3557.png

    图中所示的是一个具有一个输入层(input layer),一个隐藏层(hidden layer),一个输出层(output layer)的三层神经网络。我们都知道,在神经网络的训练过程中,其权值是通过梯度的变化大小来更新的,我们这里先进行符号规定,以便于接下来的分析。

    l-1层的第k个神经元与l层的第j个神经元的连接权值

    l层的第j个神经元的偏置。

    l层的第j神经元的输入。

    l层的第j神经元的激活输出。

    用公式表达即是:

    其中的

    为激活函数。多采用
    sigmoid,ReLU,tanh等。
    代价函数,其中L是神经网络的层数。

    我们知道,进行权值更新的时候,我们采用的是梯度下降法更新(Gradient Descent), 公式如下:

    这里最重要的便是需要求得

    ,为了求得这个导数,我们现在有几个公式需要推导,这些公式大多都有链式法则推导而出。

    (对L层的误差)

    其中我们要注意的是,对于某层的误差

    定义为
    ,其中具体到某一个神经元j的误差为

    推导:

    所以当扩展到对于所有的第L层的神经元时,我们为了方便用一个矩阵去代表我们的结果:

    需要注意的是,所有的误差矩阵都可以这样定义,如:

    其中n是l层神经元的数量,类似的,可以得出:

    其中n是第l层的神经元数量 由此可以得出结论:

    其中,

    算子代表了
    梯度,具体为
    代表
    的所有偏导数的矩阵,类似于:

    点乘,表示了两个操作数的各个元素的分别相乘,前提是两个操作数的维度统一。

    第l层第j个神经元的误差

    同样的,为了表示方便,也多用矩阵形式表示,有:

    所以,有:


    误差具体到对某个边权重的偏导数

    由此可以看出,

    呈正相关的关系,当激活函数采用了sigmoid函数时,由于x越大,其导数呈现指数衰减,所以在层数太大而且输出值范围太大的时候,
    就会变得很小,从而使得参数的更新速率变得很慢,因此会出现
    梯度消散的问题(The problem of gradient vanishing)。 此时,可以考虑替换代价函数或者激活函数,对于更换激活函数,可以更换为ReLU(Rectified Linear Units)函数,
    其导数为分段导数,在激活区
    时,其导数恒为1,不会存在梯度消散的问题。

    误差对偏置的导数


    总的更新公式


    我们在这篇文章中推导了BP算法的公式,我们接下来将在下一篇文章《基于numpy和python的反向传播算法的实现与分析》中利用numpy和python实现BP算法,有兴趣的朋友请移步。

    引用

    1. 《基于numpy和python的反向传播算法的实现与分析》
    展开全文
  • 这几天在学习深度学习方面的知识,学习...原博知乎链接:MrLi:神经网络BP反向传播算法推导​zhuanlan.zhihu.com以及觉得很好懂得反向传播的博客链接:EdisonGzq:深度学习---反向传播的具体案例​zhuanlan.zhihu.c...

    52fab0f62fc0ffe5646eec1dc2fdad16.png

    这几天在学习深度学习方面的知识,学习到反向传播的时候真的是满脑子的疑惑。这篇博客主要是想按照自己的理解说一下感受

    主要的参考博客是我在知乎上看到的,算是转载,但是我想自己推导一下,加深印象。原博知乎链接:

    MrLi:神经网络BP反向传播算法推导zhuanlan.zhihu.com

    以及觉得很好懂得反向传播的博客链接:

    EdisonGzq:深度学习---反向传播的具体案例zhuanlan.zhihu.com
    cc61b99662b0e78a9b29224704757dff.png

    后面参考了CSDN上面的博客来理解反向传播与激活函数的关系。

    https://blog.csdn.net/xierhacker/article/details/53431207blog.csdn.net

    (写这篇博客只是为了自己加深印象如果原博主觉得有抄袭成分请告知,我删博。同时感谢一下前辈们的辛苦付出,让我们菜鸟能更好去了解,我也是参考了以上这些博客对反向传播算法有了更深刻的理解)

    一、符号说明

    首先定义一下符号的表达:

    —— 神经网络的总层数

    —— 第
    层神经元的个数

    —— 连接第
    层的第
    个神经元和第
    层的第
    个神经元的权重系数

    —— 第
    层的第
    个神经元的截距项(bias)

    —— 第
    层神经元的权重系数矩阵(由
    构成的矩阵)

    —— 第
    层神经元的截距向量(由
    构成的向量)

    —— 第
    层的第
    个神经元的加权输入

    —— 第
    层神经元的加权输入向量,其每个元素为

    —— 第
    层的第
    个神经元的激活函数输出

    —— 第
    层神经元的激活函数输出向量,其每个元素为

    二、神经网络的示意图

    86debd4c162dd3d8d4f098155dbe8210.png
    神经网络示意图

    根究神经网络示意图可得到如下公式:

    层第
    个神经元的加权输入为:

    层第
    个神经元的激活输出为:

    其中,

    为神经网络采用的激活函数,写成向量形式为:

    其中

    最后令

    表示整个神经网络的代价函数,其应是关于最后一层的输出
    的函数,即:

    cost

    三、反向传播

    假设神经网络中的某个权重

    有很小的扰动误差
    ,如下图所示:

    fe181648d385a767e91a06629c4dfc57.png

    权重

    的这个很小的变化将使对应的神经元的激活函数输出产生一个很小的误差

    164576ec63adcc24c0d8091c363d3f9c.png

    该误差将进一步传递到下一层,使下一层的所有神经元的激活函数输出都产生一个误差:

    249b4932eb83c636ca229495a2d19d99.png

    同理,这些误差都将沿着网络往下一层传递,直至到达输出层,从而使代价函数产生一个误差

    :

    c9da913529ba4c00c6c995cf0229de8f.png

    根据导数的定义可知:

    因而可以通过仔细跟踪

    如何产生
    的过程来求取
    。下面将给出详细推导过程。

    首先,我们考察由

    直接使第
    层的第
    个神经元产生的误差
    ,根据偏导数定义有:

    由于第

    层的第
    个神经元回对第
    层的每一个神经元的输出都产生误差,因此第
    个神经元的输出误差为:

    因而,有向量表达:

    其中

    表示将两个向量按元素对应相乘的运算,
    表示第
    层权重矩阵的第
    列。进一步考察第
    层的第
    个神经元,由于
    层的一个神经元将受到
    层的所有神经元输出的影响,即有
    中误差传递线路,因而需对所有误差传递线路累加求和

    其中

    表示
    层权重矩阵的第
    行,对
    层的所有神经元写成向量形式有:

    同理,可写出

    直至

    最后,输出层神经元的误差将使代价函数

    产生误差

    将上面的式子代入可得到:

    其中

    表示激活函数的导数,令
    ,则上式可简化为:

    再代入

    表达式有:

    化简得:

    同理继续代入

    、……、
    ,并令
    ,可得:

    代入

    再代入

    因此,

    化简得:

    至此我们得到代价函数关于权重系数的偏导数,对于偏置项

    可采用相同的方法求其偏导数,对
    ,我们有:

    替换

    中的

    因此,

    以上就是所有的公式的推导。

    下面给出反向传播算法的实现步骤:

    1. 输入:特征
      、初始权重
      ,并令
    2. 前向传播:令
      ,计算
    3. 输出误差
    4. 误差反向传播:令
      ,计算
    5. 输出:代价函数
      的梯度,
    6. 更新权值和偏置:

    现在,来根据得到的公式然后再来深入回顾一下这几个公式,说一下背后的思想,这里主要是参考了CSDN的一篇博客,链接入下:

    https://blog.csdn.net/xierhacker/article/details/53431207blog.csdn.net

    公式1:

    公式2:

    公式3:

    公式4:

    假如我们这里的输出层用的激活函数是sigmoid,公式及形状如下图所示

    b650b6af1a5f1bfcdf4c7a520ea31f86.png

    函数的值域为(0,1),而且函数值趋向于0和趋向于1的时候,函数都变得平坦,意味着这个函数的导数越来越趋向于0。那么根据公式1可以知道最后一层的误差也会变得很小,根据公式3和公式4,权值和偏置学习的速度也会变得很小。所以,对于sigmoid激活函数来说,当输出层的激活值过大或者过小的时候,学习速度都会变小,我们称输出函数已经饱和。

    从公式2中可以看出非输出层的误差

    受到其下一层的误差
    决定,也就是说,要是输出层“饱和”,那么输出层的误差变小
    ,那么非输出层的误差也将变得小。而误差变小,根据公式3和公式4,直接导致学习速度的变小。

    前面说的总结起来就是:当输入的神经元的激活值

    很低,或者输出层神经元饱和了(过高激活或者过低激活),都将导致学习速度的降低。

    上面的结论也启发我们设计一些激活函数:比如说避免激活函数的导数等于0。

    展开全文
  • 自己学习机器学习,深度学习也有好长一段时间了,一直以来都想写点有价值的技术博客,以达到技术分享记录自己成长的目的,奈何之前一直拖着,近来算是醒悟,打算以后不定时写一写博客,也算是作为自己不断学习,...

    前言(扯犊子)

    自己学习机器学习,深度学习也有好长一段时间了,一直以来都想写点有价值的技术博客,以达到技术分享及记录自己成长的目的,奈何之前一直拖着,近来算是醒悟,打算以后不定时写一写博客,也算是作为自己不断学习,不断进步的记录。既然是写博客,希望自己的博客以后要做到“准确、生动、简洁、易懂”的水平,做到对自己、对读者负责,希望大家多交流,共同进步!

    言归正传,想起当时自己刚入门深度学习的时候,当时对神经网络的“反向传播”机制不是很理解(这对理解以后的很多概念来说,很重要!!一定要搞懂!!),当时查了很多资料,花费了很多时间,感谢当时所查阅的很多资料的作者,本篇博客就网络上很多优秀的资料和我个人的理解,争取生动、简单地讲解一下BP算法,希望能够帮助到大家。

    定义

    首先来一个反向传播算法的定义(转自维基百科):反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。 该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。(误差的反向传播)

    算法讲解(耐心看)

    如果去问一下了解BP算法的人“BP算法怎推导?”,大概率得到的回答是“不就是链式求导法则嘛”,我觉得这种答案对于提问题的人来说没有任何帮助。BP的推导需要链式求导不错,但提问者往往想得到的是直观的回答,毕竟理解才是王道。直观的答案,非图解莫属了。
    注:下图的确是反向传播算法,但不是深度学习中的backprop,不过backward的大体思想是一样的,毕竟误差没法从前往后计算啊。(在深度学习中操作的是计算图—Computational graph),如果暂时不理解上面那句话,你可以当我没说过,不要紧~(手动?)

    下面通过两组图来进行神经网络前向传播反向传播算法的讲解,第一组图来自国外某网站,配图生动形象。如果对你来说,单纯的讲解理解起来比较费劲,那么可以参考第二组图——一个具体的前向传播和反向传播算法的例子。通过本篇博客,相信就算是刚刚入门的小白(只要有一点点高等数学基础知识),也一定可以理解反向传播算法!

    CASE 1(图示讲解,看不太懂没关系,看第二组图)

    首先拿一个简单的三层神经网络来举例,如下:
    在这里插入图片描述

    每个神经元由两部分组成,第一部分(e)是输入值权重系数乘积的,第二部分(f(e))是一个激活函数(非线性函数)的输出, y=f(e)即为某个神经元的输出,如下:
    在这里插入图片描述

    下面是前向传播过程:
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述

    到这里为止,神经网络的前向传播已经完成,最后输出的y就是本次前向传播神经网络计算出来的结果(预测结果),但这个预测结果不一定是正确的,要和真实的标签(z)相比较,计算预测结果和真实标签的误差(δ\delta),如下:
    在这里插入图片描述

    下面开始计算每个神经元的误差(δ\delta):
    在这里插入图片描述
    (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 df(e)de\dfrac {df\left( e\right) }{de} represents derivative of neuron activation function (which weights are modified). ):
    在这里插入图片描述
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述
    -----------手动分割-----------
    在这里插入图片描述

    Coefficient η\eta affects network teaching speed.
    到此为止,整个网络的前向,反向传播和权重更新已经完成,推荐参考上面给出的本教程的链接,如果对纯理论讲解较难接受,没关系,强烈推荐第二组图的例子!!!

    CASE 2(具体计算举例,嫌麻烦的可直接看这个,强烈推荐!!!!!)

    首先明确,“正向传播”求损失,“反向传播”回传误差。同时,神经网络每层的每个神经元都可以根据误差信号修正每层的权重,只要能明确上面两点,那么下面的例子,只要会一点链式求导规则,就一定能看懂!

    BP算法,也叫δ\delta算法,下面以3层的感知机为例进行举例讲解。
    在这里插入图片描述

    上图的前向传播(网络输出计算)过程如下:(此处为网络的整个误差的计算,误差E计算方法为mse)

    在这里插入图片描述

    上面的计算过程并不难,只要耐心一步步的拆开式子,逐渐分解即可。现在还有两个问题需要解决:

    1. 误差E有了,怎么调整权重让误差不断减小?
    2. 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.csdn.net/han_xiaoyang

    展开全文
  • 反向传播算法过程及公式推导

    万次阅读 多人点赞 2016-04-01 21:19:56
    反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。
            反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:
    (1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
    (2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
    (3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。

            反向传播算法的思想比较容易理解,但具体的公式则要一步步推导,因此本文着重介绍公式的推导过程。


    1. 变量定义



            上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
            表示第层的第个神经元连接到第层的第个神经元的权重;
            表示第层的第个神经元的偏置;
            表示第层的第个神经元的输入,即:
            表示第层的第个神经元的输出,即:
            其中表示激活函数。

    2. 代价函数

            代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):

            其中,表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。

    3. 公式及其推导

            本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,请直接看第4节的算法步骤。
            首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:


            本文将以一个输入样本为例进行说明,此时代价函数表示为:


    公式1(计算最后一层神经网络产生的错误):



            其中,表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下:



    公式2(由后往前,计算每一层神经网络产生的错误):



            推导过程:


    公式3(计算权重的梯度):



            推导过程:



    公式4(计算偏置的梯度):



            推导过程:



    4. 反向传播算法伪代码


    • 输入训练集

    • 对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值
      • 前向传播:
    , 
      • 计算输出层产生的错误:

      • 反向传播错误:


    • 使用梯度下降(gradient descent),训练参数:

     








    展开全文

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 217
精华内容 86
关键字:

反向传播算法过程及公式推导