aihot  2017-12-11 23:50:23  机器学习 |   查看评论   

      前面我们通过几个数值展示了几个比较经典的网络的一些特性,下面我们就花一点时间来仔细观察CNN网络的变化,首先是VGG在网络结构上的一些思考,其次是Inception Module对于单层网络内部的扩展,最后我们再来看看ResidualNet对于网络计算的改变。当然,我们在介绍这些模型的同时还会聊一些同时代其他的模型。

VGG模型

      介绍VGG模型的文章中自夸了VGG模型的几个特点,下面我们来仔细说说,

      首先是卷积核变小。实际上在VGG之前已经有一些模型开始尝试小卷积核了,VGG模型只是成功案例之中的一个。

      那么小卷积核有什么好处呢?文章中提出了两个好处,首先是参数数量变少,过去一个7*7的卷积核需要49个参数,而现在3个3*3的卷积核有27个参数,看上去参数数量降低了不少;第二是非线性层的增加,过去7*7的卷积层只有1层非线性层与其相配,现在有3个3*3的卷积层有3个非线性层。非线性层的增加会使模型变得更加复杂,因此模型的表现力也有了提高。

      同时在文章还提出了VGG的模型收敛速度比之前的AlexNet还要快些,从后来人的角度来看,参数训练的速度和本层参数的数量相关。之前我们分析过CNN模型参数的方差,我们假设对于某一层,这层的输入维度为N_l,输出维度为N_{l+1}那么该层网络中每个参数的方差应该控制在\frac{2}{N_l+N_{l+1}}。如果输入输出层的维度比较大,那么参数的理想方差就需要限定的更小,所以参数可以取值的范围就比较小,那么优化起来就比较费劲;如果输入输出维度比较小,那么每个参数的理想方差就会相对大一些,那么可以取值的范围就比较大,优化起来就相对容易些。从这个角度来看,减小每一层参数的数量对于优化来说是有意义的。

      其次就是卷积层参数的规律。首先卷积层的操作不会改变输入数据的维度,这里的维度主要指feature map的长和宽。对于3*3的kernel,卷积层都会配一个大小为1的pad。同时stride被设为1。这样经过卷积层变换,长宽没有发生变化。这和之前的卷积层设计有些不同。而且每做一次pooling,feature map的长宽各缩小一倍,channel层就会增加一倍。这样的设计对于不同的feature map维度来说适配起来都比较容易。对于一些通过卷积减小维度的模型来说,对于不同的输入,卷积后的输出各不一样,所以适配起来有可能不太方便,而现在只有pooling层改变长宽维度,整体模型的维度计算就方便了许多。于是在论文中有输入为256和384等维度,模型不需要根据不同的输入维度设计不同的卷积结构,使用同样的结构或者直接加深网络深度就可以了。

      此外,模型也提到了1*1的卷积核,这个卷积核我们在后面还会提到。这种卷积核也不会改变feature map的长宽,同时又可以进一步地增加模型的非线性层,也就增加了模型的表现能力。

      上面就是VGGNet在架构上做的这些改变,这些改变也被后面一些的模型所接纳。

丰富模型层的内部结构

      提到模型的内部结构,我们就来到了GoogLeNet模型(这个英文单词是在致敬LeNet?),模型中最核心的地方就是它的Inception Module。在此之前还有一个研究模型层内部结构的文章,叫做Network In Network,其中的道理也比较相似。

      Network in Network和Inception Module这类结构主要看中的是模型在局部的拟合能力。有些模型在结构上是采用“一字长蛇阵”的方法,对于某一个特定的尺度,模型只采用一个特定尺度的卷积核进行处理,而上面两种模型却认为,采用一种尺度处理可能不太够,一张图象通常具有总体特征特征和细节特征这两类特征,我们用小卷积核能够更好地捕捉一些细节特征,而随着小卷积不断地卷下去,慢慢地一些总体特征也就被发现。

      可是这里有一个问题,那就是我们在网络前段只有细节特征,后段才慢慢有一些总体特征,而有时候我们想让两方面的特征汇集在一起,同时出现发挥作用。那么采用单一的卷积核恐怕不太容易解决这样的问题。

      于是上面两种模型开始考虑,与其把模型加深,不如把模型加厚(其实深度差不多),每一次feature map尺度的变化前后,我都尽可能地多做分析,把想得到的不同来源的信息都尽可能得到,这样的特征应该会更有价值吧!

从乘法模型到加法模型

      ResNet的核心思路就是把曾经CNN模型中的乘法关系转变成加法关系,让模型有了点“Additive”的味道。关于这个问题,文章中采用一个极端的例子作说明。

      假设我们已经有了一个较浅模型,我们的目标是去训练一个更深的模型。理论上如果我们能够找到一个靠谱的优化算法和足够的数据,那么这个更深的模型理论上应该比那个较浅的模型具有更好的表达能力。如果抛开优化和可能的过拟合问题不管,这个道理还是可以成立的。

      就算较深的模型不能够超越较浅的模型,至少它是可以作到和具有较浅的模型同样的表达能力。如果我们把较深模型分成两部分——和较浅模型相同的部分,比较浅模型多出来的部分,那么我们保持和较浅模型相同的部分的参数完全相同,同时让多出来的模型部分“失效”,只原样传递数据而不做任何处理,那么较深模型就和较浅的模型完全一样了。在论文中,这些多出来的模型部分变成了“Identity Mapping”,也就是输入和输出完全一样。

      好了,那么对于现在的架构来说,我们如何学习这些“Identity Mapping”呢?过去的学习方法就是按现在的乘法模式进行学习,我们一般的CNN模型都是一层套一层,层与层之间的关系是乘法,下一层的输出是上一层输入和卷积相乘得到的。学习这样的“Identity Mapping”还是有一点困难的,因为只要是想学到一个具体数值,它就具有一定的难度,不论是“Identity Mapping”还是其他。

  
 

除特别注明外,本站所有文章均为 人工智能学习网 原创,转载请注明出处来自CNN--结构上的思考

留言与评论(共有 0 条评论)
   
验证码: