深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(一)
前面, 我们介绍了DNN及其参数求解的方法(BP算法),我们知道了DNN仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸的问题.那么,人们又是怎么解决这个问题的呢?本节的卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法.
我们知道神经网络主要有三个部分组成, 分别为:
① 网络结构--- 描述神经元的层次与连接神经元的结构.
② **函数(激励函数)--- 用于加入非线性的因素, 解决线性模型所不能解决的问题.
③ 参数学习方法的选择(一般为权重值W和偏置项b)---如BP算法等.
我们将主要从这几个方面进行讲述.
一 CNN的应用领域
CNN在以下几个领域均有不同程度的应用:
① 图像处理领域(最主要运用领域)--- 图像识别和物体识别,图像标注,图像主题生成,图像内容生成,物体标注等。
② 视频处理领域--- 视频分类,视频标准,视频预测等
③ 自然语言处理(NLP)领域--- 对话生成,文本生成,机器翻译等
④ 其它方面--- 机器人控制,游戏,参数控制等
二 CNN的网络结构
2.1 从传统神经网络到CNN
图2.1 传统的神经网络的结构
图2.2 CNN的网络结构
如图2.1为传统的神经网络的结构, 它是一种全连接的结构, 这也就造成了参数训练的难度加深. 还有BP求解中的可能出现的梯度爆炸和梯度消失的现象等.此外,深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源. 这些因素都造成了传统的神经网络的不适用性,所以没有较为广泛的运用.
如图2.2为CNN的网络结构--- 为了解决传统的神经网络的复杂性.
CNN的网络结构和传统神经网络结构异同点有:
1) CNN主要有数据输入层, 卷积层, RELU激励层, 池化层, 全连接层, Batch Normalization Layer(不一定存在). 传统神经网络主要有数据输入层, 一个或多个隐层以及数据输出层. 比较可以发现CNN仍然使用传统神经网络的层级结构.
2) CNN的每一层都具有不同的功能, 而传统神经网络每一层都是对上一层特征进行线性回归, 再进行非线性变换的操作.
3) CNN使用RELU作为**函数(激励函数) , 传统神经网络使用sigmoid函数作为**函数.
4) CNN的池化层实现数据降维的作用,提取数据的高频信息.传统神经网络没有这个作用.
2.2 CNN的主要层次介绍
2.2.1 数据输入层 (Input Layer)
由于给定的数据总会存在着数据(图片)的大小不一,单位不一以及**函数的值域等因素的影响,我们对将要进行处理的数据有一定的要求.所以,同机器学习一样,我们在进行数据输入时首先要进行数据的预处理的工作.
常见的数据预处理的方式有以下几种:
1) 均值化处理 --- 即对于给定数据的每个特征减去该特征的均值(将数据集的数据中心化到0)
2) 归一化操作 --- 在均值化的基础上再除以该特征的方差(将数据集各个维度的幅度归一化到同样的范围内)
3) PCA降维 --- 将高维数据集投影到低维的坐标轴上, 并要求投影后的数据集具有最大的方差.(去除了特征之间的相关性,用于获取低频信息)
4) 白化 --- 在PCA的基础上, 对转换后的数据每个特征轴上的幅度进行归一化.用于获取高频信息.
备注:虽然我们介绍了PCA去相关和白化的操作,但是实际上在卷积神经网络中,一般并不会适用PCA和白化的操作,一般去均值和归一化使用的会比较多.
图2.3 均值化,归一化处理的效果图
图2.4 PCA降维和白化的效果图
2.2.2 卷积计算层(CONV Layer)
这一层就是卷积神经网络最重要的一层,也是“卷积神经网络”的名字由来。
1) 局部感知
对于给定的一张图片, 人眼总是习惯性的先关注那些重要的点(局部), 再到全局. 局部感知是将整个图片分为多个可以有局部重叠的小窗口, 通过滑窗的方法进行图像的局部特征的识别. 也可以说每个神经元只与上一层的部分神经元相连, 只感知局部, 而不是整幅图像.
那么,为什么可以使用局部感知呢?
我们发现, 越是接近的像素点之间的关联性越强, 反之则越弱. 所以我们选择先进行局部感知, 然后在更高层(FC层)将这些局部信息综合起来得到全局信息的方式.
2) 参数共享机制
所谓的参数共享就是就是同一个神经元使用一个固定的卷积核去卷积整个图像,也可以认为一个神经元只关注一个特征. 而不同的神经元关注多个不同的特征.(每一个神经元都可以看作一个filter)
3) 滑动窗口的重叠
滑动窗口重叠就是在进行滑窗的过程中对于相邻的窗口有局部重叠的部分,这主要是为了保证图像处理后的各个窗口之间的边缘的平滑度.
4)) 卷积计算
卷积的计算就是: 对于每一个神经元的固定的卷积核矩阵与窗口矩阵的乘积(对应位置相乘)再求和之后再加上偏置项b的值, 就得到了代表该神经元所关注的特征在当前图像窗口的值.
如图2.4所示, 可以看出卷积计算的过程.动态图点击这里查看.
图2.4 卷积计算图
2.2.3 RELU激励层
这一层就是**层, 在CNN中一般使用RELU函数作为**函数.它的作用主要是将卷积层的输出结果做非线性映射.
1) 常见的几种**函数
① sigmoid函数(S函数)
② Tanh函数(2S函数)
③ RELU函数 ----> 线性修正单元 ---> max{ 0, x } ==>无边界, 易出现'死神经元'
④ Leaky ReLU 函数 ---> 若x> 0 , 则输出x ; 若x<0,则 alpha*x, 其中 0< alpha <1 ==> 对RELU的改进
⑤ ELU 函数 ---> 若x> 0 , 则输出x ; 若x<0,则 alpha*(e^x - 1), 其中 0< alpha <1 ==> 也是一种对RELU的改进
⑥ Maxout函数 ---> 相当于增加了一个**层
2) **函数的一些建议
① 一般不要使用sigmoid函数作为CNN的**函数.如果用可以在FC层使用.
② 优先选择RELU作为**函数
③ 如果2失效,请用Leaky ReLU或者Maxout
④ 在极少的情况下, tanh也是有不错的效果的
2.2.4 池化层 (Poling Layer)
池化层主要用于压缩数据和参数量, 减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
池化层中的数据压缩的策略主要有:
① Max Pooling(最大池化)---> 选择每个小窗口中最大值作为需要的特征像素点(省略掉不重要的特征像素点)
② Average Pooling(平均池化) ---> 选择每个小窗口中平均值作为需要的特征像素点
池化层选择较为重要的特征点, 可以降低维度, 能够在一定程度上防止过拟合的发生.
2.2.5 FC全连接层
通过全连接结构,将前面输出的特征重新组合成一张完整的图像.
2.2.6 Batch Normalization Layer(一般用于卷积层后面,主要是使得期望结果服从高斯分布,使用较少!!)
三 CNN的优缺点
最后, 简单总结下CNN的优缺点.
优点:
① 使用局部感知和参数共享机制, 对于较大的数据集处理能力较高.
② 能够提取图像的深层次的信息,模型表达效果好.
③ 不需要手动进行特征选择, 只要训练好卷积核W和偏置项b, 即可得到特征值.
缺点:
① 需要进行调参, 模型训练时间较长, 需要的样本较多, 一般建议使用GPU进行模型训练.
② 物理含义不明, 每层中的结果无法解释, 这也是神经网络的共有的缺点.
参考文献
[2] 卷积神经网络CNN总结