在开始本篇内容之前,我想说一下什么是卷积神经网络?
以卷积结构为主,搭建起来的深度网络,为卷积神经网络。该网络可以自动提取特征,通过提取特征进行网络学习。
卷积运算
对图像和滤波矩阵做内积(逐个元素相乘再求和)的操作为卷积运算。
卷积中的重要参数
- 卷积核(kernel)
- 步长(stride)
- 填充(Pad)
- 输出通道
在深度学习中,我们最常用的卷积核是2D卷积核(k_w,k_h),k_w,k_h分别表示卷积的长和宽。卷积核中的每个数在神经网络中称作模型参数,通过BP算法进行自动学习。在神经网络中卷积层还包括参数偏置bias,每个卷积操作完毕之后都要加上一个偏置。卷积操作为线性操作即y = WX+b,W:卷积核中数,X:卷积核所覆盖的区域数据,b为偏置。至于为何加上偏置呢?如果没有偏置,那么我们模型所学到的曲线/曲面是过原点的,而现实任务中,并非如此,加入偏置,可以给网络分类增加平移的能力。
在深度卷积网络中,我们常用到的卷积核大小由1x1,3x3,5x5,7x7。5x5,7x7 卷积核通常对原始图像进行卷积,而1x1,3x3 通常用于中间层feature map 。
为何卷积核size为奇数的?
因为奇数的卷积核有一个中心点,该中心点确保卷积之后得到的feature map 位置与原始图像位置信息一一对应,此时语义信息是对应的,也就是所谓的保护位置信息,同时使用padding时候,奇数卷积核保证了对称性。
权值共享和局部连接
局部连接:每个卷积操作只负责图像数据中一部分,也就是当前层中每个节点不是与前一层单元中的每个节点都进行连接。
权重共享:在对一幅图像进行卷积操作时候,使用卷积核的参数是一样的。一定程度上减少了参数量,防止过拟合。
为了能够获取到多种不同的特征,通常会使用多个不同参数的卷积核。
卷积核与感受野
大的卷积核相比小的卷积核参数量更大,容易使模型陷入过拟合。如果使用堆叠小的卷积核的方式替代大的卷积核,参数量,计算量相比可以大大减少。如何替代呢?原始图像经过大的卷积核得到的feature map 大小和通过堆叠的多个小的卷积核得到的feature map 大小是一样的,也就是感受野不变。同时由于使用多个小的卷积核替代大的卷积核,网络深度加深,在多个卷积层之间插入一些非线性层,使网络非线性能力变的强。具体参数量和计算量计算公式如下图:k_w,k_h,In_channel,Out_channel分别指的是卷积核的宽,高,输入通道数,输出通道数。In_w,In_h为输入特征图宽,高。
步长和Pad
步长(stride):卷积核在图像中左右,上下移动的步长。当卷积层stride > 1 可以减少卷积计算量,对参数量没有影响,如上图计算公式。
加入stride,输出feature map计算公式,如下图:
Pad:为了确保Feature map整数倍变化,对输入进行填充,这对尺度相关的任务非常重要。
为了保证输入和输出大小保持不变,在stride=1情况下,pad对于不容kernel size的填充方式如下图所示:
在caffe和tensorflow中卷积的定义:
在caffe中如下图(来自慕课官网):
在tensorflow中如下图(来自慕课官网):
池化层
池化操作相当于对输入feature map进行压缩,是特征图变小,简化网络计算的复杂度,进行特征压缩,提取特征,增大感受野。同时注意:池化层没有模型参数,进行BP没有参数更新。
常用的池化层有,如下图(来自慕课官网):
激活函数
主要为了增加卷积神经网络的非线性表达能力。激活函数要具备以下四点特征:非线性,单调性,可微积性,取值范围。
常见的激活函数有:Sigmoid,tanh,RELU,ELU,Maxoutm,Softplus,Softsign
(1)Sigmoid函数:是对阶跃函数的逼近,其输出值在0~1之间,可以表示概率。阶跃函数在x=0地方不可导。该函数导数在x->无穷大或无穷小的时候,导数接近0,梯度值很小,在网络中间层中加入多个sigmoid层,参数更新时,多个接近0的值进行连乘法,会出现梯度消失。同时在Sigmoid函数中存在指数运算,非常耗时。在卷积网络中通常作为输出层中。在循环神经网络中使用多。函数表达式和曲线如下图:
sigmoid的输出在0和1之间,我们在二分类任务中,采用sigmoid的输出的是事件概率,也就是当输出满足满足某一概率条件我们将其划分正类。
阶跃函数如下图:
(2)Tanh函数:
其类似于sigmoid函数,不过其过原点。几乎不拥有卷积网络中。目前在循环神经网络中使用最多。如下图:
(3)RELU函数:
修正线性单元函数,保留了step函数的生物启发(只有输入超出阈值时候才被激活),不会出现梯度饱和现象。不过一旦输入为负值,RELU就会死掉。如下图为RELU函数图像:
BN层
通过一定的规范化手段,把每层神经网络任意神经元的输入值的分布变为均值为0,方差为1的均匀分布。
BN层是相对与batch 而言的。为何引入BN层:对于原始的输入数据,若不没有BN层,数据分布是不可控的,每个层的数据分布都是有差异的,进行BP算法,每层参数分布都在变化,对网络的收敛有一定的影响。
BN层的优点:
- 减少参数的人为选择,可以取消Dropout和L2正则项参数,或者采取更小的L2正则项约束参数。
- 减少对学习率的要求
- 可以不在使用局部响应归一化
- 破坏原来的数据分布,一定程度上缓解过拟合
在caffe和tensorflow中BN层的使用,如下图(来自慕课官网):
全连接层
当前层的每个神经单元和前一层的每一个神经元相互连接。将网络的输出变成一个向量。由于全连接的参数过多,容易造成过拟合,所以一般配合dropout层使用。
Dropout
如下图(来自慕课官网)
损失层
该层定义了使用的损失函数,通过最小化损失函数来完成网络的训练。网络的损失通过前向运算来计算,网络的参数相对于损失函数的梯度则通过反向传播来计算。
损失函数:用来评估模型的预测值和真实值之间的不一致程度。
经验风险:描述的是模型的预测值和真实值之间的偏差,通过不断最小化这个偏差来求得符合模型的解。但是通常模型参数有多组解。参数解越多表示模型相对越复杂,容易造成过拟合。而为了防止过拟合,找到合使的解,加入了正则项,如L0,L1,L2,也就是说加入了正则项的经验损失就是结构风险。
常见的损失函数:
- 分类任务损失:交叉熵损失
- 回归任务损失:L1损失,L2损失,Smooth L1损失
L1 loss: 在零点的左右两端梯度下降非常的快,且梯度值都是相同的。但是在零点处不可导。
L2 loss :在零点处可导,是一个平滑的曲线,对比L1 loss ,L2 loss在趋近于0的位置上导数变的越来越小,而L1是不变的。在L2 接近最优解的时候,导数变的越来越小,这样在一定程度上容易找到最优解。而L1 在最优解两端梯度保持不变,网络变得不稳定,由于梯度过大,可能错过最优解。不过在没有找到最优解的过程中,L1比L2下降的快。
Smooth L1:L1与l2优点的结合,在-1<x<1,过程中在接近最优解的过程中梯度越来越小,可以找到最优解,而在x<=-1 或x>=1使用L1可以加快网络学习。