1. 什么是CNN
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。
我们先来看卷积神经网络各个层级结构图:
上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车,那是什么车。
- 最左边是数据输入层(input layer),对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。
- CONV:卷积计算层(conv layer),线性乘积求和。
- RELU:激励层(activation layer),下文有提到:ReLU是激活函数的一种。
- POOL:池化层(pooling layer),简言之,即取区域平均或最大。
- FC:全连接层(FC layer)。
这几个部分中,卷积计算层是CNN的核心。
1.1 输入层
在做输入的时候,需要把图片处理成同样大小的图片才能够进行处理。
常见的处理数据的方式有:
-
去均值(常用)
- AlexNet:训练集中100万张图片,对每个像素点求均值,得到均值图像,当训练时用原图减去均值图像。
- VGG:对所有输入在三个颜色通道R/G/B上取均值,只会得到3个值,当训练时减去对应的颜色通道均值。(此种方法效率高)
TIPS:在训练集和测试集上减去训练集的均值。
-
归一化
幅度归一化到同样的范围。
-
PCA/白化(很少用)
- 用PCA降维
- 白化是对数据每个特征轴上的幅度归一化。
1.2 卷积计算层(conv)
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
滤波器filter是什么呢!请看下图。图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。
不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于提取图像的不同特征,模型就能够学习到多种特征。用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。如下图所示。
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:
- 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
- 步长stride:决定滑动多少步可以到边缘。
- 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。
-
参数共享机制
假设每个神经元连接数据窗的权重是固定对的。固定每个神经元连接权重,可以看做模板,每个神经元只关注一个特性(模板),这使得需要估算的权重个数减少:一层中从1亿到3.5万。 - 一组固定的权重和不同窗口内数据做内积:卷积
- 作用在于捕捉某一种模式,具体表现为很大的值。
卷积操作的本质特性包括稀疏交互和参数共享。
1.3 激励层
把卷积层输出结果做非线性映射。
激活函数有:
- sigmoid:在两端斜率接近于0,梯度消失。
- ReLu:修正线性单元,有可能出现斜率为0,但概率很小,因为mini-batch是一批样本损失求导之和。
TIPS:
- CNN慎用sigmoid!慎用sigmoid!慎用sigmoid!=>因为会映射到0-1,和图像的特征不太符合
- 首先试RELU,因为快,但要小心点。
- 如果RELU失效,请用 Leaky ReLU或者Maxout。
- 某些情况下tanh倒是有不错的结果,但是很少。
1.4 池化层
也叫下采样层,就算通过了卷积层,纬度还是很高 ,需要进行池化层操作。
- 夹在连续的卷积层中间。
- 压缩数据和参数的量,降低维度。
- 减小过拟合。
- 具有特征不变性。
方式有:Max pooling、average pooling
Max pooling
取出每个部分的最大值作为输出,例如上图左上角的4个黄色方块取最大值为3作为输出,以此类推。
average pooling
每个部分进行计算得到平均值作为输出,例如上图左上角的4个黄色方块取得平均值2作为输出,以此类推。
1.5 全连接层
全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全连接的特性,一般全连接层的参数也是最多的。
- 两层之间所有神经元都有权重连接
- 通常全连接层在卷积神经网络尾部
1.6 层次结构小结
CNN层次结构 | 作用 |
---|---|
输入层 | 卷积网络的原始输入,可以是原始或预处理后的像素矩阵 |
卷积层 | 参数共享、局部连接,利用平移不变性从全局特征图提取局部特征 |
激活层 | 将卷积层的输出结果进行非线性映射 |
池化层 | 进一步筛选特征,可以有效减少后续网络层次所需的参数量 |
全连接层 | 用于把该层之前提取到的特征综合起来。 |
1.7 CNN优缺点
优点:
- 共享卷积核,优化计算量。
- 无需手动选取特征,训练好权重,即得特征。
- 深层次的网络抽取图像信息丰富,表达效果好。
- 保持了层级网络结构。
- 不同层次有不同形式与功能。
缺点:
- 需要调参,需要大样本量,GPU等硬件依赖。
- 物理含义不明确。
与NLP/Speech共性:
都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。
1.8 卷积和互相关
实际上,卷积运算与互相关运算类似。为了得到卷积运算的输出,我们只需将核数组左右翻转并上下翻转,再与输入数组做互相关运算。可见,卷积运算和互相关运算虽然类似,但如果它们使用相同的核数组,对于同一个输入,输出往往并不相同。
那么,你也许会好奇卷积层为何能使用互相关运算替代卷积运算。其实,在深度学习中核数组都是学出来的:卷积层无论使用互相关运算或卷积运算都不影响模型预测时的输出。为了解释这一点,假设卷积层使用互相关运算学出图5.1中的核数组。设其他条件不变,使用卷积运算学出的核数组即图5.1中的核数组按上下、左右翻转。也就是说,图5.1中的输入与学出的已翻转的核数组再做卷积运算时,依然得到图5.1中的输出。为了与大多数深度学习文献一致,如无特别说明,本书中提到的卷积运算均指互相关运算。
1.9 卷积神经网络的特点:
稀疏交互(sparse interactions): 也叫稀疏权重(sparse weights)、稀疏连接(sparse connectivity)
在传统神经网络中,网络层之间输入与输出的连接关系可以由一个权值参数矩阵来表示。对于全连接网络,任意一对输入与输出神经元之间都产生交互,形成稠密的连接结构。这里面的交互是指每个单独的参数值,该参数值表示了前后层某两个神经元节点之间的交互。
在卷积神经网络中,卷积核尺度远小于输入的维度,这样每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重(即产生交互),我们称这种特性为稀疏交互。
稀疏交互的物理意义:通常图像、文本、语音等现实世界中的数据都具有局部的特征结构, 我们可以先学习局部的特征, 再将局部的特征组合起来形成更复杂和抽象的特征。参数共享(parameter sharing)
参数共享是指在同一个模型的不同模块中使用相同的参数。卷积运算中的参数共享让网络只需要学一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。
参数共享的物理意义:使得卷积层具有平移等变性。在第三个特点中会谈到。
显然,我们可以看到,卷积神经网络在存储大小和统计效率方面极大地优于传统的使用矩阵乘法的神经网络。等变表示(equivariant representations)
假如图像中有一只猫,那么无论它出现在图像中的任何位置,我们都应该将它识别为猫,也就是说神经网络的输出对于平移变换来说应当是等变的。特别地,当函数f(x)与g(x)满足f(g(x))=g(f(x))时,我们称f(x)关于变换g具有等变性。在猫的图片上先进行卷积,再向右平移l像素的输出,与先将图片向右平移l像素再进行卷积操作的输出结果是相等的。