精华内容
下载资源
问答
  • 文章目录前言正文卷积神经网络中的关系式卷积层...排版可能更好一点的永久原文链接:深度学习的数学-卷积神经网络误差反向传播 前言 本篇博客主要记录反向传播法在卷积神经网络中的应用,如何像全连接的隐藏层那...

    排版可能更好一点的永久原文链接:深度学习的数学-卷积神经网络的误差反向传播

    前言

    本篇博客主要记录反向传播法在卷积神经网络中的应用,如何像全连接的隐藏层那样,通过输出层的神经单元误差反向推算出所有层的神经单元误差,最终得到梯度。

    正文

    博主在看完卷积神经网络的正向运作流程后,其实是有一点懵圈的,于是我冷静了一天再继续看卷积神经网络的反向传递;正向运作流程中的 『池化』、『特征映射』应该怎么样用式子表示?经过了池化(最大/平均/L2)的神经单元输入,又怎样体现在神经单元误差的计算上?可以带着这些问题继续往下看。

    卷积神经网络中的关系式

    在进行推算之前,首先确定好每个层神经单元之间的关系式
    在这里插入图片描述

    卷积层

    卷积层中每个神经单元的输入可以理解为过滤器的加权输出,卷积层神经单元的输出套上激活函数就可以了。
    所以关系式是下面这个样子的:

    池化层

    池化层的输入等于输出,如果是最大池化,则使用Max求一定范围内的极值就可以了(当前例子是将 4 * 4 的卷积最大池化为 2 * 2 的池化层)

    输出层

    而输出层和池化层的神经单元是全连接的,所以就是熟悉的 权重 * 池化输出求和 公式
    在这里插入图片描述

    平方误差(损失函数)

    平方误差依旧由 正解 - 输出神经单元的输出,做平方和

    梯度下降法

    梯度下降如果有些忘了的话,链接在此:深度学习的数学-梯度下降
    梯度就可以看作是代价函数的导数整体下降速度最快的分量,每个变量只需要顺着梯度做减法,即可以最快速度达到整体极值点的位置

    各个神经单元的的权重、偏置都是变量,为方便理解书中也把每个变量代表的含义标了一下,如下图所示:
    在这里插入图片描述

    卷积层和输出层的神经单元误差(重点)

    在全连接隐藏层反向递推的过程中,有一个神经单元误差的概念,忘了的可以看一下之前记录的博客:深度学习的数学-神经单元误差和反向传播

    简单来说就是损失函数对神经单元的综合输入求偏导数,这个偏导数衡量这个神经单元与理想状态(理想是达到0)的差距

    而卷积神经网络中,有卷积层和输出层两种类型的神经元,分别定义如下

    PS:池化层输入等于输出是没有额外变量的,过滤器的偏置和权重都体现在了卷积层的综合输入 z 上

    这两个神经单元误差影响整体平方误差画一个图就像下面这样:
    在这里插入图片描述

    输出层的神经单元误差计算

    在看神经单元误差对权重偏置的影响之前,先看一下怎么计算输出层的神经单元误差,其定义如下:

    由平方误差的定义式可以知道 C 对 anoa_n^o 的偏导数

    PS:乘 1/2 就是为了不让偏导数前面带常数 2



    带入式子即可得到输出层的神经单元误差公式

    输出层的神经单元与其权重偏置的关系

    与之前一样,还是从输出层开始,建议看的时候结合这个式子看,很容易就看出来了

    同样根据单变量复合函数求偏导数的链式法则,把 z1oz_1^o 看作 wijOkw_{i-j}^{Ok} 的函数,再根据输出层神经单元误差的定义,得到如下式子

    相同的思路,对输出层神经单元的偏置求偏导数,能得到如下结果

    卷积层的神经单元误差与其权重偏置的关系

    还是先看下上方贴出来的式子如下

    如果但看上面看不太明白,还可以按照书中的思路,先把式子都列出来找找规律

    里边的每一个 w 的偏导数一目了然

    再找规律整理一下就能得到式子

    再看一下上面的定义式,根据单变量复合函数的偏导数公式,很容易也能得出下面的结论

    反向递推关系式(重点)

    为了减少偏导数的计算,再一次来到了紧张刺激的反向递归关系烧脑环节,书中依旧是以 6 * 6 手写识别的神经网络为例,便于理解推导过程

    三个输出神经单元的情况下,有三条路径可以影响到平方误差,把平方误差对 zijFkz_{ij}^{Fk} 的偏导数转向对输出层的三个 ziOz_i^O 求偏导数,即可得到如下式子

    提取同类项可得:

    然后把括号中的非神经单元误差的导数,根据关系式求出来(回想z = 权重 * 输出的那个式子,所以 z 对 a 求导结果自然是权重)

    然后计算 aijPka_{ij}^{Pk}zijPkz_{ij}^{Pk} 的导数
    最大池化层,输入等于输出,等于卷积层对应神经单元的最大值;两者相等(激活函数 a = x),所以导数为1

    接着计算 zijPkz_{ij}^{Pk}aijFka_{ij}^{Fk} 的导数,最大时这两个数相等(激活函数 a = x),否则为0(可以理解为激活函数 a = 0 * x)

    最后那个 zijFkz_{ij}^{Fk}aijFka_{ij}^{Fk} 的导数就是激活函数的导数,带入即可得到如下式子:

    推广一下,就可以通过下一层的神经单元误差反推上一层的神经单元误差

    最后只需要根据神经单元误差与权重和偏置的关系,即可算出梯度,再使用梯度下降法,逼近全局最低点即可

    总结

    首先根据卷积神经网络的概念引入了卷积神经网络中各层的数学关系式,并通过关系式求出了输出的神经单元误差及其各层的神经单元误差与权重和偏置的关系,最后用全连接神经网络类似的推导方法,推导出了反向递推关系式。

    展开全文
  • 其实无论是dnn还是cnn、pool层,最重要的是,我们要弄清楚反向传播的四个公式,弄清楚他们,我们就明白整个网络是如何运作和优化的,4个核心公式分别是: 1、输出层的误差方程 -这个是基础 2、误差传递方程 3...

    本文详细讲解dnn和cnn的反向传播流程。其实无论是dnn还是cnn、pool层,最重要的是,我们要弄清楚反向传播的四个公式,弄清楚他们,我们就明白整个网络是如何运作和优化的,4个核心公式分别是:

        1、输出层的误差方程    -这个是基础

        2、误差传递方程     

        3、可训练参数权重w的变化率(梯度)

        4、可训练参数偏置b的变化率(说到底其实网络就是在算误差,然后优化w和b,使得最后误差最小)

    同时理解各种层的前向推理过程,那么整个网络的流动和机制就相当清晰了。

    1、全连接层的推理与反向传播

        首先,我们需要了解全连接层的dnn的网络的推理和传播过程,接着这个基础,再进一步的分析cnn的流程。

        1、dnn的前向推理(主要是用来定义各个参数)

        前向传播过程(激活输出值):

        其中为每一层激活的输入,则上式变为

        2、dnn的反向推理过程

        反向推理过程其实就是权重w和偏置b的变化,通过两个参数的变化影响损失函数C,因此需要计算每一个参数的 。此时引入误差的概念,表示第l层第j个单元的误差:

        此时我们基于此推理出4个基本方程:

        1、输出层的误差方程

            写成矩阵形式:

        2、误差传递方程:

            从bp2可以看出,第l+1层的误差计算第l层的误差,结合bp1和bp2,便可以计算网络中的任意一层的误差,先计算,再计算。。。指导输入层。

        附上证明过程(思路简单,就是麻烦):

       此时,所以可以得到,代入上述方程,因此可以得到bp2(写成点乘的方式就是bp2的表达式):

         3、代价函数对偏置的改变率

        由于,所以

        4、代价函数对权重的改变率

            可以进一步简写为:

            可以看出,上一层的激活输出如果很小接近于0时,无论返回的误差有多么大,权重的改变率基本就为0,这就解释了为什么神经元饱和或者神经元死亡都会导致学习的非常慢,这也就是说明为什么激活函数的选择重要性。

        综上,我们得到后,此时我们就可以使用梯度下降,从而计算出网络中w和b参数的梯度。

        这里提到为什么反向传播比普通的梯度定义求偏导快

        我们普通的求偏导可以使用如下式来进行计算:

        为了计算上式,我们需要从头到尾进行一次前向传播得到最终的值,如果要单独计算每一个参数的偏导,假定有100万个参数,我们由于需要对每一个参数单独然后计算求偏导,相当于1次迭代就要前向传播100万次。

        再看反向传播,此时已知神经网络先通过一次前向传播计算出最深层的输出和各层输出ak(第一次前向传播),,再利用bp1和bp2计算出所有的层的误差...(计算量相当于一次前向传播-第二次前向传播),再由bp4可以看出,已知每一层的输出和误差,可以直接计算每一层的变化率(变化速度),从而得到梯度,计算量值相当于2次forward。

     

    2、卷积神经网络的推理与反向传播

        1、cnn的前向推理

            卷积层的前向推理实际上就是矩阵计算然后将多个矩阵计算结果相加的问题,此处不讨论

        2、cnn的反向传播

            首先看卷积层的误差推理公式,也就是bp2,先给出结论:

            为什么是这样的呢,我们通过简单的举例来验证:

            假定l层的输出是一个3*3的矩阵,第l+1层的卷积核W-l+1是一个2*2的矩阵,卷积步长为1,则输出一个Z-l+1是一个2*2的矩阵,此时简化b-l(偏置)为0,则有:

            将上式拆解成矩阵形式,如下式:

            利用卷积的计算方式,可以得到:

            接下来计算损失函数C对输出值a的偏导

           由矩阵形式可知,和W-l+1有关,假定:

           在式3的4个等式中,可以明显看出,a11只与z11有关,求偏导后,可以得到如下:

            同理,可以得到其他8个

            然后我们将上面一共9个式子使用一个矩阵卷积的形式来表示:

            如上所示,我们在误差矩阵周围填充了一圈0,此时将卷积核翻转后和反向传播的梯度和误差进行卷积,得到前一层的梯度误差,则我们直接可以简写成最开始的bp2形式,此处再重复写一次,得到cnn的bp2-误差传递方程

        然后我们基于bp4来推导权重的梯度,也需要经过一个旋转的操作(类似的原理,此处不详细分析),如下得到cnn的bp4-卷积的梯度计算(注意,根据原博客,认为是要上一层输出旋转180度,但是经过原始博客评论区提醒,我简单推了一下,应该是不需要旋转180度的,如下所示)

            对于偏置b,由于误差时3维张量,而b只是一维向量,不能像dnn中直接,通常是将的各个子矩阵分别求和,得到一个误差向量,即b的梯度,则为cnn的bp3-偏置的梯度计算

            而cnn的bp1是一样的,因此从上到下,我们同样也分析到了基于cnn的bp2,bp3,bp4,因此本质上cnn的反向传播同样也是4个核心公式的变形,但是需要自己简单推理和理解一下。

     

    2、池化层推理与反向传播

        由于池化层没有激活函数,则可以看成是线性激活函数,即,则,则bp1很好推理,与dnn一致,但激活层的偏导为1,接下来讨论池化层如何推导误差

        1、max-pool

        如果是max-pool时,我们的误差推导则只需要在前向推理时记住max的位置,然后在反向传播时,将误差直接放到原来的最大值位置,其他位置置为0,形象化举例如下:

        假定第k+1层的误差为如下,

        则第k层的误差如下:

        图中,最大池化的位置已经在前向传播时记住,因此直接放回最大的误差。

        2、average pool

        只需要将池化层的误差平均值放回原来的矩阵中即可,上式的简单举例,k+1层误差如最大池化层,k层最大误差为:

        其实average、max pool是前向传播的逆操作,很好理解,这就是池化层的bp2。因为池化层没有参数,所以不需要bp3和bp4,bp1与dnn一致,但激活层的偏导为1.

        综上,便是cnn的前向推理和反向传播的基本核心,至于其他的upsample、反卷积等,此处就不讨论了,有兴趣的同学可以进一步研究,本文的出发点在于回忆一些基础但很模糊的东西,下一篇是否要考虑总结一下各种优化方法?

    注意:本文基本上是参考了如下博客,因为毕竟如果不进行参考的话,从哪里写起来都不知道,按照参考博客的思路整合和理解。

    参考博客:https://blog.csdn.net/qq_16137569/article/details/81449209

    展开全文
  • 神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的...

    转自:http://blog.csdn.net/taigw/article/details/50612963

    神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:

    1. 初始化参数。
    2. 求代价函数关于参数的梯度。
    3. 根据梯度更新参数的值。
    4. 经过迭代以后取得最佳参数,从而完成神经网络的训练。 
      其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。

    单个神经元的训练

    单个神经元的结构如下图。假设一个训练样本为(x,y)。在下图中,x是输入向量,通过一个激励函数hw,b(x)得到一个输出aa再通过代价函数得到J

    f(W,b,x)=a=sigmoid(ixiwi+b) (公式1) 
    J(W,b,x,y)=12yhw,b(x)2 (公式2)

    这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为Wb

    通过定义变量z=ixiwi+b可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到z, 第二部分是通过sigmoid得到a。 
    这里写图片描述

    训练过程中,要求代价函数J关于Wb的偏导数。先求J关于中间变量az的偏导:

    δ(a)=aJ(W,b,x,y)=(ya) (公式3) 
    δ(z)=zJ(W,b,x,y)=Jaaz=δ(a)a(1a) (公式4)

    公式(4)中根据sigmoid函数的定义σ(z)=11+ez可得az=a(1a)

    再根据链导法则,可以求得J关于Wb的偏导数,即得Wb的梯度。

    WJ(W,b,x,y)=WJ=JzzW=δ(z)xT (公式5)

    bJ(W,b,x,y)=bJ=Jzzb=δ(z) (公式6)

    在这个过程中,先求J/a,进一步求J/z,最后求得J/WJ/b。结合上图及链导法则,可以看出这是一个将代价函数的增量J自后向前传播的过程,因此称为反向传播(back propagation)。

    多层神经网络的训练

    多层网络的一个例子如下图。 
    这里写图片描述
    假设第l+1层的输入和输出分别是alal+1, 参数为Wlbl,仿射结果为中间变量zl。注意第一层的输出a1=x,为整个网络的输入,最后一层的输出aL是代价函数的输入。

    zl+1=WlxTl+bl (公式7) 
    al+1=sigmoid(zl+1) (公式8)

    对多层网络的训练需要求代价函数J对每一层的参数求偏导。后向传播过程变为:

    1,第一步,根据代价函数的定义,求JaL的偏导δ(a)L。 
    2,在第l+1层,将误差信号从al+1传递到zl+1

    a(l+1)z(l+1)=a(l+1)(1a(l+1)) (公式9)

    3,第三步,将误差信号从第l+1层向第l层传播。

    z(l+1)a(l)=W(l),z(l+1)W(l)=a(l),z(l+1)b(l)=I (公式10)

    4, 对第l层可得Ja(l)z(l)的偏导数。

    δ(a)l=Ja(l)={(ya(l)),Jz(l+1)z(l+1)a(l)=(W(l))Tδ(z)l+1,if l=Lotherwise (公式11)

    δ(z)l=Jz(l)=Ja(l)a(l)z(l)=δ(a)la(l)(1a(l)) (公式12)

    5, 最后可得J对第l层的参数Wlbl的梯度:

    W(l)J(W,b,x,y)=W(l)J=Jz(l+1)z(l+1)W(l)=δ(z)l+1(a(l))T (公式13)

    b(l)J(W,b,x,y)=b(l)J=Jz(l+1)z(l+1)b(l)=δ(z)l+1 (公式14)

    后向传播的一般形式

    1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:

    hθ(x)=(f(L+1)...f(l)θl...f(2)θ2f(1))(x) (公式15)

    其中θ是该神经网络的参数。f(1)=xf(L+1)=hθ(x),并且对任何一个l,相邻两层间函数的导数f(l+1)f(l)都是已知的。

    2,根据链导法则,求代价函数对任何一个lJ关于f(l)的导数,即通过数值计算将误差信号后向传递到第l层。

    δl=f(l)J(θ,x,y)=Jf(l+1)f(l+1)f(l)=δl+1f(l+1)f(l) (公式16)

    3,在第l层求J关于该层参数θ(l)的梯度。

    θ(l)J(θ,x,y)=θ(l)J=Jf(l)f(l)θ(l)=δlf(l)θ(l)。(公式17)

    其中第l层对应的函数关于该层的参数的导数f(l)θ(l)是已知的。

    4,将所有样本的梯度相加得到总梯度。

    θ(l)J(θ)=mi=1θ(l)J(θ,x(i),y(i)) (公式17)

    对于不同的网络结构,在第2步和第3步中根据具体的f(l+1)f(l)f(l)θ(l)就可以求得所有参数的梯度。

    卷积神经网络的训练

    卷积神经网络(CNN)的结构可阅读上一篇博文。CNN的基本层包括卷积层和池化层,二者通常一起使用,一个池化层紧跟一个卷积层之后。这两层包括三个级联的函数:卷积,求sigmoid函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下: 
    这里写图片描述
    后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:

    卷积函数的导数及后向传播

    假设一个卷积层的输入向量是x,输出向量是y, 参数向量(卷积算子)是w。从输入到输出的过程为:

    y=xw(公式18)

    y的长度为|y|=|x||w|+1y中每一个元素的计算方法为:

    yn=(xw)[n]=|w|i=1xn+i1wi=wTxn:n+|w|1 (公式19)

    卷积过程的示意图如下: 
    这里写图片描述
    y中的元素与x中的元素有如下导数关系:

    yni+1xn=wiynwi=xni+1,for1i|w|. (公式20)

    进一步可以得到J关于wx的导数:

    δ(x)n=Jyyxn=|w|i=1Jyni+1yni+1xn=|w|i=1δ(y)ni+1wi=(δ(y)flip(w))[n] (公式21)

    δ(x)=δ(y)flip(w) (公式22)

    wiJ=Jyywi=|x||w|+1n=1Jynynwi=|x||w|+1n=1δ(y)nxn+i1=(δ(y)x)[i] (公式23)

    wJ=δ(y)x (公式24)

    因此,通过δ(y)与flip(w)的卷积就可得到J关于x的导数δ(x),通过δ(y)x的卷积就可计算出w的梯度wJ

    池化函数的导数及后向传播

    池化函数是一个下采样函数,对于大小为m的池化区域,池化函数及其导数可以定义为: 
    均值池化: g(x)=mk=1xkm, 导数为 gxi={10if xi=max(x)otherwise

    p范数池化 g(x)=xp=(mk=1|xk|p)1/p, 导数为gxi=(mk=1|xk|p)1/p1|xi|p1

    下采样的后向传播过程为上采样,其示意图为: 
    这里写图片描述
    该后向传播过程就是利用g的导数将误差信号传递到g的输入。

    δ(x)(n1)m+1:nm=x(n1)m+1:nmJ=Jynynx(n1)m+1:nm=δ(y)ngn