《解析卷积神经网络》学习笔记

前言

这本书从实用角度着重解析了深度学习中的一类神经网络模型——卷积神经网络,主要剖析了卷积神经网络的基本部件与工作机理,并且系统性的介绍了深度卷积神经网络在实践应用方面的细节配置与工程经验。是一本偏实用的深度学习工具书,内容侧重深度卷积神经网络的基础知识和实践应用。是一本很不错的入门书籍,这里我把自己在这本书中get到知识点分享一下,如果有理解不准确的地方,还望指正~~

一、卷积神经网络基本部件

1.1端到端

深度学习整个学习流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始的输入到期望输出的映射。相比分治策略,“端到端”的学习方式具有协同增效的优势,有更大可能获得全局最优解。
对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层。这些操作层整体可看作一个复杂的函数fNN,最终损失函数由数据损失和模型参数的正则化损失共同组成,深度模型的训练则在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。模型的训练过程可以简单抽象为从原始数据向最终目标的直接“拟合”,而中间的这些部件正起到了将原始数据映射为特征(即特征学习)随后再映射为样本标记(即目标任务,如分类)的作用。

1.2卷积操作

卷积是一种局部操作,通过一定大小的卷积核作用于图像局部区域获得图像的局部信息。

1.3池化层

常用的池化操作是均值池化和最大值池化。池化操作和卷积操作不一样,池化层不包括需要学习的参数。使用的时候只需要指定池化的类型,池化操作的核的大小,以及池化操作的步长等超参数。
池化层的作用
池化操作后的结果相比输入降小了,其实池化操作就是一种降采样(down-sampling)操作;另一方面池化也可以看成一个用p-范数(p-norm)作为非线性映射的“卷积”惭怍,特别是当p趋近于无穷时就是最常见的最大值池化。

池化层的引入是仿照人的视觉系统对视觉输入对象进行降维和抽象,有三个作用:

  1. 特征不变性。池化操作使模型更关注是否存在某些特征而不是特征具体的位置。可看作是一种很强的先验,使特征学习包含某种程度自由度,能容忍一些特征微小的位移、旋转或者缩放等变化。
  2. 特征降维。由于池化操作的降采样作用,池化结果中的一个元素对应于原输入数据的一个子区域,因此池化相当于在空间范围内做了维度约减, 从而使模型可以抽取更广范围的特征。同时减小了下一层输入大小,进而减小计算量和参数个数。
  3. 由于这个特征的提取,能够有更大的可能性进一步获取更为抽象的信息,从而在一定程度防止过拟合,提高一定的泛化性。
    注意:池化操作并不是卷积神经网络必须的元件或者操作。

1.4激活函数

激活函数的引入是为了增加整个网络的表达能力。如果若干线性操作层的堆叠只能起到线性映射的作用,无法形成复杂的函数。

1.5全连接层

全连接层在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样本的标记空间的作用。
在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1 × 1 的卷积;而前层是卷积层的全连接层可以转化为卷积核为h × w 的全局卷积,h 和w 分别为前层卷积输出结果的高和宽。

1.6目标函数

目标函数的作用则用来衡量该预测值与真实样本标记之间的误差。在当下的卷积神经网络中,交叉熵损失函数和ℓ2 损失函数分别是分类问题和回归问题中最为常用的目标函数。

二、卷积神经网络经典结构

2.1CNN网络机构中的重要概念

2.1.1感受野:可以理解为卷积核。

由于现代卷积神经网络拥有多层甚至超多层卷积操作,随着网络深度的加深,后层神经元在第一层输入层的感受野会随之增大。
trick:采用小卷积核同时可带来其余两个优势:第一,由于小卷积核需多层叠加,加深了网络深度进而增强了网络容量(model capacity)和复杂度(model complexity);第二,增强网络容量的同时减少了参数个数。

2.1.2分布式表示

