您的位置:首页 > 理论基础 > 计算机网络

Deep Learning的学习实践 5 -- CNN

2017-06-08 14:18 232 查看
【作者:吴斌】

CNN全称卷积神经网络(ConvolutionalNeural Network),可能是应用最广泛的神经网络模型,广泛应用于图像识别领域,大约在2000年左右在美国银行的支票手写字识别上已经商用,说明其对手写数字的识别准确率是非常高的。这个模型的详细介绍见 Yann
LeCun1998年的论文(附件Gradient-BasedLearning Applied to Document Recognition _ lecun-01a.pdf),而且这个模型经过一系列的论文发展而来,参见:http://yann.lecun.com/exdb/lenet/index.html

CNN模型的图示,来自该论文:



该模型的结构与其他神经网络模型有很大不同。

先说一下“卷积”,这是一个物理学的概念。基本的公式是:


其概念如同一个网友所说,物理学家怎么计算,2只羊+3头牛=?就是把羊和牛分散成分子,然后再相加。

关键是卷积运算的性质,有平滑性质,扩散性质。简单的理解就是,卷积计算后可以削峰平谷,去除噪声,增强指定特征(消弱其他背景的干扰),而且指定特征可以进行线性扩散。

所以,CNN模型,其精髓就是卷积计算的性质:消除噪声干扰,突出指定特征(如线条,边缘),同时要有很好地鲁棒性,对于图像中物体的拉升变形,等比例大小变化都能具有很好地识别能力。而这些性质就是手写数字识别最主要的技术要点,所以,在手写字识别领域,以及在其他很多图像识别领域,CNN模型都是优于其他模型的。

看起来,这一性质,与人类看物体的方法有些类似,人类看物体或者识别文字,也是识别基本特征(如线条,边缘),忽略背景噪声,同时对物体线性扩大缩小等变形可以很好地同样识别,而不需要重复学习。

 

为了实现以上性质,前人参考了生物学家对动物的视觉研究成果。1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive
field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。

由此,我们认识到动物视觉细胞,识别物体时,有两个特点,第一是“局部连接”,一部分视觉细胞只用于识别物体的一部分(即感受野的概念),而不是每个细胞都要识别物体的全部。第二是“抗变形C元与特征抽取S元相辅相成”,通过一层细胞实现抗变形处理,即卷积(上图的Concolutions),另一层细胞做特征抽取(上图Subsampling)。

 

之前的神经网络,层与层之间都是全连接,而CNN的特殊之处就是“局部连接”,很有仿生学的味道,图示如下:


  局部链接,参考视觉细胞感受野的概念,极大地减少了连接权值w的计算量(如上左图所示10的12次方个权值,减少到右图10的8次方个权值),而且把复杂问题采用分而治之的方法简化处理,我认为是很有魅力的一种方式。

 在CNN模型中,在局部链接的同时,还采用了pooling的方式(即权值共享),就是对于连接到同一个神经元上同一位置的连接,直接采用相同的权值w,比如上图,隐层每个神经元的感受野是10*10的像素,那么100万个隐层神经元对每个10*10的像素的连接权值共享,这样,就只有100个权值需要求解了,极大地减少了权值计算量。而且求解权值数与隐层神经元数无关,只与感受野(卷积窗口)的大小有关,(每个感受野还需要增加一个偏执参数b)。如下图所示,每种颜色的连线,权值是共享的(Shared
Weights):


对于为什么要做pooling?是存疑的,一种解释是:一方面,重复的神经元(即权值共享)能够对特征进行识别,而不考虑它在可视域中的位置。另一方面,权值共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型复杂度的规模,卷积网络对计算机视觉问题可以具有很好的泛化能力(过于复杂的模型容易过拟合)。

但是,Hinton对Pooling提出了严重的异议,称其为Bigmistake:

Thepooling operation used in convolutional neural networks is a big mistake andthe fact that it works so well is a disaster.If the pools do not overlap,pooling loses valuable information about where things are. We need thisinformation
to detect precise relationships between the parts of an object. Itstrue that if the pools overlap enough, the positions of features will beaccurately preserved by
"coarse coding" (see my paper on "distributedrepresentations" in 1986 for an explanation of this effect). But I nolonger believe that coarse coding
is the best way to represent the poses ofobjects relative to the viewer (by pose I mean position, orientation, andscale).

