卷积神经网络的一些事儿

来源:互联网 发布:数据库设计大作业 编辑:程序博客网 时间:2024/04/28 17:58

1. 从手写体图片识别说起

手写体识别一般是神经网络入门必备的demo,在传统的神经网络进行手写体识别的时候,需要更多的人工对特征进行处理,一般是如下的步骤:

>1.将原始图片的像素值栅格化为一维向量,如原始图片为8\*8, 则栅格化之后的向量为164;>2.将栅格化的向量作为神经网络的输入,手写体对应的数字编码之后作为神经网络的输出;

然后在MNIST数据集上也能有96%以上的正确率,但是MNIST数据集给的都是28*28大小的数据,如果图片的像素规模很大呢?这里可能就会考虑两个方案:要么就是直接将全部的像素作为神经网络的输入;要么就是人工去对像素进行采样降维。那么可行性又如何?对于第一种,假设隐层神经元的数量为1000,那么输入层-隐含层权值矩阵就达到了109的规模,一般的机器根本训不动,更别提用梯度下降这种可能会陷入局部最优的算法了(参数多,解空间大);对于第二种可能就是无尽的特征提取工作了。

谈到第二点,深度学习某种意义可以认为是对特征的学习. 领域知识在传统机器学习中十分重要,不管是CTR预估亦或是信用评级、LTR等,都需要在相关领域有较多的经验,往往某几个特征的发现能够给整个系统带来质的飞跃,当然这也使得传统机器学习的解释性更好。

2. 你的眼睛是怎么看图片的?

通常而言,我们在观察事物的时候,都是会将注意力集中到某一块部分,可能一块还足以让我们判断这个东西的类型,但是多观察几个局部,就能大概知道所观察的东西是个啥了。这个给我们的启发是对于输入的1000*1000像素的图片,我们并不需要所有像素的信息,提取局部的特征也能够给我们勾勒出该图片所代表的事物的特征。这个在卷积神经网络中对应的就是卷积核。另外,对图片进行采样模糊等变换,某种程度上也不会改变图片中事物的主要特征,这个在卷积神经网络中对应的就是pooling,也就是向下采样.

3. 卷积神经网络

那么卷积神经网络是如何处理类似于图片这种结构的输入呢?卷积神经网络中采用了两种十分有效的思路:局部感知和权值共享;前面提到如果直接将图像的像素作为神经网络的输入,需要学习的参数较多。表观上图像所代表的信息通过局部也能够表达,对于神经网络而言,虽然单个神经元只感受到了局部,但是整体的特征已经被整个模型所接收,最后的效果也不会差到哪里去,而随之带来的就是学习参数数目的下降。比如原始图像为1000*1000,隐层为1000000个节点,每个节点只与输入图像的5*5的区域相连,此时需要学习的参数为2.5*10^7,是原先的四万分之一.

但是这些参数的学习仍然是一个不小的挑战,但是如果隐层节点与输入层区域相连的权值都一样呢,那样子需要学习的参数仅仅为25个,而这个25个参数一般也被称之为卷积核,也有叫滤波器的,总而言之就是对局部特征进行某种线性变换的参数!如此而来,用较小的参数规模实现了对图像局部特征的学习!单个的卷积核造成的问题就是特征提取不够充分,所以一般采用的都是多个卷积核,每种卷积核所体现的就是图像局部不同的特征!卷积过后,如果直接用这些特征进行分类,一是维度过大导致训练不便,二是有可能导致过拟合,所以一般在卷积之后会加一个对卷积层特征的聚合过程,也即Pooling层。

表达卷积神经网络一般是卷积层与pooling层交替组合,构成深度神经网络,多层卷积能够组合局部特征从而表征全局,像下图中经典的LeNet-5网络结构,就是由3个卷积层和两个pooling层以及一个全连接层组成。

卷积层和pooling层可以认为是对特征的学习过程,然后将学习到的特征再输入到一个分类器中进行训练. 在卷积层,是利用卷积核对上一层的特征图进行卷积操作,然后将卷积结果重新输出到新的特征图中,在LeNet5中的C1层中,利用的就是6个5*5的卷积核对输入图像进行卷积,然后得到6个特征图,每个特征图的大小是28*28.

这里需要注意的是,卷积层的特征图并不仅仅是来自于前一层的一个特征图,有可能是前一层的多个特征图和多个卷积核进行联合操作之后得到,如LeNet-5中Pooling层S2到卷积层C3就是按照如下的排列进行连接的, 其中C3的第一个特征图来自于S2中的0,1,2号3个特征图,最后一个特征图与S2中的所有特征图相连,此时需要60个卷积核. 加上偏置,需要学习的参数为60*5*5+16.

