卷积神经网络的层级结构
• 数据输入层/ Input layer
• 卷积计算层/ CONV layer
• ReLU激励层 / ReLU layer
• 池化层 / Pooling layer
• 全连接层 / FC layer
典型的卷积神经网络结构
如LeNet、AlexNet、VGG、GoogLeNet、Network in Network、Resnet、SENet、SKNet等,以及轻量级的结构,如ShuffleNet系列、MobileNet系列等。(以后再说)
卷积神经网络介绍
卷积神经网络实际上是层次模型(hierarchical model),原始输出通常经过卷积操作、池化操作和非线性激活函数映射等的层层组合。原始数据一层层经过网络,逐渐抽取出低层特征,直至高级语义特征,这一过程为前馈运算;网络根据前馈运算的结果与真实结果之间的误差,通过反向传播算法由最后一层逐渐向前反馈,更新模型的参数;在更新参数的模型上进行再次前馈运算,重复上述步骤,直至整个网络模型收敛。一般地,前馈运算指对样本进行推理或者预测,反馈运算指预测误差反向传播更新参数。
层级结构介绍
1.数据输入层(对原始图像数据进行预处理)
该层要做的处理主要是对原始图像数据进行预处理,其中包括:
• 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
• 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
• PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化
去均值与归一化效果图:
去相关与白化效果图:
2.卷积层
卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。卷积操作被广泛应用与图像处理领域,不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。
先介绍卷积层遇到的几个名词:
H:图片高度;
W:图片宽度;
D:depth/原始图片通道数,也是卷积核个数;
F:卷积核高宽大小;
P:图像边扩充大小;
S:滑动步长/stride(窗口一次滑动的长度)
K: 深度,输出单元的深度
填充值是什么呢?以下图为例子,比如有这么一个5*5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?
那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。
卷积计算
上图给出一个卷积计算过程的示例图,输入图像大小为H=5,W=5,D=3,即5×5大小的3通道(RGB,也称作深度)彩色图像。这个示例图中包含两(用K表示)组卷积核,即图中滤波器W0和W1。在卷积计算中,通常对不同的输入通道采用不同的卷积核,如图示例中每组卷积核包含(D=3)个3×3(用F×F表示)大小的卷积核。另外,这个示例中卷积核在图像的水平方向(W方向)和垂直方向(H方向)的滑动步长为2(用S表示);对输入图像周围各填充1(用P表示)个0,即图中输入层原始数据为蓝色部分,灰色部分是进行了大小为1的扩展,用0来进行扩展。经过卷积操作得到输出为3×3×2(用Ho×Wo×K表示)大小的特征图,即3×3大小的2通道特征图,其中Ho计算公式为:Ho=(H−F+2×P)/S+1,Wo同理。 而输出特征图中的每个像素,是每组滤波器与输入图像每个特征图的内积再求和,再加上偏置bo,偏置通常对于每个输出特征图是共享的。输出特征图o[:,:,0]中的最后一个−2计算如上图右下角公式所示。
在卷积操作中卷积核是可学习的参数,经过上面示例介绍,每层卷积的参数大小为D×F×F×K。卷积层的参数较少,这也是由卷积层的主要特性即局部连接和共享权重所决定。
• 局部连接:每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野(receptive field)。在图像卷积操作中,即神经元在空间维度(spatial dimension,即上图示例H和W所在的平面)是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。
• 权重共享:计算同一个深度切片的神经元时采用的滤波器是共享的。例上图中计算o[:,:,0]的每个每个神经元的滤波器均相同,都为W0,这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的,例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的,比如输入的图片是人脸,眼睛和头发位于不同的位置,希望在不同的位置学到不同的特征 。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的。
通过介绍卷积计算过程及其特性,可以看出卷积是线性操作,并具有平移不变性(shift-invariant),平移不变性即在图像每个位置执行相同的操作。卷积层的局部连接和权重共享使得需要学习的参数大大减小,这样也有利于训练较大卷积神经网络。
3.激励层
把卷积层输出结果做非线性映射。如果没有激活函数,或者称为非线性映射,整个网络缺失非线性,再多层的堆叠,其本质仍然是线性的。常见的激活函数有Sigmoid、tanh、ReLU(参数化ReLU、随机ReLU、leaky ReLU等),Sigmoid与tanh容易发生饱和区,容易造成梯度消失,同时Sigmoid的值域被压到[0, 1]。
CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。
激励层的实践经验:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先试RELU,因为快,但要小心点
③ 如果②失效,请用Leaky ReLU或者Maxout
④ 某些情况下tanh倒是有不错的结果,但是很少
深度神经网络要解决的是一个很复杂的非凸优化问题,参数上的冗余保证了网络能够收敛到比较好的最优值。目前存在的一些办法有:
• 知识蒸馏、紧凑的网络设计、滤波器层面的剪枝(如何衡量滤波器的重要性以确定剪枝对象)等
• 低秩近似(稠密矩阵能够由若干低秩小矩阵近似重构)、未加限制的剪枝、参数量化(使用聚类中心的权重代替原有权重或使用哈希)、二值网络(参数量化的极端情况,如何二值化权重?如何传递梯度?)等。
4.池化层
池化,又可以称作汇合,英文pooling,目的是为了减少特征图,主要作用是通过减少网络的参数来减小计算量, 本质是一种降采样,具有特征不变性、特征降维、防止过拟合等作用,一般是均值池化(average pooling)和最大池化(max pooling)。通常在卷积层的后面会加上一个池化层,池化操作将保存深度大小不变,如果池化层的输入单元大小不是二的整数倍,一般采取边缘补零(zero-padding)的方式补成2的倍数,然后再池化。池化操作对每个深度切片独立,规模一般为 2*2,相对于卷积层进行卷积运算,池化层进行的运算一般有以下几种:
• 最大池化(Max Pooling):取4个点的最大值。这是最常用的池化方法。
• 均值池化(Mean Pooling):取4个点的均值。
• 高斯池化:借鉴高斯模糊的方法。不常用。
• 可训练池化:训练函数 ff ,接受4个点为输入,出入1个点。不常用。
• 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
• 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
5.全连接层
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:
数据增广与不平衡样本处理
对数据简单进行数据增广,比如水平翻转、随机截取、尺度变换、旋转等;同时,可对颜色等进行改变从而增加数据,比如颜色抖动,改变RGB或者HSV空间的值。特殊地,如AlexNet中使用Fancy PCA,或者针对不同的任务有不同的增广方式,如目标检测领域还涉及到检测框,可以参见之前的一篇文章,谷歌使用数据增广策略在目标检测任务上达到SOTA [4]。
对于不平衡样本,需要从数据、算法两个层面解决。
• 数据层面:数据重采样(上采样,复制或者数据扩充使得样本少类与样本最多的类一致;下采样,比如在每个batch中保证正负比例相等)、类别平衡采样(将样本归类,将所有类扩充到与样本最多的类一致后随机打乱,方法与数据重采样中的上采样类似)
• 算法层面:代价敏感
模型集成
• 数据层面:测试阶段数据增广(对同一张图像增广成n张,将n张输入模型得到n个结果进行集成)、简易集成法
• 模型层面:单模型集成(多层特征融合,将多层特征融合;网络快照法)、多模型集成(多模型生成,同一模型不同初始化、同一模型不同训练轮数、不同目标函数、不同网络结构;多模型集成,直接平均、加权平均、投票法、堆叠法(将集成结果作为新的特征训练另一个模型,这里的模型可以是神经网络,也可以是传统机器学习方法))
网格参数初始化
• 全零初始化,但是当全零初始化时,导致网络输出全部相同,梯度更新完全相同,模型无法训练
• 随机初始化,在实际应用,通常将随机参数服从均匀分布或者高斯分布,具体的由Xavier方法等
目标函数(损失函数,个人认为非常重要)
• 分类任务:交叉熵损失函数(常用目标函数)合页损失函数、坡道损失函数、中心损失函数
• 回归任务:L1损失函数、L2损失函数
网络正则化(保证范化能力的同时,避免过拟合)
• L2正则化(在机器学习中被称为岭回归)、L1正则化(相比于L2,能够产生更稀疏的参数)、Elastic网络正则化(L1和L2按比例混合)
• 随机失活,注意训练阶段和测试阶段的区别,需要乘系数
• 增加训练数据,使用更多的数据扩充方式
• 加入随机噪声
超参数设定与网络训练
• 超参数设定:输入数据像素大小、卷积层参数设定(卷积核大小、卷积操作的步长、卷积核个数;通常卷积核大小为奇数,一般推荐为3、5;卷积核个数一般为2的次幂)、池化层参数设定
• 网络训练:在每轮训练前将训练集顺序打乱(参考依据:信息论中从不相似的事件中学习总是比从相似事件中学习更具信息量)、学习率设定(初始不宜过大,后续需要减缓)、是否使用Batch Normalization、优化算法的选择(SGD、基于动量的SGD、Nesterov、Adagrad、Adadelta、RMSProp、Adam等)