卷积神经网络是一种特殊的多层神经网络,它是deep learning中的一个算法,现在主要应用在图像处理领域中。
既然说它是deep learning中的一个算法,那么就需要有大量的数据来支持,作为一个深度的神经网络,参数动辄百万以上,如果样本数过小很容易造成overfitting。卷积神经网络可以自主的从原始的输入图像中学习到有用的(利于分类的,利于预测的) features,这样可以将它应用到很多不知道如何设计feature的场景中。
在普通的全连接神经网络下,假设我们现在有一个100*100的图像作为输入。在计算中我们将这个图像表示为一个100*100 = 10000大小的向量(数组),假如我们只有一个hidden layer,并且神经元数量与input layer数目相同,那么光从input layer到hidden layer就有10000*10000 = 10^8个参数。正如前面所说,要想训练出一个好的网络,这么多的参数很容易造成overfitting,减少参数势在必行,于是卷积神经网络应运而生。
卷积神经网络有两大杀器:
1. Local Connectivity Pattern(局部感知野)
所谓局部感知野,如果不好理解野字,你可以理解成局部感知模块或者把整个局部感知野理解成,稀疏连接网络。
2. Shared Weights(权值共享)
这两种方法都为减少神经网络参数做出了大贡献,下面我会详细介绍这两种方法。
一:局部感知网络
计算机神经网络科学的初衷就是模拟人的神经网络,期望通过构建的计算机神经网络可以让计算机像人类一样思考,那么自然,对传统神经网络的改进也少不了进一步对人类神经网络的模仿。我们对外界事物的观察都是由局部到全局,但并不是每个像素每个像素的去认知,而是一块区域一块区域的去认识,通过这些区域得到局部信息,然后对这些局部信息的汇总,然后才得到整个全局的信息。
1. 这个也就是说,图像的像素之间也是局部的相关性较强,距离较远的像素之间相关性较弱。
2. 另一个启发来自于人类的视觉接收系统,视觉神经元只是接收局部信息的,也就是说每个神经元并不对全局进行响应。
左上图全连接神经网络,为了表示清晰,我只画了隐含层一个神经元与输入层的连接关系,其他的隐含层神经元都是与其一样的连接方式。而上面中间的和右边的是局部连接网络,一个是overlapping的局部感知,一个是无overlapping的局部感知。我假设每个隐含层神经元只感知两个输入的神经元构建而成的。也可以是3个,4个等等,这个参数后面我将详细叙说,主要和图片大小有一定的关系,和你想获得的feature的大小也有关系。现在为了更方便的画图与描述做了这个假设。
好,我们现在回到开始的那个假设,有一个100*100大小的图像作为输入,假如每个隐含层神经元只与其中10*10 = 100个像素相连在无overlapping的局部感知情况下,现在只需要(10000/(10*10) ) * (10*10) = 100*100 = 10^4个参数。
二:权值共享
虽然我们已经大幅的减小的参数的数目,但对于一个庞大的神经网络里,这样数量级的参数还是太大了,我们需要进一步减少参数。
在刚刚构建的局部感知神经网络结构中,假设隐含层的所有神经元对应的100个像素这样的所有连接的权值都相同,那么就相当于只需要10*10 = 100个参数,简而言之就是隐含层不同的神经元拥有相同的权重。如果你还没有理解,那么下面两幅图应该就能很好的说明何为共享权值了。(不同颜色代表不同的权重,相同的颜色代表权重相同)
到这儿你应该已经知道什么是权值共享了,那么你可能要问了,我们这么做的理由是什么?
前面我们有说过深度学习可以自主的从原始图片中获得有用的feature。卷积神经网络中权值共享这个操作,可以看做是一种与位置无关的特征提取方法。也就是可以对原始的输入图像应用一个相同的特征。“这其中隐含的原理是:图像一部分的统计特性与其他部分是一样的。” 这个权值共享的操作其实就是将一个卷积核(滤波器)在图像上做卷积的过程,这个卷积核就是去筛选特征的。(绿色是原始图像,黄色是卷积核,红色是得到的是特征我们称之为卷积特征)
一:多卷积核
一:多层卷积
整个过程通过原始输入找到浅层特征,在对浅层特征进一步挖掘找到中层特征,最后一步步获得高层特征。但想要从原始输入直接找到高层特征无疑是行不通的。简而言之,单层的卷积学习到的往往是浅层的特征,增加卷积的层数才有可能学习到更高层的特征。对于图像的识别,往往是需要的是高层特征。引用一段别人的话来形象的解释:
“如果有一幅图片,一个像素有一个人那么大,当你距离图片50cm去看图片,你只能看到几个像素,所以你是看不出来这个图片是个什么鬼的。站到很远很远地方再看它,反而能看得清全貌了。神经网络的层数多起来,就像你站得更远去看这个图片一样,是观察粒度上的改变。而更宏观的粒度层面是需要底下更微观的粒度层面一层一层传递和堆砌出来的。”
现在我们已经构建了一个多层卷积神经网络了。理论上它已经可以work了,但还有一些细节我们需要补充,下篇将介绍 **函数 和 Dropout Layer。
一:ReLu**函数
2001年,Attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性。
2003年,Lennie等人估测大脑同时被**的神经元只有1~4%,进一步表明神经元工作的稀疏性。
从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。
从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被**,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。
Softplus照顾到了新模型的前两点,却没有稀疏**性。因而,校正函数
”二:Dropout Layer
概念总结:
2. Fully Connection神经网络最大的缺陷在于很难提取到有用的特征而Deep Neural Networks能够自主地从数据上学到有用的feature。特别适合在一些不知道如何设计feature的场合。
3. Deep Learning强大的地方就是可以利用网络中间某一层的输出当做是数据的另一种表达,从而可以将其认为是经过网络学习到的特征。基于该特征,可以进行进一步的操作。
4. 卷积神经网络的局部感知野网络结构降低了网络的复杂度,减少了权值的数量。
5. 卷积神经网络的权值共享结构,由于同一特征映射面上的神经元权值相同,所以网络可以并行学习。
6. 卷积神经网络是为识别图像而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者其他形式的变形具有高度不变性。
7. ReLu的使用,使得网络可以自行引入稀疏性。这一做法,等效于无监督学习的预训练。
8. 所有的权重都应该用一些不同的小随机数进行初始化。
9. 多层神经网络初始化隐含层不能简单置零。这样会很容易找到局部最小值。
10. 每个DL都有众多的参数,少量数据无法将参数训练充分。
奇技淫巧:
1. 池化矩阵一般为2*2,对于非常大的图像可以使用4*4。如果取值过大,可能会损失掉太多的信息。
2. 如果网络的最后一层是softmax分类器的话似乎其前一层就不能用ReLU。
3. 无需在cost function里加入正则项,因为CNN的权重共享相同于自带某种正则化。(此点道理上说的通,还需详细考究)
4. Deep Learning中大部分**函数应该选择ReLu。
5. 使用带momentum的Nesterov's Accelerated Gradient Descent方法可以更快的收敛。
6. Dropout一定要用!
7. 图片的augmentation一定要做, 这是你与别人拉开差距的方式之一。
8. 有些时候可以对图片进行适当的手动裁剪。
9. 参数的继承可以让你有更多的时间去调整模型。(参数继承也可理解是监督式的pre-training)
初窥卷积神经网络,只会使用Theano, Lasagne, Nolearn, Caffe, 这些库构建卷积神经网络。有机会自己写遍整个流程会对卷积神经网络有更清晰的认知吧
总结
CNN中主要有三种层,分别是:卷积层、池化层和**层。
卷积层使用卷积核和图片窗口相乘,并使用梯度下降法去优化卷积核。
池化层使用最大值或者均值来描述一个图形窗口。
**层使用一个**函数将输入压缩到一个范围中,典型的[0,1][-1,1]。