3.1 卷积层

Xlj 为第l层(卷积层)第j个特征图,当l=1时即为原始图像特征,Mlj为与第l层(卷积层)第j个特征图相连的前一层特征图集合的某个子集,那么第l层的第j个特征图的计算:

Xlj=f(iMljKljXl1i+blj)

其中,为卷积运算,blj为一维的实数,假设图片像素矩阵P,卷积核为K, 如下:

P=0134104223342304K=[2111]

那么对图像进行卷积之后的结果F=KP为:

F=110971391139

此时需要注意卷积不是直接算矩阵点乘,而是将卷积矩阵旋转180度之后再算点乘。并且F中的元素与P中的元素有如下的对应关系,其中u,v为输出特征图的下标,卷积核大小为d*d,Kdh,dj为卷积核参数Kh,j旋转180度之后对应的值,Pu+h,v+j为与输入特征图进行卷积的位置的像素值。

Fu,v=hjKdh,djPu+h,v+j

卷积核的大小d一般选奇数,卷积时候的步长(一般为1)也可以根据具体的场景进行调整,当然如果为了保证卷积之后维度不变,也可以进行边缘扩展,在原始特征图的边缘补充新的像素值。

3.2 Pooling层

Pooling层主要的作用是降噪降维,缓解过拟合的尴尬。为什么这么说呢?因为就典型的max pooling(取最大)或者averaging pooling(取平均)操作而言,它能够使得模型关注于局部某一部分,而不是具体的像素,模型的鲁棒性和泛化能力得到了一定程度的保障。

Pooling层的特征图与上一层的卷积层一一对应,只不过特征图的维度变小。令Xlj为Pooling层的第j个特征图,down()为向下采样。则有:

Xlj=f(βljdown(Xl1j)+blj)

对于Pooling层的输入特征图,其每一个采样局部共享同一个采样尺度和偏置,也即βljblj都是一个实数. Pooling层之后,维度一般会减半。假设学习到的采样尺度为0.25, 偏执为0.1,采样窗口为2*2,激励函数f才用的sigmoid函数,则在Pooling层由输入特征图到输出特征图的过程如下:

Xl1j=0234204243342304Xlj=[f(1.1)f(3.35)f(3.1)f(2.85)]

3.3 全连接层

卷积层和Pooling层可以认为是对特征的学习,在这个交替的层次之后,原始的数据被转换到新的特征空间中,然后通过全连接层将特征空间和样本空间进行关联。在通常情况下,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。

3.4 反向传播推导

CNN的推导和基本的全连接神经网络无异,没什么特别的地方,关键在于两点:

  • 卷积层到Pooling层,前向计算的时候由于下采样导致为维度降低,在误差反向传导时,需要对下一层误差进行反向采样
  • Pooling层到卷积层,误差项中需要弄清楚和当前卷积核进行卷积的patch.

δlj 为第l层第j个特征图Xlj对应的误差项,其维度和Xlj一致,(δlj)u,vXlj 下标为u,v对应的误差项,即有:

δlj(δlj)u,vnetlj=Enetlj=E((netlj)u,v)=iMljKli,jXl1i+bljβljdown(Xl1j)+blj

l层为卷积层时,需要学习的参数为卷积核和偏执,假设卷积层输出N个特征图,有m个卷积核,卷积核大小为rc,则一共需要学习的参数个数为(rc+1)m。令卷积层第j个输出特征图的误差项为δlj=Enetjl .

δlj=Enetjl+1netjl+1xjlxjlnetjl=βl+1j(up(δjl+1)g(netjl))

其中是点乘,up(x)表示向上采样,如果是mean pooling,则每个元素按照原先向下采样的比率进行复制,如果是max pooling, 则需要记住最大值的位置,然后除了最大位置的元素之外,都置为0。得到卷积层的误差项之后,便可以进行权值更新了。卷积层每一个输出特征图xlj对应一个为偏执blj, 且blj为标量,其与每一个(δlj)u,v 都有关联,所以对偏执的求导为:

Eblj=uvE((netlj)u,v)((netlj)u,v)blj=uv(δlj)u,v

每一个输出特征图由若干个卷积核与输入特征图卷积得来,对于卷积核Kli,j而言,其求导的结果为一个dd的矩阵,对于其中的某个值(Ki,j)r,s求导为(其中r,s为卷积核中的下标,大小在[0,d-1]范围内,u,v为输出特征图的下标):

