卷积神经网络

  • Post author:
  • Post category:其他



参考博文


仅作为学习记录,便于查询。


从前面的学习中我们得知神经网络的结构如图所示:

那么,卷积神经网络是什么样的呢?其与前向NN、RNN或是对称网络有什么不同呢?

实际上,前向NN(Feed-Forward Neural Networks)可以想象成无回路的有向图,如CNN、全连接网络(即每相邻两层之间均有权重连接的前向网络)等。当隐藏层的层数大于等于2时就可以称之为深度网络。前向NN中每一层的作用通常是通过某种计算四年实现从输入到输出的某种变换,以提高后续任务的完成效率。以下为一个前向NN的网络模型:



循环神经网络(Recurrent Neural Networks,RNN)可以视作有回路的有向图,如Naive RNN、LSTM、GRU等。其生理原型为大脑神经元网络。由于回路的存在一定会存在解析困难、南与训练的情况,但同样因为这个特性使得RNN天生适合对序列信号进行建模。一个简单的RNN模型如下图所示。其中隐藏层存在一个指向自己的有向边,时序展开后如图所示。每竖向即为简单的前向NN的神经网络,横向展开每个时间节点权重矩阵共享,所以RNN能够处理任意时长的输入。


对称网络(Symmetrically Connected Networks)的神经网络模型是存在回路的无向图(实际上是有向的,在图论中为对称图,在此两条对称的有向边可以简化为一条无向边)。对称的权重抑制了网络模型变化的可能性,从而限制了网络的能力,同时也使得网络更容易解析。在对称网络的分类中,无隐藏节点的网络成为Hopfield Nets,有隐藏节点的网络成为玻尔兹曼机(Boltzman Machine)。其中,玻尔兹曼机要强于Hop field Nets,而弱于RNN。

卷积神经网络(Convolutional Neural Networks,CNN)依旧是层级网络,但是在层的功能和形式做了变化,可以说是传统神经网络的一个改进。如下图所示,就出现了许多新的层次。


卷积神经网络的层次结构

1、数据输入层/ Input layer

该层要做的处理主要是对原始图像数据进行预处理,其中包括:

• 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。

• 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。

去均值与归一化效果图:

• PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

去相关与白化效果图:

2、卷积计算层/ CONV layer

这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。

在这个卷积层,有两个关键操作:

• 局部关联。每个神经元看做一个滤波器(filter)

• 窗口(receptive field)滑动, filter对局部数据计算

先介绍卷积层遇到的几个名词:

• 深度/depth(解释见下图)

• 步长/stride (窗口一次滑动的长度)

• 填充值/zero-padding

填充值是什么呢?以下图为例子,比如有这么一个5*5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?

那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。


卷积的计算

(注意,下面蓝色矩阵周围有一圈灰色的框,那些就是上面所说到的填充值)



这里的蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2,

即每次向后移动两个格子

蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个

内积运算

(内积 = a1 x b1+a2 x b2+a3 x b3+a4 x b4+···)

的结果与偏置值b相加

(比如上面图的计算:2+(-2+1-2)+(1-2-2) + 1= 2 – 3 – 3 + 1 = -3),计算后的值就是绿框矩阵的一个元素。

下面的动态图形象地展示了卷积层的计算过程:




参数共享机制


• 在卷积层中每个神经元连接数据窗的权重是固定的,

每个神经元只关注一个特性

。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。

• 需要估算的权重个数减少: AlexNet 1亿 => 3.5w

• 一组固定的权重和不同窗口内数据做内积: 卷积

3、ReLU激励层 / ReLU layer

把卷积层输出结果做

非线性映射





CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是

收敛快,求梯度简单,但较脆弱

,图像如下。


※ 激励层的实践经验:

①不要用sigmoid!不要用sigmoid!不要用sigmoid!

② 首先试RELU,因为快,但要小心点

③ 如果2失效,请用Leaky ReLU或者Maxout

④ 某些情况下tanh倒是有不错的结果,但是很少

