Inception v2/v3原理与实现

 个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-71.html

论文:Christian Szegedy,etc. Rethinking the Inception Architecture for Computer Vision

素质三连

1.论文贡献

提出网络设计的4个原则,

提出卷积核的非对称分解,

提出Inception-v2和Inception-v3,

提出标签平滑(LSR)技术。

2.实验结果

基于集成的Inception-v3使用multi-crop在ILSVRC 2012达到3.5%的top-5错误率,达到SOTA。

3.存在的问题

网络深度达到42层,不够深。

通用设计原则

    Inception由于架构的复杂性,比较难以改造网络结构。如果直接按比例增大网络,Inception会失去本身的高效的计算效果。GoogLeNet的论文<Going deeper with convolutions>里面也没有详细说明各种设计决策的原因,因此Inception比较难以适应新的任务。本文提出了一些通用的原则用于高效的拓展网络。

    作者通过大量的实验得出的卷积网络的设计原则,虽然有些原则的效果也只是推测,但是当网络设计偏离这些原则的时候,模型效果会严重退化。

    1.避免表示瓶颈(representational bottlenecks),尤其在网络早期。前馈神经网络可以用输入到输出的无环图表示,这定义了信息流动的方向。对于任何将输入与输出分隔开的cut,都可以该cut传递的信息量。应该避免bottleneck极度压缩,从输入到输出网络的表示应该缓慢的下降。

    理论上说,信息量不应该仅由表示的维度评价,还跟一些重要的因素比如相关结构有关,表示的维度只能粗略的评估表示能力。

    2.特征越多,收敛越快。原文: Higher dimensional representations are easier to process locally within a network. Increasing the activations per tile in a convolutional network allows for more disentangled features. The resulting networks will train faster. [知乎]相互独立的特征越多,输入的信息就被分解的越彻底,分解的子特征间相关性低,子特征内部相关性高,把相关性强的聚集在了一起会更容易收敛。

    3.在空间聚合(Spatial aggregation)之前,可以在尽量不降低表示能力的情况下减少特征的维度。比如,在执行3x3卷积之前,减少输入表示的维数,而不会产生严重的负面影响。原因是特征图中的相邻区域具有强相关性,存在信息冗余,特征维度压缩只损失很少的信息,但是可以加快网络的学习。

    4.平衡网络的宽度和深度。增加网络的宽度和深度都可以提高网络的性能,但是只有网络的宽度和深度达到平衡时,网络的效率最高。

卷积核的分解

    GoogLeNet性能很大程度上来自于降维(通用设计原则3)的广泛使用,这可以看作是一种高效分解卷积的特殊情况。这里探索了将卷积核分解的几种方法。通过适当的分解,我们可以得到更多的解纠缠参数(disentangled parameters,看通用设计原则2),从而加快训练。此外,可以使用节省的计算和内存来增加网络滤波器数量。这里提出两种分解卷积的方式。

1.将大卷积核分解为小卷积核

    使用大卷积核比如5x5或7x7,计算量太大。可以将一层5x5卷积替换为两层串联的3x3卷积,或将一层7x7卷积替换为三层串联的3x3卷积,这个思想来源于VGGNet。分解的过程如下:

1.png

    原始的Inception架构:

2.png

    将Inception架构中的5x5卷积替换为3x3卷积:

3.png

    上面这种替换通过共享相邻块之间的权重来减少参数数量,相同输入输出特征数的情况下,两个3x3和一个5x5参数量比值为(9+9)/25=0.72,也就是说替换后获得了28%的相对增益。这样做就有两个问题:这种替换会导致表示的下降吗?如果我们的主要想对卷积层计算的线性部分进行因式分解,那么在第一层中保留线性激活不是更好吗?

    作者做了对比实验回答上面的问题:一组是两个3x3都使用ReLU,另一组是只有后一个3x3使用ReLU激活,结果如下:

4.png

    从上面的结果可以看到两个3x3卷积都使用ReLU的结果更好,这是因为这样增强了非线性表示能力。

