致敬经典
1 为什么会有CNN这个东西出现?
CNNs是第一个真正成功训练多层网络结构的学习算法。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。它的非全连接和权值共享的网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。
2 为什么可以只获取局部感受野?
卷积神经网络有两种神器可以降低参数数目,第一种神器叫做局部感知野。一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。
2 什么是权值共享?
隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数,那如果我们每个神经元的这100个参数是相同的呢(有点拗口,这100个参数是不一样的,是每一个神经元对应的100个参数一样,其实就是做个全图滤波),也就是说每个神经元用的是同一个卷积核去卷积图像。这就是传说中的权值共享。它的好处呢?一方面,重复单元能够对特征进行识别,而不考虑它在可视域中的位置。另一方面,权值共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型的规模,卷积网络对视觉问题可以具有很好的泛化能力。
3 为什么可以用权值共享?
我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:自然图像有其固有特性,也就是说,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征(没懂)。
4 如何具体实现局部连接和权值共享?
但是这样为了减少参数而这样做可以吗? 因为一种卷积核对应着提取一种特征。因此用一个滤波器对全图(这里假设为不重叠)进行滤波实际就是提取一种特征,形成一个Feature Map,如果想要多个特征,我们可以用多种滤波器进行滤波,这样就产生了多个Feature Map,这多个FeatureMap就组成了一层神经元。例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10这样隐层的神经元个数就是(1000x1000)/ (10x10)=100x100个神经元了。这只是一个FeatureMap的神经元个数,如果有100种滤波器,则总共有100x100 x 100个神经元了。因此隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。这样在损失局部权值的多样性时我们通过增加滤波器的种类来弥补,使得尽可能多的特征被提取。
5 如何理解卷积网络获得的位移、尺度、形变不变性?
卷积网络的核心思想是将:局部感受野、权值共享(或者权值复制)以及时间或空间亚采样这三种结构思想结合起来获得了某种程度的位移、尺度、形变不变性。这三种思想也可叫局部连接(local connections)、权值共享(sharedweight)、池化(pooling)。
位移不变性:图像在平移后在特征图上的表示也是同样平移的,这就使图像拥有了一定的平移不变性。
尺度不变性:同样的,pooling(以MAX Pooling为例),对局部感受野取其极大值,如果图像在尺度上发生了变化,有一定概率在尺度变化后对应的感受野取到的极大值不变,这样就可以使特征图不变,同样也增加了一定的平移不变性。对于形状不变性,实际上,在图像识别中,重要的不是显著特征的绝对位置而是相对的位置,所以为了避免把过多的位置信息编码进去,卷积和池化的操作都可以对局部的纹理进行模糊化,这样也就使图像有了一定的形状的不变性。
可以联想sift的尺度,旋转,位移不变性。他靠的的是先利用高斯滤波和下采样形成的高斯金字塔,然后利用高斯差获取极值点完成尺度不变性,最后利用局部梯度方向的不变性完成旋转不变性的。
我们可以以此类比,CNN的每一层利用不同的滤波器获得多种特征,这点类似sift里面的高斯滤波,尽可能多的获取图像的不同特征;同样CNN在卷积层之间有下采样层,这点和sift里面的下采样一样,但是sift不是为了降低数据而是尽可能为了构建一个完整的空间金字塔,CNN则是有一部分考虑的是降低数据量,但是在降低数据量时,人们希望在降低数据的时候尽量保留原先的信息,因此出现了池化(pooling),例如max-pooling,取上一层局部块里面的最大值,这点类似sift里面的高斯差求极值,因此在图像发现形变或者尺度变换的时候,局部的极大值在很大概率下会保留下来的。因此就完成了尺度和形变的不变性。如果选择mean-pooling,则我觉得是因为平均值其实更具有抗形变性和尺度性。
PS:一切的不变是基于一个局部相对不变性,我们追求的不是某个点的绝对值而是相对值。
6 CNN网络的pooling层有什么用?
最直接的作用是引入了不变性,比如最常见的conv-max pooling,因为取一片区域的最大值,所以这个最大值在该区域内无论在哪,max-pooling之后都是它,相当于对微小位移的不变性。而如果我们对输入pooling前的层做一些精心设计,让pooling region里对应的是设计后的一些性质变化,那么pooling就相当于实现了对这种设计出来的变化的不变性。比如旋转(当然就旋转而言这个方法似乎不是很好)。
1. 不变性,更关注是否存在某些特征而不是特征具体的位置。可以看作加了一个很强的先验,让学到的特征要能容忍一些的变化。
2. 减小下一层输入大小,减小计算量和参数个数。
3. 获得定长输出。(文本分类的时候输入是不定长的,可以通过池化获得定长输出)
4. 防止过拟合或有可能会带来欠拟合。
http://blog.csdn.net/zouxy09/article/details/8781543/
http://blog.csdn.net/stdcoutzyx/article/details/41596663
http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B