由于可以有效地进行特征提取,卷积神经网络(CNN)已经被广泛地应用于计算机视觉、自然语言处理等领域。之前仅在图像的分类和识别中用过CNN,且对CNN的理解较为浅显。现在重新学习卷积神经网络,并重点学习其在NLP领域的应用。特此记录。
参考:https://blog.csdn.net/jiaoyangwm/article/details/80011656
首先从卷积神经网络的概念、发展历史、网络构架、常见网络等方面学习卷积神经网络。
深度学习的概念提出后,由于可以使用大规模的数据在大规模网络上进行训练,各种深度神经网络模型被接连提出,掀起了深度神经网络在机器学习中的热潮。卷积神经网络作为深度神经网络的一种,因其权值数量少、模型复杂度低而获得了成功。
深度学习的思想:
深度神经网络的基本思想是通过构建多层网络,对目标进行多层表示,以期通过多层的高层次特征来表示数据的抽象语义信息,获得更好的特征鲁棒性。
什么是卷积神经网络:
卷积神经网络是一种带有卷积结构的深度神经网络,卷积结构可以减少深层网络占用的内存量,其三个关键的操作,其一是局部感受野,其二是权值共享,其三是pooling层,有效的减少了网络的参数个数,缓解了模型的过拟合问题。
1)网络结构
CNN的整体架构:卷积神经网络是一种多层的监督学习神经网络,隐含层的卷积层和池采样层是实现卷积神经网络特征提取功能的核心模块。该网络模型通过采用梯度下降法最小化损失函数对网络中的权重参数逐层反向调节,通过频繁的迭代训练提高网络的精度。卷积神经网络的低隐层是由卷积层和最大池采样层交替组成,高层是全连接层对应传统多层感知器的隐含层和逻辑回归分类器。第一个全连接层的输入是由卷积层和子采样层进行特征提取得到的特征图像。最后一层输出层是一个分类器,可以采用逻辑回归,Softmax回归甚至是支持向量机对输入图像进行分类。
卷积神经网络结构包括:卷积层,降采样层,全连接层。每一层有多个特征图,每个特征图通过一种卷积滤波器提取输入的一种特征,每个特征图有多个神经元。
输入图像统计和滤波器进行卷积之后,提取该局部特征,一旦该局部特征被提取出来之后,它与其他特征的位置关系也随之确定下来了,每个神经元的输入和前一层的局部感受野相连,每个特征提取层都紧跟一个用来求局部平均与二次提取的计算层,也叫特征映射层,网络的每个计算层由多个特征映射平面组成,平面上所有的神经元的权重相等。
通常将输入层到隐藏层的映射称为一个特征映射,也就是通过卷积层得到特征提取层,经过pooling之后得到特征映射层。
1)局部感受野与权值共享
卷积神经网络的核心思想就是局部感受野、权值共享和pooling层,以此来达到简化网络参数并使得网络具有一定程度的位移、尺度、缩放、非线性形变稳定性。
1)卷积层、下采样层、全连接层
卷积层:因为通过卷积运算我们可以提取出图像的特征,通过卷积运算可以使得原始信号的某些特征增强,并且降低噪声。
下采样层:因为对图像进行下采样,可以减少数据处理量同时保留有用信息,采样可以混淆特征的具体位置,因为某个特征找出来之后,它的位置已经不重要了,我们只需要这个特征和其他特征的相对位置,可以应对形变和扭曲带来的同类物体的变化。
全连接层:采用softmax全连接,得到的激活值即卷积神经网络提取到的图片特征。
卷积神经网络相比一般神经网络在图像理解中的优点:
CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
卷积网络执行的是监督训练,所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟系统的实际“运行”结构,它们可以是从实际运行系统中采集来。
1)参数初始化:
在开始训练前,所有的权都应该用一些不同的随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无学习能力。
2)训练过程包括四步
① 第一阶段:前向传播阶段
② 第二阶段:后向传播阶段
计算实际输出与相应的理想输出的差。
按照极小化误差的方法调整权值矩阵。
网络的训练过程如下:
选定训练组,从样本集中分别随机地寻求N个样本作为训练组;
将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;
从训练组中取一个输入模式加到网络,并给出它的目标输出向量;
计算出中间层输出向量,计算出网络的实际输出向量;
将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;
依次计算出各权值的调整量和阈值的调整量;
调整权值和调整阈值;
判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;
训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。
1)数据集的大小和分块
数据驱动的模型一般依赖于数据集的大小,CNN和其他经验模型一样,能够适用于任意大小的数据集,但用于训练的数据集应该足够大, 能够覆盖问题域中所有已知可能出现的问题,
设计CNN的时候,数据集应该包含三个子集:训练集、测试集、验证集
Looney等人建议,数据集中65%的用于训练,25%的用于测试,10%用于验证。
2)数据预处理
为了加速训练算法的收敛速度,一般都会采用一些数据预处理技术,其中包括:去除噪声、输入数据降维、删除无关数据等。
数据的平衡化在分类问题中异常重要,一般认为训练集中的数据应该相对于标签类别近似于平均分布,也就是每一个类别标签所对应的数据集在训练集中是基本相等的,以避免网络过于倾向于表现某些分类的特点。
为了平衡数据集,应该移除一些过度富余的分类中的数据,并相应补充一些相对样例稀少的分类中的数据。
还有一个方法就是复制一部分这些样例稀少分类中的数据,并在这些数据中加入随机噪声。
3)数据规则化
将数据规则化到统一的区间(如[0,1])中具有很重要的优点:防止数据中存在较大数值的数据造成数值较小的数据对于训练效果减弱甚至无效化,一个常用的方法是将输入和输出数据按比例调整到一个和激活函数相对应的区间。
4)网络权值初始化
CNN的初始化主要是初始化卷积层和输出层的卷积核(权值)和偏置
网络权值初始化就是将网络中的所有连接权重赋予一个初始值,如果初始权重向量处在误差曲面的一个相对平缓的区域的时候,网络训练的收敛速度可能会很缓慢,一般情况下网络的连接权重和阈值被初始化在一个具有0均值的相对小的区间内均匀分布。
5)BP算法的学习速率
如果学习速率选取的较大,则会在训练过程中较大幅度的调整权值w,从而加快网络的训练速度,但是这会造成网络在误差曲面上搜索过程中频繁抖动,且有可能使得训练过程不能收敛。
如果学习速率选取的较小,能够稳定的使得网络逼近于全局最优点,但也可能陷入一些局部最优,并且参数更新速度较慢。
自适应学习率设定有较好的效果。
6)收敛条件
有几个条件可以作为停止训练的判定条件,训练误差、误差梯度、交叉验证等。一般来说,训练集的误差会随着网络训练的进行而逐步降低。
7)训练方式
训练样例可以有两种基本的方式提供给网络训练使用,也可以是两者的结合:逐个样例训练(EET)、批量样例训练(BT)。
在EET中,先将第一个样例提供给网络,然后开始应用BP算法训练网络,直到训练误差降低到一个可以接受的范围,或者进行了指定步骤的训练次数。然后再将第二个样例提供给网络训练。
EET的优点是相对于BT只需要很少的存储空间,并且有更好的随机搜索能力,防止训练过程陷入局部最小区域。
EET的缺点是如果网络接收到的第一个样例就是劣质(有可能是噪音数据或者特征不明显)的数据,可能使得网络训练过程朝着全局误差最小化的反方向进行搜索。
相对的,BT方法是在所有训练样例都经过网络传播后才更新一次权值,因此每一次学习周期就包含了所有的训练样例数据。
BT方法的缺点也很明显,需要大量的存储空间,而且相比EET更容易陷入局部最小区域。
而随机训练(ST)则是相对于EET和BT一种折衷的方法,ST和EET一样也是一次只接受一个训练样例,但只进行一次BP算法并更新权值,然后接受下一个样例重复同样的步骤计算并更新权值,并且在接受训练集最后一个样例后,重新回到第一个样例进行计算。
ST和EET相比,保留了随机搜索的能力,同时又避免了训练样例中最开始几个样例如果出现劣质数据对训练过程的过度不良影响。
AlexNet是Alex Krizhevsky、Ilya Sutskever和 Geoffrey Hinton创造的一个“大型的深度卷积神经网络”,赢得了2012 ILSVRC(2012年ImageNet 大规模视觉识别挑战赛)。
AlexNe采用两台GPU服务器进行训练,其网络结构分为两股“流”。AlextNet的网络结构示意如下:
该方法训练了一个端到端的卷积神经网络实现对图像特征提取和分类,网络结构共7层,包含5层卷积层和2层全连接层。
AlexNet包含了6亿三千万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。
要点:
即无论对什么物体,学习过程都是:边缘→部分→整体。
VGGNet由牛津大学计算机视觉组合和Google DeepMind公司研究员一起研发的深度卷积神经网络。它探索了卷积神经网络的深度和其性能之间的关系,通过反复的堆叠33的小型卷积核和22的最大池化层,成功的构建了16~19层深的卷积神经网络。VGGNet获得了ILSVRC 2014年比赛的亚军和定位项目的冠军,在top5上的错误率为7.5%。目前为止,VGGNet依然被用来提取图像的特征。
VGGNet的网络结构如下图所示。VGGNet包含很多级别的网络,深度从11层到19层不等,比较常用的是VGGNet-16和VGGNet-19。VGGNet把网络分成了5段,每段都把多个3*3的卷积网络串联在一起,每段卷积后面接一个最大池化层,最后面是3个全连接层和一个softmax层。
A网络(11层)有8个卷积层和3个全连接层,E网络(19层)有16个卷积层和3个全连接层,卷积层宽度(通道数)从64到512,每经过一次池化操作,扩大一倍。
结构:
相比AlexNet的变化:
VGG虽然比AlexNet模型层数多,且每轮训练时间会比AlexNet更长,但是因为更深的网络和更小的卷积核带来的隐式正则化结果,需要的收敛的迭代次数减小了许多。
网络特点:
1)VGGNet使用3x3的卷积
2)使用三个3x3的卷积,而不是一个7x7的卷积。
两个连续的3x3的卷积相当于5x5的感受野,三个相当于7x7的感受野,优势在于:
① 包含三个ReLU层而不是一个,使得决策函数更有判别性;
② 减少了参数,比如输入输出都是C个通道,使用3x3的3个卷积层需要3×(3x3xCxC)=27xCxC个参数,使用7x7的1个卷积层需要7x7xCxC=49xCxC个参数,这可以看做是为7x7的卷积施加一种正则化,使它分解为3个3x3的卷积。
3)使用1x1的卷积层,该层主要是为了增加决策函数的非线性,而不影响卷积层的感受野,虽然1x1的卷积操作是线性的,但是ReLU增加了非线性。
训练过程:
除了从多尺度的训练图像上采样输入图像外,VGGNet和AlexNet类似
1)优化方法:含有动量的随机梯度下降SGD+momentum(0.9)
2)批尺度: batch_size = 256
3)正则化:采用L2正则化,weight_decay 是5e-4,dropout在前两个全连接层之后,p=0.5
4)参数初始化:对于较浅的A网络,参数进行随机初始化,权值w从N(0,0.01)中采样,偏差bias初始化为0;对于较深的网络,先用A网络的参数初始化前四个卷积层和三个全连接层。
5)数据预处理:为了获得224x224的输入图像,要在每个SGD迭代中对每张重新缩放的图像进行随机裁剪,为了增强数据集,裁剪的图像还要随机水平翻转和RGB色彩偏移。
测试过程:
1)对输入图像重新缩放到一个预定义的最小图像边的尺寸Q
2)网络密集地应用在重缩放后的图像上,也就是说全连接层转化为卷积层(第一个全连接层转化为7x7的卷积层,后两个全连接层转化为1x1的卷积层),然后将转化后的全连接层应用在整张图中)
3)为了获得固定尺寸的类别分数向量,对分数图进行空间平均化处理。
介绍GooLeNet之前,先引入一张CNN的结构演化图:
2012年AlexNet做出历史突破以来,直到GoogLeNet出来之前,主流的网络结构突破大致是网络更深(层数),网络更宽(神经元数)。所以大家调侃深度学习为“深度调参”,但是纯粹的增大网络的缺点:
那么解决上述问题的方法当然就是增加网络深度和宽度的同时减少参数,Inception就是在这样的情况下应运而生。GoogLeNet团队提出的Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。
Inception网络结构:
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构,基本结构如下:
但是使用5x5的卷积核仍然会带来巨大的计算量,为此文章借鉴NIN,采用1x1的卷积核来进行降维。
例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
改进后的Inception 模型如下:
GoogLeNet Incepetion V1比AlexNet的8层或者VGGNet的19层还要更深。但其计算量只有15亿次浮点运算,同时只有500万的参数量,仅为AlexNet参数量(6000万)的1/12,却可以达到远胜于AlexNet的准确率,可以说是非常优秀并且非常实用的模型。
Inception V1参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:
Inception Module的基本结构:
其中有4个分支:
第二个分支,先使用了1x1卷积,然后连接3x3卷积,相当于进行了两次特征变换
第三个分支,先使用1x1卷积,然后连接5x5卷积
第四个分支,3x3最大池化后直接使用1x1卷积
四个分支在最后通过一个聚合操作合并,在输出通道这个维度上聚合。
GoogLeNet
基于Inception构建了GoogLeNet的网络结构如下(共22层):
上图说明:
GoogLeNet是谷歌团队为了参加ILSVRC 2014比赛而精心准备的,为了达到最佳的性能,除了使用上述的网络结构外,还做了大量的辅助工作:包括训练多个model求平均、裁剪不同尺度的图像做多次验证等等。
GoogleNet Inception V2
V2和V1的最大的不同就是,V2增加了Batch Normalization。
Inception V2学习了VGGNet,用两个3x3的卷积代替5x5的卷积,用以降低参数量并减轻过拟合,还提出了著名的Batch Normalization方法,该方法是一个很有效的正则化的方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅度的提高。
BN在用于神经网络某层时,会对每一个mini-batch数据的内部进行标准化(normalization)处理,使输出规范化到N(0,1)的正态分布,减少了Internal Covariate Shift(内部神经元分布的改变)。
BN的论文指出,传统的深度神经网络在训练时,每一层的输入的分布都在变化,导致训练变得困难,我们只能使用一个很小的学习速率解决这个问题。而对每一层使用BN之后,我们就可以有效地解决这个问题,学习速率可以增大很多倍,达到之前的准确率所需要的迭代次数只有1/14,训练时间大大缩短。
BN算法实现如下:
输入:输入数据 x 1 . . . x m x_1 . . . x_m x1...xm这些数据是准备进入激活函数的数据)
计算过程:
正向传播的过程:通过可学习的 γ γ γ与 β β β参数求出新的分布值。
反向传播的过程:通过链式求导方式,求出 γ γ γ , β β β 以及相关权值。
ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet,Alpha zero也使用了ResNet,所以可见ResNet确实很好用。
实验发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。
回想一下神经网络反向传播的原理,先通过正向传播计算出结果output,然后与样本比较得出误差值Etotal
根据误差结果,利用著名的“链式法则”求偏导,使结果误差反向传播从而得出权重w调整的梯度。下图是输出结果到隐含层的反向传播过程(隐含层到输入层的反向传播过程也是类似):
通过不断迭代,对参数矩阵进行不断调整后,使得输出结果的误差值更小,使输出结果与事实更加接近。
从上面的过程可以看出,神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,衰减越厉害),导致无法对前面网络层的权重进行有效的调整。
那么我们作这样一个假设:假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。
ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好,残差网络的基本结构如下图所示,很明显,该图是带有跳跃结构的:
期望输出:H(x),即H(x)是期望的复杂映射,如果要学习这样的模型,训练的难度会比较大。
此时,如果已经学习到较为饱和的准确率,或者发现下层的误差变大时,接下来的目标就转化为恒等映射的学习,也就是使得输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。
上图的残差网络中,通过捷径连接的方式直接将输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,H(x)=x,也就是恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
学习的目标:目标值H(x)和输入x的差值,即F(x):=H(x)-x,将残差逼近于0,使得随着网络加深,准确率不下降。
见下篇。