2.将卷积核非对称分解

    3x3还可以分解为更小的卷积吗?比如分解为2x2卷积?实验结果表明分解为nx1卷积优于分解为2x2卷积。比如,使用3x1和1x3卷积串联等价于3x3卷积,如下图:

5.png

    替换后,参数只有原来的(3+3)/9=66%。作为比较,3x3分解为两个2x2卷积,参数为原来的8/9=89%,因此前者更加高效。理论上可以将nxn卷积分解为1xn卷积和nx1卷积串联,而且高效得多。

    将非对称卷积分解应用在Inception架构,如下图:

6.png

    但是作者发现上面这种卷积分解并不适用所有的层,特别是网络的早期。但是在网络的中期,特征图大小在12-20范围内时,可以取得比较好的效果,此时可以用1x7和7x1卷积核取得较好的效果。

特征图的减小

    传统使用池化去减小特征图的大小,为了避免representational bottleneck,在池化之前,先对特征图的滤波器数量进行拓展(通用设计原则1)。比如,要将DxDxK的特征图转换为D/2xD/2x2xK的特征图,首先进行stride=1、滤波器数量为2k的卷积,然后再进行池化。但是这样做总的计算量很大。另一个方式可以先池化再卷积,可以减少1/4的计算量。然而这样会导致representational bottlenck,因为先对特征图进行了下采样,在提取特征。如下图左边:

7.png

    作者找到了一个两全其美的方法(牛逼),使用两个平行的stride=2的模块:P和C,P是池化模块,C卷积模块,对两个模块的输出进行concat,如下图。

8.png

辅助分类器

    在 GoogLeNet论文中,引入了辅助分类器概念,以提高非常深网络的收敛性。但是作者发现在训练的早期,辅助分类器并没有任何卵用,在接近训练的结束的时候,辅助分类器可以提高一点精度。

     GoogLeNet中使用了两个辅助分类器,去掉接在网络早期的辅助分类器没有任何影响。结合上一段,GoogLetNet论文中说的辅助分类器帮助低级特征收敛理论,实际上很可能只是放错了位置。作者认为辅助分类器起到的是正则化的作用,因为发现当辅助分类器使用BN或dropout的时候,主分类器表现更好。也侧面证明了BN有正则化的作用。

标签平滑(Label-Smoothing Regularization,LSR)

    这里提出一种通过估计训练过程中label-dropout的边缘效应来正则化分类器的机制[原文:Here we propose a mechanism to regularize the classifier layer by estimating the marginalized effect of label-dropout during training]。

    对于训练样本x,网络最后的softmax层输出的预测概率为p(k|x)=exp(zi)/sum(exp(z)),其中zi是未归一化的log-概率值或称为logit值。类别标签为q(k|x),且sum(q(k|x))=1。

    交叉熵损失函数:L(q,p)=-sum(q(k|x)*log(p(k|x)))。最小化该损失函数,等价于最大化ground-truth类别的log似然值。交叉熵函数对于zi是可微的,其梯度为p(k|x)-q(k|x),值区间为[-1,1]。

    对于训练样本x,其标签为y,类别标签分布:q(k|x)=delta_xy,其中delta_xy是Dirac函数,即当k=y时,delta_xy=1,否则delta_xy=0。

    当采用预测的概率来拟合真实的概率时,只有当ground-truth标签的logit值远远大于其它类别标签的logit值时才行。但这可能出现两个问题:1.可能导致过拟合,模型学习的结果是将全部概率值分配给groundtruth类别标签,则不能保证其泛化能力。2.其鼓励最大的Logit值远大于其它标签的logit值,但是结合梯度的有界性,会削弱模型的适应能力。也就是说,模型对groundtruth太自信了,玩意标注的数据错了呢。

    因此这里提出一种机制鼓励模型减少自信,称为标签平滑(Label-Smoothing Regularization,LSR)

    假设一个标签分布u(k),一个平滑参数epsilon,对于一个标签为y的训练样本x,我们使用q’(k|x)代替q(k|x),q’(k|x)=(1-epsilon)* delta_xy+epsilon*u(k)。该公式将原始的groundtruth标签分布q(k|x)与固定的分布u(k)融合在一起,通过权重1-epsilon和epsilon。

    这里采用均匀分布作为u(k),即u(k)=1/K,则q’(k|x)=(1-epsilon)* delta_xy+epsilon/K。

