目录
一、常用的卷积神经网络概述
二、基础的神经网络
三、卷积神经网络
四、AlexNet
五、NiN
六、VGG
七、GoogleNet
1、Inception V1
2、Inception V2
3、Inception V3
4、Inception V4
八、ResNet
九、ResNeXt
十、性能比较
十一、CNN的设计准则
目前主要的网络先是AlexNet,然后到VGG,到GoogleNet再到ResNet,深度是逐渐加深的分别是8层、19层、GoogleNet V1是22层和ResNet第一篇文章是152层,其中VGG和ResNet结构简洁而且性能比较好,因此使用比较广泛。GoogleNet的性能最好,但是网络很复杂,思想是先分级再分支然后再各自做变换然后再合并,就是增加了网络的宽度,先分支各个网路做各自的卷积或池化,最终把结果串接起来形成更多的特征通道。残差网络主要是对通达上的操作,通道拆解。目前网络有三大维度,深度、宽度(GoogleNet主做的维度)、残差网络的升级版ResNeXt增加了维度基数,因此有三个参数来表征网络的复杂度,换句话说就是模型的表达力,网络越复杂模型表达力越强。
先是AlexNet之前的是浅网络(BOW和SVM),19层VGG的Top-5 error是7.3,,22层的GoogleNet是6.7,但是GoogleNet很复杂,因此经常使用性价比更高的VGG网络。残差网络加直连又是性能很大的提升。可以看出从AlexNet到VGG提升很大,VGG到残差网络也提升很大,GoogleNet是不断得在做改进,从V1到V4不断地在做改进。
神经网络的概念是90年代提出的,后来被SVM替代,因为神经网络性能有瓶颈,而且理论证明不完善,还是一个黑箱。深度模型理论相对于90年代并无太大变化,只是层数加深了,多了一些细节上的变动,再加上GPU的发展,大数据集标注,神经网络开始复苏。神经元的输入是x1到xD,w1对应着x1权重相乘后相加,加起来后经过激活函数,以前的激活函数是sigmoid函数,所有的值都压到0到1之间,输出一个值,输入是x,权重向量w是要学习的,还有个偏置bias,也可以换成矩阵内积的形式。
以前的基础网络基本上都是三到五层,输入层、输出层、隐含层视情况而定,有的是3有的是1还有的是2,这个是超参,调参的时候可以具体观察哪个效果好。一般情况下层数越多会对梯度消失有影响,不一定是深度越深性能越好,以前神经网络的性能有瓶颈主要就是梯度消失问题。一个神经网络只要深度足够深,理论上可以拟合出任何复杂的函数,按理来说越深拟合能力越强,拟合能力越强自然性能越好。面临的主要问题时梯度消失,因为网络深的话梯度回传不到最前层,前几层的训练就会失败。另外一个问题就是过拟合。有时候可以没有隐含层,梯度就是求导数,因为输出要定义一个损失函数Loss Function,损失函数是在训练集上训练时候优化的目标,让函数越来越小,目标是让输出与数据集的标注ground truth尽可能逼近。Loss Function就是这个作用,可以简单理解为差平方函数,就是把ground truth的值和输出的值相减,然后平方和,基于所有的数据相加,这就是Loss Function。用梯度下降将一个函数的值慢慢变小,把Loss Funtion的梯度往回传,一直传到输入端,传到输入端期间的参数都在不断的优化,包括偏置b。接下来是后向传播,后向传播时back propagation,使用方法为求导的链式规则。
梯度下降需要有一个损失函数。交叉熵中a表示模型的输出,介于0到1之间是个概率值,y表示ground truth值为0或1,希望y是0的时候a也是0,或者y是1的时候a也是1,在实际训练中a不是1,但是慢慢向0推进。因为数据集当时很小,使用批量梯度下降,批量的意思是每一次优化基于所有数据集。数据集大的话就要使用随机梯度下降,这时候一个方向就是有问题的,随机梯度下降由于只使用了部分或一个方向去做优化,大的方向是指向最优点,但不是直接指向的,方向是歪的,因为单次优化的数据集比较小。梯度下降因为是每次迭代都要算梯度,梯度只是指出下降的方向,具体要下降多少就是学习率/步长。梯度下降的原理如右图所示,每迭代一次,就让交叉熵的损失小一些,计算的梯度本质上就是损失函数王最低值变化的方向,有了方向乘以步长和学习率。红箭头是梯度方向,步长是设置的学习参数,沿着率箭头下降多少。一维的梯度下降,曲线就是loss function,切线代表梯度方向,学习率决定梯度下降多远,基于这个方向再下降,然后学习一定的步长,不断的迭代和下降最终会收敛到最低点,到最后的时候梯度下降的方向就不是那么陡了,自然学习效率就不高了。迭代次数的判断方式为:设置最大迭代次数或目标的损失函数值,达到这个值就停止,还有一个是early stop,到后几步优化的百分比很小,甚至出现变大,这个时候就停止。
卷积神经网络和传统基础的神经网络比较像,卷积层就是之前的隐含层,卷积是二维的本质上和全链接一个操作,卷积网络的激活函数为relu,池化层用于降维,池化操作有两种平均池化核最大化池化。全连链接层是基础神经网络的映射层,批归一化层在AlexNet和VGG中都没有使用,GoogleNet和ResNet使用了。任何一个问题都可以表达成一个损失函数,损失函数都是有一个全局最优点的,但是由于数据集太大,内存太小,引起计算量太大,致使梯度回传达不到全局最优点,一般来说,达到局部最优,这个模型性能基本上就可以了。但是无法判断达到最优的程度,因为数据太大,模型太深,并且是个黑箱,因此这个函数很复杂,相当于一个很高维的函数。之前有学者指出,神经网络不是凸函数,达不到最优,后来又有学者指出最关键的是鞍点问题,鞍点是优化没办法达到全局最优的一个重要问题。
计算机视觉中卷积中输入一般是一张图片有红绿蓝三个通道组成一个三维的张量。
右上角的卷积层是一个动图,有一个卷积核,其实就是一个3D滤波器,以扫描窗的形式从左向右从上向下,不断的对图像做卷积,卷积的操作就是权重相加再加个偏置,卷积核的参数是权重相加的权重参数,图像的像素值或者是特征图片的像素值是被权重相加的变量,核的参数是需要学习的。因为核的大小有限,因此核实提取局部特征的操作。同一个卷积层里面有多个卷积核,卷积核要把输入的图片或特征图卷积一遍,一个核就对应一个特征层,多个核就对应多个特征层,特征层又称为通道,这些参数是需要学习的。左下角有原始输入图片,下面是滤波器的库,不同的卷积核对图片做下卷积,卷积操作为函数的第一项,有五个卷积核输出就有五层。右下角展示了有两个卷积核的情况,蓝色是一个卷积核红色是一个卷积核,红色输出的是左边的一层,蓝色输出的是右边的一层。512个核就是512层,捕捉了512种局部特征。因为在模型的训练过程中有前项和后项,前项是卷积的正常操作,本质上每个核都要卷积一遍,为了计算效率实际上会转化成矩阵乘。可以认为每个核提取一种特征或者认为是提取出一种梯度特征。一个卷积层对应着很多卷积核,这个是超参,有点卷积层有128有的卷积层有512,层越深卷积核的数量越大,因为层数越深,图片尺寸在降低,特征需要不断增维,特征增维就是因为核数变多了,用多少核是实验决定的。比如AlexNet并没有解释核的具体原理,某个层为什么使用那种核,只是给出了一个大概的原理。数量使用实验决定的,原因不清楚,这也是为什么神经网络时黑箱的一个原因,因为不清楚用多少核合适。一个卷积核的参数在扫描过程中是共享,核本身就是一组权值,基本的操作就是点积。输出的所有特征层做串接而不是相加。比如输入特征是6x6,一个卷积层的输出也是6x6,两个卷积核输出两个6x6就是一个三维矩阵2x6x6,512个核就是512x6x6,三维矩阵的厚度不断增加。这512个核有各自的参数,他们不做共享,但是这个核在扫描所有图片的时候参数是不变的,这个是共享的。因此是二维生成多维,低维生成高维,同时要降图片尺寸,就是一种不断的抽象。
卷积核的数量和输出的数量相等,核的尺寸都是基数的方便对称计算,步长就是扫描窗扫描的跨步,比如右上角,扫描步长是2,零填充是为了保证输出的尺寸和输入的尺寸相等,比如右上角,因为卷积核的尺寸时3x3因此填充一层零就可以了,步长是2,核的数量是5。W、H、D分别是输出的宽度、高度、通道数,size是卷积核的尺寸,padding是补零的层数,stride是步长,就是输出的特征尺寸,通道数是由卷积核数量决定的。对于灰度图卷积核是二维的,对于RGB图像卷积核是三维的参数。超参都是设计出来的,在训练前就要定下来。卷积神经网络无法原理解释。卷积核厚度由输入图片或特征的厚度决定的。
左下角输入图片和一个3维的卷积核,生成一个特征点,如果步长大于1的话图片尺寸就会降维,加入步长是2,图片就降两倍。右边输入图片图片是32x32x3,卷积核的尺寸是5x5x3卷积核的数量是6意味着有6个特征层,无补零,特征输出是28x28x6,6就是特征层的数量,28是卷积后的尺寸,因为没有补零,因此尺寸就变小了,步长是1。核数和输出的通道数相等。感受野越大,核的尺寸越大,考虑的信息越周全,但是计算量更大。当特征图下降时,即使卷积核尺寸不变,感受野也是变大的。一个核卷积出一层特征,这个核是要考虑三个通道的,理论上需要一个三维核,但实际上一个核就可以处理三个通道。1x1卷积核用于升维和降维。因为参数有归一化,后面有两种归一化加入了,一般情况下认为,自己可以学习出归一化成份。共享参数指的是同一个核做卷积的时候无论扫到哪个位置,参数是不变的,按照神经网络的理论,每个位置需要各自的卷积核,因为不同的位置需要不同的信心需要不同的卷积核去处理,但由于计算存储有限,所以就使用一个参数,不同位置上的卷积用一套参数。因为有激活函数,所以可以解决一点溢出问题。
左下角是sigmoid函数,进行0到1的压缩,任何值都可以压缩到0到1。卷积神经网络中主要使用ReLU函数,这个就解决可梯度消失问题,因为sigmoid在较大值和较小时梯度很小,梯度回传的时候,如果值处在这个区间时,很容易发生梯度消失,梯度很难回传,就是sigmoid在深度学习中使用不广泛的原因。
ReLU是一个分段线性函数,没有饱和的问题,这是比sigmoid有优势的地方,所以能减轻梯度消失问题。AlexNet能成功训练的一个重要的原因就是使用sigmoid函数的引入,因此后面的CNN基本使用的都是ReLU函数。左图任何三维曲面函数都可以拆分成分段平面函数。中图是卷积完后输出的值,通过激活函数后生成右图,确实能解决梯度消失的问题。一个特征图是共享同一个卷积核的参数。
上图给出了一个简单的例子,首先进行卷积两个卷积核输出两层特征,每层各自通过ReLU激活,形成一个新的两层的特征层,再通过卷积降维,这个卷积的步长可能是2或者更高,卷积成小尺寸,前面的卷积可以认为步长是1,并且没有补0,卷积输出再通过ReLU激活,再形成最后的输出。所以基本的配置是卷积层后面追加一个激活函数,这是最基本的配置。因为激活在人的神经元中的原理是达到一定阈值后采取刺激、激活下一层的输出。因为卷积操作本质上是一个线性操作,而激活函数本质上是一个非线性操作,使用激活函数可以增加非线性,就可以近似拟合所有函数。
CNN网络最终要输出标签,最终的神经元是有1000个神经元的节点。池化主要是特征融合的作用,右上图给出的是最大化池化。对于多通道层,每个通道进行各自的池化操作。池化不降通道数而降低特征图的尺寸。没有中位数池化,因为GPU擅长并行数值计算,CPU擅长排序。
全链接是抹掉空间信息的层,将二维变成一维的操作,后面的推理和传统神经网络一样,起到推理或分类。全局感受野相当于卷积,参数是要学习的。可以认为卷积核和尺寸和输入特征图的尺寸是一样的。通过卷积把图片尺寸或特征尺寸降维以后尺寸变小,通道变厚。接一个全链接层,全链接层的作用是1xk,有k个神经元,每个神经元要把用特征层的核去做权重相加。特征的长宽是HxW,那么卷积核也是这个尺寸,卷积核的厚度为C。K是所有卷积核的数量,全链接后所有链接和传统神经网络相似(也称为全尺寸卷积)。
全链接层结束后最后一层就是softmax层,这个层为归一化层,归一化的作用是把所有的输出全部压到0到1的概率值。K是前一个全链接层,也就是接在softmax层的全链接层的维度。softmax是和逻辑回归很像的一个函数。所以最终输出的都是归一化的概率,例如ImageNet有1000个输出,最终sotftmax层的全链接层的维度都是1x1000。一个神经元代表一个类,选择输出最大的概率对应着图片的分类结果。训练过程中每个类都要输出一个概率。基于label构建损失函数,对最终的输出概率去log值相加loss,softmax是对逻辑回归的泛化,相当于增加逻辑回归的数量,原理和交叉熵类似。
AlexNet有很多工程技巧ticks,有的有数学原理,有的只是直观的理解。去像素的中心化就是所有数据集训练的图片,都要把各自通道上的像素值相加求均值,求出均值后分别把每个图片通道上的都减均值。防过拟合提高泛化能力首先就是数据强,256x256分别提取中心和四角的224x224子图片。因此一张图片可以变换成十张图片,中心化是为了保证分布在同一个位置上,没有偏移。Dropout是一个很重要的东西,防止过拟合,失活率是0.5一般是在全连接层做,因为全链接层负责推断,卷积层负责特征提取。最后一个全链接层FC进行Dropout,对部分神经元不进行梯度回传,这样就可以防止过拟合,也防止网络特别依赖所有的节点,让各个节点都有自己的推断作用,卷积层没有Dropout。
AlexNet在ImageNet-2010图像分类竞赛上取得了第一名,之后DNN正式开始,5个卷积层,3个全链接层,一共8层网络,softmax不算是一层,softmax只是概率上的归一化。参数是60M,神经元有65个,因为当时显卡的内存有限,所以需要分成两组,把一个网络拆成两部分放在各自的显卡上操作,训练时间为一周,但是要比CPU要快50倍加速。采用的新技术为ReLU非线性激活,Max pooling池化和Dropout。
AlexNet有5个卷积层,后面是3个全链接层,中间的虚线是卷积的过程,里面的是卷积核。输入图片为224x224,第一卷积层是11x11的卷积核,上下两部分输出都是48,上下两部分指的是GPU的两个部分。第二层是5x5的卷积核,输出128个通道。第三个卷积层开始的时候才在两个显卡之间有信息的交互,之后两个显卡分开,之后的卷积核都是3x3,输出通道分别为192、192、128,在全链接层对上下两路进行合并。
AlexNet提出了局部响应归一化,用来模拟神经元侧抑制机制。N为通道数,也是卷积核的数量,归一化邻域是n,n是一个偶数。上图表示五个通道,有红点的是中心通道,在这个通道上做归一化,n代表左右各找多少个通道,找到后平方和相加,乘以系数,再加权重作为分母,用中心值除以分母,计算出归一化值。下面是AlexNet的具体配置。
红色代表输出通道数,第三卷积层有GPU交互,最终是log概率和。通道独立就是各显卡做各显卡的卷积,通道合并就是跨显卡做卷积。一般情况下,能放到一个GPU中就方法一个GPU中,放到单GPU的性能一般好于多GPU。
为了提高CNN的局部感知区域,提出了Bottleneck Layer。操作即使1x1的卷积做降维或升维。通道上是1XC的向量,通过1x1的卷积。做特征的重新整合的意义在于特征更加紧密,也可能是计算性能的要求。
VGG网络里提出了核分解,7x7的卷积核可以分解成3个连续的3x3的卷积核连续做卷积,这样做的原理是将参数。C是通道数,通道数假设不变一直是C,中间由ReLU连接。
上图是VGG网络的结构参数,使用最广泛的是VGG-16和VGG-19,分别代表16层和19层的VGG网络,VGG-19性能更好。输入图片一般是224x224,为了在比较性能时的公平性,高分辨图片输入的效果要好,所以输入同一化,这样比价性能时更客观。维数一般升高两倍,也降低两倍,使用用最大池化。右图为流程图,池化的步长为2。固定尺寸限制主要是最后一个卷积层往全链接层固定时有限值,因为卷积网络的参数要写死,超参也要写死,如果图片尺寸变动,最后一个卷积层的输出也要变动。就没办法使用固定的网络映射到固定的全链接层上了。把全链接层去掉的网络都可以接受任意的图片,因为最后一个卷积层到全链接层使用的是全尺寸卷积核,而此参数是写死的,如果输入图片的尺寸发生变化,最后一个卷积核的尺寸可能不匹配。改进网络时都在前一代网络上做改进。
GoogleNet和VGG是同期出现的,参加了2014年的ImageNet竞赛,GoogleNet是第一名,VGG是第二名,但是GoogleNet网络特别复杂,VGG网络特别简单有效。虽然VGG性能排第二,但是在后期中一般VGG使用比较广泛,因为VGG最好改进和应用,GoogleNet因为网络太复杂,因此使用相对较少。一共有四个版本,V1基本上和VGG同期,V3和V4基本上和残差网络同期。基本的宗旨是减少参数增加模型的复杂度,增加宽度和深度,保证低计算量和块的计算效率
提出了Inception模块,这个模块中实现了分支和合并的思想,为了提升Inception模块的多尺度适应性。同时还增加了网络的宽度,引入了三个尺寸的卷积,1x1卷积、3x3卷积、5x5卷积和3x3池化,可以认为这四种并行操作各自捕捉各自的特征,最终做一个通道上的串接。为了减少计算量,中间加入了1x1的卷积来做特征降维,因为并行操作增加了很大的计算量,所以先用1x1的卷积核做特征上的降维,计算量大概降了10倍,但是性能上能保证,通过降计算量可以保证深度更深。相应的提出了两个问题,取消全链接,全链接主要负责推断用,而且参数量特别大,为了减轻网络的负载,把参数比较大的全链接层去掉了,最后一个层只接一个全尺寸卷积层。因为网络又宽又深,因此除了住的分类器外还加了辅助分类器。中间的两个深度层是为了解决前几层的梯度消失问题,因为网络太深了,梯度回传到前几层,已经基本没有什么梯度了。
左边的结构捕捉多尺度的特征,不同的卷积核尺寸不同,必然感受野不一样,一个物体大一点小一点基本都能捕捉到,在1x1、3x3、5x5感受野的范围内。这是首个提出的split-merge,串接后合并所有分支的思想。引入Bottleneck Layer来解决计算问题。左边是原始的设计1x1卷积、3x3卷积、5x5卷积和3x3的最大池化。高性能的Inception是引入1x1的卷积给通道数做降维,对池化来讲,1x1的卷积会放在池化后面,这就是3个1x1放的位置,所以V1的基本模块如右下角的图所示,网络里基本都会出现这个模块。
全连接层本质上是一个全尺寸的卷积层,接在最后一个卷积层的输出上,AlexNet和VGG全链接层都是三层的参数量,AlexNet最后一个卷积层的输出是6x6的尺寸,通道是256。VGG最后的输出是7x7,通道数也是256。因为第一个全链接层的维数是4096,4096个输出通道就需要4096个卷积核,因此第一个全链接层的参数量最大,后面就会小一些,加起来分别是58.6M和72M。如果不使用全链接层,就可以多加几个Inception模块,这样在特征提取层面模型的复杂度更高,模型的表达力更强。实验证明只需要全尺寸的平均池化就可以了,后面在加上一个softmax推断层。输入是7x7x1024,输出是1x1x1024。V1开始后面都没有全链接层了,这是一个大的设计趋势,包括残差网络也去掉了全链接层。
上图是V1网络的构架,一共有9个Inception模块,前面是一个大的卷积,最后有个主分类器,两个辅助分类器(两个红框),左图为主分类器的构架。
第一列是层的类型,3a、3b代表inception模块,并且尺寸是一样的,都是28x28,4系列都是14x14,5系列都是7x7。标的第一列patch size/stride分别代表尺寸和步长,第二列代表输出的数量,第三个值代表通道,前两个是输出的尺寸长乘宽,可以观察到通道越来越小,通道越来越大,因为中间使用了很多inception模块,所以很多中间不像是残差网络是很明显的2倍关系。5到9列代表的是Inception模块的参数情况深度是不变的情况下的inception模块,第5到第9列加起来正好是输出尺寸的层数。
将上表的网络展开如上图所示,绿色部分使用的是AlexNet的跨通道归一化,蓝色部分代表卷积,红色部分代表池化,中图和右图分别加上辅助分类器和最终分类器。主分类器取消了全链接层,辅助分类器没有取消全链接层。主分类器是为了对接到softmax层上,因为softmax输出的维数有限值,所以必须加上一个简单的全链接层,而辅助分类器有多个全链接层。
V1只要是两大贡献就是Inception模块和取消全链接层,其他都是辅助的。V2提出了批归一化,批归一化是一个很重要的操作,这个操作以后的神经网络都在使用,包括残差网络、GAN。GAN。GAN在做图像生成的时候,w-GAN出现之前,BN非常重要,是决定GAN能不能训练成功的决定因素、思想是要解决在不同层上分布不均衡,称为协相关偏移问题。简单来讲是白花,因为把每一层的输出都归一化到0到1的正态分布。这样做的好处是允许较高的学习率,并取代部分的Dropout,换句话说通过把每一层上的数据做一下归一化把偏移的问题解决掉,这样的话可以避免一部分的过拟合。因为Dropout本来是防止过拟合的。另外一个重要的思想是卷积核的分解,比如把一个5x5的核分解成两个3x3。
批归一化的原理如上图所示。因为在训练的时候数据集很大,没有办法把所有数据一次性的提取进来计算损失,取了折中,根据设备的限制。通常情况下batch越大越好,如果显存不够的话,只能将batch设置小一点。mini-batch一次只进行32个数据进行训练或者64个数据进行训练。32个数据称为一个batch,一批批的送,batch之间的数据要进行归一化。假设batch的尺寸是32,一次送32个图片,图片进去后每一个卷积层的输出都对应32个图片。假如某一个卷积层有K个输出通道,输出K个特征,batch在K个通道上,每个图片对应一个WxH尺寸的特征,所以32个通道都是WxHx1的特征(图中只画出了三个)。对着32的特征图片算出它们的平均值和标准差,计算得出后再对计算出的层做归一化,一共算32张图片,计算次数为K次。归一化就是减去均值除以标准差。
因为强制归一化会抹杀数据特性,比如有的数据确实均值高一点,强制归一化到0这个位置的话就会出问题。中间还要除以方差来调整正太分布的宽度,如果强制把标准差设置为1,这种情况下,必须配对使用尺度变换和偏移。BN是学习出来的,尺度变化和偏移是学习出来的,公式中代表强制归一化的值,代表最终向后传播的结果,代表尺度因子,代表偏置,k代表第k个卷积特征。和需要学习。这样的话,假如说,卷积层的输出要对应一个批归一化层,卷积层的输出是K个通道,因此做BN后需要进行K次尺度和偏移,每个通道上对应一组尺度因子和偏置。V2在卷积层和激活层之间,relu激活要把卷积层的线性输出,压成非线性,因为卷积层用来提特征,因此某些特征会损失掉。如果在relu后使用BN,因为数据进行了扭曲和非线性变换,从直观上理解效果不好,应该在原始的分布上把这个问题解决了比较好,之后再通过激活层对输出非线性,所以一般不会用在激活层之后。因此BN层实际上有两层,一层不需要学习参数,另一层需要学习尺度因子和偏移量。
因为BN层是基于mini-batch做计算的,训练时候需要mini-batch,而测试的时候并没有mini-batch。训练阶段是是是计算,每一个batch进来都会有一组batch数据。在训练过程中,要把每次进来的batch的均值和标准差都存储,比如说有10000个数据,batch是100,10000个数据都训练后是一个epoch,这个epoch里面有100个batch,训练1个epoch,每个BN层会存100个batch。保存之后,测试时对batch求平均值,用这个平均值作为测试阶段的batch数据。
Inception V3提出了卷积再进行分解,因为5x5分解成3x3就不能再往下分了,3x3是没有办法分解成1x1的。这里采用的方法是一个NxN的卷积会分解成一个1xN的卷积和一个Nx1的卷积,如右上角的图所示,但这样能降低参数量和计算量。V 3的工程性质比较重,因为不同的层使用了不同的分解方式。分辨率为35的时(W=35,H=35)使用的是将5x5的卷积分解成两个3x3的卷积。17x17的层上使用了上述分解方式。更深层8x8的分辨率,用并行操作来增加特征维度,上述就是三种分解方案。这么做的原因是工程性的实验积累,理论上无法解释。
V3除了提出了卷积进一步分解的三种方式,还提出了一种特殊的池化。一般的池化通道数不变,会减少信息量,造成表达瓶颈,这里的提出的池化方式在保证特征降维的同时将特征图的层数增加,来解决表达瓶颈问题。正常升维度的方法是通过1x1的卷积来上升通道,但是这样会大大增加计算量,另一种方案是先做尺寸降维,但是会有表达瓶颈。Inception v3提出了另外一种方案,在做池化的同时进行两路1x1卷积的降维,把最后的特征串接到池化特征后面,加入原始特征是320个通道,两路降维各有160个通道,因此最终有640个通道,通过两个卷积来补充最终的信息。
通过实验发现第一个浅层的分类器无效果,而且这个分类器只在后期fine-tune阶段才有效果,因此取消开始的辅助分类器,辅助分类器只使用在最后才有效果,并且有正则化的效果。还使用了BN和Dropout。因为数据量比较大,即使多千分之几也会多出很多图片分类正确。
V3的工程性质比较强,证明了卷积的一维分解可行。总体来讲,V3网络要解决的问题是避免表达瓶颈,而且不增加明显的计算量,就使用了卷积的分解。上表表示V3的参数表,因为层数加深用表格表达比较方便。输入尺寸中每一通道的输出尺寸是前一通道的输入尺寸,5、6、7使用分别使用三种不同的Inception方案,池化使用全尺寸卷积。
V4最重要的改进是给inception模块加入直连,竖线右部代表原始deinception模块,左边从relu激活到下一个relu之间加了一个直连。
残差网络的主要思想是加直连,原文中称为跳跃连接或短连接。左边指的是原始的卷积网络。加一个直连接到输出上,原来只使用卷积输出,现在加上输入。这是残差网络的基本模块,用这些基本模块堆成残差网络,能保证模型深度更深,同时收敛更快,梯度消失能更好的的解决。从直观上理解,在做梯度下降优化时需要对x求偏导,对一维函数H(x)求导,由于x的导数为1,因此梯度永远不会消失,由于反向传播时使用导数的链式规则,由于每一层的导师大于1,因此最终导数的乘积大于1。如果不使用这种连接,使用原始导数,如果导数都小于1,相乘后梯度就会变得很小,最终导数值就会变得非常小。取名残差的原因是F(x)此时只在模拟残差函数,如果只拟合残差函数时,当梯度很小时,就很轻松,相当于残差对x进行修正,当梯度很小的时候,强制让两个3x3的卷积去拟合梯度扰动。
左下图代表残差的具体原理图,取消了最大值池化,尺寸降维用卷积来操作,全链接层和Dropout,因为Dropout是防止过拟合,所以这种操作可以有效防止过拟合。残差网络是在VGG-19上做改进的,变为34层的普通网络和34层的残差网络,实验证明比VGG-19效果好很多。
对34层的残差网络,输入图片输入后生成7x7的特征图,接下来使用通道数为64的残差块,因为一直做3x3的卷积和padding,因此特征图尺寸不变。虚线代表降维,尺寸缩小两倍,通道数增加两倍。最终使用全尺寸池化输出分类。网络结构很简单,但是性能很有效。
为了更近一步的增加深度,使用了3x3的卷积分解。优化时先用1x1卷积进行降维,然后做3x3卷积,最后再用1x1的卷积升维。参数可以大大减少,并提升深度。50/101/152分别代表50层、101层、152层,这些层将1x1的卷积计算在内。
上表代表不同层数的配置,分别是18层、34层、50层、101层、152层,最开始的第一卷积层都是一样的,后面的卷积都是残杀卷积,x2代表的是用了两个残差模块,层数越深使用越多,中括号里50层及其以上使用了bottleneck。
之前的网络都是宽度和深度两大维度,深度就是层越深,宽度就是层越多。分支主要是不同操作的分支,有一个1x1卷积分支、1个3x3卷积分支和一个池化分支四个分支操作不一样。引入了cardinality,借鉴了VGG网络中分显卡训练的split-merge思想。前面的inception是四个分支,每个分支上出8个通道,穿起来就是4x8共32个通道,不做分支只做相加,也就是每个通道上有8个分支的话,相加还是8个通道。每个通道设计的分支完全一样,只不过每个分支进行操作的时候通道数量维数更低。最后低维度卷积后做一个特征的升维,升到输出的数量做加法合并。可以在同参数模型下,增加结构,增加的结构就是基数。相当于定义了第三个维度,网络的基数来提高模型的表达力。增加任何一个都会提升模型表达力,模型性能会更高。100层ResNeXt的参数规模相当于200层的残差网络。
原始的参数网络输入是256个通道,在256个通道上做1x1的卷积,生成64个通道的输出,然后在64个通道上的卷积做3x3的输出,再在64个通道的特征图上做1x1的卷积做升维,把64升到256个通道最终是256的输出。拆分后对256的卷积做1x1的输出,输出的通道数是4,共16个,在4的通道上做3x3的卷积,输出还是4。最终用1x1的卷积把通道数由4升为256,16个通道的构架完全一样,但是参数不一样,最后做加和。原来是64通道的输出,现在是4个通道的输出,原来是64个通道上做3x3的卷积,现在是32个4x4的通道,参数数量一样,ResNet需要更多的层数。
FLOPs是浮点计算吞吐量,衡量显卡计算的性能,都是50层的情况下,ResNet是4.1billion,ResNet是7.8billion。增加cardinality基数会不断提升性能,不断降低维数,是为了保证使用的参数量是一样的。
这是ResNeXt的参数量,C指的是基数。ResNeXt-50下的中括号代表32x4d结构块。一共32个分支,每个分支负责4个通道,Bottle width指的是4,性能一定等提升,比如32x8或32x16,改进后的宽度是128,原来是64。左下角是性能,最终极网络的性能分别为19.1和4.4,原始的残差网络分别为20.1和4.8。
注意:必须使用全链接层,因为需要把二维压成一维。
下面是准确性和执行效率的对比。X轴是计算量,Y轴是top-1 error,圆的大小代表参数量。
在场景分类上做性能对比,这里使用了AlexNet、GoogleNet、VGG和ResNet,从表中可以看出VGG和残差网络各有优劣,但是VGG明显比ResNet复杂度低,
第一个设计准则是尽量避免设计瓶颈,也就是说在卷积过程中空间尺寸是不断会变小的,输出通道C是要变多的,数据量必须要维持一个比较小的变化,实际操作中数据量要慢慢变小,也就是说,C的增加量弥补不到宽高的减小量,减少的太快的话,会造成信息瓶颈。1x1会遵循这个准则,但是总体上会小量变小,从这个角度来讲信息损失并不大。
另外一个准则是卷积核数量要保证在可控范围内,卷积核数量不能太大,通道数量也不能太大。因为太大的话,会带来很大的参数量,参数量大的话,会造成计算量指数级的增长,因为向后传播的话,都是相乘递加的。用C和K控制参数数量,K可以理解为输入数量,C可以理解为输出数量,一般都是3x3、5x5、7x7这种,再大就不多了。复杂度主要靠输入通道和输出通道控制。
感受野要足够大,第一层感受野大一点要好,如果是三个连续的3x3可能对一次连续捕获三个感受野有问题。感受野大的时候特征捕捉的越稳定,但是大的话,参数和计算都会变大,在后层网络中,用几个连续的3x3代替7x7的感受野。因为每个3x3后面要配一个relu激活。
另外一个策略是用分组来降低计算量。AlexNet是在不同GPU上分组,Inception通过分支做拆解,ResNeXt是在基上做拆解。做拆解时一个7x7的矩阵可以拆解为3个3x3的矩阵,复杂度为CxK/G,做拆分的话复杂度是CxK。
Inception采用空间的低秩分解。3x3分解成1x3和3x1,滤波器通道拆解通过NiN来弥补信息损失。