赞
踩
图中是一个图像识别的CNN模型,最左边船的图像是输入层,计算机理解为输入若干个矩阵。接着是卷积层(Convolution Layer),卷积层的激活函数使用的是ReLU(x)=max(0,x)。在卷积层后面是池化层(Pooling layer),注意:池化层没有激活函数。
根据模型的需要卷积层+池化层的组合(或者卷积层+卷积层+池化层的组合)可以在隐藏层出现很多次。在若干卷积层+池化层后面是全连接层(Fully Connected Layer, FC),全连接层为DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类。
CNN相对于DNN,比较特殊的是卷积层和池化层。
微积分中卷积的表达式为:
离散形式是:
这个式子用矩阵表示(星号表示卷积):
如果是二维的卷积,则表示式为:
CNN的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为:
其中,W为卷积核,X为输入。如果X是一个二维输入的矩阵,则W也是一个二维的矩阵。如果X是多维张量,W也是一个多维的张量。
对图像卷积其实就是对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。
举例如下,图中的输入是一个二维的3x4的矩阵,而卷积核是一个2x2的矩阵。假设卷积核一次移动一个像素,首先对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S的S00的元素,值为aw+bx+ey+fz。接着将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,得到了输出矩阵S的S01的元素,同样的方法,可以得到输出矩阵S的S02,S10,S11,S12的元素。 最终得到卷积输出的矩阵为一个2x3的矩阵S。
再举一个动态的卷积过程的例子:有下面这个绿色的5x5输入矩阵,卷积核是一个黄色的3x3的矩阵。卷积的步幅是一个像素。则卷积的过程如下面的动图。卷积的结果是一个3x3的矩阵。
举一个输入是多维的例子,如输入的是对应RGB的彩色图像(三个分布对应R,G和B的矩阵)。
原输入是3个5x5的矩阵,全零填充后输入变为3个7x7的矩阵。该例使用了两个卷积核,由于输入是3个7x7的矩阵(7x7x3的张量),对应的卷积核W0最后一维是3的张量,由于卷积核W0的单个子矩阵维度为3x3,那么卷积核W0实际上是一个3x3x3的张量。这里的步幅为2,每次卷积后会移动2个像素的位置。最终的卷积过程和上面的2维矩阵类似,上面是矩阵的卷积,两个矩阵对应位置的元素相乘后相加。这里是张量的卷积,两个张量的3个子矩阵卷积后,再把卷积的结果相加后再加上偏倚b。
卷积的过程:输入是7x7x3的张量,卷积核是两个3x3x3的张量。卷积步幅为2,由于有两个卷积核W0和W1,最后得到了输出是3x3x2的张量。如果把上面的卷积过程用数学公式表达出来就是:
其中,n_in为输入矩阵的个数(张量的最后一维的维数)。Xk代表第k个输入矩阵。Wk代表卷积核的第k个子卷积核矩阵。s(i,j)即卷积核W对应的输出矩阵的对应位置元素的值。
对于卷积后的输出,一般会通过ReLU激活函数,将输出的张量中的小于0的位置对应的元素值都变为0。
池化就是对输入张量的各个子矩阵进行压缩。假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。要想将输入子矩阵的每nxn个元素变成一个元素,那么需要一个池化标准。常见的池化标准有2个,MAX或者是Average。即取对应区域的最大值或者平均值作为池化后的元素值。
下面这个例子采用取最大值的池化方法。采用2x2的池化,步幅为2,首先对红色2x2区域进行池化,此2x2区域的最大值为6,对应的池化输出位置的值为6,由于步幅为2,此时移动到绿色的位置去进行池化,输出的最大值为8,同样的方法,可以得到黄色区域和蓝色区域的输出值。最终,输入4x4的矩阵在池化后变成了2x2的矩阵,进行了压缩。
CNN的结构,包括输出层,若干的卷积层+ReLU激活函数,若干的池化层,DNN全连接层,以及最后的用Softmax激活函数的输出层。
图中的CONV为卷积层,POOL为池化层,FC为DNN全连接层,用Softmax激活函数的输出层。从上图可以看出,要理顺CNN的前向传播算法,重点是输入层的前向传播,卷积层的前向传播以及池化层的前向传播。而DNN全连接层和用Softmax激活函数的输出层的前向传播算法与DNN相同。
输入层前向传播到卷积层是CNN前向传播算法的第一步。以图像识别为例,考虑样本都是二维的黑白图片,输入层X是一个矩阵,矩阵的值等于图片的各个像素位置的值,和卷积层相连的卷积核W也是矩阵。如果样本是RGB彩色图片,输入X是3个矩阵(分别对应R,G和B的矩阵),或者说是一个张量,和卷积层相连的卷积核W也是张量,对应的最后一维的维度为3(每个卷积核都是3个子矩阵组成)。同样,对于3D的彩色图片之类的样本,输入X可以是4维,5维的张量,那么对应的卷积核W也是个高维的张量。
不管维度多高,对于输入,前向传播的过程可以表示为:
其中,上标代表层数,星号代表卷积,而b代表我们的偏倚, σ为激活函数,一般是ReLU。该过程和DNN的前向传播非常像,只是这儿是张量的卷积而不是乘法。为了简化描述,默认输入是3维的张量,即用RBG可以表示的彩色图片。
定义CNN模型参数:
普通隐藏层前向传播到卷积层时的前向传播算法。假设隐藏层的输出是M个矩阵对应的三维张量,则输出到卷积层的卷积核也是M个子矩阵对应的三维张量。这时表达式和输入层的很像,也是
其中,上标代表层数,星号代表卷积,而b代表偏倚, σ为激活函数,一般是ReLU。
也可以写成M个子矩阵子矩阵卷积后对应位置相加的形式,即:
和上一节区别在于,这里的输入是隐藏层,而不是输入的原始图片样本形成的矩阵。需要定义的CNN模型参数和上一节一样。
池化层的目的是对输入的矩阵进行缩小概括。如输入的若干矩阵是NxN维的,而池化大小是kxk的区域,则输出的矩阵都是维的。
这里需要定义的CNN模型参数是:
全连接层是普通的DNN模型结构,可以直接使用DNN的前向传播算法逻辑,即:
激活函数一般是sigmoid或者tanh。经过若干全连接层之后,最后的一层为Softmax输出层。此时输出层和普通的全连接层唯一的区别是,激活函数是softmax函数。
这里需要定义的CNN模型参数是:
首先回顾DNN的反向传播算法。在DNN中,首先计算出输出层的δL:
要套用DNN的反向传播算法到CNN,有几个问题需要解决:
问题1比较好解决,主要解决问题2,3,4。大家要注意的是,DNN中的al,zl都只是一个向量,而CNN中的al,zl都是一个三维张量,即由若干个输入的子矩阵组成。由于卷积层可以有多个卷积核,各个卷积核的处理方法是完全相同且独立的,为了简化算法公式的复杂度,下面提到卷积核都是卷积层中若干卷积核中的一个。
首先解决问题2,如果已知池化层的δl,推导出上一隐藏层的。
在前向传播算法时,池化层一般会用MAX或者Average对输入进行池化,池化的区域大小已知。现在反过来,要从缩小后的误差δl,还原前一次较大区域对应的误差。
在反向传播时,首先会把δl的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把δl的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把δl的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。
用一个例子说明:假设池化区域大小是2x2。δl的第k个子矩阵为:
由于池化区域为2x2,我们先讲做还原,即变成:
如果是MAX,假设之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:
如果是Average,则进行平均:转换后的矩阵为:
其中,upsample函数完成了池化误差矩阵放大与误差重新分配的逻辑。
我们概括下,对于张量,我们有:
对于卷积层的反向传播,首先回忆下卷积层的前向传播公式:
其中n_in为上一隐藏层的输入子矩阵个数。
这里的式子其实和DNN的类似,区别在于对于含有卷积的式子求导时,卷积核被旋转了180度。即式子中的rot180(),翻转180度的意思是上下翻转一次,接着左右翻转一次。在DNN中这里只是矩阵的转置。那么为什么呢?由于这里都是张量,直接推演参数太多了。我们以一个简单的例子说明为啥这里求导后卷积核要翻转。
为了符合梯度计算,我们在误差矩阵周围填充了一圈0,此时我们将卷积核翻转后和反向传播的梯度误差进行卷积,就得到了前一次的梯度误差。这个例子直观的介绍了为什么对含有卷积的式子反向传播时,卷积核要翻转180度的原因。
以上就是卷积层的误差反向传播过程。
我们现在已经可以递推出每一层的梯度误差δl了,对于全连接层,可以按DNN的反向传播算法求该层W,b的梯度,而池化层并没有W,b,也不用求W,b的梯度。只有卷积层的W,b需要求出。
注意到卷积层z和W,b的关系为:
因此我们有:
注意到此时卷积核并没有反转,主要是此时是层内的求导,而不是反向传播到上一层的求导。具体过程我们可以分析一下。
和第4节一样的一个简化的例子,这里输入是矩阵,不是张量,那么对于第l层,某个个卷积核矩阵W的导数可以表示如下:
假设输入a是4x4的矩阵,卷积核W是3x3的矩阵,输出z是2x2的矩阵,那么反向传播的z的梯度误差δ也是2x2的矩阵。
那么根据上面的式子,我们有:
最终一共得到9个式子。整理成矩阵形式后可得:
从而可以清楚的看到这次我们为什么没有反转的原因。
而对于b,则稍微有些特殊,因为δl是三维张量,而b只是一个向量,不能像DNN那样直接和δl相等。通常的做法是将δl的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:
以最基本的批量梯度下降法为例来描述反向传播算法。
输入:m个图片样本,CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。梯度迭代参数迭代步长α,最大迭代次数MAX与停止迭代阈值ϵ
输出:CNN模型各隐藏层与输出层的W,b
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。