交叉熵为:L(q’,p)=-sum(q‘(k|x)*log(p(k|x)))=(1-epsilon)*L(q,p)+epsilon*L(u,p)

等价于将单个交叉熵损失函数替换为一对交叉熵损失函数L(q,p)和L(u,p)。L(u,p)惩罚了标注的标签分布p相对于先验分布u的偏差。

    该偏差也可以从KL散度的角度计算,H(u,p)=D_KL(u||p)+H(u)。

    在ImageNet实验中,K=1000个类别,u(k)=1/1000,epsilon=0.1,在ILSVRC2012上对top1和top5大约有0.2%的提升。

低分辨率输入

    一个经典的视觉任务是目标检测,一般用CNN将生成的region proposals提取特征,这些region proposal一般都很小、分辨率很低,由此产生的问题是如何适当的处理低分辨率的输入。

    普遍的看法是,采用更高分辨率输入的模型能提高模型的性能,这是真的吗?是因为高分辨率的输入还是因为模型容量的问题提高模型表现?为了更加精确的评估分辨率对模型性能的影响,作者设置了下面三组实验:

1.输入分辨率为299x299,第一层卷积stride=2,后接最大池化。

2.输入分辨率为151x151,第一层卷积stride=1,后接最大池化。

3.输入分辨率为71x71,第一层卷积stride=1,后无最大池化。

    三个模型,除了第一个卷积层,其它层完全一样,在ILSVRC2012数据集上训练并测试,结果如下:

14.png

    虽然低分辨率的网络需要更长的时间来训练,但最终结果的质量与高分辨率的网络相当接近。因此,适当降低输入分辨率对模型影响不大。如果根据输入分辨率去降低网络的容量,那么网络的性能会差得多。

Inception v2

    将上面提到的方法在Inception模型上实现,架构:

9.png

    像之前说的那样,将7x7卷积分解为3个3x3卷积串联,将5x5卷积分解为两个3x3卷积串联。上表中第一个Inception部分是3个经典的Inception模块的串联:

10.png

    第二个Inception部分是5个高级一点的Inception模块串联:

11.png

    第三个Inception部分使用两个非对称卷积的Inception模块:

13.png

    网络更详细的配置放在补充材料(我没找到)里面。尽管网络达到42层,计算花费是GoogLeNet的2.5倍,但是仍然少于VGGNet。

实验结果与Inception v3

训练参数

    使用Tensorflow框架,batch_size=32,epochs=100,使用RMSProp:decay=0.9, 小常量=1.0。学习率为0.045,使用指数衰减学习率,每两个epoch衰减,衰减率为0.94。使用梯度截断[论文:On the difficulty of training recurrent neural networks],阈值为2.0.

实验结果与比较

15.png

    上面的每行Inception-v2模型都是累积修改的结果。将上表最后一行的模型称为Inception-v3,集成了本文提到的各种tricks。multi-crop测试结果如下:(下面的top-5 error与top-1 error应该放反了)

16.png

集成模型的结果:

17.png

结论:

本文介绍了几个通用设计原则用于增大网络,这里提出的Inception v3的single crop最终达到top-1错误率:21.2%、top-5错误率:5.6%在ILSVR 2012分类任务上,达到sota。

代码实现环节

待续

参考文献

[1]Christian Szegedy,etc. Rethinking the Inception Architecture for Computer Vision

[2]AIHGF. InceptionV3 - 类别标签平滑正则化LSR. https://www.aiuai.cn/aifarm632.html

发布了74 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37394634/article/details/103976493