神经网络中的“分布式表示” 指“语义概念”(concept)到神经元(neuron)是一个多对多映射,直观来讲,即每个语义概念由许多分布在不同神经元中被激活的模式(pattern)表示;而每个神经元又可以参与到许多不同语义概念的表示中去。
深度特征的层次性:
卷积操作可获取图像区域不同类型特征,而池化等操作可对这些特征进行融合和抽象,随着若干卷积、池化等操作的堆叠,各层得到的深度特征逐渐从泛化特征(如边缘、纹理等)过度到高层语义表示(躯干、头部等模式)。
以Alex-Net为例,浅层卷积核学到的是基本模式,如第一层中的边缘、方向、和第二层的纹理等特征表示。随着网络的加深,较深层例如从第三层除了一些泛化模式外,也开始出现一些高层语义模式,如“车轮”、“文字”和“人脸”形状的模型,直到第五层,更具有分辨能力的模式被卷积网络所捕获,以上的这些观察就是深度网络中特征的层次性2.2

2.2经典网络

2.2.1Alex-Net网络模型

Alex-Net的网络结构,共含五层卷积层和三层全连接层。Alex-Net的上下两支是为方便同时使用两片GPU 并行训练,不过在第三层卷积和全连接层处上下两支信息可交互。

2.2.2VGG-Nets网络模型

三、卷积神经网络的压缩

按照压缩过程对网络结构的破坏程度,我们将模型压缩技术分为“前端压缩”与“后端压缩”两部分。
前端压缩:是指不改变原网络结构的压缩技术,主要包括知识蒸馏、紧凑的模型结构设计以及滤波器层面的剪枝等;
后端压缩:则包括低秩近似、未加限制的剪枝、参数量化以及二值网络等,其目标在于尽可能地减少模型大小,因而会对原始网络结构造成极大程度的改造。
由于“前端压缩”未改变原有的网络结构,仅仅只是在原模型的基础上减少了网络的层数或者滤波器的个数,其最终的模型可完美适配现有的深度学习库,如Caffe等。
相比之下,“后端压缩”为了追求极致的压缩比,不得不对原有的网络结构进行改造,如对参数进行量化表示等,而这样的改造往往是不可逆的。同时,为了获得理想的压缩效果,必须开发相配套的运行库,甚至是专门的硬件设备,其最终的结果往往是一种压缩技术对应于一套运行库,从而带来了巨大的维护成本。

四、数据扩充

4.1.简单的数据扩充方式:

1) 图像水平翻转(horizontally flipping)
水平翻转操作会使原数据集扩充一倍。
2)随机抠取(random crops)
随机抠取操作一般用较大(约0.8 至0.9 倍原图大小)的正方形在原图的随机位置处抠取图像块(image patch/crop),每张图像随机抠取的次数决定了数据集扩充的倍数。
在此使用正方形的原因是由于卷积神经网络模型的输入一般是方形图像,直接以方形抠取避免了矩形抠取后续的图像拉伸操作带来的分辨率失真。
3)尺度变换
尺度变换一般是将图像分辨率变为原图的0.8、0.9、1.1、1.2、1.3 等倍数,将尺度变换后的图像作为扩充的训练样本加入原训练集。
4)旋转操作
将原图旋转一定角度,如-30度、-15度、15 度、30 度度等,同样将旋转变换的图像作为扩充样本加入模型训练。
5)色彩抖动
在此基础上,对原图或已变换的图像(或图像块)进行色彩抖动(color jittering)也是一种常用的数据扩充手段。色彩抖动是在RGB颜色空间对原有RGB色彩分布进行轻微的扰动,也可在HSV颜色空间尝试随机改变图像原有的饱和度和明度(即,改变S和V通道的值)或对色调进行微调(小范围改变该通道的值)。

4.2.特殊的数据扩充方式:

1)Fancy PCA
首先对所有的训练数据的R、G、B像素进行主成分分析(PCA)操作,得到对应的特征向量和特征值,然后根据特征向量和特征值可以计算出一组随机值,将其作为扰动加入到原像素中即可。
2)监督式数据扩充
首先根据原数据训练一个分类的初始模型。而后,利用该模型,对每张图生成对应的特征图或热力图。这张特征图可指示图像区域与场景标记间的相关概率。之后,可根据此概率映射回原图选择较强相关的图像区域作为扣取的图像块。

五、数据预处理

卷积神经网络中的数据预处理通常是计算训练集图像像素均值,之后在处理训练集、验证集和测试集图像时需要分别减去该均值。减均值操作的原理是,我们默认自然图像是一类平稳的数据分布(即数据每一个维度的统计都服从相同分布), 此时,在每个样本上减去数据的统计平均值(逐样本计算)可以移除共同部分,凸显个体差异。
需要注意的是,在实际操作中应首先划分好训练集、验证集和测试集,而该均值仅针对划分后的训练集计算。不可直接在未划分的所有图像上计算均值,如此会违背机器学习基本原理,即“模型训练过程中能且仅能从训练数据中获取信息”。

