CNN--结构上的思考
前面我们通过几个数值展示了几个比较经典的网络的一些特性,下面我们就花一点时间来仔细观察 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 模型参数的方差,我们假设对于某一层,这层的输入维度为,输出维度为
那么该层网络中每个参数的方差应该控制在
。如果输入输出层的维度比较大,那么参数的理想方差就需要限定的更小,所以参数可以取值的范围就比较小,那么优化起来就比较费劲;如果输入输出维度比较小,那么每个参数的理想方差就会相对大一些,那么可以取值的范围就比较大,优化起来就相对容易些。从这个角度来看,减小每一层参数的数量对于优化来说是有意义的。
其次就是卷积层参数的规律。首先卷积层的操作不会改变输入数据的维度,这里的维度主要指 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”还是其他。
于是,ResNet 对上面的问题做了一些改变。既然是要学习“Identity Mapping”,那么我们能不能把过去的乘法转变为加法?我们假设多出来的层的函数形式是 F(x),那么乘法关系学习“Identity Mapping”就变成了,由于学习的形式没有变,对于乘法我们学习起来同过去一样,但是对于加法就简单多了 -
,只要将参数学习成 0 就可以了,0 和其他数值相比具有很大的优势,这样训练难度就大大降低了。于是,我们也见到即使非常深的网络也可以训练,这也验证了将乘法关系改为加法关系后对模型训练带来的显著提升。
在 ResNet 之前,还有一些网络已经提出了类似的思想,比如 Highway-Network。Highway-Network 同样具有加法的特点,但是它并不是一个纯粹的加法,所以在优化过程总较 ResNet 弱一些。
这样我们就回顾完了上次我们提到的几个模型中的闪光点,如果想进一步地研究这些模型以及模型结构中的精妙之处,多多做实验多多分析数据才是王道。
最后一点
为什么 GoogLeNet 和 ResNet 的层数很深且参数很少?因为他们的全连接层比较少。为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论