精华内容
下载资源
问答
  • 1. 误差反向传播整体流程 2. 误差反向传播代码实现 3. 误差反向传播梯度确认 4. 误差反向传播使用示例

    1. 神经网络学习整体流程

    神经网络学习的步骤如下所示。

    • 前提
      神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习。神经网络的学习分为下面 4 个步骤。
    • 步骤1(mini-batch)
      从训练数据中随机选择一部分数据。
    • 步骤2(计算梯度)
      计算损失函数关于各个权重参数的梯度。
    • 步骤3(更新参数)
      将权重参数沿梯度方向进行微小的更新。
    • 步骤4(重复)
      重复步骤1、步骤2、步骤3。

    之前介绍的误差反向传播法会在步骤2 中出现。我们可以利用数值微分求得了这个梯度。数值微分虽然实现简单,但是计算要耗费较多的时间。和需要花费较多时间的数值微分不同,误差反向传播法可以快速高效地计算梯度。

    2. 误差反向传播代码实现

    3. 误差反向传播梯度确认

    4. 误差反向传播使用示例

    展开全文
  • 详解 误差反向传播算法推导

    万次阅读 多人点赞 2018-09-14 03:58:31
    误差反向传播算法误差 反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络...

    误差反向传播算法误差

    反向传播算法(back propagation,简称BP模型)是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。

    误差反向传播算法系统的解决了多层神经网络隐含层连接权学习问题,人们把采用这种算法进行误差校正的多层前馈网络称为BP网。BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或(Exclusive OR,XOR)和一些其他问题。

    从结构上讲,BP网络具有输入层、隐藏层和输出层;
    从本质上讲,BP算法就是以网络误差平方为目标函数、采用梯度下降法来计算目标函数的最小值。

    因此学习误差反向传播算法对于深度学习的深造起到非常重要的作用,这也是本篇博客的主题。

    由于梯度下降法需要求解相邻层的梯度,这就要求网络中需要处处可导,也就是需要激活函数也必须支持可导性。M-P模型中使用step函数作为激活函数,只能输出0或1,不连续所以不可导。为了使误差能够顺利传播,科学家们提出了可导函数sigmoid作为激活函数 f ( u ) f(u) f(u),但是在后期的使用中发现sigmoid函数也存在一定的问题(梯度饱和问题),于是发展出了ReLU函数及其变形激活函数,想深入了解激活函数的小伙伴可以查看下这篇博客:https://blog.csdn.net/ViatorSun/article/details/82418578

    1) 以单层感知器入

    反向传播算法便于大家理解,下面先解释下单层感知器的梯度下降法。由复合函数求导法则可以知道,误差函数求导如下所示:

    ∂ E ∂ w i = ∂ E ∂ y ∂ y ∂ w i \frac{\partial E}{\partial w_i} = \frac{\partial E}{\partial y}\frac{\partial y}{\partial w_i} wiE=yEwiy

    y = f ( u ) y=f(u) y=f(u),求误差函数 E E E w i w_i wi 的导数为:

    ∂ E ∂ w i = − ( r − y ) ∂ y ∂ w i = − ( r − y ) ∂ f ( u ) ∂ w i \frac{\partial E}{\partial w_i} = -(r-y)\frac{\partial y}{\partial w_i} = -(r-y)\frac{\partial f(u)}{\partial w_i} wiE=(ry)wiy=(ry)wif(u)

    f ( u ) f(u) f(u)的导数就是对复合函数求导

    ∂ E ∂ w i = − ( r − y ) ∂ f ( u ) ∂ u ∂ u ∂ w i \frac{\partial E}{\partial w_i} = -(r-y)\frac{\partial f(u)}{\partial u} \frac{\partial u}{\partial w_i} wiE=(ry)uf(u)wiu

    u u u w i w_i wi求导的结果只和 x i x_i xi相关: ∂ u ∂ w i = x i \frac{\partial u}{\partial w_i} = x_i wiu=xi 整理下上面两个式子,得到:

    ∂ E ∂ w i = − ( r − y ) x i ∂ f ( u ) ∂ u \frac{\partial E}{\partial w_i} = -(r-y)x_i\frac{\partial f(u)}{\partial u} wiE=(ry)xiuf(u)

    在此,我们对激活函数 S i g m o i d Sigmoid Sigmoid σ ( x ) = 1 1 + e − x \sigma(x) = \frac {1}{1+e^{-x}} σ(x)=1+ex1函数求导:

    ∂ σ ( x ) ∂ x = e − x ( 1 + e − x ) 2 \frac{\partial \sigma(x)}{\partial x} = \frac {e^{-x}}{(1+e^{-x})^2} xσ(x)=(1+ex)2ex

    e − x = u e^{-x} = u ex=u 则导函数为:

    ∂ f ( u ) ∂ u = f ( u ) ( 1 − f ( u ) ) \frac{\partial f(u)}{\partial u} = f(u)(1-f(u)) uf(u)=f(u)(1f(u))

    将激活函数的导数代入上面整理结果得到:

    ∂ E ∂ w i = − ( r − y ) x i f ( u ) ( 1 − f ( u ) ) \frac{\partial E}{\partial w_i} = -(r-y)x_i f(u)(1-f(u)) wiE=(ry)xif(u)(1f(u))

    由于输出结果 y = f ( u ) y=f(u) y=f(u),所以单层感知器的权重调整值为(其中 η \eta η为学习率):

    Δ w i = − η ∂ E ∂ w i = η ( r − y ) y ( 1 − y ) x i \Delta w_i = - \eta\frac{\partial E}{\partial w_i} = \eta(r-y)y(1-y)x_i Δwi=ηwiE=η(ry)y(1y)xi

    至此,这就是单层感知器权重的调节量。


    2)多层感知器的反传传播算法

    接下来,我们再分析下多层感知器。多层感知器的误差函数 E E E等于个输出单元的误差总和。 E = 1 2 ∑ j = 1 q ( r j − y j ) 2 E = \frac{1}{2} \sum_{j=1}^q (r_j - y_j)^2 E=21j=1q(rjyj)2

    对误差函数求导得:

    ∂ E ∂ w i j = ∂ E ∂ y j ∂ y j ∂ w i j \frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial w_{ij}} wijE=yjEwijyj

    其中, w i j w_{ij} wij代表 x i x_i xi y j y_j yj之间的连接权重,对 E E E求导的结果只和 y j y_j yj相关,如下所示:

    ∂ E ∂ w i j = − ( r j − y j ) ∂ y j ∂ w i j \frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) \frac{\partial y_j}{\partial w_{ij}} wijE=(rjyj)wijyj

    与单层感知相同,对上式展开后对复合函数求导:

    ∂ E ∂ w i j = − ( r j − y j ) ∂ y j ∂ u j ∂ u j ∂ w i j \frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) \frac{\partial y_j}{\partial u_j} \frac{\partial u_j}{\partial w_{ij}} wijE=(rjyj)ujyjwijuj

    下面与单层感知器一样,对误差函数求导得:

    ∂ E ∂ w i j = − ( r j − y j ) y j ( 1 − y j ) x i \frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) y_j (1-y_j)x_i wijE=(rjyj)yj(1yj)xi

    则权重的调节值为(其中 η \eta η为学习率):

    Δ w i j = η ( r j − y j ) y j ( 1 − y j ) x i \Delta w_{ij} = \eta(r_j - y_j )y_j (1-y_j)x_i Δwij=η(rjyj)yj(1yj)xi

    由此可见,多层感知器中,只需要使用与连接权重 w i j w_{ij} wij相关的输入 x i x_i xi和输出 y j y_j yj,即可计算出连接权重的调节值。

    将神经网络分解开可以更清晰的分析,再将最后一列各变量之间的偏导数累成就是整个链式法则的体现。


    3) 带中间层的多层感知器的反向传播算法

    最后我们再解释下带中间层的多层感知器的梯度下降法。由于中间层的加入,层之间的权重下标我们增加到三个,其中 i i i表示输入层单元, j j j表示中间层单元, k k k表示输出层单元 。如下图所

    首先考虑输出层与中间层之间的连接权重 w 2 j k w_{2jk} w2jk的调整。对权重 w 2 j k w_{2jk} w2jk求导:

    ∂ E ∂ w 2 j k = ∂ E ∂ y k ∂ y k ∂ u 2 k ∂ u 2 k ∂ w 2 j k \frac{\partial E}{\partial w_{2jk}} = \frac{\partial E}{\partial y_k} \frac{\partial y_k}{\partial u_{2k}} \frac{\partial u_{2k}}{\partial w_{2jk}} w2jkE=ykEu2kykw2jku2k

    经过误差函数 E E E对输出 y k y_k yk求导,输出 y k y_k yk求导,输出 y k y_k yk对激活值 u 2 k u_{2k} u2k求导,激活值 u 2 k u_{2k} u2k对连接权重 w 2 j k w_{2jk} w2jk求导之后,得到:

    ∂ E ∂ w 2 j k = − ( r k − y k ) y k ( 1 − y k ) z j \frac{\partial E}{\partial w_{2jk}} = -(r_k - y_k) y_k ( 1-y_k) z_j w2jkE=(rkyk)yk(1yk)zj

    所以,即便是输出层有多个单元,只要对每个输出单元分别求导后,也能得到误差函数对中间层权重的偏导数接下来计算输入层和中间层之间的连接权重 w 1 i j w_{1ij} w1ij的偏导数:

    ∂ E ∂ w 1 i j = ∑ k = 1 q [ ∂ E ∂ y k ∂ y k ∂ u 2 k ∂ u 2 k ∂ w 1 i j ] \frac{\partial E}{\partial w_{1ij}} = \sum_{k=1}^q[ \frac{\partial E}{\partial y_k} \frac{\partial y_k}{\partial u_{2k}} \frac{\partial u_{2k}}{\partial w_{1ij}}] w1ijE=k=1q[ykEu2kykw1iju2k]

    中间层的单元 j j j和输出层的所有单元相连,所以如上式所示,误差函数 E E E对连接权重 W 1 i j W_{1ij} W1ij求偏导,就是对所有输出单元的导数进行加权和,实际使用的是所有输出单元连接权重的总和。将 s i g m o i d sigmoid sigmoid函数的导数和误差函数代入到上式,得:

    ∂ E ∂ w 1 i j = − ∑ k = 1 q [ ( r k − y k ) y k ( 1 − y k ) ∂ u 2 k ∂ w 1 i j ] \frac{\partial E}{\partial w_{1ij}} = -\sum_{k=1}^q[ (r_k - y_k)y_k(1-y_k) \frac{\partial u_{2k}}{\partial w_{1ij}}] w1ijE=k=1q[(rkyk)yk(1yk)w1iju2k]

    由于连接权重 w 1 i j w_{1ij} w1ij只对中间层 z j z_j zj的状态产生影响,所以上式中剩余部分求导后的结果如下:

    ∂ u 2 k ∂ w 1 i j = ∂ u 2 k ∂ z j ∂ z j ∂ w 1 i j \frac{\partial u_{2k}}{\partial w_{1ij}} = \frac{\partial u_{2k}}{\partial z_j } \frac{\partial z_j}{\partial w_{1ij}} w1iju2k=zju2kw1ijzj

    激活值 u 2 k u_{2k} u2k z j z_j zj求导得到连接权重 w 2 j k w_{2jk} w2jk,结合下式就可以求出输入层与中间层之间的连接权重 w 1 i j w_{1ij} w1ij的调整值:

    ∂ z j ∂ w 1 i j = ∂ z j ∂ u 1 j ∂ u 1 j ∂ w 1 i j = z j ( 1 − z j ) x i \frac{\partial z_j}{\partial w_{1ij}} = \frac{\partial z_j}{\partial u_{1j}} \frac{\partial u_{1j}}{\partial w_{1ij}} = z_j ( 1- z_j) x_i w1ijzj=u1jzjw1iju1j=zj(1zj)xi Δ w 1 i j = η ∑ k = 1 q [ ( r k − y k ) y k ( 1 − y k ) w 2 j k ] z j ( 1 − z j ) x i \Delta w_{1ij} = \eta \sum_{k=1}^q [ (r_k - y_k) y_k ( 1- y_k) w_{2jk} ] z_j (1-z_j) x_i Δw1ij=ηk=1q[(rkyk)yk(1yk)w2jk]zj(1zj)xi

    具体推导过程可以参考下列公式

    在此需要注意 z j = f ( u j ) z_j=f(u_j) zj=f(uj),输入层与中间层之间的权重调整值是相关单元在中间层与输出层之间的权重调整值的总和。

    4)小结

    至此,误差反向传播算法的讲解就全部结束了,其中包含了大量的公式,理解起来可能会有一些难度,但是这是必过的槛。如果实在不理解过程的话,只记住最后那张图也可以,那张图便是整个算法的精髓所在。除此之外,在实际应用过程中可能还会遇到一个问题,那就是激活函数使用 S i g m o i d Sigmoid Sigmoid或者 t a n h tanh tanh函数的时候,如果 x x x趋向正负无穷的时候,会出现偏导数为零的情况,见下图,左侧为 S i g m o i d Sigmoid Sigmoid函数图像,右侧为其导函数的图像。这时候,由于权重调整值趋近于0,所以无法调整连接权重,权重所在的单元也就不再起作用。

    这就是误差反向传播算法中的梯度消失导致无法调整连接权重的问题,对于这个问题,需要在训练的过程中合理地调整学习率 η \eta η,以防止梯度消失。

    展开全文
  • 误差反向传播

    千次阅读 2019-06-19 09:00:00
    误差反向传播,就是其中最为高效的一种求解导数的算法。   但是,误差反向传播并不是很容易被理解。 作者是数学专业出身,也花了不少功夫来理解这个东西。完了就在思考,明明就是一个复合函数的链式求导,为毛会...

    点击上方“大数据与人工智能”,“星标或置顶公众号”

    第一时间获取好内容

    640?wx_fmt=gif

    640?wx_fmt=png


    作者丨stephenDC

    这是作者的第11篇文章



    前馈网络是神经网络中最为基础的一种,对网络结构的修改可以延伸出其他的网络类型。前馈网络模型的训练,通常基于模型参数的导数。


    而误差反向传播,就是其中最为高效的一种求解导数的算法。

     

    但是,误差反向传播并不是很容易被理解。


    作者是数学专业出身,也花了不少功夫来理解这个东西。完了就在思考,明明就是一个复合函数的链式求导,为毛会整的这么难以理解呢?


    后来发现,其实是“误差反向传播”这个概念有一定的误导性,如果当初起名叫“导数反向传播”或者“梯度反向传播”,就容易理解多了。

     

    本文就跟大家聊一下这个话题。



    前馈网络模型



    640?wx_fmt=png

    图1. 前馈网络结构

     

    前馈网络的结构,如上图所示。


    其中包括两类对象,结点和边。结点用来表示一个变量,而边则表示两个结点直接的关系。图中的边我们画成了有向的(带箭头),这是因为从输入到输出,信息是单向的向前流动的,而不能反向流动,所谓的“前馈”,也正是这个意思。每一条边上会附带一个参数,称之为“权重”,其作用我们后面再提。

     

    为了一般性,我们在上图中把网络分成了三个部分,中间部分拿来作为示例,其前后都可能还有若干层的网络结构。

     

    在很多文献里,会把结点称为“神经元”,然后讲“树突”、“轴突”什么的。尽管神经网络模型的提出,确实受到了神经科学的启发,但学习这个模型的时候最好忘掉这些东西,没有什么鸟用。


    原因有两点:

     

    1. 作为一个抽象出来的数学模型,应该更加通用,跟生物和神经科学扯在一起,只会限制你的思考。


    2. 真正生物意义上的“神经网络”,其结构远比这个复杂,这个模型并不足以描述。



    模型的计算


     

    640?wx_fmt=png


    很简单对吧?


    不过这里要注意的有两点:


    1.  对于回归问题,神经网络的输出层(也即最后一层),通常采用线性激活函数,而中间层则采用非线性激活函数。这里为了说明方便,采用了统一的激活函数。


    2.  从输入到输出,每一层都先后按照以上方式进行作用,其结果就是输出变成了输入的一个复合函数。信息每向前传播一层,复合函数之上就多加了一次线性加权求和和一次激活函数作用。




    模型的训练


    对于监督学习来说,计算出损失函数,然后求出损失函数对各个模型参数的导数,即可对模型进行训练。


    对神经网络模型而言,参数求导似乎是一个非常艰巨的任务,一是因为模型参数非常多;二是因为复合函数非常复杂。


    事实上确实如此,但幸运的是,模型参数的导数之间是有关系的,利用这种关系可以高效地对所有参数进行求导。


    640?wx_fmt=png


    640?wx_fmt=png


    640?wx_fmt=png


    640?wx_fmt=png



    小结


    这篇文章告诉我们,如果有一天你成了大神,发明了什么算法,一定要慎重地给各种相关概念起名字。


    大神们都知道咋回事,但容易误导他人啊!谁特么告诉我,输出为连续值的监督学习问题,怎么就叫Regression了?(摊手...)



    -end-

     


    640?wx_fmt=png

    展开全文
  • 误差反向传播算法浅解

    万次阅读 2017-09-28 09:24:48
    反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称。由于多层前馈神经网络的训练经常采用误差反向传播算法,人们也常把多层前馈神经网络称为BP网络。

    反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称。由于多层前馈神经网络的训练经常采用误差反向传播算法,人们也常把多层前馈神经网络称为BP网络。


    反向传播算法发明的历史请参考我的前文《神经网络简史》。


    多层前馈神经网络是指通过按某种方式将神经元连接起来,就可构成相关神经网络。下图所示为一个熟知的前馈网络模型,该网络有L层,第1 层为输入层,第L层为网络输出层。在这个网络中,前一层神经元全连接到后一层神经元,同层的神经元之间没有任何连接


    反向传播通常被认为是基于优化理论的一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。


    本文主要内容:

    • 神经网络应用梯度下降的直观理解

    • 反向传播算法的学习过程

    • 反向传播算法推导

    • 总结探讨

    • 本文灵感来源

    • 参考文献


    直观理解


    考虑一个有两个输入单元、一个输出单元、没有隐藏单元的简单神经网络。每个神经元都使用输入的加权和作为线性输出。


    最初在训练之前,会随机分配权重。之后神经元根据训练实例进行学习,在此情况下包含元组 (x1,x2,t) 的集合,其中 x1与x2是网络的输入,t 为正确输出(在给定相同的输入时网络最终应当产生的输出)。网络在给定x1 和 x2时,会计算一个输出 y,很可能与t 不同(因为权重最初是随机的)。衡量期望输出t 与实际输出  y 之间的差异的一个常见方法是采用平方误差测度:

    其中E为差异或误差。


    为什么采用平方差?其数学背景是最小二乘法,也可以理解为空间两点的距离或者平方误差等。最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。最重要的应用是在曲线拟合上。最小平方所涵义的最佳拟合,即残差(残差为:观测值与模型提供的拟合值之间的差距)平方总和的最小化。


    举例来讲,考虑单一训练实例的网络:(1,1,0),输入x1 与x2均为1,正确输出t 为 0(网络只有一个输出)。现在若将实际输出 y 画在x轴,误差E画在y 轴,得出的是一条抛物线。抛物线的极小值对应输出y,最小化了误差E。对于单一训练实例,极小值还会接触到 x 轴,这意味着误差为零,网络可以产生与期望输出t 完全匹配的输出y。因此,把输入映射到输出的问题就化为了一个找到一个能产生最小误差的函数的最优化问题。

    单一实例的神经网络的误差函数非常容易理解,可以通过解方程,直接找到最小值。这里给一个梯度表示,如下图,便于理解多实例神经网络的梯度表示。



    反向传播算法的目的是找到一组能最大限度地减小误差的权重。寻找抛物线或任意维度中任何函数的极大值的方法有若干种。其中一种方法是通过求解方程组,但这依赖于网络是一个线性系统,而目标也需要可以训练多层非线性网络(因为多层线性网络与单层网络等价)。


    如果考虑两个实例呢(依然是单层神经网络,不考虑非线性变换)?


    考虑一个神经元的输出取决于其所有输入的加权总和:

    其中w1和 w2是从输入单元到输出单元相连的权重。因此,误差取决于输入到该神经元的权重,也是网络要学习最终需要改变的。若每个权重都画在一个水平的轴上,而误差画在垂直轴上,得出的就是一个抛物面(若一个神经元有 k 个权重,则误差曲面的维度就会是k+1,因而就是二维抛物线的k+1维等价)。



    抛物面的最小值需要通过梯度下降法求得。如下图所示。


    如果是多个实例呢?并且是多层神经网络的非线性变换呢?从数学角度看,已经不能通过求解方程组得到最小值,也不能简单的描绘多维权重系数构成的函数所对应的几何形状(比如抛物面)。但是运用抽象推理,大概想象成这样子:


    以上就是神经网络学习和误差函数原理的直观表示。


    结合梯度的概念,这里先给出梯度下降的推导结果(公式所示),下面逐步解释为什么有这个推导结果



    这个公式推导所带出的三个导数非常重要,是影响梯度的三个重要因素。我把上面三个偏导分成三部分来讨论,分别对应于误差函数激活函数神经元模型。假设我们要得到的是第i层到第j层的连接权重w_ij,用于梯度的偏导可以通俗的表达为:


    下面分别从神经元模型误差函数激活函数的角度解释这个公式。


    一个神经元的基本模型如下图所示。



    通向一个神经元的输入net_j是之前神经元的输出o_i 的加权和。若该神经元输出层后的第一层,输入层的输出 o_i就是网络的输入 x_i。该神经元的输入数量是 n。变量 w_ij表示神经元 i 与 j 之间的权重。对于每一个神经元,其对应的输出为:

    从数学的角度来看,神经元模型定义了两层的复合函数:内层是net_k,外层是φ函数。激活函数φ一般是非线性可微函数(反向传播要求人工神经元的激励函数可微)。常用作激活函数的是Sigmoid函数:

    或者写成:

    这个函数也被称为单极性Sigmoid函数。其导数形式很好:

    其图像如何下:

    双极性Sigmoid函数要比较常用。公式如下:

    或者写成(把上式中分子分母同时除以e^z,令x=-2z就得到第二个式子):

    其导数为:

    其图像为:

    从上图可以看出,对于Sigmoid函数,当z的取值越来越大后(饱和区),函数曲线变得越来越平缓,意味着此时的导数也越来越小。同样的,当z的取值越来越小时(饱和区),也有这个问题。仅仅在z取值为0附近时,导数的取值较大。在后文讲到的反向传播算法中,每一层向前递推都要乘以导数,得到梯度变化值。Sigmoid的这个曲线意味着在大多数时候,我们的梯度变化值很小,导致我们的W,b更新到极值的速度较慢,也就是我们的算法收敛速度较慢。


    由于反向传播使用梯度下降法,需要计算平方误差函数对网络权重的导数。假设对于一个输出神经元,平方误差函数为:

    其中

    • E 为平方误差,

    • t 为训练样本的目标输出,

    • y 为输出神经元的实际输出。

    • 加入系数1/2是为了抵消微分出来的指数。之后,该表达式会乘以一个任意的学习速率,因此在这里乘上一个常系数是没有关系的。


    由梯度的定义,与方向导数有关联的一个概念是函数的梯度。多元函数的偏导向量构成了梯度,梯度的方向是函数在这点增长最快的方向,那么函数的偏导在这点的梯度方向也达到最大值。其中,要使用梯度下降法更新 w_ij,必须选择一个学习速率μ。要加在原本的权重上的变化,等于学习速率与梯度的乘积,乘以-1:

    之所以要乘以-1 是因为要更新误差函数极小值而不是极大值的方向。


    从数学的角度看,平方误差函数形成了对输出o_j的复合函数:

    这个式子无论对于输出层的神经元,还是隐藏层的神经元,都是成立的。


    综上所述,误差函数是关于权重的函数,为了在由权重系数构成的多维空间中寻找一个下降最快的梯度方向,我们需要对所有权重系数求偏导。根据复合函数的求导规则,其一般形式为:


    反向传播算法的学习过程


    学习过程由信号的正向传播与误差的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号) 不符,则转入误差的反向传播阶段。误差反传是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号作为修正各单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程,是周而复始地进行的。权值不断调整的过程,也就是网络学习训练过程。此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。


    学习过程的伪码描述如下:

    输入:训练集和学习率

    初始化网络权值(通常是小的随机值)

      do

         forEach 训练样本 ex

            prediction = neural-net-output(network, ex)  // 正向传递,得到当前样本的输出

            actual = teacher-output(ex)//从监督老师那里获得真实输出

            计算输出单元的误差 (prediction - actual)//获得残差

            计算    对于所有隐藏层到输出层的权值和阈值          // 反向传递

            计算    对于所有输入层到隐藏层的权值和阈值          // 继续反向传递

            更新网络权值和阈值 // 输入层不会被误差估计改变

      until 所有样本正确分类或满足其他停止条件

      return 权重与阈值确定的多层前馈神经网络


    完整的误差反向传播算法包括前向计算和反向传播两部分。


    反向传播算法推导


    为了最小化误差E,最终归结为优化问题。前面说过,反向传播算法的目的是找到一组能最大限度地减小误差的权重,在反向传播中使用的方法是梯度下降法。这样我们就需要计算误差函数E对权重的偏导。由上文,误差函数对权重w_ij的偏导数是三个偏导数的乘积:


    我们的目标就是分别求得这三个偏导。


    在右边的最后一项中(神经元模型),只有加权和 net_j取决于 w_ij,因此:

    当对一个权重求导时,其他权重就视为常量。这里如有不确定,把加权和展开即可明白。


    对于激活函数部分,神经元j 的输出对其输入的导数就是激活函数的偏导数(这里假定使用Sigmoid函数):

    这就是为什么反向传播需要的激活函数是可微的。同时,前向传播时,很容易求得net_j(各层神经元计算得到的加权和),所以该偏导也容易求得。


    对于误差函数部分的偏导,为了方便理解,分输出层和隐藏层来讨论。


    如果神经元在输出层中,因为此时o_j=y以及

    所以第一项可以直接算出。


    但如果j 是网络中任一内层(隐藏层),就需要用到链式求导法则。


    下面以一个神经网络的局部来说明。神经网络中相邻的两层构成一个计算单元,因此只需要理解第j层和第k(j+1) 层之间的结构和运算,便可以通晓整个网络的结构和运算(前面说过,层与层之间全连接,同层之间没有连接)。


    注意到我们要求的是第i层到第j层的连接权重w_ij,考虑第j层中的某个神经元的输出o_j是第k层所有神经元{u,v,…,w}的输入,把误差(损失)函数E看作是{u,v,…,w}的函数(注意,这里的第k层可能是输出层,也可能是隐藏层;作为输出层时,既可能是多值输出,也可能是单值输出)。可以得到:


    这里应用链式求导法则


    最后一步做了两次替换:


    对于上面推导结果,我们发现:


    因此,若已知所有关于下一层(更接近输出神经元的一层)的输出关于o_k 的导数,则可以计算 o_j的导数。


    现在把上述推导放在一起:

    此时:

    则:


    综上,权重的调整只和以下因素有关:

    • 前向神经元的输出(和所调整权重有关的一个前向神经元的输出作为输入)

    • 当前神经元的激活函数

    • 所有后向神经元(误差函数导数,激活函数导数,并一直递归下去)及其前向传播时的权重(这些权重用来作为误差后向传播的权重)

    • 递归会终结在输出层,从而使用残差(y-t)。注意到递归的层数以及系数作用,这里有一大串连乘,如果连乘的数字小于1,则梯度越乘越小,导致梯度消散;如果连乘的数字大于1,则梯度越乘越大,导致梯度爆炸

    • 对于偏置来说,注意到偏置是没有权重,调整的是偏置本身


    总结探讨


    总结起来,BP的误差反向传播思想可以概括为:利用输出层的误差来估计出其直接前导层的误差,再借助于这个新的误差来计算更前一层的误差,按照这样的方式逐层反传下去便可以得到所有各层的误差估计。


    BP算法的提出在一定程度上解决了多层网络参数训练难的问题,但是其自身也存在如下一些问题。


    首先,误差在反向传播过程中会逐渐衰减/增大,经过多层的传递后将会变得消散/爆炸,这使得BP在深层网络中并不可行。对于梯度爆炸,则一般可以通过调整神经网络模型中的初始化参数得以解决。对于无法完美解决的梯度消失问题,目前有很多研究,一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数(σ(z)=max(0,z))。


    其次,BP采用最速梯度下降的优化思想,而实际问题的误差函数通常不是凸的,存在众多局部极小值点,算法很难得到最优解。极小值问题,有多种解决方案,比如从多个不同的初始点开始搜索,模拟退火,随机梯度下降,遗传算法等。但这些都是启发式,理论上尚缺乏保障。


    第三,由于训练过程中依靠于导数信息来进行权值的调整,当权值调节过大时会使大部分神经元的加权和过大,致使传递函数工作于S型函数的饱和区,所以权值的调整会出现停顿的情况。


    第四,隐层神经元的个数设置是个未解决的问题,实际应用中通常靠试错法调整。


    第五,BP神经网络的过拟合,常用的方法是早停和正则化。早停是指:将数据分成训练集和验证集,训练集用来计算梯度,更新连接权和阈值,验证集用来估计误差,如果训练集误差降低但是验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。正则化是指:误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。


    最后,对于一些复杂网络的优化问题,BP算法受到学习速率的限制需要花费几个小时,甚至更长的时间来完成训练任务。累积BP算法和标准BP算法各有优缺点。

    展开全文
  • 误差反向传播

    2020-03-03 13:33:10
    误差反向传播法 步骤 准备好学习数据。 进行权重和偏置的初始设置,设置学习率。 计算神经单元的输出值及平方误差C。 根据误差反向传播法,计算各层的神经单元误差。 根据神经单元误差计算平方误差C的偏导数。 计算...
  • python 新手 神经网络的反向传播 和 误差反向传播 是同一个东西吗
  • 误差反向传播算法 我们知道神经网络是由大量的参数即权重构成,神经网络的学习过程则是这些参数的变化更新过程。误差反向传播算法就是用于更新这些参数的。这里我们假设激活函数为Sigmoid。 Ps: 在吴恩达...
  • 深度学习入门笔记(六):误差反向传播算法

    千次阅读 多人点赞 2020-07-15 21:37:04
    误差反向传播法——能够高效计算权重参数的梯度的方法。要正确理解误差反向传播法,有两种方法: 一种是基于数学式;另一种是基于计算图(computational graph)。前者是比较常见的方法,机器学习相关的图书中多数都是...
  • 误差反向传播(Error Back Propagation, BP)算法 1、BP算法的基本思想是:学习过程由信号的正向传播与误差的反向传播两个过程组成。 1)正向传播:输入样本->输入层->隐藏层(处理)->输出层 举一个...
  • 1.误差反向传播算法是干什么的? 通过数值微分计算了神经网络的权重参数的梯度,数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。本章我们将学习一个能够高效计算权重参数的梯度的方法——误差反向传播法...
  • 误差反向传播算法(BP网络)

    千次阅读 2020-04-20 09:50:30
    误差反向传播网络(Error Back Propagtion,),简称为BP神经网络,是一种多层神经网络,与之相关的另一个概念是多层感知器(Multi-Layer Perceptron,MLP)。多层感知器除了输入层和输出层以外,还具有若干个隐含层...
  • 误差反向传播(BP)算法

    千次阅读 2018-01-23 23:56:34
    误差反向传播算法是训练神经网络最常用且最基础的算法 这里以三层神经网络为基础,结合不同的准则函数和激活(转移)函数对误差反向传播算法做出详细的计算 一、三层感知器 网络描述: 训练数据输入输出对:...
  • 网络游戏-误差反向传播神经网络的预测方法、系统及服务器.zip
  • 人工神经网络的实现和用于训练的误差反向传播算法 包含神经网络框架、误差反向传播算法和用于手写数字识别和猫识别的特定训练类。 可以保存和加载经过训练的网络,包括经过训练和保存的数字识别网络。 其他任务的新...
  • 在机器学习算法中,误差反向传播和梯度下降是模型收敛的关键技术,作者将以单隐层模型为例说明误差反向传播和梯度下降的工作原理。 各种算法的单隐层模型结构大同小异 正向传播 假设:主要模型参数有3个,输入...
  • 本章我们将学习一 个能够高效计算权重参数的梯度的方法——误差反向传播法 正确理解误差反向传播法:一种是基于数学式; 另一种是基于计算图(computational graph) 5.1 计算 5.1.1 用计算图求解 节点用○表示...
  • 误差反向传播和深度学习相关技巧总结 一、误差反向传播法 1.几个问题 误差反向传播的目的是什么? 为了能够更高效的计算权重参数的梯度方法,数值微分虽然很好理解,但是它的计算量确实很大,执行效率很低。 反向...
  • 一、误差反向传播神经网络的提出 采用非线性连续变换函数,使隐含层神经元具有学习能力。 二、误差反向传播神经网络结构 互连结构 BP神经网络是一种具有三层或三层以上结构的无反馈的层内无互联的前向网络,各层...
  • 误差反向传播(BP)推导

    千次阅读 2020-02-12 14:48:40
    误差反向传播公式推导 1、输出层与其前一层的参数的倒数 2、输出层与其前一层的参数的倒数 3、误差传播迭代公式(输出层) 4、误差传播迭代公式(隐藏层) 5、误差传播迭代公式(总结) BP简单例子及...
  • 二是整理前馈神经网络中正向传播、误差反向传播和梯度下降的原理;三是梯度消失和梯度爆炸问题的原因及解决思路。 一、神经网络结构 目前比较常用的神经网络结构有如下三种: 1、前馈神经网络 前馈神经网络...
  • BP误差反向传播算法

    2017-05-07 17:16:54
    BP算法通过将输出误差反向传播,将误差分配到每个权值上,利用梯度更新对所有参数进行调整以达到输出累计误差最小 [图片来自Andrew Ng的machine learning课程] 为了简化概念,先不加上偏置单元 符号介绍 zli...
  • 针对该问题,鲁梅尔哈特的人于1986年提出了误差反向传播算法,该算法使得神经网络再次回到人们的视野。 什么是误差反向传播算法? 通过比较实际输出和期望输出得到的误差信号,把误差信号从输出层逐层向前传播,得到...
  • 公司内部AI学习资料,共享给感兴趣的朋友。值得一看!!!
  • 反向传播算法又称误差反向传播、BP算法( Backpropagation,缩写为BP)。 BP算法的学习过程由正向传播过程和反向传播过程组成。 在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得...
  • 误差反向传播算法系统解决了多层神经网络隐含层连接权学习问题,人们把采用这种算法进行误差校正的多层前馈网络称为BP网。BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决...
  • 误差反向传播法 上一篇文章介绍的是用数值微分法计算梯度,但这种方法比较耗时间,接下来介绍新的梯度计算法:误差反向传播法。在此之前,先介绍计算图。 一、计算图 计算图用节点和箭头表示,节点表示某种运算...
  • 最近看了BP神经网络(Back Propagation Neural Networks),对于其中误差反向传播公式的推导比较困惑,在参考周志华老师的《机器学习》和网上一些博客后,做出一个简单的还原。 1. BP网络模型及变量说明 1.1 模型...
  • BP算法核心就两点 1.误差反向传播 2.链式求导法则 参考: 这个最全最细0.一步步教你理解反向传播方法 这个简单易懂,一看就懂了1.20分钟搞懂神经网络BP算法 这个例子不错2.一文搞懂反向传播算法 ...
  • BP神经网络:误差反向传播算法公式推导 开端: BP算法提出 1. BP神经网络参数符号及激活函数说明 2. 网络输出误差(损失函数)定义 3. 隐藏层与输出层间的权重更新公式推导 4. 输入层与隐藏层间的权重更新...
  • 误差反向传播例子

    千次阅读 2019-04-27 21:33:26
    反向传播(Backpropagation)是训练神经网络最通用的方法之一,网上有许多文章尝试解释反向传播是如何工作的,但是很少有包括真实数字的例子,这篇博文尝试通过离散的数据解释它是怎样工作的。 P...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,811
精华内容 13,124
关键字:

误差反向传播