六、网络参数初始化

神经网络模型一般依靠随机梯度下降法进行模型训练和参数更新,网络的最终性能与收敛得到的最优解直接相关,而收敛效果实际上又很大程度取决于网络参数最开始的初始化。理想的网络参数初始化使模型训练事半功倍,相反,糟糕的初始化方案不仅会影响网络收敛甚至会导致“梯度弥散”或“爆炸”致使训练失败。

6.1.全零初始化

通过合理的数据预处理和规范化,当网络收敛到稳定状态时,参数(权值)在理想情况下应基本保持正负各半的状态(此时期望为0)。因此,一种简单且听起来合理的参数初始化做法是,干脆将所有参数都初始化为0,因为这样可使得初始化全零时参数的期望(expectation)与网络稳定时参数的期望一致为零。
存在的问题:当参数全为0时,网络不同神经元的输出必然相同,相同输出则导致梯度更新完全一样,这样便会令更新后的参数仍然保持一样的状态。即如若参数进行了全零初始化,那么网络神经元将毫无能力对此做出改变,从而无法进行模型训练。

6.2.随机初始化

将参数随机化自然是打破上述“僵局”的一个有效手段,不过我们仍然希望所有参数期望依旧接近0。遵循这一原则,我们可将参数值随机设定为接近0的一个很小的随机数(有正有负)。在实际应用中,随机参数服从高斯分布(Gaussian distriblution)或均匀分布(uniform distribution)都是较有效的初始化方式。
1)标准的高斯分布是均值为0,方差为1。
问题1,网络输出数据分布的方差会随着输入神经元个数改变。
解决办法,会在初始化的同时加上对方差大小的规范化。这就是Xavier参数初始化方法。实验对比发现此初始化方法的网络相比未做方差规范化的版本有更快的收敛速率。这样初始化的原因在于维持了输入输出数据分布方差的一致性。
问题2,Xavier方法并未考虑非线性映射函数对输入s 的影响。因为使用如Relu函数等非线性映射函数后,输出数据的期望往往不再为0,因此Xavier方法解决的问题并不完全符合实际情况.
Xavier方法改进:将非线性映射造成的影响考虑进参数初始化中,他们提出原本Xavier方法中方差规范化的分母应为√(n/2) 而不是√n
2)均匀分布
3)利用预训练模型,将预训练模型的参数作为新任务上模型的参数初始化。
由于预训练模型已经在原先任务上收敛到较理想的局部最优解,加上很容易获得这些预训练模型,用此最优解作为新任务的参数初始化无疑是一个优质首选。

总结
1.推荐的网络初始化方式为He方法,将参数初始化为服从高斯分布或均匀分布的较小随机数,同时对参数方差需施加规范化;
2.借助预训练模型中参数作为新任务参数初始化的方式是一种简便易行且十分有效的模型参数初始化方法。

七、激活函数

“激活函数”,又称“非线性映射函数”,是深度卷积神经网络中不可或缺的关键模块。可以说,深度网络模型其强大的表示能力大部分便是由激活函数的非线性带来的。
激活函数模拟了生物神经元特性,接受一组输入信号并产生输出,并通过一个阈值模拟神经元的激活和兴奋状态。

7.1Sigmoid函数

型函数作用后,输
出响应的值域被压缩到[0, 1] 之间,而? 对应了生物神经元的“抑制状态”,?
则恰好对应了“兴奋状态”。但对于??????? 函数两端大于?(或小于−5)的
区域,这部分输出会被压缩到?(或?)。这样的处理会带来梯度的“饱和效
应”(?????????? ?????)。不妨对照??????? 型函数的梯度图(图????),大于?
(或小于−5)部分的梯度接近?,这会导致在误差反向传播过程中导数处于该
区域的误差很难甚至无法传递至前层,进而导致整个网络无法正常训练。

7.2tanh函数

7.3Relu函数

7.1Sigmoid函数
7.1Sigmoid函数

八、目标函数

九、网络正则化

猜你喜欢

转载自blog.csdn.net/john_bh/article/details/80179720