为您推荐:
精华内容
最热下载
问答
  • 5星
    9.4MB qq_31988139 2021-06-30 09:47:27
  • 5星
    12.76MB qq_31988139 2021-06-30 09:46:52
  • 一、反向传播的由来 在我们开始DL的研究之前,需要把ANN—人工神经元网络以及bp算法做一个简单解释。 关于ANN的结构,我不再多说,网上有大量的学习资料,主要就是搞清一些名词: 输入层/输入神经元,输出层/输出...
    [本文摘自](https://blog.csdn.net/mao_xiao_feng/article/details/53048213)

    一、反向传播的由来

    在我们开始DL的研究之前,需要把ANN—人工神经元网络以及bp算法做一个简单解释。
    关于ANN的结构,我不再多说,网上有大量的学习资料,主要就是搞清一些名词:
    输入层/输入神经元,输出层/输出神经元,隐层/隐层神经元,权值,偏置,激活函数

    接下来我们需要知道ANN是怎么训练的,假设ANN网络已经搭建好了,在所有应用问题中(不管是网络结构,训练手段如何变化)我们的目标是不会变的,那就是网络的权值和偏置最终都变成一个最好的值,这个值可以让我们由输入可以得到理想的输出,于是问题就变成了y=f(x,w,b)(x是输入,w是权值,b为偏置,所有这些量都可以有多个,比如多个x1,x2,x3……最后f()就好比我们的网络它一定可以用一个函数来表示,我们不需要知道f(x)具体是怎样的函数,从小我们就认为只要是函数就一定要是可表示的,像f(x)=sin(x)一样,但是请摈弃这样的错误观念,我们只需要知道一系列的w和b决定了一个函数f(x),这个函数让我们由输入可以计算出合理的y)

    最后的目标就变成了尝试不同的w,b值,使得最后的y=f(x)无限接近我们希望得到的值t

    但是这个问题依然很复杂,我们把它简化一下,让(y-t)^2的值尽可能的小。于是原先的问题化为了C(w,b)=(f(x,w,b)-t)^2取到一个尽可能小的值。这个问题不是一个困难的问题,不论函数如何复杂,如果C降低到了一个无法再降低的值,那么就取到了最小值(假设我们不考虑局部最小的情况)

    如何下降?数学告诉我们对于一个多变量的函数f(a,b,c,d,……)而言,我们可以求得一个向量,它称作该函数的梯度,要注意的是,梯度是一个方向向量,它表示这个函数在该点变化率最大的方向(这个定理不详细解释了,可以在高等数学教材上找到)于是C(w,b)的变化量ΔC就可以表示成

    其中

    是该点上的微小变化,我们可以随意指定这些微小变化,只需要保证ΔC<0就可以了,但是为了更快的下降,我们为何不选在梯度方向上做变化呢?

    事实上,梯度下降的思想就是这样考虑的,我们使得从而保证C一直递减,而对于w来说只要每次更新即可。

    ok,到这里,似乎所有的问题都解决了,让我们重新整理一下思绪,我们将问题转化了很多步:
    网络权值偏置更新问题 ==> f(x,w,b)的结果逼近t ==> C(w,b)=(f(x,w,b)-t)^2取极小值问题 ==> C(w,b)按梯度下降问题 ==>取到极小值,网络达到最优

    千万别忘了一点!!推导基于一个前提:我们已经提前知道了当前点的梯度。然而事实并非如此!!
    这个问题困扰了NN研究者多年,1969年M.Minsky和S.Papert所著的《感知机》一书出版,它对单层神经网络进行了深入分析,并且从数学上证明了这种网络功能有限,甚至不能解决象”异或”这样的简单逻辑运算问题。同时,他们还发现有许多模式是不能用单层网络训练的,而对于多层网络则没有行之有效的低复杂度算法,最后他们甚至认为神经元网络无法处理非线性问题。然而于1974年,Paul Werbos首次给出了如何训练一般网络的学习算法—back propagation。这个算法可以高效的计算每一次迭代过程中的梯度,让以上我们的推导得以实现!!
    不巧的是,在当时整个人工神经网络社群中无人知晓Paul所提出的学习算法。直到80年代中期,BP算法才重新被David Rumelhart、Geoffrey Hinton及Ronald Williams、David Parker和Yann LeCun独立发现,并获得了广泛的注意,引起了人工神经网络领域研究的第二次热潮。

    二、原理的引入

    上面已经提到,所谓反向传播,就是计算梯度的方法。对于反向传播,先不急着介绍它的原理,很多文章直接引入公式,反而使得我们很难去理解。这里先引入知乎上某位大神的回答。

    来源:知乎https://www.zhihu.com/question/27239198?rf=24827633


    假设输入a=2,b=1,在这种情况下,我们很容易求出相邻节点之间的偏导关系


    利用链式法则:

    \frac{\partial e}{\partial a}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial a}以及\frac{\partial e}{\partial b}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial b}+\frac{\partial e}{\partial d}\cdot \frac{\partial d}{\partial b}


    \frac{\partial e}{\partial a}的值等于从a到e的路径上的偏导值的乘积,而\frac{\partial e}{\partial b}的值等于从b到e的路径1(b-c-e)上的偏导值的乘积加上路径2(b-d-e)上的偏导值的乘积。也就是说,对于上层节点p和下层节点q,要求得\frac{\partial p}{\partial q},需要找到从q节点到p节点的所有路径,并且对每条路径,求得该路径上的所有偏导数之乘积,然后将所有路径的 “乘积” 累加起来才能得到\frac{\partial p}{\partial q}的值。

    这种情况下偏导很容易求得,因为我们已经知道网络的函数关系式,e=(a+b)*(b+1),这是一个没有权值干预,已知输入与输出之间关系的网络。实际当中我们只是知道e与输出之间的关系,就是上面说的C=(y-t)^2,而且会有成千上万的权值和偏置干预求导的过程。那么换个思路,能不能求输出对结果的偏导呢?

    再利用上图的关系。节点c对e偏导2并将结果堆放起来,节点d对e偏导3并将结果堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送2*1并对堆放起来,节点c向b发送2*1并堆放起来,节点d向b发送3*1并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为2*1+3*1=5, 即顶点e对b的偏导数为5。简要的概括,就是从最上层的节点e开始,以层为单位进行处理。对于e的下一层的所有子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每一个节点都“堆放”些值,然后我们针对每个节点,把它里面所有“堆放”的值求和,就得到了顶点e对该节点的偏导。然后将这些第二层的节点各自作为起始顶点,初始值设为顶点e对它们的偏导值,以”层”为单位重复上述传播过程,即可求出顶点e对每一层节点的偏导数。

    三、一个很好的例子

    现在,我们再把权值考虑进去,以下是一个很好的例子,有助于我们去理解反向传播

    假设,你有这样一个网络层:


    第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

      现在对他们赋上初值,如下图:


      其中,输入数据  i1=0.05,i2=0.10;

         输出数据 o1=0.01,o2=0.99;

         初始权重  w1=0.15,w2=0.20,w3=0.25,w4=0.30;

               w5=0.40,w6=0.45,w7=0.50,w8=0.88

     

      目标:给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。

     

      Step 1 前向传播

      1.输入层—->隐含层:

      计算神经元h1的输入加权和:


    神经元h1的输出o1:(此处用到激活函数为sigmoid函数):



    同理,可计算出神经元h2的输出o2:

    2.隐含层—->输出层:

      计算输出层神经元o1和o2的值:

      

     

    这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。

     Step 2 反向传播

    1.计算总误差

    总误差:(square error)

    但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:

     

    2.隐含层—->输出层的权值更新:

    以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则)

    下面的图可以更直观的看清楚误差是怎样反向传播的:


    现在我们来分别计算每个式子的值:

    计算

    计算

    (这一步实际上就是对sigmoid函数求导,比较简单,可以自己推导一下)

     

    计算

    最后三者相乘:

    这样我们就计算出整体误差E(total)对w5的偏导值。

    回过头来再看看上面的公式,我们发现:

    为了表达方便,用来表示输出层的误差:

    因此,整体误差E(total)对w5的偏导公式可以写成:

    如果输出层误差计为负的话,也可以写成:

    最后我们来更新w5的值:

    (其中,是学习速率,这里我们取0.5)

    同理,可更新w6,w7,w8:

     

    3.隐含层—->隐含层的权值更新:

     方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)—->net(o1)—->w5,但是在隐含层之间的权值更新时,是out(h1)—->net(h1)—->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。

     

     

    计算

    先计算

    同理,计算出:

    两者相加得到总值:

    再计算

    再计算

    最后,三者相乘:

     为了简化公式,用sigma(h1)表示隐含层单元h1的误差:

    最后,更新w1的权值:

    同理,额可更新w2,w3,w4的权值:

    这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是不错的


    四、最一般的情况


            上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
            表示第l-1层的第k个神经元连接到第l层的第j个神经元的权重;
            表示第l层的第j个神经元的偏置;
            表示第l 层的第j 个神经元的输入,即 :
             
            表示第l层的第j个神经元的输出,即:
             
            其中表示激活函数。
    L表示神经网络的最大层数,也可以理解为输出层。
    将第l层第j个神经元中产生的错误(即实际值与预测值之间的误差)定义为:
             
    代价函数,依然用C来表示






    以上4个方程中,第一个方程其实不难理解,就是求输出对估价函数C的偏导。

    唯一比较困难的,就是第二个方程,它给出了根据下一层的错误量δl+1计算δl的等式。为证明该等式,我们先依据δkl+1=∂C/∂zkl+1重新表达下等式δlj =∂C/∂zlj。这里可以应用链式法则:

    在最后一行,我们互换了下表达式右侧的两项,并取代了 δkl+1的定义。为了对最后一行的第一项求值,注意:
    作微分,我们得到

    代回 (42) 我们得到

     这就是以分量形式呈现的 (BP2)。后两式在完成了BP2证明之后就不太难了,留给读者来证明。

            </div>
    
    展开全文
    qq_37023388 2018-07-19 08:24:19
  • 注:下的确是反向传播算法,但不是深度学习中的backprop,不过backward的大体思想是一样的,毕竟误差没法从前往后计算啊。(在深度学习中操作的是计算—Computational graph),如果暂时不理解上面那句话,你...

    前言(扯犊子)

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

    言归正传,想起当时自己刚入门深度学习的时候,当时对神经网络的“反向传播”机制不是很理解(这对理解以后的很多概念来说,很重要!!一定要搞懂!!),当时查了很多资料,花费了很多时间,感谢当时所查阅的很多资料的作者,本篇博客就网络上很多优秀的资料和我个人的理解,争取生动、简单地讲解一下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 d f ( e ) d e \dfrac {df\left( e\right) }{de} dedf(e) 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

    展开全文
    ft_sunshine 2019-05-15 11:37:33
  • 反向传播算法直观理解 定义 (DEFINITIONS) DEFINITION 1. FORWARD PROPAGATION 定义1.向前传播 Normally, when we use a neural network we input some vector x and the network produces an out put y. The ...

    反向传播算法的直观理解

    定义 (DEFINITIONS)

    DEFINITION 1. FORWARD PROPAGATION

    定义1.向前传播

    Normally, when we use a neural network we input some vector x and the network produces an out put y. The input vector goes through each hidden layer, one by one, until the output layer. Flow in this direction, is called forward propagation.

    通常,当我们使用神经网络时,我们输入一些向量x,并且网络会产生输出y。 输入向量逐个遍历每个隐藏层,直到输出层。 沿这个方向的流动称为正向传播。

    During the training stage, the input gets carried forward and at the end produces an scalar cost J(θ).

    在训练阶段,输入被结转,最后产生标量成本J(θ)。

    DEFINITION 2. BACK PROPAGATION ALGORITHM

    定义2.反向传播算法

    The back-prop algorithm then goes back into the network and adjusts the weights to compute the gradient. To be continued…

    反向传播算法然后返回网络并调整权重以计算梯度。 未完待续…

    DEFINITION 3. ANALYTICAL DIFFERENTIATION

    定义3.分析鉴别

    Doing it analytically in terms of algebra is probably what you did in school. For common functions, this is straightforward. But when an analytical method fails or is difficult, we usually try numerical differentiation.

    从代数角度进行分析可能是您在学校所做的。 对于常见功能,这很简单。 但是当分析方法失败或困难时,我们通常会尝试数值微分。

    DEFINITION 4. NUMERICAL DIFFERENTIATION

    定义4.数值微分

    Since algebraic manipulation is difficult or not possible, with numerical methods we general use methods that are heavy in calculation, therefore computers are often used. Numerical differentiation is done using discrete points of a function. From here there are 2 general methods: one is using the nearby points, while the other is using curve fitting.

    由于很难或不可能进行代数运算,因此对于数值方法,我们通常使用计算量大的方法,因此经常使用计算机。 使用函数的离散点进行数值微分。 从这里开始,有2种常规方法:一种是使用附近的点,另一种是使用曲线拟合。

    DEFINITION 5. STOCHASTIC GRADIENT DESCENT

    定义5.随机梯度下降

    The algorithm responsible for the “learning”. It uses the gradient produced by the back propagation algorithm.

    负责“学习”的算法。 它使用反向传播算法产生的梯度。

    DEFINITION 6. BACK PROPAGATION ALGORITHM

    定义6.反向传播算法

    The back-prop algorithm then goes back into the network and adjusts the weights to compute the gradient. In general, the back-prop algorithm is not just for multi-layer perceptron(s). Its a generic numerical differentiation algorithm that can be used to find the derivative of any function, given that the function is differentiable in the first place.

    反向传播算法然后返回网络并调整权重以计算梯度。 通常,反向传播算法不仅适用于多层感知器。 它是一种通用的数值微分算法,可用于查找任何函数的导数,前提是该函数首先是可微的。

    One of the top features of this algorithm is that it uses a relatively simple and inexpensive procedure to compute the differential. Making it quite efficient.

    该算法的主要特点之一是它使用相对简单且便宜的过程来计算差分。 使其效率很高。

    PROBLEM 1. HOW TO COMPUTE THE GRADIENT OF A COST FUNCTION

    问题1.如何计算成本函数的梯度

    Given a function f, we wanna find the gradient:

    给定一个函数f,我们想找到梯度:

    Image for post

    where x is a set of variables whose derivatives we need, and y are additional variables, that we don’t require the derivatives.

    其中x是我们需要其导数的一组变量,而y是我们不需要导数的其他变量。

    For learning, we want to find the gradient of the cost function. To be continued…

    为了学习,我们想找到成本函数的梯度。 未完待续…

    DEFINITION 6. LOSS FUNCTION

    定义6.损失功能

    This is the function applied to often one data point to find the delta between the predicted point and the actual point for example. Most times this is the squared loss, which gives the distance measure.

    此函数通常应用于一个数据点,以查找例如预测点和实际点之间的增量。 大多数情况下,这是平方损失,它给出了距离度量。

    Image for post

    DEFINITION 7. COST FUNCTION

    定义7.成本函数

    This is the function that is the combination of all the loss functions, it’s not always a sum. But sometimes an average or weighted average. For example:

    该函数是所有损失函数的组合,并不总是求和。 但有时是平均值或加权平均值。 例如:

    Image for post

    PROBLEM 1. HOW TO COMPUTE THE GRADIENT OF A COST FUNCTION

    问题1.如何计算成本函数的梯度

    Given a function f, we wanna find the gradient:

    给定一个函数f,我们想找到梯度:

    Image for post

    where x is a set of variables whose derivatives we need, and y are additional variables, that we don’t require the derivatives.

    其中x是我们需要其导数的一组变量,而y是我们不需要导数的其他变量。

    For learning, we want to find the gradient of the cost function.

    为了学习,我们想找到成本函数的梯度。

    Image for post

    To be continued…

    未完待续…

    DEFINITION 8. CHAIN RULE OF CALCULUS

    定义8.算子的链规则

    Given that x is a real number, and f and g are both functions mapping from a real number to real number. Furthermore,

    假设x是一个实数,并且f和g都是从实数到实数的映射函数。 此外,

    Image for post
    Image for post

    Then the chain rule says that,

    然后链条规则说,

    Image for post

    DEFINITION 9. MULTI-VARIABLE CHAIN RULE

    定义9.多元链规则

    Given that x and y are vectors in different dimensions,

    假设x和y是不同维度的向量,

    Image for post

    Also g and f are functions mapping from one dimension to another, such that,

    g和f也是从一个维度映射到另一维度的函数,这样,

    Image for post
    Image for post

    or equivalently,

    或等效地,

    Image for post

    where, ∂ y / ∂ x is the n × m Jacobian matrix of g.

    ,y /∂x是g的n×m雅可比矩阵。

    DEFINITION 10. GRADIENT Whereas a derivative or differential is the rate of change along one axis. The gradient is a vector of slopes for a function along multiple axes.

    定义10.梯度导数或微分是沿一个轴的变化率。 梯度是函数沿多个轴的斜率矢量。

    DEFINITION 11. JACOBIAN MATRIX

    定义11.雅各宾矩阵

    Sometimes we need to find all of the partial derivatives of a function whose input and output are both vectors. The matrix containing all such partial derivatives is the Jacobian.

    有时我们需要找到一个函数的所有偏导数,这些函数的输入和输出都是矢量。 包含所有此类偏导数的矩阵为雅可比行列式。

    Given:

    鉴于:

    Image for post

    The Jacobian matrix J is given by:

    雅可比矩阵J由下式给出:

    Image for post
    Image for post

    DEFINITION 12. CHAIN RULE FOR TENSORS

    定义12.张量链规则

    We work with very high dimensional data most times, for example images and videos. So we need to extend our chain rule to beyond just vectors, into tensors.

    大多数时候,我们使用非常高维度的数据,例如图像和视频。 因此,我们需要将链式规则扩展到不仅仅是矢量,还可以是张量。

    Imagine a 3D tensor,

    想象一下3D张量

    Image for post

    The gradient of a value z with respect to this tensor is,

    值z相对于该张量的梯度为,

    Image for post

    For this tensor, the iᵗʰ index gives a tuple of 3 values, or a vector,

    对于该张量,iᵗʰ索引给出一个包含3个值或向量的元组,

    Image for post

    The gradient of a value z with respect to the iᵗʰ index of the tensor is,

    值z相对于张量的iᵗʰ索引的梯度为

    Image for post

    So given this,

    因此,鉴于此,

    Image for post

    The chain rule for tensors is,

    张量的链式规则是

    Image for post
    Image for post

    概念 (CONCEPTS)

    CONCEPT 1. THE COMPUTATIONAL GRAPH

    概念1.计算图

    Image for post

    This is an example of a computational graph for the equation of a line. Starting nodes are what you will see in the equation, for the sake of the diagram, there’s always a need to define additional variables for intermediate nodes, in this example the node “u”. The node “u” is equivalent to “mx”.

    这是直线方程的计算图示例。 起始节点是您将在方程式中看到的,为了方便起见,始终需要为中间节点定义其他变量,在本示例中为节点“ u”。 节点“ u”等效于“ mx”。

    We introduce this concept to illustrate the complicated flow of computations in the back-prop algorithm.

    我们引入这个概念来说明反向传播算法中复杂的计算流程。

    Image for post

    Remember from earlier, when we defined loss function to be a difference squared, that’s what we use here on the last layer of the computation graph. Where y is the actual value and a is the predicted value.

    记得从前,当我们将损失函数定义为差平方时,这就是我们在计算图的最后一层使用的方法。 其中,y是实际值,a是预测值。

    Image for post

    CONCEPT 2. FORWARD & BACKWARD PROPAGATION

    概念2。向前和向后传播

    Notice that our loss value is heavily dependent on the last activation value, which is then dependent on the previous activation value, which is then dependent on the preceding activation value and so on.

    请注意,我们的损失值在很大程度上取决于上一个激活值,然后又取决于之前的激活值,然后又取决于之前的激活值,依此类推。

    In going forward through the neural net, we end up with a predicted value, a. During the training stage, we have an additional information which is the actual result the network should get, y. Our loss function is really the distance between these value. When we wanna minimize this distance, we first have to update the weights on the very last layer. But this last layer is dependent on it’s preceding layer, therefore we update those. So in this sense we are propagating backwards through the neural network and updating each layer.

    在遍历神经网络时,我们得出的预测值为a。 在培训阶段,我们还有其他信息,即网络应获得的实际结果y。 我们的损失函数实际上就是这些值之间的距离。 当我们想最小化此距离时,我们首先必须更新最后一层的权重。 但是最后一层取决于它的上一层,因此我们对它们进行更新。 因此,从这个意义上讲,我们正在通过神经网络向后传播并更新每一层。

    CONCEPT 3. SENSITIVITY TO CHANGE

    概念3.改变的敏感性

    When a small change in x produces a large change in the function f, we say the the function is very sensitive to x. And if a small change in x produces a small change in f, we say it’s not very sensitive.

    当x的较小变化导致函数f的较大变化时,我们说该函数对x非常敏感。 而且,如果x的微小变化导致f的微小变化,我们说它不是很敏感。

    For example, the effectiveness of a drug may be measured by f, and x is the dosage used. The sensitivity is denoted by:

    例如,药物的有效性可以通过f来测量,并且x是所使用的剂量。 灵敏度表示为:

    Image for post

    To extend this further, let’s say our function was multi-variable now.

    为了进一步扩展这一点,假设我们的函数现在是多变量的。

    Image for post

    The function f can have different sensitivities to each input. So for example, maybe just quantity analysis wasn’t enough, so we break down the drug into 3 active ingredients and consider each one’s dosage.

    函数f对每个输入可能具有不同的灵敏度。 因此,例如,也许仅仅进行数量分析还不够,因此我们将药物分为3种有效成分,并考虑每个人的剂量。

    Image for post

    And the last bit of extension, if one of the input values, for example x is also dependent on it’s own inputs. We can use the chain rule to find those sensitivities. Again with the same example, maybe the x is broken down into it’s constituent parts in the body, so we have to consider that as well.

    还有扩展的最后一位,如果输入值之一(例如x)也取决于它自己的输入。 我们可以使用链式规则找到那些敏感度。 再次使用相同的示例,也许x被分解为它在人体中的组成部分,所以我们也必须考虑这一点。

    Image for post

    We consider the make up of x, and how its ingredients may be affecting the overall effectiveness of the drug.

    我们考虑x的组成,以及其成分可能如何影响药物的整体功效。

    Image for post

    Here, we’re measuring the how sensitive the effect of the overall drug is to this small ingredient of the drug.

    在这里,我们正在测量整个药物的效果对药物的这种小成分的敏感程度。

    CONCEPT 4. A SIMPLISTIC MODEL

    概念4.简单模型

    Image for post

    So this computation graph considers the link between the nodes a and the one right before it, a’.

    因此,此计算图考虑了节点a和节点a'之间的链接。

    Image for post

    To apply chain rule on this,

    要对此应用连锁规则,

    Image for post

    Which describes how sensitive C is to small changes in a. Then we move on to the preceding computation,

    其中描述了C对a中的微小变化有多敏感。 然后我们继续前面的计算,

    Image for post

    Which measures how sensitive a is to small changes in u. Then we move on to the preceding 3 computations,

    哪个度量a对u的微小变化有多敏感。 然后我们继续前面的3个计算,

    Image for post

    Which measures how sensitive u is to small changes in each of the:

    哪个度量u对以下各项中的微小变化有多敏感:

    • weight, w

      重量,w
    • preceding activation value, a’

      前一个激活值,a'
    • bias, b

      偏差,b

    Putting this all together we get,

    将所有这些放在一起,

    Image for post

    CONCEPT 5. COMPLICATIONS WITH A SIMPLISTIC MODEL

    概念5.简单模型的复杂化

    If in the previous example, we have 2 nodes and 1 link between them. With this example we have 3 nodes and 2 links.

    如果在前面的示例中,我们有2个节点和它们之间的1个链接。 在此示例中,我们有3个节点和2个链接。

    Image for post

    Since there’s no limit on how long you can chain the chain rule. We can keep doing this for arbitrary number of layers. For this layer, note that the computation graph becomes this,

    由于对链接规则的链接时间没有限制。 我们可以继续对任意数量的层执行此操作。 对于这一层,请注意计算图变为

    Image for post

    Notice the need to annotate each node with additional ticks. These ticks are not derivatives though, they just signify that u and u’ are different, unique values or objects.

    注意,需要用附加的刻度标记每个节点。 尽管这些刻度不是派生的,它们只是表示u和u'是不同的,唯一的值或对象。

    CONCEPT 5. COMPLICATIONS WITH A COMPLEX MODEL

    概念5.复杂模型的复杂化

    The examples so far have been linear, linked list kind of neural nets. To expand it to realistic networks, like this,

    到目前为止,示例都是线性的,链表式的神经网络。 要将其扩展到现实的网络中,

    Image for post

    We have to add some additional notation to our network.

    我们必须在网络中添加一些其他符号。

    Let’s see how we would get the computational graph for a²₁ through a¹₁.

    让我们看看如何获​​得a²₁到a¹₁的计算图。

    Image for post
    Image for post

    Now let’s see how we would get the computational graph for a²₂ through a¹₁.

    现在,让我们看看如何得到a²2到a¹₁的计算图。

    Image for post
    Image for post

    You will notice that both graphs actually have a large component in common, specifically everything up to a¹₁. Meaning that if a computation has already been computed, then it could be reused the next and the next time and so on. While this increases the use of memory, it significantly reduces compute time, and for a large neural net, is necessary.

    您会注意到,两个图实际上有一个大的共同点,尤其是所有不超过a₁的东西。 这意味着,如果已经计算出一个计算,则可以在下一次和下一次重用它,依此类推。 尽管这增加了内存的使用量,但它显着减少了计算时间,并且对于大型神经网络而言,这是必需的。

    If we use the chain rule on these, we get pretty much the same formulas, just with the additional indexing.

    如果我们在这些规则上使用链式规则,我们将获得几乎相同的公式,只是带有附加索引。

    CONCEPT 6. FURTHER COMPLICATIONS WITH A COMPLEX MODEL

    概念6.复杂模型的进一步复杂化

    You will notice that a²₂ will actually have several paths back to the output layer node, like so.

    您会注意到,a²²实际上将有几条返回输出层节点的路径,就像这样。

    Image for post

    So this necessitates us to sum over the previous layer. This value that we get from the summation of all preceding nodes and their gradients has the instruction for updating it so that we minimize the error.

    因此,这需要我们对上一层进行汇总。 我们从前面所有节点及其梯度的总和中获得的值具有更新该指令的指示,以便使误差最小化。

    CONCEPT 7. MINIMIZING THE COST FUNCTION

    概念7.最小化成本功能

    If you remember DEFINITIONS 6 & 7, specifically 7, you’ll remember that the cost function is conceptually the average or the weighted average of the differences between the predicted and actual outputs.

    如果您记得定义6和7,特别是7,则将记住成本函数在概念上是预测产出与实际产出之间差异的平均值或加权平均值。

    Image for post

    If we use the Gradient Descent algorithm for Linear Regression or Logistic Regression to minimize the cost function.

    如果我们使用线性线性回归或逻辑回归的梯度下降算法来最小化成本函数。

    Then for Neural Networks we use the Back Propagation algorithm. I think by now it is clear why we can’t just use single equation for a neural network. Neural networks aren’t exactly continuous functions that we can find a nice derivative of. Rather they are discrete nodes that approximate a function in concert. Hence the need for a recursive algorithm to find it’s derivative or gradient, which takes into factor all the nodes.

    然后对于神经网络,我们使用反向传播算法。 我认为到现在为止很清楚为什么我们不能只对神经网络使用单个方程式了。 神经网络并非完全连续的函数,我们可以找到它的一个很好的派生类。 相反,它们是离散的节点,它们近似地协调一个函数。 因此,需要一种递归算法来找到它的导数或梯度,这需要考虑所有节点。

    The complete cost function looks something like this:

    完整的成本函数如下所示:

    Image for post

    Which is conceptually just:

    从概念上讲,这仅仅是:

    Image for post

    CONCEPT 7. SYMBOL TO SYMBOL DERIVATIVES

    概念7.从符号到符号导数

    So far you have an idea of how to get the algebraic expression for the gradient of a node in a neural network. Via the application of the chain rule to tensors and the concept of the computational graph.

    到目前为止,您已经了解了如何获取神经网络中节点的梯度的代数表达式。 通过将链式规则应用于张量和计算图的概念。

    The algebraic expression or the computational graph don’t deal with numbers, rather they just give us the theoretical background to verify that we are computing them correctly. And they help guide our coding.

    代数表达式或计算图不处理数字,而是给我们提供理论背景以验证我们是否正确计算了它们。 它们有助于指导我们的编码。

    In the next concept, we will talk about the symbol to number derivatives.

    在下一个概念中,我们将讨论符号到数字的导数。

    CONCEPT 8. SYMBOL TO NUMBER DERIVATIVES

    概念8.符号到数字的导数

    Here we start to depart from theory and go into the practical arena.

    在这里,我们开始背离理论,进入实践领域。

    Image for post

    算法 (ALGORITHMS)

    ALGORITHM 1. BASIC SETUP + GET GRADIENT OF NODE

    算法1.基本设置+结点梯度

    First of all we have to make a few setups, first of those being, the order of the neural network and the computational graph of the nodes associated with our network. We order them in such a way that we the computation of one comes after the other.

    首先,我们必须进行一些设置,首先是神经网络的顺序和与我们的网络关联的节点的计算图。 我们以这样一种方式对它们进行排序,使得我们一个计算在另一个计算之后。

    Each node u^{(n)} is associated with an operation f^{(i)} such that:

    每个节点u ^ {(n)}与操作f ^ {(i)}关联,这样:

    Image for post

    where 𝔸^{(i)} is the set of all nodes that are the parent of u^{(n)}.

    其中𝔸^ {(i)}是u ^ {(n)}父级的所有节点的集合。

    First we need to compute get all the input nodes, to do that we need to input all the training data in the form of x vectors:

    首先,我们需要计算获取所有输入节点,为此,我们需要以x向量的形式输入所有训练数据:

    for i = 1, ...., n_i
    u_i = get_u(x_i)

    Note that n_i is the number of input nodes, where the input nodes are:

    请注意, n_i是输入节点的数量,其中输入节点为:

    Image for post

    If these are input nodes, then the nodes:

    如果这些是输入节点,那么这些节点:

    Image for post

    are the nodes after the input nodes but before the last node, u^{(n)}.

    是输入节点之后但最后一个节点u ^ {(n)}之前的节点。

    for i = n_i+1, ..., n
    A_i = { u_j = get_j(Pa(u_i)) }
    u_i = fi(A_i)

    You will notice that these go in the other direction than when we were conceptualizing the chain rule computational graph. This is because this algorithm details out the forward propagation.

    您会注意到,这些方向与我们概念化链式规则计算图时的方向相反。 这是因为该算法详细说明了前向传播。

    We will call this graph:

    我们称这个图为:

    Image for post

    Using this graph, we can construct another graph:

    使用此图,我们可以构造另一个图:

    Image for post

    While each node of G computes the forward graph node u^i, each node in B computes the gradients using the chain rule.

    G的每个节点都计算前向图节点u ^ i时,B的每个节点都使用链规则计算梯度。

    Image for post

    If you consider all the nodes in a neural network and the edges that connect them, you can think of the computation required to do back propagation increasing linearly with the number of edges. Since each edge represents the computation of one chain rule, connecting some node to one of its parent nodes.

    如果考虑神经网络中的所有节点以及连接它们的边,则可以想到进行反向传播所需的计算量随边的数量线性增加。 由于每个边代表一个链规则的计算,因此将某个节点连接到其父节点之一。

    ALGORITHM 2. ADDITIONAL CONSTRAINTS + SIMPLE BACK PROPAGATION

    算法2.附加约束+简单的反向传播

    As mentioned above, the computational complexity of the algorithm is linear with the number of edges of the network. But this is assuming that finding the partials on each edge is a constant time.

    如上所述,算法的计算复杂度与网络边缘的数量成线性关系。 但这是假设在每个边缘上找到局部片段的时间是恒定的。

    Here we aim to build a concrete understanding of the backprop algorithm while still keeping certain complications out of sight. One of them being the tensor nodes.

    在这里,我们旨在建立对反向传播算法的具体理解,同时仍使某些复杂性看不见。 其中之一是张量节点。

    Run forward propagation

    This will obtain the activation values for the network, that are in randomized or not as useful state.

    这将获得网络的激活值,这些激活值处于随机状态或不可用状态。

    Initialize grad_table

    In this data structure we will store all the gradients that we compute.

    在此数据结构中,我们将存储我们计算出的所有梯度。

    To get an individual entry, we use grad_table(u_i)

    This will store the calculated value of:

    这将存储以下内容的计算值:

    Image for post
    grad_table[u_n] = 1

    This sets the last node to 1.

    这会将最后一个节点设置为1。

    for j = n-1 to 1
    grad_table[u_j] = \\sum grad_table[u_i] du_i/du_j

    This is theoretically this:

    理论上是这样的:

    Image for post
    return grad_table

    The backprop algorithm visits each node only once to calculate the partials, this prevents the unnecessary recalculation of exponential number of sub expressions. Remember that this comes at the cost of more memory usage.

    反向传播算法仅访问每个节点一次以计算局部变量,从而避免了不必要的子表达式指数数量的重新计算。 请记住,这是以更多的内存使用为代价的。

    其他文章 (Other Articles)

    This post is part of a series of stories that explores the fundamentals of deep learning:1. Linear Algebra Data Structures and OperationsObjects and Operations2. Computationally Efficient Matrices and Matrix Decompositions
    Inverses, Linear Dependence, Eigen-decompositions, SVD3. Probability Theory Ideas and ConceptsDefinitions, Expectation, Variance4. Useful Probability Distributions and Structured Probabilistic ModelsActivation Functions, Measure and Information Theory5. Numerical Method Considerations for Machine Learning
    Overflow, Underflow, Gradients and Gradient Based Optimizations6. Gradient Based Optimizations
    Taylor Series, Constrained Optimization, Linear Least Squares7. Machine Learning Background Necessary for Deep Learning I
    Generalization, MLE, Kullback-Leibler Divergence8. Machine Learning Background Necessary for Deep Learning II
    Regularization, Capacity, Parameters, Hyper-parameters9. Principal Component Analysis Breakdown
    Motivation, Derivation10. Feed-forward Neural Networks
    Layers, definitions, Kernel Trick11. Gradient Based Optimizations Under The Deep Learning Lens
    Stochastic Gradient Descent, Cost Function, Maximum Likelihood12. Output Units For Deep Learning
    Stochastic Gradient Descent, Cost Function, Maximum Likelihood13. Hidden Units For Deep Learning
    Activation Functions, Performance, Architecture14. The Common Approach to Binary ClassificationThe most generic way to setup your deep learning models to categorize movie reviews15. General Architectural Design Considerations for Neural NetworksUniversal Approximation Theorem, Depth, Connections16. Classifying Text Data into Multiple ClassesSingle-Label Multi-class Classification17. Back Propagation Algorithm Part IDefinitions, Concepts, Algorithms with Visuals

    下一个… (Up Next…)

    Coming up next is the Part II of this article. If you would like me to write another article explaining a topic in-depth, please leave a comment.

    接下来是本文的第二部分 。 如果您希望我写另一篇文章深入解释某个主题,请发表评论。

    For the table of contents and more content click here.

    有关目录和更多内容,请单击此处

    翻译自: https://medium.com/@tbatsuur/back-propagation-algorithm-85c65e6fc359

    反向传播算法的直观理解

    展开全文
    weixin_26712591 2020-09-15 06:37:35
  • 作者:Great Learning Team deephub.ai 翻译组 神经网络 什么是反向传播? 反向传播是如何工作的?... 那就是反向传播算法。 它对以前的模块产生积极影响,以提高准确性和效率。 让我们来深入研究一下...


    作者:Great Learning Team
    deephub.ai 翻译组

    1. 神经网络
    2. 什么是反向传播?
    3. 反向传播是如何工作的?
    4. 损失函数
    5. 为什么我们需要反向传播?
    6. 前馈网络
    7. 反向传播的类型
    8. 案例研究

    在典型的编程中,我们输入数据,执行处理逻辑并接收输出。 如果输出数据可以某种方式影响处理逻辑怎么办? 那就是反向传播算法。 它对以前的模块产生积极影响,以提高准确性和效率。

    让我们来深入研究一下。

    神经网络(Neural network)

    神经网络是连接单元的集合。每个连接都有一个与其相关联的权重。该系统有助于建立基于海量数据集的预测模型。它像人类的神经系统一样工作,有助于理解图像,像人类一样学习,合成语音等等。

    什么是反向传播(What is backpropagation?)

    我们可以将反向传播算法定义为在已知分类的情况下,为给定的输入模式训练某些给定的前馈神经网络的算法。当示例集的每一段都显示给网络时,网络将查看其对示例输入模式的输出反应。之后,测量输出响应与期望输出与误差值的比较。之后,我们根据测量的误差值调整连接权重。

    在深入研究反向传播之前,我们应该知道是谁引入了这个概念以及何时引入。它最早出现在20世纪60年代,30年后由大卫·鲁梅尔哈特、杰弗里·辛顿和罗纳德·威廉姆斯在1986年的著名论文中推广。在这篇论文中,他们谈到了各种神经网络。今天,反向传播做得很好。神经网络训练是通过反向传播实现的。通过这种方法,我们根据前一次运行获得的错误率对神经网络的权值进行微调。正确地采用这种方法可以降低错误率,提高模型的可靠性。利用反向传播训练链式法则的神经网络。简单地说,每次前馈通过网络后,该算法根据权值和偏差进行后向传递,调整模型的参数。典型的监督学习算法试图找到一个将输入数据映射到正确输出的函数。反向传播与多层神经网络一起工作,学习输入到输出映射的内部表示。

    反向传播是如何工作的?(How does backpropagation work?)

    让我们看看反向传播是如何工作的。它有四层:输入层、隐藏层、隐藏层II和最终输出层。

    所以,主要的三层是:

    1.输入层

    2.隐藏层

    3.输出层

    每一层都有自己的工作方式和响应的方式,这样我们就可以获得所需的结果并将这些情况与我们的状况相关联。 让我们讨论有助于总结此算法所需的其他细节。


    这张图总结了反向传播方法的机能。

    1.输入层接收x

    2.使用权重w对输入进行建模

    3.每个隐藏层计算输出,数据在输出层准备就绪

    4.实际输出和期望输出之间的差异称为误差

    5.返回隐藏层并调整权重,以便在以后的运行中减少此错误

    这个过程一直重复,直到我们得到所需的输出。训练阶段在监督下完成。一旦模型稳定下来,就可以用于生产。

    损失函数(Loss function)

    一个或多个变量被映射到实数,这些实数表示与这些变量值相关的某个数值。为了进行反向传播,损失函数计算网络输出与其可能输出之间的差值。

    为什么我们需要反向传播?(Why do we need backpropagation?)

    反向传播有许多优点,下面列出一些重要的优点:

    •反向传播快速、简单且易于实现

    •没有要调整的参数

    •不需要网络的先验知识,因此成为一种灵活的方法

    •这种方法在大多数情况下都很有效

    •模型不需要学习函数的特性

    前馈网络(Feed forward network)

    前馈网络也称为MLN,即多层网络。 之所以称为前馈,是因为数据仅在NN(神经网络)中通过输入节点,隐藏层并最终到达输出节点。 它是最简单的人工神经网络。

    反向传播的类型(Types of backpropagation)

    有两种类型的反向传播网络。

    •静态反向传播(Static backpropagation)

    •循环反向传播(Recurrent backpropagation)

    1. 静态反向传播(Static backpropagation)

    在这个网络中,静态输入的映射生成静态输出。像光学字符识别这样的静态分类问题将是一个适合于静态反向传播的领域。

    1. 循环反向传播(Recurrent backpropagation)

    反复进行反向传播,直到达到某个阈值为止。 在到达阈值之后,将计算误差并向后传播。

    这两种方法的区别在于,静态反向传播与静态映射一样快。

    案例研究(Case Study)

    让我们使用反向传播进行案例研究。 为此,我们将使用Iris数据(鸢尾花卉数据集),该数据包含诸如萼片和花瓣的长度和宽度之类的特征。 在这些帮助下,我们需要确定植物的种类。

    为此,我们将构建一个多层神经网络,并使用sigmoid函数,因为它是一个分类问题。

    让我们看一下所需的库和数据。

    import numpy as np
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    

    为了忽略警告,我们将导入另一个名为warnings的库。

    import warnings
    warnings.simplefilter(action='ignore', category=FutureWarning)
    

    接着让我们读取数据。

    iris = pd.read_csv("iris.csv")
    iris.head()
    

    现在我们将把类标记为0、1和2。

    iris. replace (, , inplace=True)
    

    我们现在将定义函数,它将执行以下操作。

    1.对输出执行独热编码(one hot encoding)。

    2.执行sigmoid函数

    3.标准化特征

    对于独热编码,我们定义以下函数。

    defto_one_hot(Y):
        n_col = np.amax(Y) + 1
        binarized = np.zeros((len(Y), n_col))
        for i in range(len(Y)):
            binarized ] = 1.return binarized
    

    现在我们来定义一个sigmoid函数

    defsigmoid_func(x):return1/(1+np.exp(-x))
    defsigmoid_derivative(x):return sigmoid_func(x)*(1 – sigmoid_func(x))
    

    现在我们将定义一个用于标准化的函数。

    defnormalize(X, axis=-1, order=2):
        l2 = np. atleast_1d (np.linalg.norm(X, order, axis))
        l2 = 1return X / np.expand_dims(l2, axis)
    

    现在我们将对特征进行规范化,并对输出应用独热编码。

    x = pd.DataFrame(iris, columns=columns)
    x = normalize(x.as_matrix())
    
    y = pd.DataFrame(iris, columns=columns)
    y = y.as_matrix()
    y = y.flatten()
    y = to_one_hot(y)
    

    现在是时候应用反向传播了。为此,我们需要定义权重和学习率。让我们这么做吧。但在那之前,我们需要把数据分开进行训练和测试。

    #Split data to training and validation data(将数据拆分为训练和验证数据)
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.33)
    #Weights
    w0 = 2*np.random.random((4, 5)) - 1#forinput - 4 inputs, 3 outputs
    w1 = 2*np.random.random((5, 3)) - 1#for layer 1 - 5 inputs, 3 outputs
    #learning rate
    n = 0.1
    

    我们将为错误设置一个列表,并通过可视化查看训练中的更改如何减少错误。

    errors = []
    

    让我们执行前馈和反向传播网络。对于反向传播,我们将使用梯度下降算法。

    for i in range (100000):
    #Feed forward network
    layer0 = X_train
    layer1 = sigmoid_func(np.dot(layer0, w0))
    layer2 = sigmoid_func(np.dot(layer1, w1))
    Back propagation using gradient descent
    layer2_error = y_train - layer2
    layer2_delta = layer2_error * sigmoid_derivative(layer2)
    layer1_error = layer2_delta.dot (w1.T)
    layer1_delta = layer1_error * sigmoid_derivative(layer1)
    w1 += layer1.T.dot(layer2_delta) * n
    w0 += layer0.T.dot(layer1_delta) * n
    error = np.mean(np.abs(layer2_error))
    errors.append(error)
    

    准确率将通过从训练数据中减去误差来收集和显示

    accuracy_training = (1 - error) * 100
    

    现在让我们直观地看一下如何通过减少误差来提高准确度。(可视化)

    plt.plot(errors)
    plt.xlabel('Training')
    plt.ylabel('Error')
    plt.show()
    


    现在让我们查看一下准确率。

    print ("Training Accuracy of the model " + str (round(accuracy_training,2)) + "%")
    

    Output: Training Accuracy of the model 99.04%

    我们的训练模型表现很好。现在让我们看看验证的准确性。

    #Validate
    layer0 = X_test
    layer1 = sigmoid_func(np.dot(layer0, w0))
    layer2 = sigmoid_func(np.dot(layer1, w1))
    layer2_error = y_test - layer2
    error = np.mean(np.abs(layer2_error))
    accuracy_validation = (1 - error) * 100print ("Validation Accuracy of the model "+ str(round(accuracy_validation,2)) + "%")
    

    Output: Validation Accuracy 92.86%

    这个性能符合预期。

    应遵循的最佳实践准则(Best practices to follow)

    下面讨论一些获得好模型的方法:

    •如果约束非常少,则系统可能不起作用

    •过度训练,过多的约束会导致过程缓慢

    •只关注少数方面会导致偏见

    反向传播的缺点(Disadvantages of backpropagation)

    •输入数据是整体性能的关键

    •有噪声的数据会导致不准确的结果

    •基于矩阵的方法优于小批量方法(mini-batch)

    综上所述,神经网络是具有输入和输出机制的连接单元的集合,每个连接都有相关联的权值。反向传播是"误差的反向传播",对训练神经网络很有用。它快速、易于实现且简单。反向传播对于处理语音或图像识别等易出错项目的深度神经网络非常有益。

    原文链接:https://imba.deephub.ai/p/1c5b5250659911ea90cd05de3860c663

    展开全文
    m0_46510245 2020-03-14 19:02:44
  • u012121468 2019-10-22 16:19:07
  • qiwsir 2020-09-25 17:18:24
  • Bluenapa 2019-11-13 11:48:55
  • qq_15698613 2021-12-18 01:24:46
  • hohaizx 2018-09-02 21:15:59
  • u012429555 2018-10-05 12:15:54
  • qq_23100417 2019-10-16 13:54:35
  • qq_21121821 2019-06-18 14:42:24
  • yaochunchu 2019-07-11 22:21:37
  • qq_29407397 2019-05-27 11:02:34
  • aoyi3705 2019-09-21 16:03:25
  • bitcarmanlee 2017-12-16 11:45:23
  • AIWCZ 2020-10-30 17:11:26
  • jiaochong11 2018-08-25 10:07:23
  • LucyGill 2017-03-22 16:18:24
  • weixin_42284373 2019-03-06 22:44:20
  • dawningblue 2017-11-22 16:19:08
  • hongxue8888 2017-08-09 11:31:40
  • Hunter_pcx 2018-10-24 20:28:04
  • qq_36643282 2019-05-10 22:41:50
  • m0_51286080 2020-10-04 11:21:56
  • qq_33869371 2019-02-21 16:12:00
  • Torero_lch 2018-09-11 20:17:13
  • u013555719 2017-12-12 17:15:16

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,059
精华内容 4,823
关键字:

反向传播算法直观图