4、池化层 / Pooling layer

池化层夹在连续的卷积层中间,

用于压缩数据和参数的量,减小过拟合



简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

这里再展开叙述池化层的具体作用。


·

特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的压缩。平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。


·

特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。


·

在一定程度上防止过拟合,更方便优化。



池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

这里就说一下Max pooling,其实思想非常简单。



对于每个2*2的窗口选出

最大的数

作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。

5、全连接层 / FC layer

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:



一般CNN结构依次为

① INPUT

② [[CONV -> RELU]*N -> POOL?]*M

③ [FC -> RELU]*K

④ FC


卷积神经网络之训练算法

Ⅰ 同一般机器学习算法,先定义代价函数,衡量和实际结果之间差距。

Ⅱ 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。

BTW,关于SGD(

参考

):

随机就是说每次随机采用样本中的一个例子来近似所有的样本,用一个随机采用的例子计算梯度并用这个梯度来更新参数,即SGD每次迭代仅对一个随机样本计算梯度,直至收敛。


·

由于SGD每次迭代只使用一个训练样本,因此这种方法也可用作online learning。


·

每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。


卷积神经网络之优缺点

优点

• 共享卷积核,对高维数据处理无压力

• 无需手动选取特征,训练好权重,即得特征分类效果好

缺点

• 需要调参,需要大样本量,训练最好要GPU

• 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)


卷积神经网络之典型CNN

• LeNet,这是最早用于数字识别的CNN

• AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比

• LeNet更深,用多层小卷积层叠加替换单大卷积层。

• ZF Net, 2013 ILSVRC比赛冠军

• GoogLeNet, 2014 ILSVRC比赛冠军

• VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好


卷积神经网络之 fine-tuning

fine-tuning就是使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。

那为什么我们不用随机选取选几个数作为权重初始值?原因很简单,第一,自己从头训练卷积神经网络容易出现问题;第二,fine-tuning能很快收敛到一个较理想的状态,省时又省心。

那fine-tuning的具体做法是?

• 复用相同层的权重,新定义层取随机权重初始值

• 调大新定义层的的学习率,调小复用层学习率


卷积神经网络的常用框架

Caffe

• 源于Berkeley的主流CV工具包,支持C++,python,matlab

• Model Zoo中有大量预训练好的模型供使用

Torch

• Facebook用的卷积神经网络工具包

• 通过时域卷积的本地接口,使用非常直观

• 定义新网络层简单

TensorFlow

• Google的深度学习框架

• TensorBoard可视化很方便

• 数据和模型并行化好,速度快


总结

卷积网络在本质上是一种

输入到输出的映射

,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

CNN一个非常重要的特点就是头重脚轻(

越往输入权值越小,越往输出权值越多

),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

卷积神经网络CNN

主要用来识别位移、缩放及其他形式扭曲不变性的二维图形

。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以

并行学习

,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,

权值共享降低了网络的复杂性

,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。


原文Q&A


一、为什么不用BP神经网络去做呢?


1.全连接,权值太多,需要很多样本去训练,计算困难

• 应对之道:减少权值的尝试,局部连接,权值共享

卷积神经网络有两种神器可以降低参数数目。

第一种神器叫做

局部感知野

,一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。

第二级神器,即

权值共享


2.边缘过渡不平滑

• 应对之道:采样窗口彼此重叠


二、LeNet里的隐层的神经元个数怎么确定呢?


它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!

LeNet-5共有7层,不包含输入,每层都包含可训练参数(连接权重)。输入图像为32*32大小。

例如,我的图像是1000×1000像素,而滤波器大小是10×10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000×1000 )/ (10×10)=100×100个神经元了。

那重叠了怎么算?比如上面图的C2中28*28是如何得来的?这里的步长就是1,窗口大小是5*5,所以窗口滑动肯定发生了重叠。下图解释了28的由来。


三、S2层是一个下采样层是干嘛用的?为什么是下采样?


也就是上面所说的池化层,只是叫法不同而已。这层利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息,相当于图像压缩。