I think it makes much more sense to represent a pose as asmall matrix that converts a vector of positional coordinates relative to theviewer into positional coordinates relative to the shape itself. This
is whatthey do in computer graphics and it makes it easy to capture the effect of achange in viewpoint. It also explains why you cannot see a shape withoutimposing a rectangular coordinate frame on it, and if you impose a differentframe, you cannot even recognize
it as the same shape. Convolutional neuralnets have no explanation for that, or at least none that I can think of.
原文链接:http://www.reddit.com/r/MachineLearning/comments/2lmo0l/ama_geoffrey_hinton/

Theano中实现的CNN模型(LeNet)中的Pooling是重叠(overlap)方式的,因为每个感受野之间是高度重叠的,每个感受野(卷积窗口)相邻一列像素,每个感受野相当于N*N的滑动窗口每次向右移动一列像素。所以,这里的pooling其实采用的是粗糙编码("coarsecoding")的方式,把图像进行平滑处理。这种pooling方式有点像把图像等比例缩小(维度约减),抽取其主要特征,而且忽略噪声数据,并且能够容忍图形的畸变和位移(这一点对手写数字识别很重要)。但是Hinton认为,这种方法,没有分析图像中图形的各个位置之间的关系,比如图形旋转后就是无法识别的,所以他认为这种忽略图形位置关系的pooling方式是错误的。当然,这也明确说明了,CNN模型对手写数字识别之类的图像识别问题是很有效的,但是对其他问题(包括某些图像识别问题),就不一定有效了。

 

另外,一个卷积层对图像扫描识别一遍也称作一个filter(滤波器)操作,只是对一种高层特征进行提取,图像识别中往往需要对多种高层特征进行提取,就会有多个filter操作,每种filter对特征的提取也称作一个featuremap(特征模板)的操作,CNN模型中的每个卷积层有多个featuremap
,每个神经元的连接权值就是多维的,比如有4个feature map(下图每种颜色对应一个权值的feature
map),就表示每个神经元的每个连接权值W是4维的。如下图所示,m-1层是4个featuremap,m层是2个feature
map。 m-1层的权值是4维的,k指第m层的第k个feature
map,l指第m-1层的第l个featuremap,i,j表示第m-1层像素的位置i列,j行。详述如下:To
form a richerrepresentation of the data, hidden layers are composed of a set of multiplefeature maps, {h(k);
k = 0..K}.  The weights
W of this layer can beparametrized as a 4D tensor (destination feature map index, source feature mapindex, source vertical position index, source horizontal position index) andthe biases
basa vector (one element per destination feature map index)


每个Feature map是一种“Localfeature”(基本特征或高级特征的基本组成单位,如:边,角,衬线体)的分类器,多个Local
feature得到特征抽取后再进行组合形成高层的特征抽象,图示如下:

 






下面,对于最上面CNN模型(LeNet5)的图示进行详细说明,输入图片的大小是32*32像素,C1卷积层是5*5的感受野(也称作Filter
shape)从输入图片中获取像素,包含6个feature map,每个feature map的大小是28*28的特征图,
S2特征抽取与C1对应,采用2*2的下采样窗口(也称作MaxPooling Shape)从C1获取数据,包含6个feature
map,14*14是抽取后的高层特征图,后面是类似的,C3卷积层也是用5*5的感受野从S2获取特征,包含16个featuremap,10*10的特征图,对应的S4也是2*2的下采样窗口,包含16个feature
map,5*5是抽取后的高层特征呈现,再后面,C5包含120个featuremap,5*5的特征图,对应的S4也是5*5特征图,所以,C5与S4采用的是全连接,后面对应的特征抽取f6包含84个单元(基于手写数字识别的需要而设计),也是用全连接,到最后一层分类器也是全连接。这里的每一层,感受野卷积窗口是多大,高层特征图是多大,下采样窗口是多大,需要多少个隐层神经元,与输入数据的结构直接相关,还要防止BP计算时的梯度损失,计算过程挺复杂,在后面的代码示例中再说明。这个CNN结构里,后面的feature
map数比前面的多,意味着在后面的神经网络中可以对前面局部连接的特征图,进行特征组合,而形成高层抽象,这种方法会使特征呈现更加丰富。(引一段论文原文:A large degree of invariance togeometric transformations of the input can be achieved with this progressivereduction
of spatial resolution compensated by a progressive increase of therichness of the representation (the number of feature maps))。

 

CNN模型的训练过程,是没有pretraining过程的,直接使用标注数据,进行有监督的学习,隐藏层的最后一层与输出层(分类器)是全连接的,训练时,采用BP反向传播的方法进行训练,特征学习和分类模式同时进行训练。CNN的层数不会太多,典型的就是上图中的3个隐层(每个隐层含有一个C卷积层,一个S特征抽取层),称作LeNet-5模型。这与AutoEncoder和DBN中所谓特征抽象的训练方法是有区别的,但是整个过程看起来是类似的。

