zoukankan      html  css  js  c++  java
  • SIGAI深度学习第七集 卷积神经网络1

    讲授卷积神经网络核心思想、卷积层、池化层、全连接层、网络的训练、反向传播算法、随机梯度下降法、AdaGrad算法、RMSProp算法、AdaDelta算法、Adam算法、迁移学习和fine tune等。

    大纲:

    卷积神经网络简介

    视觉神经网络的核心思想

    卷积神经网络的核心思想

    卷积运算

    卷积层的原理

    多通道卷积

    池化层的原理

    全连接层

    卷积网络结构

    训练算法简介

    卷积层的反向传播

    池化层的反向传播

    全连接层的反向传播

    完整的反向传播算法

    随机梯度下降法

    参数值初始化

    学习率的设定

    梯度下降法的改进

    迁移学习与fine tune

    本集总结

    卷积神经网络简介:

    是各种深度神经网络中被使用最广泛的一种,由LeCun在1989年提出(1998年又设计了LetNet5网络),LeNet5被成功应用于手写字符图像的识别(如邮政编码识别)。

    在这之后的很长时间内,卷积网络没有得到广泛关注和大规模应用,到2012年,有更深层次的AlexNet网络在图像分类(如人脸检测、物体识别)任务中取得成功,此后卷积神经网络高速发展,被广泛用于机器视觉等领域,在很多问题上都取得了当前最好的性能。在上世纪90年代,1995~2012,机器视觉里边很多问题,都是用SVM、AdaBoost来做的,如检测和各种分类问题,比卷积神经网络效果好一些,随着大量的样本的出现及算法本身的改进、GPU计算技术的出现,导致卷积神经网络精度越来越高,对很多问题解决效果越来越好,因此成为解决现实问题的一个方案。

    通过卷积和池化层自动学习图像在各个尺度上的特征。

    是一种仿生的方法,借鉴自动物的视觉神经网络系统。

    视觉神经系统的原理:

    人在认知图像时是分层进行的,首先理解的是颜色和亮度,然后是边缘、角点、直线等局部细节特征,接下来是纹理、形状、区域等更复杂的信息和结构,最后形成整个无图的概念。

    视觉神经科学之前对于视觉机理的研究已经证明了大脑的视觉皮层具有分层结构,对应于对图像理解时一层层的分层结构。

    眼睛将看到的物体成像在视网膜上,视网膜把光学信号转换成电信号,传递到大脑的视觉皮层(Visual cortex),视觉皮层是大脑中负责处理视觉信号的部分。

    卷积神经网络的核心思想:

    卷积神经网络可以看成是对视觉神经系统机制的简单模仿。

    由卷积层、池化层、全连接层构成,通过多个卷积、池化层提取图像在各个尺度上的特征。

    每个卷积层包含多个卷积核,用这些卷积核从左向右、从上往下依次扫描整个图像,得到称为特征图(feature map)的输出数据。

    网络前面的卷积层捕捉图像局部、细节信息,有小的感受野,即输出图像的每个像素只对应输入图像很小的一个范围;后面的卷积层感受野逐层加大,用于捕获图像更复杂、更抽象的信息。

    经过多个卷积层的运算,最后得到图像在各个不同尺度的抽象表示。

    卷积运算:

    在数字图像处理领域,卷积是一种常见的运算。

    可用于图像去噪、增强、边缘检测等问题,还可以用于提取图像的特征。

    用一个称为卷积核的矩阵自上而下、自左向右在图像上滑动,将卷积核矩阵的各个元素与它在图像上覆盖的对应位置的元素相乘,然后求和,得到输出值。

     

    ∂I/∂y表示水平方向边缘信息,Sobel算子是利用中心差分公式设计出来的。卷积完之后水平方向边缘的地方像素值比较大其他地方像素值比较小,这样就把边缘给提取出来了,因此卷积核可以从来提取图像的特征,每个特征值是每个像素点相邻像素点的加权平均值。

     

     卷积运算:

     经过卷积运算之后图像尺寸变小了,如果原图像是m*n,卷积核为s*s,卷积结果图像为(m-s+1)*(n-s+1),为了保证卷积之后的图像大小不变,可以做填充操作padding,在周边补0,然后用尺寸扩大后的图像进行卷积。

    需要考虑的问题:卷积核的尺寸,一般行数和列数相等,而且为奇数;卷积步长,一般为1,也可以设置成其他值。

    卷积层的原理:

    在图像处理中,卷积核矩阵的数值是根据经验人工设计的。

    可以通过机器学习的手段来自动生成这些卷积核,从而描述各种不同类型的特征。

    卷积神经网络就是通过自动学习的手段来得到各种有用的卷积核,通过这些卷积核k和图像I进行卷积操作得到特征图像F(包含从图像里提取出来的颜色特征、边缘特征、纹理特征等等)。

    卷积层的每个卷积核实现的映射为:,(加了一个偏置项、一个激活函数(原因和全连接神经网络相同,为了保证映射是非线性的))

     注意:需要多个卷积层(如第一个卷积层提颜色、亮度特征,第二个卷积层提边缘信息,第三个卷积层提纹理、形状信息);每层需要多个卷积核(每个卷积核用于提取每一种或几种特征来)。

    感受野的感念:卷积核在一次卷积操作时对原图像的作用范围称为感受野,不同的卷积层有不同的感受野。网络前面的卷积层感受野小,用于提取图像细节的信息;后面的卷积层感受野更大,用于提取更大范围的、层次的抽象信息。越往后的卷积层对应的原始图像里的区域越大,即感受野越大。

    多通道卷积:

    卷积层每个卷积核的通道数必须和输入特征图像的通道数(如图像是三维,则输入数据就是三通道)相同。

    本层输出图像的通道数等于本层的卷积核数。每个卷积核的每一个通道分别和输入通道的每个通道做2D卷积,卷积完之后将通道加起来形成一张图像。

    池化层的原理:

    卷积对图像的缩小是有限的,卷积之后为(m-s+1)*(n-s+1),需要很多卷积层才能缩小,层数太多又是不行的,因此需要卷积之后将图像再缩小一点再继续下一个卷积层,因此就引入了池化层。

    特征图像的维数很高,维数高不仅计算耗时,而且容易导致过拟合,引入了下采样技术,也称为池化(pooling)操作。

    对图像的某一个区域用一个值代替,如最大值或平均值,叫做max池化;如果采用均值,叫做均值池化。

    除了降低图像尺寸之外,池化带来的另外一个好处是一定程度的平移、旋转不变性,因为输出值由图像的一片区域计算得到,对于小幅度的平移和旋转不敏感。

    池化层没有参数,不像卷积层有卷积核参数k。

    池化核大小:一般是正方形;池化步长:一般是无重叠,两个池化区域相互不重叠。

    max池化是非线性操作,现在用的更多,而均值函数是线性函数,神经网络非线性性越强越好,一般选max池化作为池化层。

    全连接层:

    原理和前边的全连接神经网络(或叫多层感知器模型、多层前馈神经网络)是一模一样的。卷积层(cov),池化层(pooling)。

    第一个全连接层,从前面的层(卷积层或池化层)接收输入数据(卷积层或池化层的输出数据展开成一个向量作为全连接层的输入)。

    一个卷积神经网络可能有多个全连接层,最后得到一个输出层。

    卷积神经网络的整体结构:

    标准的卷积神经网络由卷积层、池化层、全连接层。cov——>

    网络的前半部分为卷积层和池化层,二者交替进行。池化对图像降维是很快的,如2*2压缩为一个像素点的池化函数,以log2n的速度降维。

    网络的后半部分为全连接层。

    也有其它变种,如全卷积网络;或者几个卷积层之后接一个池化层。

    经过卷积和池化对图像特征提取降维从而避免了直接使用全连接神经网络带来的神经元很多的问题。

    训练算法简介:

    前面已经知道了CNN的结构,通过结构可以得到正向传播算法,也就是输入一张图像怎么得到结果(cov->pooling->FC->输出结果),输出结果和多层感知器是一样的,可以用它来做分类和回归,这样就可以用CNN来解决分类和回归任务了。

    卷积核K、全连接层权重矩阵W的参数,也是和全连接神经网络一样通过训练算法来确定的。

     卷积层的参数即核卷积,和全连接层的参数一起,通过训练确定,池化层没有参数需要学习。

    核心问题是如何计算卷积核的梯度值,如何将卷积层、池化层的误差项计算出来并传播到前一层。反向传播算法流程:误差项计算梯度值、把误差项传播到前一层,和全连接神经网络是一样的,这里的卷积神经网络也是通过反向传播算法和梯度下降法来训练的,卷积神经网络本质上看成全连接神经网络,只不是它的连接权重是共享的,卷积神经网络也称为权重共享的神经网络。

    卷积层的反向传播:

    推导卷积层和池化层反向传播算法的实现,

    uij(l)对图像卷积和加偏置以后的结果,它是没有加激活函数的,激活函数是一一映射,uij(l)激活之后得到xij(l)。

    正向传播的计算公式为

    会发现卷积输出图像的任意一个元素都与卷积核矩阵的任意一个元素都有关,因为输出图像的每一个像素值都共用了一个卷积核模板。

    反向传播时需要计算损失函数对卷积核以及偏置项的偏导数,和全连接网络不同的是,卷积核要作用于同一个图像的多个不同位置。

    下面讲卷积层反向传播三个关键点:

    ①卷积层卷积核矩阵梯度计算公式:

    ②卷积层偏置项梯度计算公式:

    ③怎么把误差项从后一层传播到前一层去:

    所以得出损失函数对l层卷积核中元素kpq(l)的偏导数为,其中第二个乘积项,第三个乘积项,由此得到卷积核的偏导数计算公式,偏置项的偏导数

    定义误差项,这是一个矩阵,尺寸和卷积输出图像相同

    由此得到根据误差项计算卷积核偏导数的公式,这实际上是一个卷积运算,误差项充当卷积核,而本卷层的输入图像充当此次卷积的输入图像。

    下面来计算对卷积核各个元素的偏导数:

     类似的有,.......,由此可得,这里*是卷积。

     根据误差项计算卷积核偏导数的公式得:

    误差项的计算公式:

     

     

     

     池化层的反向传播:

    池化层没有要通过学习得到的参数,只需传播误差项。 

    正向传播的时候对图像进行了一个下采样的操作,得到尺寸更小的一张图像,正向传播时的下采样变换为X(l)=down(X(l-1))。

    反向传播怎么做到的呢,这里的误差项是定义在输入图像和输出图像上边的,每一层的误差项都是建立在当前层的输出结果上面的,传到前一层的误差项是损失函数对输入数据的偏导数,反向传播时使用上采样

     ①均值池化:

    正向传播计算公式为

    反向传播时,对输入值的偏导数为,具体的做法为将传入的误差项每个元素复制多份,展开成一个块,并做如下计算

     ②max池化

    在进行正向传播时,需要记住最大值的位置。反向传播时,对于扩充的块,最大值位置处的元素设为 ,其他位置全部置为0。

    正向传播时的计算公式:y=max(x1,...,xl)=xt

    反向传播时的导数值为

    如果这个元素是最大值,则,否则

     全连接层的反向传播:

    全连接层的反向传播和普通神经网络是相同的。

     完整的反向传播算法:

    把激活函数给拆开了(从卷积层、全连接层中拆开了),好处是代码可以复用了,激活函数对于卷积层、全连接层是一样的,像caffee、tensorflow就是这样实现的。

     

     随机梯度下降法:

    神经网络的训练有单样本模式和批量模式两种方案。

    单样本模式是指每次只用一个样本来进行梯度下降,也就是说正向传播时每次只用一个样本计算损失函数值,反向传播算法时只用同一个样本来计算损失函数L对参数W的梯度值来完成梯度下降法的更新,损失是定义在单个样本上的。批量样本是定义在所有的样本上面的所有样本都用上了。

    如果每次用所有样本进行反向传播和梯度下降迭代,损失函数为,其中后一项是正则化项,前一个是对N个样本的均值。

    我们在训练神经网络,尤其是卷积神经网络这样的深层神经网络时,一般训练样本都比较大如一百万以上,每次进行梯度下降和反向传播都用所有的这些样本迭代一遍的话会收敛的非常慢,作为改进,我们会采用类似单样本这样的模式。

    介于单样本和批量模式之间的有一种叫做小批量的mini-batch随机梯度下降法。

    每次更新参数,每一轮迭代的时候,我们只是从整个样本集N个样本中随机选一部分出来选M个出来,如果M==1的话是单样本模式,如果M>1的话是小批量模式。每次选小批量M个样本参与梯度下降,拿这M个样本来近似代替N个样本精确的损失函数,即只使用一部分随机选取的样本来定义损失函数,,其中M<<N。mini-batch有一个batch-size这个参数,一般是人为设置的,一般设置为2的n次方,考虑到计算机的性能如显存的大小、GPU数量和规模,由它决定每个batch能跑多大的样本,如有128万训练样本,先把这些128万样本随机洗牌先洗一遍打乱顺序,然后等分成1万份每份128个样本,每次拿这样128个样本去定义损失函数,就是用它去跑一下反向传播算法和梯度下降法,然后根据这128个样本定义损失函数,最后求神经网络参数W梯度的时候是怎么求的呢:先把128中的每个样本计算出一个梯度来,取这些128个样本梯度值的均值做为128个样本的梯度值再进行更新,每次随机的选128个样本,就是每次迭代的时候只拿一部分样本构造损失函数近似替代所有样本上的损失函数,这种做法能收敛吗能取到极小值吗:对于凸优化而言是可以保证的,SGD在数学期望的意义下收敛,即随机采样产生的梯度的期望值是真实的梯度,批量模式的梯度下降法每次迭代的时候除非到达驻点结束循环之前损失函数值一定会下降的,但SGD就不能保证了,因为它每次损失函数都是不一样的,每次128个样本的选择是随机的,每次损失函数定义都不一样,因此不能保证每次迭代都收敛,但是它整体来说会趋向于收敛的(损失函数值L随迭代次数震荡递减),终归来说它的损失函数值是会降下去的。

     参数值初始化:

     用反向传播算法和梯度下降法来训练神经网络的时候,我们要给神经网络的参数W赋予一个初始值,一般用一个随机数来赋初始值,如果全部初始化为0或1网络会不太好收敛。

    大多采用均匀分布((-1,1)或(0,1)),正态分布(N(μ,σ^2))的随机数生成,然后用神经元的数量做归一化。

     学习率的设定:

    ,其中α是学习率。

     乘以一个α是为了保证算法是收敛的,因为我们要忽略泰勒展开中的高阶无穷小,迭代以后新的值Wt+1在Wt的一个邻域里面,否则泰勒展开式是不能近似成立的展开到一阶。

    ,忽略最后一项高阶无穷小的泰勒余项,f(x)=f(x0)+f'(x-x0),由此式可得上边的①式,所以阿尔法是非常小的值如10-4或10-5,如果阿尔法设置 大的话可能不收敛,因为直接跨过了它的邻域,在泰勒展开里边就没法忽略2次和2次以上的项(可能比一次项导数的值还要大),所以不能保证往下收敛,但是阿尔法设置太小的话收敛的又非常慢。

    学习率的设定可以是固定学习率,或动态调整学习率-人工定义的规则(如前10万次迭代设为10-4,接下来10万次用10-5,然后依次减小),也可以自适应学习率α值,不用人工设定,根据具体情况设置成α有多大合适。

     梯度下降法的改进:

    ,其中第二项是更新项,更新项也有一些更复杂的策略,但也是梯度下降法,只不过是变了一些花样,总体来说都是用梯度值构造更新项,更复杂的更新项出现是为了迭代的更快一点,如之前迭代100万次才收敛改进更新项之后20万次迭代就收敛了,也会收敛的更好,如之前不能收敛会陷入局部最小值或鞍点,但是更新项改进后可以收敛。

    改进的目标:收敛的更快,收敛的更好(如抵抗局部极小值,鞍点问题)。

    改进点:自适应学习率,每一维有自己的学习率,积累之前的信息。

    自适应学习率,W是一个向量代表神经网络所有的参数,为W的每一维设置不同的学习率。也可以积累之前的信息,如更新项中包含L对W1到Wt的梯度。

    ①带动量项的梯度下降法:

    带动量项的梯度下降法积累了之前的梯度信息,如果更新项中包含L对W1到Wt的梯度,所有的梯度都用上,梯度会越加越大会不合适,所以就引入了动量项。

    这里采用了一个衰减策略,累积了之前迭代时的梯度值,加上此项之后的参数更新公式为Wt+1=Wt+Vt+1,动量项的计算公式为,其中u为衰减因子,展开之后:

     u是小于1的正数,前边的梯度值起的作用越来越小,画成图形就是动量项就是累积了以前的梯度方向,矢量加起来,因为梯度是矢量。梯度一会朝向这个一会朝向另一个方向,但是每次方向不一样会乱走一会走过去一会走过来,如果积累以前的梯度值的话,来回的震荡可以抵消掉,总体会朝向一个趋势往前走收敛到极小值处,即保持惯性,减少震荡。

     ②AdaGrad算法:

    标准的梯度下降法依赖于人工设定的学习率,如果设置过小,收敛太慢,而如果设置太大,可能导致算法那不收
    敛,为这个学习率设置一个合适的值非常困难。

    AdaGrad算法同带动量项的梯度下降法也是累积了所有梯度的信息,这里不是用它们来更新梯度值的,而是用它们来计算自适应学习率的。

    AdaGrad算法根据前几轮迭代时的历史梯度值动态调整学习率,且优化变量向量的每一个分量都有自己的学习率:

     其中,i下标表示向量的分量,t下标表示迭代次数。

    和标准梯度下降法唯一不同的是多了分母中的这一项,它累积了到本次迭代为止梯度的历史值信息用于生成梯度下降的系数值。历史导数值的绝对值越大分量学习率越小,反之越大。

    缺点是,需要人工设置一个全局的学习率;随着时间的累积,上式中的分母会越来越大,导致学习率趋向于0,参数无法有效更新。

    ③RMSProp算法:

    对AdaGrad的改进,避免了长期累积梯度值所导致的学习率趋向于0的问题。

    按照衰减系数累积了历史的梯度平方值

     是衰减因子,大于0小于1,每次累加梯度的时候乘了一个衰减因子,和动量项梯度下降法道理一样,t越往前乘的衰减因子越小即衰减的越厉害起的作用越小,避免了累加梯度时导致α后边的分数趋向于0。

    缺点,也需要人工指定的全局学习率。

    ④AdaDelta算法:

      其实和RMSProp算法差不多,只是α后边分数的分子不一样。这样构造的原因是确保量纲正确(保持xt+1和△xt的量纲一致)。

    ⑤Adam算法:

     整合了自适应学习率与动量项

     梯度下降法的改进的总结:

     迁移学习与fine tune:

    机器视觉中有一些特征具有共性,它们对各种物体的识别具有普遍性,如边缘、角点、纹理特征。卷积网络学习得到的特征可能会具有通用性。
    能不能将一个数据集上训练的网络用于另外一个任务?
    直接用不是一种好的选择,另外一种思路是把这个网络的参数作为训练的初始值,在新的任务上继续训练,这种做法称为fine-tune,即网络微调。大量的实验结果和应用结果证明,这种微调是有效的。
    说明卷积神经网络在一定程度上具有迁移学习的能力,卷积层学习到的特征具有通用性,也包括池化层。

     本集总结:

  • 相关阅读:
    Mac下好玩的终端命令
    【bzoj3441】乌鸦喝水
    LeetCode[39]: 组合总和
    打击盗版,支持原创
    状态模式(State)-设计模式
    webpack核心概念
    吴裕雄--天生自然TensorFlow高层封装:Estimator-自定义模型
    吴裕雄--天生自然TensorFlow高层封装:Estimator-DNNClassifier
    吴裕雄--天生自然TensorFlow高层封装:Keras-TensorFlow API
    吴裕雄--天生自然TensorFlow高层封装:Keras-多输入输出
  • 原文地址:https://www.cnblogs.com/wisir/p/11737201.html
Copyright © 2011-2022 走看看