E((Kli,j)r,s)=uvE((netlj)u,v)((netlj)u,v)((Kli,j)r,s)=uv(δlj)u,v((netlj)u,v)((Kli,j)r,s)=uv(δlj)u,v((Xl1iKli,j)u,v)((Kli,j)r,s)

此时又有:

(Xl1iKli,j)u,v=rs(Kli,j)r,s(Xl1i)u+r,v+s

所以:

E((Kli,j)r,s)=uv(δlj)u,v(Xl1i)u+r,v+s

也即:

EKli,j=uv(δlj)u,v(PTl1i)u,v

其中,PTl1iXl1i中与卷积核进行卷积的部分,我们来看个例子,对于xl1i(X)、以及卷积Ki,j(K) 如下:

X=x11x21x31x12x22x32x13x23x33K=[k11k21k12k22]P=[a11a21a12a22]

a11=x11k22+x12k21+x21k12+x22k11a12=x12k22+x13k21+x22k12+x23k11a21=x21k22+x22k21+x31k12+x32k11a22=x22k22+x23k21+x32k12+x33k11

此时的a即为δ,所以:

Ek11Ek12Ek21Ek22=Ea11x22+Ea12x23+Ea21x32+Ea22x33=Ea11x21+Ea12x22+Ea21x31+Ea22x32=Ea11x12+Ea12x13+Ea21x22+Ea22x23=Ea11x11+Ea12x12+Ea21x21+Ea22x22

即是(*为卷积操作):
TMP=Ek22Ek12Ek21Ek11=x11x21x31x12x22x32x13x23x33Ea22Ea12Ea21Ea11

再将TMP反转180度,便可以得到最终的结果roate180((xl1irotate180(δlj)))了~

l层为Pooling层时,需要学习的参数为偏执和采样尺度,每一个特征图对应两个参数。令δli为Pooling层的误差项,δli=Enetli。Pooling层下一层一般是卷积层,所以有:

δli=Enetli=Exlixlinetli=xlinetlijEnetl+1jnetl+1jxli=f(xli)jconv2(δl+1j,Kl+1i,j,full)

这里的conv2指的是对δl+1j作宽卷积运算,其具体含义见:http://blog.csdn.net/zy3381/article/details/43274029, 要推导这个公式,首先来看个例子。

假设Pooling层的第i个输出特征图xli大小为3*3,卷积核为K,大小为2*2, 即:

xli=x11x21x31x12x22x32x13x23x33K=[k11k21k12k22]

Al+1i=xliK, 则netl+1j=iAl+1i+bl+1j,所以有:

Al+1i=[a11a21a12a22]a11=x11k22+x12k21+x21k12+x22k11a12=x12k22+x13k21+x22k12+x23k11a21=x21k22+x22k21+x31k12+x32k11a22=x22k22+x23k21+x32k12+x33k11

那么,由此可以看出,x11只参与到(netl+1j)11的计算,x12参与到(netl+1j)11(netl+1j)12的计算

Exli=Ex11Ex21Ex31Ex12Ex22Ex32Ex13Ex23Ex33

Ex11Ex12Ex13Ex21Ex22Ex23Ex31Ex32Ex33=Ea11a11x11=E((netjl+1)11)k22=(δl+1j)11k22=Ea11a11x12+Ea12a12x12=(δl+1j)11k21+(δl+1j)12k22=(δl+1j)12k21=(δl+1j)11k12+(δl+1j)21k22=(δl+1j)11k11+(δl+1j)12k12+(δl+1j)21k21+(δl+1j)22k22=(δl+1j)12k11+(δl+1j)22k21=(δl+1j)21k12=(δl+1j)21k11+(δl+1j)22k12=(δl+1j)22k11

上面求解的结果实际上就是(δl+1j)K宽卷积的结果,首先以(δl+1j)为中心(假设(δl+1j)大小为wh, 卷积核K大小为dd),扩展出大小为(w+2(d1))的矩阵NK,新增的部分用0填充,上面例子中的NK即为:

Exli=00000(δl+1j)11(δl+1j)2100(δl+1j)12(δl+1j)2200000

然后对K旋转180度(不是转置)进行卷积,便可以得到Exli了。
所以对权值求导为:

EβljEbli=uvE((netlj)u,v)((netlj)u,v)βlj=uv(δlj)u,vdown(Xl1j)u,v=uv(δljdown(Xl1j))u,v=uvE((netlj)u,v)((netlj)u,v)blj=u,v(δli)u,v