CNN这个模型,现在还在很多自然语言处理里面使用,我看到几个QA(问答类的短文本匹配)相关的应用中使用了CNN,参看附件的Deep
Learning for Natural LanguageProcessing: Theory and Practice(微软研究院)的这个材料。





是不是人脑神经元处理语言的机制与处理图像的机制差不多?这是个有趣的问题。我目前的看法是,这种想法有些机械化了,这种机制可能只是在某些方面有效。而且,看一下CNN模型如此多的超参数设置和复杂的结构设计,怎么才能让它有效,我想还需要大量的定制。



Theano中实现的CNN(LeNet)是个简化版,结构如下: 

Theano的CNN模型代码要点:

Theano的说明文档” DeepLearning Tutorial”的6.10.1章节对各个超参数的设置方法有一个说明。

源代码中有2个卷积层,为了测试方便,我去掉了一个卷积层(包含一个C层一个S层)。

输入特征维数修改为144维。

   layer0_input = x.reshape((batch_size, 1, 144, 1))

   

   # Construct the first convolutional pooling layer:

   # filtering reduces the image size to (28-5+1,28-5+1)=(24,24)

   # maxpooling reduces this further to (24/2,24/2) = (12,12)

   # 4D output tensor is thus of shape (batch_size,nkerns[0],12,12)

   #减少一层CNN,直接用layer0的输出,滑动窗用5*5

   layer0 = LeNetConvPoolLayer(rng, input=layer0_input,

           image_shape=(batch_size, 1, 12, 12),

           filter_shape=(nkerns[1], 1, 5, 5), poolsize=(2, 2))   

 

   # the HiddenLayer being fully-connected, it operates on 2D matrices of

   # shape (batch_size,num_pixels) (i.e matrix of rasterized images).

   # This will generate a matrix of shape (20,32*4*4) = (20,512)

   layer2_input = layer0.output.flatten(2)   #减少一层CNN,直接用layer0的输出

 

   # construct a fully-connected sigmoidal layer

   hiddenLayer_num = 500     #全连接MLP,隐层神经元数,默认500

   #减少一层CNN,直接用layer0的输出

   layer2 = HiddenLayer(rng, input=layer2_input, n_in=nkerns[1] * 4 * 4,

                        n_out=hiddenLayer_num, activation=T.tanh)

 

   # classify the values of the fully-connected sigmoidal layer

   layer3 = LogisticRegression(input=layer2.output, n_in=hiddenLayer_num, n_out=2)

 

   # the cost we minimize during training is the NLL of the model

   cost = layer3.negative_log_likelihood(y)

 

   # create a function to compute the mistakes that are made by the model

   test_model = theano.function([index], layer3.errors(y),

            givens={

               x: test_set_x[index * batch_size: (index + 1) * batch_size],

               y: test_set_y[index * batch_size: (index + 1) * batch_size]})

 

# 测试数据,输出预测结果,预测概率

   test_model_result = theano.function(inputs = [index],

            outputs = [layer3.errors(y), layer3.y_pred, layer3.p_y_given_x],  

            givens={

               x: test_set_x[index * batch_size: (index + 1) * batch_size],

               y: test_set_y[index * batch_size: (index + 1) * batch_size]})

 

  # create a list of all model parameters to be fit by gradient descent

  #减少一层:

   params = layer3.params + layer2.params + layer0.params

 

离网数据的简单测试结果,训练数据:25600      校验数据:15360     测试数据:15360   特征维数:144,
(144=12*12,滑动窗口5*5)每批次数据2560,迭代2轮。AUC:0.565。

CNN模型是一种直接模仿动物视觉处理过程的模型,下面我们可以看一下动物神经网络具体描述的图片:


  此图展示的是不同类型的神经元之间的连接关系,它们构成了简单的神经网络。


  此图展示的是小猫视觉在执行方向选择任务时,由神经元组成的功能柱结构,每种颜色代表针对不同方向响应的神经元及功能柱结构。
Yann Lecun的材料,“TheUnreasonable Effectiveness of Deep Learning”,新增了很多CNN以及其他DNN模型的说明,看起来很有价值,其中谈到一些混合模型(集成模型)的应用,貌似是CNN+RBM,还加上了LanguageModel等,太复杂了,没太看懂。看一张图吧:


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 美国 cnn