精华内容
下载资源
问答
  • 吴恩达反向传播推导
    千次阅读
    2022-02-04 14:01:58

    1、首先是单层的反向传播各种导数推导

    2、然后是拓展到多层的反向传播推导

    3、最后记住这些公式结论

     

    更多相关内容
  • 神经网络的前向传播和反向传播推导 x1x_{1}x1​和x2x_{2}x2​表示输入 wijw_{ij}wij​表示权重 bijb_{ij}bij​表示偏置 σi\sigma_{i}σi​表示激活函数,这里使用sigmoid激活函数 outoutout表示输出 yyy表示真实值...
  • CNN 反向传播推导

    千次阅读 2019-06-14 20:26:53
    CNN卷积神经网络推导和实现 本文的论文来自: Notes on Convolutional Neural Networks, Jake Bouvrie。 这个主要是CNN的推导和实现的一些笔记,再看懂这个笔记之前,最好具有CNN的一些基础。这里也先列出一个资料供...

    CNN卷积神经网络推导和实现

    本文的论文来自:

    Notes on Convolutional Neural Networks, Jake Bouvrie。

    这个主要是CNN的推导和实现的一些笔记,再看懂这个笔记之前,最好具有CNN的一些基础。这里也先列出一个资料供参考:

    [1] Deep Learning(深度学习)学习笔记整理系列之(七)

    [2] LeNet-5, convolutional neural networks

    [3]卷积神经网络

    [4] Neural Network for Recognition of Handwritten Digits

    [5] Deep learning:三十八(Stacked CNN简单介绍)

    [6] Gradient-based learning applied to document recognition.

    [7]Imagenet classification with deep convolutional neural networks.

    [8] UFLDL中的“卷积特征提取”和“池化”。

    另外,这里有个matlab的Deep Learning的toolbox,里面包含了CNN的代码,在下一个博文中,我将会详细注释这个代码。这个笔记对这个代码的理解非常重要。

    下面是自己对其中的一些知识点的理解:

    《Notes on Convolutional Neural Networks》

    一、介绍

    这个文档讨论的是CNNs的推导和实现。CNN架构的连接比权值要多很多,这实际上就隐含着实现了某种形式的规则化。这种特别的网络假定了我们希望通过数据驱动的方式学习到一些滤波器,作为提取输入的特征的一种方法。

    本文中,我们先对训练全连接网络的经典BP算法做一个描述,然后推导2D CNN网络的卷积层和子采样层的BP权值更新方法。在推导过程中,我们更强调实现的效率,所以会给出一些Matlab代码。最后,我们转向讨论如何自动地学习组合前一层的特征maps,特别地,我们还学习特征maps的稀疏组合。

    二、全连接的反向传播算法

    典型的CNN中,开始几层都是卷积和下采样的交替,然后在最后一些层(靠近输出层的),都是全连接的一维网络。这时候我们已经将所有两维2D的特征maps转化为全连接的一维网络的输入。这样,当你准备好将最终的2D特征maps输入到1D网络中时,一个非常方便的方法就是把所有输出的特征maps连接成一个长的输入向量。然后我们回到BP算法的讨论。(更详细的基础推导可以参考UFLDL中“反向传导算法”)。

    2.1、Feedforward Pass前向传播

    在下面的推导中,我们采用平方误差代价函数。我们讨论的是多类问题,共c类,共N个训练样本。

    这里表示第n个样本对应的标签的第k维。表示第n个样本对应的网络输出的第k个输出。对于多类问题,输出一般组织为“one-of-c”的形式,也就是只有该输入对应的类的输出节点输出为正,其他类的位或者节点为0或者负数,这个取决于你输出层的激活函数。sigmoid就是0,tanh就是-1.

    因为在全部训练集上的误差只是每个训练样本的误差的总和,所以这里我们先考虑对于一个样本的BP。对于第n个样本的误差,表示为:

    传统的全连接神经网络中,我们需要根据BP规则计算代价函数E关于网络每一个权值的偏导数。我们用l来表示当前层,那么当前层的输出可以表示为:

    输出激活函数f(.)可以有很多种,一般是sigmoid函数或者双曲线正切函数。sigmoid将输出压缩到[0, 1],所以最后的输出平均值一般趋于0 。所以如果将我们的训练数据归一化为零均值和方差为1,可以在梯度下降的过程中增加收敛性。对于归一化的数据集来说,双曲线正切函数也是不错的选择。

    2.2、Backpropagation Pass反向传播

    反向传播回来的误差可以看做是每个神经元的基的灵敏度sensitivities(灵敏度的意思就是我们的基b变化多少,误差会变化多少,也就是误差对基的变化率,也就是导数了),定义如下:(第二个等号是根据求导的链式法则得到的)

    因为∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是说bias基的灵敏度∂E/∂b=δ和误差E对一个节点全部输入u的导数∂E/∂u是相等的。这个导数就是让高层误差反向传播到底层的神来之笔。反向传播就是用下面这条关系式:(下面这条式子表达的就是第l层的灵敏度,就是)

    公式(1)

    这里的“◦”表示每个元素相乘。输出层的神经元的灵敏度是不一样的:

    最后,对每个神经元运用delta(即δ)规则进行权值更新。具体来说就是,对一个给定的神经元,得到它的输入,然后用这个神经元的delta(即δ)来进行缩放。用向量的形式表述就是,对于第l层,误差对于该层每一个权值(组合为矩阵)的导数是该层的输入(等于上一层的输出)与该层的灵敏度(该层每个神经元的δ组合成一个向量的形式)的叉乘。然后得到的偏导数乘以一个负学习率就是该层的神经元的权值的更新了:

    公式(2)

    对于bias基的更新表达式差不多。实际上,对于每一个权值(W)ij都有一个特定的学习率ηIj

    三、Convolutional Neural Networks 卷积神经网络

    3.1、Convolution Layers 卷积层

    我们现在关注网络中卷积层的BP更新。在一个卷积层,上一层的特征maps被一个可学习的卷积核进行卷积,然后通过一个激活函数,就可以得到输出特征map。每一个输出map可能是组合卷积多个输入maps的值:

    这里Mj表示选择的输入maps的集合,那么到底选择哪些输入maps呢?有选择一对的或者三个的。但下面我们会讨论如何去自动选择需要组合的特征maps。每一个输出map会给一个额外的偏置b,但是对于一个特定的输出map,卷积每个输入maps的卷积核是不一样的。也就是说,如果输出特征map j和输出特征map k都是从输入map i中卷积求和得到,那么对应的卷积核是不一样的。

    3.1.1、Computing the Gradients梯度计算

    我们假定每个卷积层l都会接一个下采样层l+1 。对于BP来说,根据上文我们知道,要想求得层l的每个神经元对应的权值的权值更新,就需要先求层l的每一个神经节点的灵敏度δ(也就是权值更新的公式(2))。为了求这个灵敏度我们就需要先对下一层的节点(连接到当前层l的感兴趣节点的第l+1层的节点)的灵敏度求和(得到δl+1),然后乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)W。再乘以当前层l的该神经元节点的输入u的激活函数f的导数值(也就是那个灵敏度反向传播的公式(1)的δl的求解),这样就可以得到当前层l每个神经节点对应的灵敏度δl了。

    然而,因为下采样的存在,采样层的一个像素(神经元节点)对应的灵敏度δ对应于卷积层(上一层)的输出map的一块像素(采样窗口大小)。因此,层l中的一个map的每个节点只与l+1层中相应map的一个节点连接。

    为了有效计算层l的灵敏度,我们需要上采样upsample 这个下采样downsample层对应的灵敏度map(特征map中每个像素对应一个灵敏度,所以也组成一个map),这样才使得这个灵敏度map大小与卷积层的map大小一致,然后再将层l的map的激活值的偏导数与从第l+1层的上采样得到的灵敏度map逐元素相乘(也就是公式(1))。

    在下采样层map的权值都取一个相同值β,而且是一个常数。所以我们只需要将上一个步骤得到的结果乘以一个β就可以完成第l层灵敏度δ的计算。

    我们可以对卷积层中每一个特征map j重复相同的计算过程。但很明显需要匹配相应的子采样层的map(参考公式(1)):

    up(.)表示一个上采样操作。如果下采样的采样因子是n的话,它简单的将每个像素水平和垂直方向上拷贝n次。这样就可以恢复原来的大小了。实际上,这个函数可以用Kronecker乘积来实现:

    好,到这里,对于一个给定的map,我们就可以计算得到其灵敏度map了。然后我们就可以通过简单的对层l中的灵敏度map中所有节点进行求和快速的计算bias基的梯度了:

    公式(3)

    最后,对卷积核的权值的梯度就可以用BP算法来计算了(公式(2))。另外,很多连接的权值是共享的,因此,对于一个给定的权值,我们需要对所有与该权值有联系(权值共享的连接)的连接对该点求梯度,然后对这些梯度进行求和,就像上面对bias基的梯度计算一样:

    这里,中的在卷积的时候与逐元素相乘的patch,输出卷积map的(u, v)位置的值是由上一层的(u, v)位置的patch与卷积核k_ij逐元素相乘的结果。

    咋一看,好像我们需要煞费苦心地记住输出map(和对应的灵敏度map)每个像素对应于输入map的哪个patch。但实际上,在Matlab中,可以通过一个代码就实现。对于上面的公式,可以用Matlab的卷积函数来实现:

    我们先对delta灵敏度map进行旋转,这样就可以进行互相关计算,而不是卷积(在卷积的数学定义中,特征矩阵(卷积核)在传递给conv2时需要先翻转(flipped)一下。也就是颠倒下特征矩阵的行和列)。然后把输出反旋转回来,这样我们在前向传播进行卷积的时候,卷积核才是我们想要的方向。

    3.2、Sub-sampling Layers 子采样层

    对于子采样层来说,有N个输入maps,就有N个输出maps,只是每个输出map都变小了。

    down(.)表示一个下采样函数。典型的操作一般是对输入图像的不同nxn的块的所有像素进行求和。这样输出图像在两个维度上都缩小了n倍。每个输出map都对应一个属于自己的乘性偏置β和一个加性偏置b。

    3.2.1、Computing the Gradients 梯度计算

    这里最困难的是计算灵敏度map。一旦我们得到这个了,那我们唯一需要更新的偏置参数β和b就可以轻而易举了(公式(3))。如果下一个卷积层与这个子采样层是全连接的,那么就可以通过BP来计算子采样层的灵敏度maps。

    我们需要计算卷积核的梯度,所以我们必须找到输入map中哪个patch对应输出map的哪个像素。这里,就是必须找到当前层的灵敏度map中哪个patch对应与下一层的灵敏度map的给定像素,这样才可以利用公式(1)那样的δ递推,也就是灵敏度反向传播回来。另外,需要乘以输入patch与输出像素之间连接的权值,这个权值实际上就是卷积核的权值(已旋转的)。

    在这之前,我们需要先将核旋转一下,让卷积函数可以实施互相关计算。另外,我们需要对卷积边界进行处理,但在Matlab里面,就比较容易处理。Matlab中全卷积会对缺少的输入像素补0 。

    到这里,我们就可以对b和β计算梯度了。首先,加性基b的计算和上面卷积层的一样,对灵敏度map中所有元素加起来就可以了:

    而对于乘性偏置β,因为涉及到了在前向传播过程中下采样map的计算,所以我们最好在前向的过程中保存好这些maps,这样在反向的计算中就不用重新计算了。我们定义:

    这样,对β的梯度就可以用下面的方式计算:

    3.3、Learning Combinations of Feature Maps 学习特征map的组合

    大部分时候,通过卷积多个输入maps,然后再对这些卷积值求和得到一个输出map,这样的效果往往是比较好的。在一些文献中,一般是人工选择哪些输入maps去组合得到一个输出map。但我们这里尝试去让CNN在训练的过程中学习这些组合,也就是让网络自己学习挑选哪些输入maps来计算得到输出map才是最好的。我们用αij表示在得到第j个输出map的其中第i个输入map的权值或者贡献。这样,第j个输出map可以表示为:

    需要满足约束:

    这些对变量αij的约束可以通过将变量αij表示为一个组无约束的隐含权值cij的softmax函数来加强。(因为softmax的因变量是自变量的指数函数,他们的变化率会不同)。

    因为对于一个固定的j来说,每组权值cij都是和其他组的权值独立的,所以为了方面描述,我们把下标j去掉,只考虑一个map的更新,其他map的更新是一样的过程,只是map的索引j不同而已。

    Softmax函数的导数表示为:

    这里的δ是Kronecker delta。对于误差对于第l层变量αi的导数为:

    最后就可以通过链式规则去求得代价函数关于权值ci的偏导数了:

    3.3.1、Enforcing Sparse Combinations 加强稀疏性组合

    为了限制αi是稀疏的,也就是限制一个输出map只与某些而不是全部的输入maps相连。我们在整体代价函数里增加稀疏约束项Ω(α)。对于单个样本,重写代价函数为:

    然后寻找这个规则化约束项对权值ci求导的贡献。规则化项Ω(α)对αi求导是:

    然后,通过链式法则,对ci的求导是:

    所以,权值ci最后的梯度是:

    3.4、Making it Fast with MATLAB

    CNN的训练主要是在卷积层和子采样层的交互上,其主要的计算瓶颈是:

    1)前向传播过程:下采样每个卷积层的maps;

    2)反向传播过程:上采样高层子采样层的灵敏度map,以匹配底层的卷积层输出maps的大小;

    3)sigmoid的运用和求导。

    对于第一和第二个问题,我们考虑的是如何用Matlab内置的图像处理函数去实现上采样和下采样的操作。对于上采样,imresize函数可以搞定,但需要很大的开销。一个比较快速的版本是使用Kronecker乘积函数kron。通过一个全一矩阵ones来和我们需要上采样的矩阵进行Kronecker乘积,就可以实现上采样的效果。对于前向传播过程中的下采样,imresize并没有提供在缩小图像的过程中还计算nxn块内像素的和的功能,所以没法用。一个比较好和快速的方法是用一个全一的卷积核来卷积图像,然后简单的通过标准的索引方法来采样最后卷积结果。例如,如果下采样的域是2x2的,那么我们可以用2x2的元素全是1的卷积核来卷积图像。然后再卷积后的图像中,我们每个2个点采集一次数据,y=x(1:2:end,1:2:end),这样就可以得到了两倍下采样,同时执行求和的效果。

    对于第三个问题,实际上有些人以为Matlab中对sigmoid函数进行inline的定义会更快,其实不然,Matlab与C/C++等等语言不一样,Matlab的inline反而比普通的函数定义更非时间。所以,我们可以直接在代码中使用计算sigmoid函数及其导数的真实代码。

    转载至:https://blog.csdn.net/zouxy09/article/details/9993371

    第二部分

    卷积神经网络的反向传播:

    首先回顾一下一般的前馈神经网络的反向传播:
    这里写图片描述
    详细内容可参看:神经网络基础和反向传播推导

    1,CNN的前向传播

    a)对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小。
    这里写图片描述
    b)对于池化层,按照池化标准把输入张量缩小。
    c)对于全连接层,按照普通网络的前向传播计算。

    2,CNN反向传播的不同之处:

    首先要注意的是,一般神经网络中每一层输入输出a,z都只是一个向量,而CNN中的a,z是一个三维张量,即由若干个输入的子矩阵组成。其次:

    1. 池化层没有激活函数。这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1。
    2. 池化层在前向传播的时候,对输入进行了压缩,那么我们向前反向推导上一层的误差时,需要做upsample处理
    3. 卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得到当前层的输出,这和一般的网络直接进行矩阵乘法得到当前层的输出不同。这样在卷积层反向传播的时候,上一层误差的递推计算方法肯定有所不同。
    4. 对于卷积层,由于W使用的运算是卷积,那么由该层误差推导出该层的所有卷积核的W,b的方式也不同。

    由于卷积层可以有多个卷积核,各个卷积核的处理方法是完全相同且独立的,为了简化算法公式的复杂度,我们下面提到卷积核都是卷积层中若干卷积核中的一个。接下来看具体的CNN反向传播步骤。

    3,已知池化层的误差,反向推导上一隐藏层的误差

    在前向传播时,池化层我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后区域的误差,还原前一层较大区域的误差。这个过程叫做upsample。假设我们的池化区域大小是2x2。第l层误差的第k个子矩阵δlk为:
    这里写图片描述
    如果池化区域表示为a*a大小,那么我们把上述矩阵上下左右各扩展a-1行和列进行还原
    这里写图片描述
    如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:
    这里写图片描述
    如果是Average,则进行平均,转换后的矩阵为:
    这里写图片描述
    上边这个矩阵就是误差矩阵经过upsample之后的矩阵,那么,由后一层误差推导出前一层误差的公式为:
    这里写图片描述
    上式和普通网络的反向推导误差很类似:
    这里写图片描述
    可以看到,只有第一项不同。

    4,已知卷积层的误差,反向推导上一隐藏层的误差

    公式如下:
    这里写图片描述
    我们再看一次普通网络的反向推导误差的公式:
    这里写图片描述
    可以看到区别在于,下一层的权重w的转置操作,变成了旋转180度的操作,也就是上下翻转一次,左右再翻转一次,这其实就是“卷积”一词的意义(我们可简单理解为数学上的trick),可参考下图,Q是下一层的误差,周围补0方便计算,W是180度翻转后的卷积核,P是W和Q做卷积的结果:
    这里写图片描述

    5,已知卷积层的误差,推导该层的W,b的梯度

    经过以上各步骤,我们已经算出每一层的误差了,那么:
    a)对于全连接层,可以按照普通网络的反向传播算法求该层W,b的梯度。
    b)对于池化层,它并没有W,b,也不用求W,b的梯度。
    c)只有卷积层的W,b需要求出,先看w:
    这里写图片描述
    再对比一下普通网络的求w梯度的公式,发现区别在于,对前一层的输出做翻转180度的操作:
    这里写图片描述
    而对于b,则稍微有些特殊,因为在CNN中,误差δ是三维张量,而b只是一个向量,不能像普通网络中那样直接和误差δ相等。通常的做法是将误差δ的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:
    这里写图片描述



    本文内容来自:
    1,Michael Nielsen的《Neural Networks and Deep Learning》中文翻译
    2,http://www.cnblogs.com/pinard/p/6494810.html
    3,http://blog.csdn.net/yunpiao123456/article/details/52437794

    展开全文
  • 机器学习——反向传播原理与公式推导

    一文理解反向传播的原理与推导

    什么是反向传播

    在训练神经网络的时候,会经常听到的一个名词:Backpropagation,反向传播。那么究竟什么是反向传播?我们知道训练神经网络的过程其实就是寻找一组较优参数的过程。这一过程经常需要用到梯度下降算法,即通过反复迭代,最终得到一组较优的参数。在线性回归中我们已经知道,参数的更新公式可以表示成:
    θ j ≔ θ j − α ∂ ∂ θ j J ( θ ) \theta_j\coloneqq\theta_j-\alpha\frac{\partial}{\partial\theta_j}J\left(\boldsymbol{\theta}\right) θj:=θjαθjJ(θ)
    其中, J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left(\boldsymbol{\theta}\right)=\frac{1}{2m}\sum_{i=1}^m\left(h_\boldsymbol{\theta}\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
    从公式中可以看到,参数更新时用到了微分,具体而言就是针对每个参数,求其偏微分,然后带入到更新公式中即可。这在线性回归中是行得通的,因为往往这类问题涉及到的参数相对来说比较少,就算用人工的方式一个一个推导,似乎也可以得到最终的结果。但是在神经网络中,参数的数量和线性回归相比,根本不在一个量级,涉及到的函数也变成了多层复合函数。此时刚才的方法就行不通了,好在我们有“反向传播”。反向传播算法可以说是求解多层复合函数的所有变量的偏导数的利器,其具体思想就是我们熟知的链式法则求导。下面将作具体介绍。

    反向传播理论推导

    在讲解反向传播之前,先来回顾一下梯度下降(图片来源为李宏毅2021春机器学习课程的课件)。

    在梯度下降中,我们首先会随机初始化一组参数 θ 0 \theta^0 θ0,然后通过对 θ 0 \theta^0 θ0中的每一个参数求偏导,得到由所有的参数构成的向量 ∇ L ( θ ) \nabla{L(\theta)} L(θ),即图中左边部分内容。将其代入到图中右边公式: θ 1 = θ 0 − η ∇ L ( θ 0 ) \theta^1=\theta^0-\eta\nabla{L(\theta^0)} θ1=θ0ηL(θ0),对参数进行更新,得到 θ 1 \theta^1 θ1。重复上述过程,直到得到一组较优的参数 θ \theta θ
    由于神经网络通常涉及大量参数,为了更有效的计算梯度,引入了反向传播。

    在训练时,我们通常会有一个损失函数,在图中,损失函数是所有样本损失之和。即假设第 n n n个训练样本输入到神经网络后,得到输出 y n y^n yn,同时,这一样本对应的真实值是 y ^ n \hat{y}^n y^n,则 C n C^n Cn表示两者之间的误差,例如我们可以定义 C n = y n − y ^ n C^n=y^n-\hat{y}^n Cn=yny^n,将所有样本的误差相加就可以得到最终的损失函数 L ( θ ) L(\theta) L(θ)。于是求偏导的公式就可以写成图中形式:
    ∂ L ( θ ) ∂ ω = ∑ n = 1 N ∂ C n ( θ ) ∂ ω \frac{\partial{L(\theta)}}{\partial{\omega}}=\sum_{n=1}^N\frac{\partial{C^n(\theta)}}{\partial{\omega}} ωL(θ)=n=1NωCn(θ)
    于是,我们只需要关注某一个样本的 ∂ C n ( θ ) ∂ ω \frac{\partial{C^n(\theta)}}{\partial{\omega}} ωCn(θ)。以一个神经元的计算为例,即上图中的红色三角形部分。

    现在假设神经网络的输入为 x 1 , x 2 x_1,x_2 x1x2,对应参数为 ω 1 , ω 2 \omega_1,\omega_2 ω1ω2,偏量为 b b b,则我们可以得到 z = x 1 ω 1 + x 2 ω 2 + b z=x_1\omega_1+x_2\omega_2+b z=x1ω1+x2ω2+b z z z通过激活函数后,再根据一系列类似的计算最终得到输出 y 1 , y 2 y_1,y_2 y1y2。根据链式求导法则,可以得到:
    ∂ C ∂ ω = ∂ z ∂ ω ∂ C ∂ z \frac{\partial{C}}{\partial{\omega}}=\frac{\partial{z}}{\partial{\omega}}\frac{\partial{C}}{\partial{z}} ωC=ωzzC
    接下来就需要分别计算这两部分。其中计算 ∂ z ∂ ω \frac{\partial{z}}{\partial{\omega}} ωz叫做forward pass,计算 ∂ C ∂ z \frac{\partial{C}}{\partial{z}} zC叫做backward pass

    Forward pass很简单,就是一次函数的求导:
    ∂ z ∂ ω 1 = x 1 ∂ z ∂ ω 2 = x 2 \frac{\partial{z}}{\partial{\omega_1}}=x_1 \\[4pt] \frac{\partial{z}}{\partial{\omega_2}}=x_2 ω1z=x1ω2z=x2
    从中我们可以得到规律: ∂ z ∂ ω i \frac{\partial{z}}{\partial{\omega_i}} ωiz的结果就是与参数 ω i \omega_i ωi相连接的输入值。例如,在图中与 ω 1 \omega_1 ω1相连的是 x 1 x_1 x1,那么 ∂ z ∂ ω 1 = x 1 \frac{\partial{z}}{\partial{\omega_1}}=x_1 ω1z=x1

    我们再用具体的数值作一下理解。现在我们的输入为-1和1,对应着四个参数: ω 11 = 1 , ω 12 = − 1 , ω 21 = − 2 , ω 22 = 1 \omega_{11}=1,\omega_{12}=-1,\omega_{21}=-2,\omega_{22}=1 ω11=1,ω12=1,ω21=2,ω22=1。按照刚才的规律·,我们可以直接得到 ∂ z 2 ∂ ω 22 = − 1 \frac{\partial{z_2}}{\partial{\omega_{22}}}=-1 ω22z2=1,根据图中的值,我们可以计算 z 2 = 1 × ( − 1 ) + ( − 1 ) × 1 + 0 = − 2 z_2=1\times(-1)+(-1)\times1+0=-2 z2=1×(1)+(1)×1+0=2,经过激活函数函数后(假设为sigmoid),得到 a 2 = 1 1 + e − 2 ≈ 0.12 a_2=\frac{1}{1+e^{-2}}\approx0.12 a2=1+e210.12,于是按照同样的方法,我们可以得到 ∂ z ∂ ω = 0.12 \frac{\partial{z}}{\partial{\omega}}=0.12 ωz=0.12
    接下来是Backward pass,即计算 ∂ C ∂ z \frac{\partial{C}}{\partial{z}} zC

    我们假设 z z z经过的激活函数为sigmoid函数,则我们可以得到 a = σ ( z ) a=\sigma(z) a=σ(z),则
    ∂ C ∂ z = ∂ a ∂ z ∂ C ∂ a = σ ′ ( z ) ∂ C ∂ a \frac{\partial{C}}{\partial{z}}=\frac{\partial{a}}{\partial{z}}\frac{\partial{C}}{\partial{a}}=\sigma'(z)\frac{\partial{C}}{\partial{a}} zC=zaaC=σ(z)aC
    σ ( z ) \sigma(z) σ(z)及其导数的图像为:

    此时,我们将 a a a作为输入,进行上述和求 z z z同样的计算,可以得到 z ′ , z ′ ′ z',z'' z,z,那么 ∂ C ∂ a \frac{\partial{C}}{\partial{a}} aC可以写成:
    ∂ C ∂ a = ∂ z ′ ∂ a ∂ C ∂ z ′ + ∂ z ′ ′ ∂ a ∂ C ∂ z ′ ′ \frac{\partial{C}}{\partial{a}}=\frac{\partial{z'}}{\partial{a}}\frac{\partial{C}}{\partial{z'}}+\frac{\partial{z''}}{\partial{a}}\frac{\partial{C}}{\partial{z''}} aC=azzC+azzC

    ∂ a ∂ z \frac{\partial{a}}{\partial{z}} za ∂ C ∂ a \frac{\partial{C}}{\partial{a}} aC两部分的结果进行整理,可以得到:
    ∂ C ∂ z = σ ′ ( z ) ( ω 3 ∂ C ∂ z ′ + ω 4 ∂ C ∂ z ′ ′ ) \frac{\partial{C}}{\partial{z}}=\sigma'(z)\left( \omega_3 \frac{\partial{C}}{\partial{z'}} +\omega_4 \frac{\partial{C}}{\partial{z''}} \right) zC=σ(z)(ω3zC+ω4zC)
    从另一个角度看上述公式:

    此时,我们的输入是 ∂ C ∂ z ′ \frac{\partial{C}}{\partial{z'}} zC ∂ C ∂ z ′ ′ \frac{\partial{C}}{\partial{z''}} zC,参数是 ω 3 和 ω 4 \omega_3和\omega_4 ω3ω4,和前向传播类似,通过相乘再相加,最后再乘以一个常数 σ ′ ( z ) \sigma'(z) σ(z),我们就可以得到 ∂ C ∂ z \frac{\partial{C}}{\partial{z}} zC具体表达式,这就是反向传播的内核所在,即从相反的角度作和前向传播类似的计算(前向传播需要经过一个激活函数,而反向传播需要乘以一个常数)。
    那么现在的问题就只剩下如何计算 ∂ C ∂ z ′ \frac{\partial{C}}{\partial{z'}} zC ∂ C ∂ z ′ ′ \frac{\partial{C}}{\partial{z''}} zC这两项了。下面分情况进行讨论:
    case1: z ′ 和 z ′ ′ z'和z'' zz经过激活函数后,直接输出(例如 y 1 = a ′ = s i g m o i d ( z ′ ) y_1=a'=sigmoid(z') y1=a=sigmoid(z))。

    那么,此时具体的计算为:
    ∂ C ∂ z ′ = ∂ y 1 ∂ z ′ ∂ C ∂ y 1 ∂ C ∂ z ′ ′ = ∂ y 2 ∂ z ′ ′ ∂ C ∂ y 2 \frac{\partial{C}}{\partial{z'}}= \frac{\partial{y_1}}{\partial{z'}} \frac{\partial{C}}{\partial{y_1}} \\[4pt] \frac{\partial{C}}{\partial{z''}}= \frac{\partial{y_2}}{\partial{z''}} \frac{\partial{C}}{\partial{y_2}} zC=zy1y1CzC=zy2y2C
    ∂ C ∂ y 1 \frac{\partial{C}}{\partial{y_1}} y1C ∂ C ∂ y 2 \frac{\partial{C}}{\partial{y_2}} y2C的具体表达式需要根据损失函数 C C C的具体形式决定。
    case2: z ′ 和 z ′ ′ z'和z'' zz经过激活函数后,后面仍有内容,即处于中间某一环节。

    此时,
    ∂ C ∂ z ′ = σ ′ ( z ′ ) ( ω 5 ∂ C ∂ z a + ω 6 ∂ C ∂ z b ) \frac{\partial{C}}{\partial{z'}}=\sigma'(z')\left( \omega_5 \frac{\partial{C}}{\partial{z_a}} + \omega_6 \frac{\partial{C}}{\partial{z_b}} \right) zC=σ(z)(ω5zaC+ω6zbC)
    于是,我们的任务又变成了求 ∂ C ∂ z a , ∂ C ∂ z b \frac{\partial{C}}{\partial{z_a}},\frac{\partial{C}}{\partial{z_b}} zaC,zbC。如此反复进行下去,直到我们到达输出层。
    以上是我们从正向的角度逐一对参数进行分解求导的。如果我们从输出层开始反向计算,相当于将神经网络计算方向反过来,那么问题就会变得很简单

    从输出层,我们可以很容易得计算出 ∂ C ∂ z 5 , ∂ C ∂ z 6 \frac{\partial{C}}{\partial{z_5}},\frac{\partial{C}}{\partial{z_6}} z5C,z6C,于是按照上面公式,就可以得到 ∂ C ∂ z 3 , ∂ C ∂ z 4 \frac{\partial{C}}{\partial{z_3}},\frac{\partial{C}}{\partial{z_4}} z3C,z4C,再进行类似得计算,最后就可以得到 ∂ C ∂ z 1 , ∂ C ∂ z 2 \frac{\partial{C}}{\partial{z_1}},\frac{\partial{C}}{\partial{z_2}} z1C,z2C

    以上就是反向传播的全部内容!
    (主要参考李宏毅机器学习

    展开全文
  • CNN的反向传播推导

    千次阅读 2019-01-21 17:48:29
    神经网络基础和反向传播推导 1 CNN的前向传播 a)对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M N大小,卷积核为a b大小,那么输出Y为(M-a+1)*(N-b+1)...

    卷积神经网络三个重要概念:

    1. 局部感受野(local receptive fields)
    2. 共享权重(shared weights)
    3. 池化(pooling)

    (1)局部感受野:在全连接的网络中,输入被描绘成纵向排列的神经元,但是在卷积网络中我们把它看成28x28的方形:
    在这里插入图片描述
    输入神经元的一小片区域会被连接到下一层隐层,这个区域被称为局部感受野,然后在输入图像中移动局部感受野,每移动一次,对应一个隐层的神经元,如此重复构成隐层所有神经元。如果局部感受野是5x5的,一次移动一格,输入图像是28x28的,那么隐层有24x24个神经元。

    (2)共享权重和偏置:每个隐层的神经元都有一个偏置和连接到它的局部感受野的5x5的权重,并且对这一层的所有神经元使用相同的权重和偏置。也就是说,对于隐藏层的第j行第k列的神经元,它的输出为:
    在这里插入图片描述
    其中σ是激活函数,b是共享偏置,Wl,m是共享权重的5x5数组,用ax,y表示输入层的第x行第y列的神经元的输出值,即隐层的第j行第k列的神经元的若干个输入。

    共享,意味着这一个隐层的所有神经元检测完全相同的特征,在输入图像的不同位置。这说明卷积网络可以很好地适应图片的平移不变性共享权重和偏置被称为卷积核或者滤波器。我们再看一下卷积的过程:
    在这里插入图片描述

    图像分类中我们会卷积多次(卷积核不同),也称为特征映射,下图卷积了3次,识别了3种特征:
    在这里插入图片描述
    共享权重和偏置的一个很大的优点是,大大减少了网络的参数数量。一次卷积我们需要5x5=25个共享权重,加上一个共享偏置共26个参数。如果我们卷积了20次,那么共有20x26=520个参数。以全连接对比,输入神经元有28x28=784个,隐层神经元设为30个,共有784x30个权重,加上30个偏置,共有23550个参数。卷积层的平移不变性会减少参数数量并加快训练,有助于建立深度网络。

    (3)**池化:**池化层一般在卷积层之后使用,主要是简化从卷积层输出的信息。池化层的每个单元概括了前一层的一个小区域,常见的方法有最大池化,它取前一层那个小区域里的最大值作为对应池化层的值。
    在这里插入图片描述

    为什么要池化呢?在通过卷积获得了特征之后,下一步我们要利用这些特征去做分类,如果直接用这些特征去训练分类器,维度还是太高,计算量太大而且容易过拟合,而通过池化大大减少特征的维度,减少过拟合的出现。再者,我们选择图像中的连续范围作为池化区域,这就意味着即使图像经历了一个小的平移之后,依然会产生相同的 (池化的) 特征,做到了图片的平移不变性。这里也可以看到卷积池化共享权重都有类似的作用。

    最后要知道,卷积层往往不止一个特征映射,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。所以我们也将最大池化分别应用于每一个特征映射,如下图,最后是一个输出层,和池化层全连接,一个神经元代表一个类别:

    在这里插入图片描述

    需要注意的是,以上我们举的例子都是单通道的图像,实际上我们的输入图像一般是三通道的,也就是说是一个三维的张量,而对应的卷积核也是三维的,卷积核的“厚度”和输入图像的“厚度”是相同的,三通道就意味着“厚度”为3,所以这个卷积核也是三层。接下来计算第一个通道和卷积核对应第一层的卷积,同样的,计算第二、三个通道和卷积核对应第二、三层的卷积,卷积就是矩阵对应元素相乘之后再相加。最后这三个结果相加,在加上偏置,作为输出。如下图:
    在这里插入图片描述
    如果再多一个卷积核,就再重复一次上边的运算,最后的输出加一层,“厚度”变为2。

    卷积神经网络的反向传播:

    首先回顾一下一般的前馈神经网络的反向传播:
    在这里插入图片描述
    详细内容可参看:神经网络基础和反向传播推导

    1 CNN的前向传播

    a)对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为MN大小,卷积核为ab大小,那么输出Y为(M-a+1)*(N-b+1)大小。
    在这里插入图片描述
    b)对于池化层,按照池化标准把输入张量缩小。
    c)对于全连接层,按照普通网络的前向传播计算。

    2 CNN反向传播的不同之处:

    首先要注意的是,一般神经网络中每一层输入输出a,z都只是一个向量,而CNN中的a,z是一个三维张量,即由若干个输入的子矩阵组成。其次:

    1. 池化层没有激活函数。这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1。
    2. 池化层在前向传播的时候,对输入进行了压缩,那么我们向前反向推导上一层的误差时,需要做upsample处理
    3. 卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得到当前层的输出,这和一般的网络直接进行矩阵乘法得到当前层的输出不同。这样在卷积层反向传播的时候,上一层误差的递推计算方法肯定有所不同。
    4. 对于卷积层,由于W使用的运算是卷积,那么由该层误差推导出该层的所有卷积核的W,b的方式也不同。

    由于卷积层可以有多个卷积核,各个卷积核的处理方法是完全相同且独立的,为了简化算法公式的复杂度,我们下面提到卷积核都是卷积层中若干卷积核中的一个。接下来看具体的CNN反向传播步骤。

    3 已知池化层的误差,反向推导上一隐藏层的误差

    在前向传播时,池化层我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后区域的误差,还原前一层较大区域的误差。这个过程叫做upsample。假设我们的池化区域大小是2x2。第l层误差的第k个子矩阵 δ k l \delta_k^l δkl为: 在这里插入图片描述
    如果池化区域表示为a*a大小,那么我们把上述矩阵上下左右各扩展a-1行和列进行还原:
    在这里插入图片描述
    如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:
    在这里插入图片描述
    如果是Average,则进行平均,转换后的矩阵为:
    在这里插入图片描述
    上边这个矩阵就是误差矩阵经过upsample之后的矩阵,那么,由后一层误差推导出前一层误差的公式为:
    在这里插入图片描述
    上式和普通网络的反向推导误差很类似:
    在这里插入图片描述
    可以看到,只有第一项不同。

    4 已知卷积层的误差,反向推导上一隐藏层的误差

    公式如下:
    在这里插入图片描述
    我们再看一次普通网络的反向推导误差的公式:
    在这里插入图片描述
    可以看到区别在于,下一层的权重w的转置操作,变成了旋转180度的操作,也就是上下翻转一次,左右再翻转一次,这其实就是“卷积”一词的意义(我们可简单理解为数学上的trick),可参考下图,Q是下一层的误差,周围补0方便计算,W是180度翻转后的卷积核,P是W和Q做卷积的结果:
    在这里插入图片描述

    5 已知卷积层的误差,推导该层的W,b的梯度

    经过以上各步骤,我们已经算出每一层的误差了,那么:

    1. 对于全连接层,可以按照普通网络的反向传播算法求该层W,b的梯度。
    2. 对于池化层,它并没有W,b,也不用求W,b的梯度。
    3. 只有卷积层的W,b需要求出,先看w:
      在这里插入图片描述
      再对比一下普通网络的求w梯度的公式,发现区别在于,对前一层的输出做翻转180度的操作:
      在这里插入图片描述
      而对于b,则稍微有些特殊,因为在CNN中,误差δ是三维张量,而b只是一个向量,不能像普通网络中那样直接和误差δ相等。通常的做法是将误差δ的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:
      在这里插入图片描述
    展开全文
  • 一、明确反向传播的是什么 cost函数对某一参数的偏导,即某一参数发生变化,会对cost产生什么影响。 在已l层变化对cost的影响,我们可以进一步根据链式法则得到l-1层参数对cost的影响。 二、在池化层中 目前,我们...
  • RNN、LSTM反向传播推导详解

    千次阅读 多人点赞 2019-04-14 12:18:11
    在做吴恩达深度学习课程相关作业时,顺便进行了RNN和LSTM的反向传播推导。顺便记录如下,希望能对你有所帮助~ RNN前向与反向: 模型的整体结构如下图所示,输入的是序列x、输出y,长度为Tx。 BasicRNN 前向...
  • 反向传播推导

    2020-02-20 23:11:05
    本篇博客从一个简单的例子开始,一步步演示直至推导反向传播的4大基本公式。希望能够帮助大家理解反向传播的知识。 链式法则 链式法则是反向传播的基础知识,对于链式法则大家理解下面两种case即可。 case1 ...
  • 正向传播、反向传播推导总结

    千次阅读 2019-06-25 10:55:05
    最近在看《动手学深度学习》这本书,收获很大,在此想总结一下,方便日后回顾。也推荐大家去看看这本书。 一、正向传播:(这里不考虑偏差项b) 输入层到隐藏层中间变量: ...
  • 反向传播过程中,我们要算每一个输出结点的损失,因此损失函数是每个输出几点关于标签的损失之和。 反向传播又可以分为两个部分:Forward pass 和 Backward pass。 Forward Pass 在Forward pass中我们的目标是计算...
  • CNN反向传播推导

    千次阅读 2018-03-23 18:23:31
    做CS231n作业碰到要实现CNN,在反向传播部分卡住,找了一些资料仔细推导了一番才得到结果,感觉有一些资料没有写清楚,这里把自己结合资料的推导过程与大家分享。参考:Convolutional Neural Networks ...
  • 深度学习之反向传播推导

    千次阅读 2018-08-16 20:34:23
    反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是: 将训练集数据输入到ANN的输入层, 经过隐藏层, 最后达到输出层并 输出...
  • 什么是全连接神经网络? 全连接神经网络是指任意两个相邻层之间的神经元全部互相连接。如下图所示: 图 1 如何计算全连接神经网络的输出? 在进行计算前,我们先对一些变量进行...结果跟我们之前的推导一模一样。 到此...
  • 神经网络基础和反向传播推导

    万次阅读 多人点赞 2017-08-06 16:00:29
    反向传播的核心是代价函数C关于任何权重w(或者偏置b)的偏导数的表达式,这个表达式告诉我们在改变权重和偏置时,代价函数变化的快慢。实际上它让我们细致领悟如何通过改变权重和偏置来改变整个网络的行为。 ...
  • 三个特征值,一个隐藏层(四个神经元),一个输出层(一个神经元),激活...手写推导过程为:右上角角标嫌麻烦写到了右下角,请读者不要和神经元位置混淆 过程略有简化,读者明白意思即可 m个样本的结果如下: ...
  • 我在之前的博客里面介绍过浅层的神经网络,现在就从浅层神经网络出发,介绍深度神经网络(DNN)的正向传播和反向传播。希望网友们看本博客之前需要对神经网络有个简单的了解,或者可以看博客初探神经网络(深度学习...
  • DNN反向传播推导过程

    千次阅读 2018-02-05 19:57:23
    1.L" role="presentation" ...">LLL层神经网络的前向传播: 设第l" role="presentation" style="position: relative;">lll层的权值矩阵为Wl" role="presentation" style="position: relative;">WlWlW^l,输出为zl" r
  • 吴恩达机器学习课程反向传播算法的数学推导 Proof of Back Propagation Algorithm.pdf 【本文旨在给出吴恩达机器学习课程反向传播算法的数学推导
  • 其中对resnet反向传播进行了分析,给出以下公式: 但是反向传播是为了对权重和偏置进行更新,论文中只是分析了对特征x的梯度。 自己对权重的梯度做了分析。 以一个小的示例表达: 其中分为两类,一是对...
  • 当softmax作为中间层的激活函数时,会导致小数相乘,使得效果很不好,所以softmax一般和交叉熵损失函数一起使用,放在最后一层。
  • RNN中的的反向传播推导(通俗版)

    万次阅读 2018-07-01 11:18:22
    反向传播其实就是链式求导法则的重复使用,链式法则其实就是先计算外层函数的导数,再计算内层函数的导数,一直重复。误差反向传播的过程,就是层层求导的过程。在看RNN的反向传播之前,先看看简单网络的反向传播。 ...
  • 图源http://cs231n.github.io/convolutional-networks/侵删 卷积神经网络反向传播推导 池化层反向传播 池化层的反向传播比较容易理解,我们以最大池化举例,上图中,池化后的数字6对应于池化前的红色区域,实际上...
  • 这几天自己用java实现了一下CNN的正向计算与误差反向传播,正向计算很好理解,也比较容易实现,但反向传播由于与普通的神经网络不同,实现会稍微复杂一些,看了很多博主的文章,感觉对卷积层的误差后向传递及卷积层...
  • 参考cs231n 和 https://blog.csdn.net/pjia_1008/article/details/66972060
  • lstm反向传播推导

    2019-08-29 10:03:20
    文章目录推导过程参考 推导过程 参考 https://ilewseu.github.io/2018/01/06/LSTM%E5%8F%82%E6%95%B0%E6%9B%B4%E6%96%B0%E6%8E%A8%E5%AF%BC/
  • 每一个权重对误差的影响,我们可以通过下图更直观的看清楚误差的反向传播 2.3.1 隐含层到输出层的权值更新 隐含层到输出层的权值,在上面的例子里是W5,W6,W7,W8 我们以W6参数为例子,计算W6对整体误差的影响有多大,...
  • 神经网络,反向传播推导 神经网络,反向传播推导 标注说明 解题思路 寻找δ(l)δ(l)\delta^{(l)}与δ(l+1)δ(l+1)\delta^{(l+1)}之间的关系 确定δ(L)δ(L)\delta^{(L)}的值 标注说明 θ(l)i,jθi,j...
  • 反向传播算法是人工神经网络训练时采用的一种通用方法,在现代深度学习中得到了大 规模的应用。全连接神经网络(多层感知器模型,MLP),卷积神经网络(CNN),循环神 经网络(RNN)中都有它的实现版本。算法从多元复合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,640
精华内容 6,656
关键字:

反向传播推导

友情链接: Breakout_clone.rar