返回介绍

数学基础

统计学习

深度学习

工具

Scala

九、小型网络

发布于 2023-07-17 23:38:25 字数 80602 浏览 0 评论 0 收藏 0

  1. 目前神经网络领域的研究基本可以概括为两个方向:探索模型更好的预测能力,关注模型在实际应用中的难点。

    事实上卷积神经网络在图像识别领域超越了人类的表现,但是这些先进的网络需要较高的计算资源。这些资源需求超出了很多移动设备和嵌入式设备的能力(如:无人驾驶),导致实际应用中难以在这些设备上应用。

    小型网络就是为解决这个难点来设计的。

  2. 小型网络的设计和优化目标并不是模型的准确率,而是在满足一定准确率的条件下,尽可能的使得模型小,从而降低对计算资源的需求,降低计算延迟。

  3. 小型高效的神经网络的构建方法大致可以归为两类:对已经训练好的网络进行压缩,直接训练小网络模型。

  4. 模型参数的数量决定了模型的大小,所谓的小型网络 指的是网络的参数数量较少。

    小型网络具有至少以下三个优势:

    • 较小的模型具有更高效的分布式训练效率。

      WorkerPS 以及 WorkerWorker 之间的通信是神经网络分布式训练的重要限制因素。在分布式数据并行训练中,通信开销与模型的参数数量成正比。较小的模型需要更少的通信,从而可以更快的训练。

    • 较小的模型在模型导出时开销更低。

      当在tensorflow 等框架中训练好模型并准备部署时,需要将模型导出。如:将训练好的模型导出到自动驾驶汽车上。模型越小,则数据导出需要传输的数据量越少,这样可以支持更频繁的模型更新。

    • 较小的模型可以在FPGA 和嵌入式硬件上部署。

      FPGA 通常只有小于10MB 的片上内存,并且没有外部存储。因此如果希望在FPGA 上部署模型,则要求模型足够小从而满足内存限制。

9.1 SqueezeNet 系列

9.1.1 SqueezeNet

  1. squeezenet 提出了Fire 模块,并通过该模型构成一种小型CNN 网络,在满足AlexNet 级别准确率的条件下大幅度降低参数数量。

  2. CNN 结构设计三个主要策略:

    • 策略 1:部分的使用1x1 卷积替换3x3 卷积。因为1x1 卷积的参数数量比3x3 卷积的参数数量少了 9 倍。

    • 策略 2:减少3x3 卷积输入通道的数量。这会进一步降低网络的参数数量。

    • 策略 3:将网络中下采样的时机推迟到网络的后面。这会使得网络整体具有尺寸较大的feature map

      其直觉是:在其它不变的情况下,尺寸大的feature map 具有更高的分类准确率。

    策略1、2 是关于在尽可能保持模型准确率的条件下减少模型的参数数量,策略3 是关于在有限的参数数量下最大化准确率。

9.1.1.1 Fire 模块

  1. 一个Fire 模块由一个squeeze 层和一个expand 层组成。

    • squeeze 层:一个1x1 卷积层,输出通道数为超参数 $ MathJax-Element-446 $ 。

      • 通常选择超参数 $ MathJax-Element-446 $ 满足: $ MathJax-Element-447 $ 。
      • 它用于减少expand 层的输入通道数,即:应用策略2 。
    • expand 层:一个1x1 卷积层和一个3x3 卷积层,它们卷积的结果沿着深度进行拼接。

      • 1x1 卷积输出通道数为超参数 $ MathJax-Element-448 $ ,3x3 卷积输出通道数为超参数 $ MathJax-Element-455 $ 。
      • 选择1x1 卷积是应用了策略1 。

9.1.1.2 网络性能

  1. 网络设计:

    • SqueezeNet 从一个独立的卷积层(conv1)开始,后跟 8 个Fire 模块(fire2~9 ),最后连接卷积层conv10、全局平均池化层、softmax 输出层。
    • 从网络开始到末尾,每个Fire 模块的输出通道数逐渐增加。
    • conv1、fire4、fire8 之后执行最大池化,步长为2。这种相对较晚的执行池化操作是采用了策略3。
    • expand 层中的3x3 执行的是same 卷积,即:在原始输入上下左右各添加一个像素,使得输出的feature map 尺寸不变。
    • fire9 之后使用Dropout,遗忘比例为 0.5 。

  2. 网络参数:

    • $ MathJax-Element-451 $ (#1x1 squeeze) 列给出了超参数 $ MathJax-Element-451 $ , $ MathJax-Element-453 $ (#1x1 expand) 列给出了超参数 $ MathJax-Element-453 $ , $ MathJax-Element-455 $ (#3x3 expand) 列给出了超参数 $ MathJax-Element-455 $ 。
    • $ MathJax-Element-456 $ , $ MathJax-Element-457 $ , $ MathJax-Element-458 $ , $ MathJax-Element-459 $ 这四列给出了模型裁剪的参数。
    • # parameter before pruning 列给出了模型裁剪之前的参数数量。
    • # parameter after pruning 列给出了模型裁剪之后的参数数量。

  3. 模型性能:

    • 网络压缩方法列:给出了网络裁剪方法,包括SVD(Denton et al. 2014)Network pruning (Han et al. 2015b)Deep compression (Han et al. 2015a)
    • 数据类型列:给出了计算精度。
    • 模型压缩比例列:给出了模型相对于原始AlexNet 的模型大小压缩的比例。
    • top-1 Accuracy/top-5 Accuracy 列:给出了模型在ImageNet 测试集上的评估结果。

    可以看到,SqueezeNet 在满足同样准确率的情况下,模型大小比AlexNet 压缩了 50 倍。如果使用 Deep Compression 以及 6 bit 精度的情况下,模型大小比AlexNet 压缩了 510 倍。

    CNN 网络结构网络压缩方法数据类型模型大小模型压缩比例top-1 Accuracytop-5 Accuracy
    AlexNetNone32 bit240 MB1x57.2%80.3%
    AlexNetSVD32 bit48 MB5x56.0%79.4%
    AlexNetNetwork Pruning32 bit27 MB9x57.2%80.3%
    AlexNetDeep Compression5-8 bit6.9 MB35x57.2%80.3%
    SqueezeNetNone32 bit4.8 MB50x57.5%80.3%
    SqueezeNetDeep Compression8 bit0.66 MB363x57.5%80.3%
    SqueezeNetDeep Compression6 bit0.47 MB510x57.5%80.3%
a. 超参数设计
  1. 定义 $ MathJax-Element-460 $ 为地一个fire 模块的输出通道数,假设每 $ MathJax-Element-461 $ 个 fire 模块将fire 模块的输出通道数增加 $ MathJax-Element-462 $ 。如: $ MathJax-Element-463 $ ,则网络中所有fire 模块的输出通道数依次为:

    $ \text{base}_e,\text{base}_e,\text{base}_e+\text{incr}_e,\text{base}_e+\text{incr}_e,\text{base}_e+2*\text{incr}_e,\text{base}_e+2*\text{incr}_e,\cdots $

    因此第 $ MathJax-Element-619 $ 个 fire 模块的输出通道数为: $ MathJax-Element-465 $ 。由于fire 模块的输出就是fire 模块中expand 层的输出,因此 $ MathJax-Element-466 $ 也就是第 $ MathJax-Element-619 $ 个fire 模块中expand 层的输出通道数。

    • 定义 $ MathJax-Element-483 $ 为所有fire 模块的expand 层中,3x3 卷积数量的比例。这意味着:不同fire 模块的expand 层中3x3 卷积数量的占比都是同一个比例。则有:

      • 第 $ MathJax-Element-619 $ 个fire 模块的expand 层中的1x1 卷积数量 $ MathJax-Element-470 $ 。
      • 第 $ MathJax-Element-619 $ 个fire 模块的expand 层中的3x3 卷积数量 $ MathJax-Element-472 $ 。
    • 定义 $ MathJax-Element-479 $ (squeeze ratio)为所有 fire 模块中,squeeze 层的输出通道数与expand 层的输出通道数的比例,称作压缩比。这意味着:不同fire 模块的压缩比都相同。

      则有:第 $ MathJax-Element-619 $ 个 fire 模块的 squeeze 层的输出通道数为 $ MathJax-Element-475 $ 。

  2. 对于前面给到的SqueezeNet 有: $ MathJax-Element-476 $ 。

  3. 评估超参数 $ MathJax-Element-479 $ : $ MathJax-Element-478 $ , $ MathJax-Element-479 $ 从 0.15~1.0

    在 $ MathJax-Element-480 $ 时,ImageNet top-5 准确率达到峰值 86.0% ,此时模型大小为 19MB 。此后进一步增加 SR 只会增加模型大小而不会提高模型准确率。

  4. 评估超参数 $ MathJax-Element-483 $ : $ MathJax-Element-482 $ , $ MathJax-Element-483 $ 从 1%~99%

    3x3 卷积占比(相对于expand 层的卷积数量的占比)为 50% 时,ImageNet top-5 准确率达到 85.3% 。此后进一步增加3x3 卷积的占比只会增加模型大小而几乎不会提高模型准确率。

b. 旁路连接
  1. 采用ResNet 的思想,可以在SqueezeNet 中添加旁路连接。下图中,左图为标准的SqueezeNet ,中图为引入简单旁路连接的SqueezeNet,右图为引入复杂旁路连接的SqueezeNet

    • 简单旁路连接:就是一个恒等映射。此时要求输入feature map 和残差feature map 的通道数相等。
    • 复杂旁路连接:针对输入feature map 和残差feature map 的通道数不等的情况,旁路采用一个1x1 卷积来调整旁路的输出通道数。

    它们在ImageNet 测试集上的表现:

    模型结构top-1 准确率top-5 准确率model size
    SqueezeNet57.5%80.3%4.8MB
    SqueezeNet + 简单旁路连接60.4%82.5%4.8MB
    SqueezeNet + 复杂旁路连接58.8%82.0%7.7MB

    因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。

9.1.2 SqueezeNext

  1. 现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,SqueezeNext 针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。

9.1.2.1 SqueezeNext Block

  1. SqueezeNext 块是在Fire 块的基础进行修改:

    • expand 层的3x3 卷积替换为1x3 + 3x1 卷积,同时移除了 expand 层的拼接 1x1 卷积、添加了1x1 卷积来恢复通道数。
    • 通过两阶段的 squeeze 得到更激进的通道缩减,每个阶段的squeeze 都将通道数减半。

  2. SqueezeNext 块也采用类似ResNet 的旁路连接,从而可以训练更深的网络。

    下图中,左图为 ResNet 块,中图为 SqueezeNetFire 块,右图为SqueezeNext 块。

9.1.2.2 网络性能

  1. 网络结构:如下为一个23层的SqueezeNext 网络(记做SqueezeNext-23)。

    • 相同颜色的SqueezeNext 块具有相同的输入feature map 尺寸和通道数。
    • 该网络结构描述为[6,6,8,1],意思是:在第一个conv/pooling 层之后有四组SqueezeNext 块,每组SqueezeNext 分别有6个、6个、8个、1个 SqueezeNext 块。
    • 在全连接层之前插入一个1x1 卷积层来降低全连接层的输入通道数,从而大幅降低全连接层的参数数量。

    23层SqueezeNext 网络的另一种结构(记做SqueezeNext-23v5):结构描述为[2,4,14,1]

  2. SqueezeNext网络在ImageNet 上的预测准确率:

    • 参数降低倍数是相对于AlexNet 网络的参数而言。
    • G-SqueezeNext-23SqueezeNext-23 采用分组卷积的版本。
    模型top-1 准确率top-5 准确率参数数量(百万)参数降低倍数
    AlexNet57.10%80.30%60.91x
    SqueezeNet57.50%80.30%1.251x
    SqueezeNext-2359.05%82.60%0.7284x
    G-SqueezeNext-2357.16%80.23%0.54112x
    SqueezeNext-3461.39%84.31%1.061x
    SqueezeNext-4462.64%85.15%1.251x
  3. 更宽和更深版本的SqueezeNext网络在ImageNet 上的预测准确率:

    • 1.5/2.0 分别表示将网络拓宽1.5/2 倍。拓宽指的增加网络的feature map 的通道数,做法是增加第一个conv 的输出通道数。
    • 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
    模型top-1 准确率top-5 准确率参数数量(百万)
    1.5-SqueezeNext-2363.52%85.66%1.4
    1.5-SqueezeNext-3466.00%87.40%2.1
    1.5-SqueezeNext-4467.28%88.15%2.6
    VGG-1968.50%88.50%138
    2.0-SqueezeNext-2367.18%88.17%2.4
    2.0-SqueezeNext-3468.46%88.78%3.8
    2.0-SqueezeNext-4469.59%89.53%4.4
    MobileNet67.50%(70.9%)86.59%(89.9%)4.2
    2.0-SqueezeNext-23v567.44%(69.8%)88.20%(89.5%)3.2
  4. 硬件仿真结果:

    • 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。

    • Time 表示模型的推断时间(相对耗时),Energy 表示模型的推断功耗。

    • 8x8,32KB16x16,128KB 表示仿真硬件的配置:

      • NxN 表示硬件具有NxNPE 阵列。processing element:PE 是单个计算单元。
      • 32KB/128KB 表示全局缓存。

  5. 深度可分离卷积的计算密集性较差,因为其计算/带宽 比例较低,所以在某些移动设备上表现较差。

    一个可分离卷积的计算需要多次 IO 和计算才能完成,相比而言普通卷积只需要一次IO 和计算。

9.2 MobileNet 系列

9.2.1 MobileNet

  1. MobileNet 应用了Depthwise 深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。

  2. MobileNet 不仅产生了小型网络,还重点优化了预测延迟。

    与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大。

9.2.1.1 深度可分离卷积

  1. 对于传统的卷积层,单个输出feature 这样产生:

    • 首先由一组滤波器对输入的各通道执行滤波,生成滤波feature 。这一步仅仅考虑空间相关性。

    • 然后计算各通道的滤波feature 的加权和,得到单个feature

      这里不同位置处的通道加权和的权重不同,这意味着在空间相关性的基础上,叠加了通道相关性。

    Depthwise 深度可分离卷积打破了空间相关性和通道相关性的混合:

    • 首先由一组滤波器对输入的各通道执行滤波,生成滤波feature 。这一步仅仅考虑空间相关性。

    • 然后执行1x1 卷积来组合不同滤波feature

      这里不同位置处的通道加权和的权重都相同,这意味着这一步仅仅考虑通道相关性。

  2. 假设:输入 feature map 是一个尺寸为 $ MathJax-Element-484 $ 、输入通道数为 $ MathJax-Element-663 $ 的张量 $ MathJax-Element-486 $ ,输出feature map 是一个尺寸为 $ MathJax-Element-502 $ 、输出通道数为 $ MathJax-Element-677 $ 的张量 $ MathJax-Element-489 $ 。假设核张量为 $ MathJax-Element-499 $ ,其形状为 $ MathJax-Element-497 $ 。

    则对于标准卷积过程,有: $ MathJax-Element-492 $ 。其中: $ MathJax-Element-619 $ 为输入通道的索引; $ MathJax-Element-620 $ 为输出通道的索引; $ MathJax-Element-495 $ 为空间索引, $ MathJax-Element-496 $ 分别为对应空间方向上的遍历变量。

    其参数数量为: $ MathJax-Element-497 $ ;其计算代价为: $ MathJax-Element-498 $ 。

  3. depthwise 深度可分离卷积中,假设核张量为 $ MathJax-Element-499 $ ,其形状为: $ MathJax-Element-504 $ 。则对于 depthwise 深度可分离卷积过程:

    • 首先对输入的各通道执行滤波,有: $ MathJax-Element-501 $ 。输出尺寸为 $ MathJax-Element-502 $ 、输出通道数为 $ MathJax-Element-663 $ 。

      其参数数量为: $ MathJax-Element-504 $ ;其计算代价为: $ MathJax-Element-505 $ 。

    • 然后对每个通道得到的滤波feature 执行1x1卷积,有: $ MathJax-Element-506 $ 。其中 $ MathJax-Element-507 $ 为1x1 卷积的核张量。

      其参数数量为: $ MathJax-Element-508 $ ;其计算代价为: $ MathJax-Element-509 $ 。

    • 总的参数数量为: $ MathJax-Element-510 $ ,约为标准卷积的 $ MathJax-Element-511 $ 。

      总的计算代价为: $ MathJax-Element-512 $ ,约为标准卷积的 $ MathJax-Element-513 $ 。

      通常卷积核采用3x3 卷积,而 $ MathJax-Element-514 $ ,因此depthwise 卷积的参数数量和计算代价都是常规卷积的 $ MathJax-Element-515 $ 到 $ MathJax-Element-516 $ 。

  4. 常规卷积和Depthwise可分离卷积的结构区别(带BNReLU ):(左图为常规卷积,右图为Depthwise 可分离卷积)

9.2.1.2 网络结构

  1. MobileNeet 网络结构如下表所示。其中:

    • Conv 表示标准卷积,Conv dw 表示深度可分离卷积。
    • 所有层之后都跟随BNReLU (除了最后的全连接层,该层的输出直接送入到softmax 层进行分类)。

  2. MobileNet 大量的参数和计算量都被消耗在 1x1 卷积上:

    • Conv 1x1 包含了所有的1x1 卷积层,包括可分离卷积中的1x1 卷积。
    • Conv DW 3x3 仅包括可分离卷积中的 3x3 卷积。
    层类型乘-加运算参数数量
    Conv 1x194.86%74.59%
    Conv DW 3x33.06%1.06%
    Conv 3x31.19%0.02%
    全连接层0.18%24.33%
  3. 与训练大模型相反,训练MobileNet 时较少的采用正则化和数据集增强技术,因为MobileNet 是小模型,而小模型不容易过拟合。

    论文特别提到:在depthwise 滤波器上使用很少或者不使用 L2 正则化,因为它们的参数很少。

9.2.1.3 宽度乘子 & 分辨率乘子

  1. 尽管基本的MobileNet 架构已经很小,延迟很低,但特定应用需要更快的模型。为此MobileNet 引入了两个超参数:宽度乘子、分辨率乘子

  2. 宽度乘子width multiplier ,记做 $ MathJax-Element-721 $ 。其作用是:在每层均匀的缩减网络(实际上是减小每层网络的输入、输出 feature map 的通道数量)。

    • 宽度乘子应用于第一层(是一个全卷积层)的输出通道数上。这也影响了后续所有Depthwise可分离卷积层的输入feature map通道数、输出feature map通道数。

      这可以通过直接调整第一层的输出通道数来实现。

    • 它大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,降低了计算量。

    • 通常将其设置为:0.25、0.5、0.75、1.0 四档。

  3. 分辨率乘子resolution multiplier,记做 $ MathJax-Element-528 $ 。其作用是:降低输出的feature map 的尺寸。

    • 分辨率乘子应用于输入图片上,改变了输入图片的尺寸。这也影响了后续所有Depthwise可分离卷积层的输入feature map 尺寸、输出feature map 尺寸。

      这可以通过直接调整网络的输入尺寸来实现。

    • 它不会改变模型的参数数量,但是大概以 $ MathJax-Element-520 $ 的比例降低计算量。

  4. 如果模型同时实施了宽度乘子和分辨率乘子,则模型大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,大概以 $ MathJax-Element-522 $ 的比例降低了计算量。

    假设输入feature map 尺寸为14x14,通道数为 512 ;卷积尺寸为3x3;输出feature map 尺寸为14x14,通道数为512

    层类型乘-加操作(百万)参数数量(百万)
    常规卷积4622.36
    深度可分离卷积52.30.27
    $ MathJax-Element-525 $ 的深度可分离卷积29.60.15
    $ MathJax-Element-524 $ 的深度可分离卷积15.10.15

9.2.1.4 网络性能

  1. 常规卷积和深度可分离卷积的比较:使用深度可分离卷积在ImageNet 上只会降低 1% 的准确率,但是计算量和参数数量大幅度降低。

    模型ImageNet Accuracy乘-加操作(百万)参数数量(百万)
    常规卷积的MobileNet71.7%486629.3
    MobileNet70.6%5694.2
  2. 更瘦的模型和更浅的模型的比较:在计算量和参数数量相差无几的情况下,采用更瘦的MobileNet 比采用更浅的MobileNet 更好。

    • 更瘦的模型:采用 $ MathJax-Element-525 $ 宽度乘子( 表示模型的通道数更小)。
    • 更浅的模型:删除了MobileNet5x Conv dw/s 部分(即:5层 feature size=14x14@512 的深度可分离卷积)。
    模型ImageNet Accuracy乘-加操作(百万)参数数量(百万)
    更瘦的MobileNet68.4%3252.6
    更浅的MobileNet65.3%3072.9
  3. 不同宽度乘子的比较:随着 $ MathJax-Element-721 $ 降低,模型的准确率一直下降( $ MathJax-Element-527 $ 表示基准 MobileNet)。

    • 输入分辨率:224x224。
    with multiplierImageNet Accuracy乘-加 操作(百万)参数数量(百万)
    1.070.6%5694.2
    0.7568.4%3252.6
    0.563.7%1491.3
    0.2550.6%410.5
  4. 不同分辨率乘子的比较:随着 $ MathJax-Element-528 $ 的降低,模型的准确率一直下降( $ MathJax-Element-529 $ 表示基准MobileNet)。

    • 宽度乘子:1.0 。
    • $ MathJax-Element-530 $ 对应 $ MathJax-Element-531 $ , $ MathJax-Element-532 $ 对应 $ MathJax-Element-533 $ , $ MathJax-Element-534 $ 对应 $ MathJax-Element-542 $ , $ MathJax-Element-536 $ 对应 $ MathJax-Element-537 $ 。
    resolutionImageNet Accuracy乘-加 操作(百万)参数数量(百万)
    224x22470.6%5694.2
    192x19269.1%4184.2
    160x16067.2%2904.2
    128x12864.4%1864.2
  5. 根据 $ MathJax-Element-538 $ 和 分辨率为 $ MathJax-Element-539 $ 两两组合得到 16 个模型。

    • 绘制这16个模型的accuracy 和计算量的关系:近似于 log 关系,但是在 $ MathJax-Element-540 $ 有一个显著降低。

    • 绘制这16个模型的accuracy 和参数数量的关系:

  6. MobileNet 和其它模型的比较:

    • MobileNetVGG 16 准确率相近,但是模型大小小了32倍,计算量小了27倍。
    • 瘦身的MobileNet(宽度乘子 $ MathJax-Element-541 $ ,分辨率乘子 $ MathJax-Element-542 $ )和 Squeezenet 模型大小差不多,但是准确率更高,计算量小了 22 倍。
    模型ImageNet Accuracy乘-加 操作(百万)参数数量(百万)
    1.0 MobileNet-22470.6%5694.2
    GoogleNet69.8%15506.8
    VGG 1671.5%15300138
    0.50 MobileNet-16060.2%761.32
    Squeezenet57.5%17001.25
    AlexNet57.2%72060

9.2.2 MobileNet V2

  1. MobileNet V2 创新性的提出了具有线性bottleneckInverted 残差块。

    这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的内存需求。

9.2.2.1 线性bottleneck

  1. 一直以来,人们认为与任务相关的信息是嵌入到feature map 中的一个低维子空间。因此feature map 事实上有一定的信息冗余。如果缩减feature map 的通道数量(相当于降维),则可以降低计算量。

    MobileNet V1 就是采用宽度乘子,从而在计算复杂度和准确率之间平衡。

  2. 由于ReLU 非线性激活的存在,缩减输入 feature map 的通道数量可能会产生不良的影响。

    输入feature map 中每个元素值代表某个特征,将所有图片在该feature map 上的取值扩成为矩阵:

    $ \mathbf P = \begin{bmatrix} P_{1,1}&P_{1,2}&\cdots&P_{1,n}\\ P_{2,1}&P_{2,2}&\cdots&P_{2,n}\\ \vdots&\vdots&\ddots&\vdots\\ P_{N,1}&P_{N,2}&\cdots&P_{N,n}\\ \end{bmatrix} $

    其中 $ MathJax-Element-543 $ 为样本的数量, $ MathJax-Element-544 $ 。即:行索引代表样本,列索引代表特征。所有特征由feature map 展平成一维得到。

    通常 $ MathJax-Element-545 $ ,则输入矩阵 $ MathJax-Element-546 $ 的秩 $ MathJax-Element-547 $ 。

    • 对于1x1 卷积(不考虑ReLU),则1x1 卷积是输入特征的线性组合。输出 featuremap 以矩阵描述为:

      $ \mathbf P^* = \begin{bmatrix} P^*_{1,1}&P^*_{1,2}&\cdots&P^*_{1,n^*}\\ P^*_{2,1}&P^*_{2,2}&\cdots&P^*_{2,n^*}\\ \vdots&\vdots&\ddots&\vdots\\ P^*_{N,1}&P^*_{N,2}&\cdots&P^*_{N,n^*}\\ \end{bmatrix} $

      其中 $ MathJax-Element-548 $ , $ MathJax-Element-561 $ 为输出通道数。

    • 如果考虑ReLU,则输出 featuremap 为:

      $ \mathbf P^{**} = ReLU(\mathbf P^*) = \begin{bmatrix} ReLU(P^*_{1,1})&ReLU(P^*_{1,2})&\cdots&ReLU(P^*_{1,n^*})\\ ReLU(P^*_{2,1})&ReLU(P^*_{2,2})&\cdots&ReLU(P^*_{2,n^*})\\ \vdots&\vdots&\ddots&\vdots\\ ReLU(P^*_{N,1})&ReLU(P^*_{N,2})&\cdots&ReLU(P^*_{N,n^*})\\ \end{bmatrix} $
    • 对于输出的维度 $ MathJax-Element-550 $ ,如果 $ MathJax-Element-564 $ 在维度 $ MathJax-Element-620 $ 上的取值均小于 0 ,则由于 $ MathJax-Element-553 $ 的作用, $ MathJax-Element-559 $ 在维度 $ MathJax-Element-620 $ 上取值均为 0 ,此时可能发生信息不可逆的丢失。

      • 如果 1x1 卷积的输出通道数很小(即 $ MathJax-Element-561 $ 较小),使得 $ MathJax-Element-557 $ ,则 $ MathJax-Element-564 $ 的每个维度都非常重要。

        一旦经过 ReLU 之后 $ MathJax-Element-559 $ 的信息有效维度降低(即 $ MathJax-Element-560 $ ),则发生信息的丢失。且这种信息丢失是不可逆的。

        这使得输出feature map 的有效容量降低,从而降低了模型的表征能力。

      • 如果 1x1 卷积的输出通道数较大(即 $ MathJax-Element-561 $ 较大),使得 $ MathJax-Element-562 $ ,则 $ MathJax-Element-564 $ 的维度出现冗余。即使 $ MathJax-Element-564 $ 的某个维度被丢失,该维度的信息仍然可以从其它维度得到。

    • 如果 1x1 卷积的输出通道数非常小,使得 $ MathJax-Element-565 $ ,则信息压缩的过程中就发生信息不可逆的丢失。

      上面的讨论的是 ReLU 的非线性导致信息的不可逆丢失。

  3. 实验表明:bootleneck 中使用线性是非常重要的。

    虽然引入非线性会提升模型的表达能力,但是引入非线性会破坏太多信息,会引起准确率的下降。在Imagenet 测试集上的表现如下图:

9.2.2.2 bottleneck block

  1. bottleneck block:输入feature map 首先经过线性 bottleneck 来扩张通道数,然后经过深度可分离卷积,最后通过线性bottleneck 来缩小通道数。

    输入bootleneck 输出通道数与输入通道数的比例称作膨胀比。

    • 通常较小的网络使用略小的膨胀比效果更好,较大的网络使用略大的膨胀比效果更好。
    • 如果膨胀比小于 1 ,这就是一个典型的 resnet 残差块。
  2. 可以在 bottleneck block 中引入旁路连接,这种bottleneck block 称作Inverted 残差块,其结构类似ResNet 残差块。

    • ResNeXt 残差块中,首先对输入feature map 执行1x1 卷积来压缩通道数,最后通过1x1 卷积来恢复通道数。

      这对应了一个输入 feature map 通道数先压缩、后扩张的过程。

    • Inverted 残差块中,首先对输入feature map 执行1x1 卷积来扩张通道数,最后通过1x1 卷积来恢复通道数。

      这对应了一个输入 feature map 通道数先扩张、后压缩的过程。这也是Inverted 残差块取名为Inverted 的原因。

  3. 当深度可分离卷积的步长为 1 时,bottleneck block包含了旁路连接。

    当深度可分离卷积的步长不为 1 时,bottleneck block不包含旁路连接。这是因为:输入feature map 的尺寸与块输出feature map 的尺寸不相同,二者无法简单拼接。

    虽然可以将旁路连接通过一个同样步长的池化层来解决,但是根据ResNet的研究,破坏旁路连接会引起网络性能的下降。

  4. 事实上旁路连接有两个插入的位置:在两个1x1 卷积的前后,或者在两个Dwise 卷积的前后。

    通过实验证明:在两个1x1 卷积的前后使用旁路连接的效果最好。在Imagenet 测试集上的表现如下图:

  5. bottleneck block 可以看作是对信息的两阶段处理过程:

    • 阶段一:对输入feature map 进行降维,这一部分代表了信息的容量。
    • 阶段二:对信息进行非线性处理,这一部分代表了信息的表达。

    MobileNet v2 中这二者是独立的,而传统网络中这二者是相互纠缠的。

9.2.2.3 网络性能

  1. MobileNet V2 的设计基于 MobileNet v1 ,其结构如下:

    • 每一行代表一个或者一组相同结构的层,层的数量由 $ MathJax-Element-566 $ 给定。

    • 相同结构指的是:

      • 同一行内的层的类型相同,由Operator 指定。其中bottleneck 指的是bottleneck block
      • 同一行内的层的膨胀比相同,由 t 指定。
      • 同一行内的层的输出通道数相同,由c 指定。
      • 同一行内的层:第一层采用步幅s,其它层采用步幅1
    • 采用ReLU6 激活函数,因为它在低精度浮点运算的环境下表现较好。

    • 训练过程中采用dropoutBN

  2. MobileNet V1 类似,MobileNet V2 也可以引入宽度乘子、分辨率乘子这两个超参数。

  3. 网络推断期间最大内存需求(通道数/内存消耗(Kb)):采用 16 bit 的浮点运算。

  4. 网络在ImageNet 测试集上的表现:

    • 最后一列给出了预测单张图片的推断时间。
    网络Top 1Params(百万)乘-加 数量(百万)CPU
    MobileNet V170.64.2575113ms
    ShuffleNet (1.5)71.53.4292-
    ShuffleNet (x2)73.75.4524-
    NasNet-A74.05.3564183ms
    MobileNet V272.03.430075ms
    MobileNet V2(1.4)74.76.9585143ms

9.3 ShuffleNet 系列

9.3.1 ShuffleNet

  1. ShuffleNet 提出了 1x1分组卷积+通道混洗 的策略,在保证准确率的同时大幅降低计算成本。

    ShuffleNet 专为计算能力有限的设备(如:10~150MFLOPs)设计。在基于ARM 的移动设备上,ShuffleNetAlexNet 相比,在保持相当的准确率的同时,大约 13 倍的加速。

9.3.1.1 ShuffleNet block

  1. XceptionResNeXt 中,有大量的1x1 卷积,所以整体而言1x1 卷积的计算开销较大。如ResNeXt 的每个残差块中,1x1 卷积占据了乘-加运算的 93.4% (基数为32时)。

    在小型网络中,为了满足计算性能的约束(因为计算资源不够)需要控制计算量。虽然限制通道数量可以降低计算量,但这也可能会严重降低准确率。

    解决办法是:对1x1 卷积应用分组卷积,将每个 1x1 卷积仅仅在相应的通道分组上操作,这样就可以降低每个1x1 卷积的计算代价。

  2. 1x1 卷积仅在相应的通道分组上操作会带来一个副作用:每个通道的输出仅仅与该通道所在分组的输入(一般占总输入的比例较小)有关,与其它分组的输入(一般占总输入的比例较大)无关。这会阻止通道之间的信息流动,降低网络的表达能力。

    解决办法是:采用通道混洗,允许分组卷积从不同分组中获取输入。

    • 如下图所示:(a) 表示没有通道混洗的分组卷积;(b) 表示进行通道混洗的分组卷积;(c)(b) 的等效表示。
    • 由于通道混洗是可微的,因此它可以嵌入到网络中以进行端到端的训练。

  3. ShuffleNet 块的结构从ResNeXt 块改进而来:下图中(a) 是一个ResNeXt 块,(b) 是一个 ShuffleNet 块,(c) 是一个步长为2ShuffleNet 块。

    ShuffleNet 块中:

    • 第一个1x1 卷积替换为1x1 分组卷积+通道随机混洗。

    • 第二个1x1 卷积替换为1x1 分组卷积,但是并没有附加通道随机混洗。这是为了简单起见,因为不附加通道随机混洗已经有了很好的结果。

    • 3x3 depthwise 卷积之后只有BN 而没有ReLU

    • 当步长为2时:

      • 恒等映射直连替换为一个尺寸为 3x3 、步长为2 的平均池化。

      • 3x3 depthwise 卷积的步长为2

      • 将残差部分与直连部分的feature map 拼接,而不是相加。

        因为当feature map 减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。

9.3.1.2 网络性能

  1. Shufflenet 中,depthwise 卷积仅仅在1x1 卷积的输出 feature map 上执行。这是因为 depthwise 很难在移动设备上高效的实现,因为移动设备的 计算/内存访问 比率较低,所以仅仅在1x1 卷积的输出 feature map 上执行从而降低开销。

  2. ShuffleNet 网络由ShuffleNet 块组成。

    • 网络主要由三个Stage 组成。

      • 每个Stage 的第一个块的步长为 2 ,stage 内的块在其它参数上相同。
      • 每个Stage 的输出通道数翻倍。
    • Stage2 的第一个1x1 卷积并不执行分组卷积,因此此时的输入通道数相对较小。

    • 每个ShuffleNet 块中的第一个1x1 分组卷积的输出通道数为:该块的输出通道数的 1/4

    • 使用较少的数据集增强,因为这一类小模型更多的是遇到欠拟合而不是过拟合。

    • 复杂度给出了计算量(乘-加运算),KSize 给出了卷积核的尺寸,Stride 给出了ShuffleNet block 的步长,Repeat 给出了 ShuffleNet block 重复的次数,g 控制了ShuffleNet block 分组的数量。

      g=1 时,1x1 的通道分组卷积退化回原始的1x1 卷积。

  3. 超参数 g 会影响模型的准确率和计算量。在 ImageNet 测试集上的表现如下:

    • ShuffleNet sx 表示对ShuffleNet 的通道数增加到 s 倍。这通过控制 Conv1 卷积的输出通道数来实现。

    • g 越大,则计算量越小,模型越准确。

      其背后的原理是:小模型的表达能力不足,通道数量越大,则小模型的表达能力越强。

      • g 越大,则准确率越高。这是因为对于ShuffleNet,分组越大则生成的feature map 通道数量越多,模型表达能力越强。
      • 网络的通道数越小(如ShuffleNet 0.25x ),则这种增益越大。
    • 随着分组越来越大,准确率饱和甚至下降。

      这是因为随着分组数量增大,每个组内的通道数量变少。虽然总体通道数增加,但是每个分组提取有效信息的能力变弱,降低了模型整体的表征能力。

    • 虽然较大gShuffleNet 通常具有更好的准确率。但是由于它的实现效率较低,会带来较大的推断时间。

  4. 通道随机混洗的效果要比不混洗好。在 ImageNet 测试集上的表现如下:

    • 通道混洗使得分组卷积中,信息能够跨分组流动。
    • 分组数g 越大,这种混洗带来的好处越大。

  5. 多种模型在ImageNet 测试集上的表现:

    比较分为三组,每一组都有相差无几的计算量。 $ MathJax-Element-567 $ 给出了在该组中,模型相对于 MobileNet 的预测能力的提升。

    • MFLOPs 表示乘-加运算量(百万),错误率表示top-1 error
    • ShuffleNet 0.5x(shallow,g=3) 是一个更浅的ShuffleNet 。考虑到MobileNet 只有 28 层,而ShuffleNet 有 50 层,因此去掉了Stage 2-4 中一半的块,得到一个教浅的、只有 26 层的 ShuffleNet

  6. 在移动设备上的推断时间(Qualcomm Snapdragon 820 processor,单线程):

9.3.2 ShuffleNet V2

  1. ShuffleNet V2 基于一系列对照实验提出了高效网络设计的几个通用准则,并提出了ShuffleNet V2 的网络结构。

9.3.2.1 小型网络通用设计准则

  1. 目前衡量模型推断速度的一个通用指标是FLOPs(即乘-加 计算量)。事实上这是一个间接指标,因为它不完全等同于推断速度。如:MobileNet V2NASNET-AFLOPs 相差无几,但是MobileNet V2 的推断速度要快得多。

    如下所示为几种模型在GPUARM 上的准确率(在ImageNet 验证集上的测试结果)、模型推断速度(通过Batch/秒来衡量)、计算复杂度(通过FLOPs 衡量)的关系。

    • ARM 平台上batchsize=1 , 在GPU 平台上batchsize=8

    • 准确率与模型容量成正比,而模型容量与模型计算复杂度成成比、计算复杂度与推断速度成反比。

      因此:模型准确率越高,则推断速度越低;模型计算复杂度越高,则推断速度越低。

  2. FLOPs 和推断速度之间的差异有两个原因:

    • 除了FLOPs 之外,还有几个因素对推断速度有重要的影响。

      • 内存访问量(memory access cost:MAC):在某些操作(如分组卷积)中,其时间开销占相当大比例。因此它可能是GPU 这种具有强大计算能力设备的瓶颈。
      • 模型并行度:相同FLOPs 的情况下,高并行度的模型比低并行度的模型快得多。
    • 即使相同的操作、相同的 FLOPs,在不同的硬件设备上、不同的库上,其推断速度也可能不同。

  3. MobileNet V2ShuffleNet V1 这两个网络非常具有代表性,它们分别采用了group 卷积和 depth-wise 卷积。这两个操作广泛应用于其它的先进网络。

    利用实验分析它们的推断速度(以推断时间开销来衡量)。其中:宽度乘子均为1,ShuffleNet V1 的分组数g=3

    从实验结果可知:FLOPs 指标仅仅考虑了卷积部分的计算量。虽然这部分消耗时间最多,但是其它操作包括数据IO、数据混洗、逐元素操作(ReLU、逐元素相加)等等时间开销也较大。

  4. 小型网络通用设计准则:

    • 准则一:输入通道数和输出通道数相等时,MAC 指标最小。

      假设输入feature map 尺寸为 $ MathJax-Element-601 $ 、通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ 。假设为1x1 卷积,则FLOPs 为: $ MathJax-Element-571 $ 。

      其内存访问量为:输入featuremap 内存访问量+输出featuremap 内存访问量+卷积核内存访问量。因此有: $ MathJax-Element-572 $ 。

      根据不等式 $ MathJax-Element-573 $ ,以及 $ MathJax-Element-574 $ ,则有: $ MathJax-Element-575 $ 。当 $ MathJax-Element-579 $ 时等式成立。

    • 准则二:大量使用分组卷积会增加MAC

      分组卷积可以降低FLOPs 。换言之,它可以在FLOPs 固定的情况下,增大featuremap 的通道数从而提高模型的容量。但是采用分组卷积可能增加MAC

      对于1x1 卷积,设分组数为 g ,则FLOPs 数为 $ MathJax-Element-577 $ ,内存访问量为

      $ MathJax-Element-578 $ 。

      当 $ MathJax-Element-579 $ 时, $ MathJax-Element-580 $ 最小。因此 $ MathJax-Element-581 $ 随着 $ MathJax-Element-582 $ 的增加而增加。

    • 准则三:网络分支会降低并行度。

      虽然网络中采用分支(如Inception系列、ResNet系列)有利于提高模型的准确率,但是它对GPU 等具有高并行计算能力的设备不友好,因此会降低计算效率。

      另外它还带来了卷积核的lauching以及计算的同步等问题,这也是推断时间的开销。

    • 准则四:不能忽视元素级操作的影响。

      元素级操作包括ReLU、AddTensor、AddBias 等,它们的FLOPs 很小但是 MAC 很大。在ResNet 中,实验发现如果去掉ReLU 和旁路连接,则在GPUARM 上大约有 20% 的推断速度的提升。

9.3.2.2 ShuffleNet V2 block

  1. ShuffleNet V1 block 的分组卷积违反了准则二,1x1 卷积违反了准则一,旁路连接的元素级加法违反了准则四。而ShuffleNet V2 block 修正了这些违背的地方。

  2. ShuffleNet V2 blockShuffleNet V1 block 的基础上修改。(a),(b) 表示ShuffleNet V1 block (步长分别为1、2),(c),(d) 表示ShuffleNet V2 block (步长分别为1、2)。其中GConv 表示分组卷积,DWConv 表示depthwise 卷积。

    • 当步长为1 时,ShuffleNet V2 block 首先将输入feature map 沿着通道进行拆分。设输入通道数为 $ MathJax-Element-663 $ ,则拆分为 $ MathJax-Element-584 $ 和 $ MathJax-Element-585 $ 。

      • 根据准则三,左路分支保持不变,右路分支执行各种卷积操作。

      • 根据准则一,右路的三个卷积操作都保持通道数不变。

      • 根据准则二,右路的两个1x1 卷积不再是分组卷积,而是标准的卷积操作。因为分组已经由通道拆分操作执行了。

      • 根据准则四,左右两路的featuremap 不再执行相加,而是执行特征拼接。

        可以将Concat、Channel Shuffle、Channel Split 融合到一个element-wise 操作中,这可以进一步降低element-wise 的操作数量。

    • 当步长为2时,ShuffleNet V2 block 不再拆分通道,因为通道数量需要翻倍从而保证模型的有效容量。

    • 在执行通道Concat 之后再进行通道混洗,这一点也与ShuffleNet V1 block 不同。

9.3.2.3 网络性能

  1. ShuffleNet V2 的网络结构类似ShuffleNet V1,主要有两个不同:

    • ShuffleNet v2 block 代替 ShuffleNet v1 block
    • Global Pool 之前加入一个 1x1 卷积。

  2. ShuffleNet V2 可以结合SENet 的思想,也可以增加层数从而由小网络变身为大网络。

    下表为几个模型在ImageNet 验证集上的表现(single-crop)。

  3. ShuffleNet V2 和其它模型的比较:

    • 根据计算复杂度分成40,140,300,500+ 等四组,单位:MFLOPs
    • 准确率指标为模型在ImageNet 验证集上的表现(single-crop)。
    • GPU 上的 batchsize=8ARM 上的batchsize=1
    • 默认图片尺寸为224x224,标记为* 的图片尺寸为160x160,标记为** 的图片尺寸为192x192

  4. ShuffleNet V2 准确率更高。有两个原因:

    • ShuffleNet V2 block 的构建效率更高,因此可以使用更多的通道从而提升模型的容量。

    • 在每个ShuffleNet V2 block ,有一半通道的数据( $ MathJax-Element-586 $ )直接进入下一层。这可以视作某种特征重用,类似于DenseNet

      但是ShuffleNet v2 block 在特征Concat 之后又执行通道混洗,这又不同于DenseNet

9.4 IGCV 系列

  1. 设计小型化网络目前有两个代表性的方向,并且都取得了成功:

    • 通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用1x3 +3x1 卷积去替代3x3 卷积 。
    • 使用一系列稀疏卷积核去组成一个密集卷积核。如:交错卷积中采用一系列分组卷积去替代一个密集卷积。

9.4.1 IGCV

  1. 简化神经网络结构的一个主要方法是消除结构里的冗余。目前大家都认为现在深度神经网络结构里有很强的冗余性。

    冗余可能来自与两个地方:

    • 卷积核空间方向的冗余。通过小卷积核替代(如,采用3x31x33x1 卷积核)可以降低这种冗余。
    • 卷积核通道方向的冗余。通过分组卷积、depth-wise 卷积可以降低这种冗余。

    IGCV 通过研究卷积核通道方向的冗余,从而减少网络的冗余性。

  2. 事实上解决冗余性的方法有多种:

    • 二元化:将卷积核变成二值的-1+1,此时卷积运算的乘加操作变成了加减 操作。这样计算量就下降很多,存储需求也降低很多(模型变小)。

    • 浮点数转整数:将卷积核的 32 位浮点数转换成16 位整数。此时存储需求会下降(模型变小)。

      除了将卷积核进行二元化或者整数化之外,也可以将 feature map 进行二元化/整数化。

    • 卷积核低秩分解:将大卷积核分解为两个小卷积核 ,如:将100x100 分解为 100x1010x100、将5x5 分解为两个3x3

    • 稀疏卷积分解:将一个密集的卷积核分解为多个稀疏卷积核。如分组卷积、depth-wise 卷积。

9.4.1.1 IGCV block

  1. IGCV 提出了一种交错卷积模块,每个模块由相连的两层分组卷积组成,分别称作第一层分组卷积primary group conv 、第二层分组卷积secondary group conv

    • 第一层分组卷积采用3x3 分组卷积,主要用于处理空间相关性;第二层分组卷积采用1x1 分组卷积,主要用于处理通道相关性。

    • 每层分组卷积的每个组内执行的都是标准的卷积,而不是 depth-wise 卷积。

    • 这两层分组卷积的分组是交错进行的。假设第一层分组卷积有 L 个分组、每个分组 M 个通道,则第二层分组卷积有 M 个分组、每个分组L 个通道。

      • 第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中。

        第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。

      • 这两层分组卷积是互补的、交错的,因此称作交错卷积Interleaved Group Convolution:IGCV

    • 这种严格意义上的互补需要对每层分组卷积的输出 feature map 根据通道数重新排列Permutation。这不等于混洗,因为混洗不能保证严格意义上的通道互补。

  2. 由于分组卷积等价于稀疏卷积核的常规卷积,该稀疏卷积核是block-diagonal (即:只有对角线的块上有非零,其它位置均为 0 )。

    因此IGCV 块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。

  3. 假设第一层分组卷积的卷积核尺寸为 $ MathJax-Element-601 $ ,则 IGCV 块的参数数量为:

    $ T_{igc} = L\times M\times W\times H\times M +M\times L\times 1\times 1\times L=LM(WHM+L) $

    令 $ MathJax-Element-588 $ 为IGCV 块 的输入feature map 通道数量,则 $ MathJax-Element-589 $ 。

    对于常规卷积,假设卷积核的尺寸为 $ MathJax-Element-601 $ ,输入输出通道数均为 $ MathJax-Element-712 $ ,则参数数量为: $ MathJax-Element-592 $ 。当参数数量相等,即 $ MathJax-Element-593 $ 时,则有: $ MathJax-Element-594 $ 。

    当 $ MathJax-Element-595 $ 时,有 $ MathJax-Element-596 $ 。通常选择 $ MathJax-Element-597 $ ,考虑到 $ MathJax-Element-598 $ ,因此该不等式几乎总是成立。于是 IGCV 块总是比同样参数数量的常规卷积块更宽(即:通道数更多)。

  4. 在相同参数数量/计算量的条件下,IGCV 块(除了L=1 的极端情况)比常规卷积更宽,因此IGCV 块更高效。

    • 采用IGCV 块堆叠而成的IGCV 网络在同样参数数量/计算量的条件下,预测能力更强。

    • Xception 块、带有加法融合的分组卷积块都是IGCV 块的特殊情况。

      • M=1L 等于IGCV 块输入feature map 的输入通道数时,IGCV 块退化为Xception 块。

      • L=1M 等于IGCV 块输入feature map 的输入通道数时,IGCV 块退化为采用Summation 融合的Deeply-Fused Nets block

9.4.1.2 网络性能

  1. IGCV网络结构如下表所示,其中:RegConv-Wc 表示常规卷积, W 表示卷积核的尺寸为WxWc 表示通道数量;Summation 表示加法融合层(即常规的1x1 卷积,而不是1x1 分组卷积)。

    • IGCV 块之后紧跟 BNReLU,即结构为:IGC block+BN+ReLU
    • 4x(3x3,8) 表示分成4组,每组的卷积核尺寸为3x3 输出通道数为 8 。
    • 网络主要包含3个stageB 表示每个stage 的块的数量。
    • 某些stage 的输出通道数翻倍(对应于Output size 减半),此时该stage 的最后一个 block 的步长为2(即该block 中的3x3 卷积的步长为2) 。

  2. IGCV网络的模型复杂度如下所示。

    SumFusion 的参数和计算复杂度类似 RegConv-W16,因此没有给出。

  3. IGCV模型在CIFAR-10CIFAR-100 上的表现:

    • 如果增加恒等映射,则结果为:

    • 所有的模型比较:

  4. IGCV模型在ImageNet 上的表现:(输入224x224,验证集,single-crop

  5. 超参数LM 的选取:

    通过IGCVCIFAR100 上的表现可以发现:L 占据统治地位,随着 $ MathJax-Element-696 $ 的增加模型准确率先上升到最大值然后缓缓下降。

9.4.2 IGCV2

  1. IGCV2 block 的主要设计思想是:将 IGCV block 两个结构化的稀疏卷积核组成的交错卷积推广到更多个结构化的稀疏卷积核组成的交错卷积,从而进一步消除冗余性。

9.4.2.1 IGCV2 block

  1. 假设输入feature map 的通道数为 $ MathJax-Element-663 $ ,卷积核尺寸为 $ MathJax-Element-601 $ ,输出通道数为 $ MathJax-Element-677 $ 。考虑输入 feature map 的一个 patch(对应卷积核大小) $ MathJax-Element-698 $ ,该 patch 经过卷积之后的结果为: $ MathJax-Element-604 $ 。其中 $ MathJax-Element-698 $ 是一个长度为 $ MathJax-Element-606 $ 的向量, $ MathJax-Element-607 $ 是一个长度为 $ MathJax-Element-677 $ 的向量, $ MathJax-Element-622 $ 是一个 $ MathJax-Element-677 $ 行、 $ MathJax-Element-611 $ 列的矩阵。

    • Xception、deep roots、IGCV1 的思想是:将卷积核 $ MathJax-Element-622 $ 分解为多个稀疏卷积的乘积:

      $ \mathbf{\vec y} =\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 \mathbf{\vec x},\quad \mathbf W=\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 $

      其中 $ MathJax-Element-613 $ 至少有一个为块稀疏block-wise sparse 矩阵; $ MathJax-Element-700 $ 为置换矩阵,用于重新调整通道顺序; $ MathJax-Element-615 $ 为一个密集矩阵。

    • 对于IGCV1 , 令 $ MathJax-Element-616 $ 为第 $ MathJax-Element-619 $ 层分组卷积的分组数,则:

      $ \mathbf W^i=\begin{bmatrix} \mathbf W_1^i&\mathbf 0&\cdots&\mathbf 0\\ \mathbf 0&\mathbf W_2^i&\cdots&\mathbf 0\\ \vdots&\vdots&\ddots&\vdots\\ \mathbf 0&\mathbf 0&\cdots&\mathbf W_{G_i}^i\\ \end{bmatrix} $

      其中 $ MathJax-Element-618 $ 表示第 $ MathJax-Element-619 $ 层分组卷积的卷积核,它是一个block-wise sparse 的矩阵,其中第 $ MathJax-Element-620 $ 组的卷积核矩阵为 $ MathJax-Element-621 $ 。

  2. IGCV2 不是将 $ MathJax-Element-622 $ 分解为 2个 block-wise sparse 矩阵的乘积(不考虑置换矩阵),而是进一步分解为 $ MathJax-Element-696 $ 个块稀疏矩阵的乘积:

    $ \mathbf{\vec y} =\mathbf P_L\mathbf W_L\mathbf P_{L-1}\mathbf W_{L-1}\cdots\mathbf P_1\mathbf W_1 \mathbf{\vec x}=\left(\prod_{l=L}^1\mathbf P_l\mathbf W_l\right)\mathbf{\vec x}\\ \mathbf W=\mathbf P_L\mathbf W_L\mathbf P_{L-1}\mathbf W_{L-1}\cdots\mathbf P_1\mathbf W_1=\prod_{l=L}^1\mathbf P_l\mathbf W_l $

    其中 $ MathJax-Element-630 $ 为块稀疏矩阵,它对应于第 $ MathJax-Element-642 $ 层分组卷积,即:IGCV2 包含了 $ MathJax-Element-696 $ 层分组卷积; $ MathJax-Element-631 $ 为置换矩阵。

    • 为了设计简单,第 $ MathJax-Element-642 $ 层分组卷积中,每个分组的通道数都相等,设为 $ MathJax-Element-640 $ 。
    • 如下所示为一个 IGCV2 block 。实线表示权重 $ MathJax-Element-630 $ ,虚线表示置换 $ MathJax-Element-631 $ ,加粗的线表示产生某个输出通道(灰色的那个通道)的路径。

9.4.2.2 互补条件 & 平衡条件

  1. 事实上并不是所有的 $ MathJax-Element-696 $ 个块稀疏矩阵的乘积一定就是密集矩阵,这其中要满足一定的条件,即互补条件complementary condition 。互补条件用于保证:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。

  2. 要满足互补条件,则有以下准则:

    对于任意 $ MathJax-Element-636 $ , $ MathJax-Element-634 $ 等价于一层分组卷积,且 $ MathJax-Element-635 $ 也等价于一层分组卷积。且这两层分组卷积是互补的:第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中;第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。

    • 其物理意义为:从任意位置 $ MathJax-Element-636 $ 截断,则前面一半等价于一层分组卷积,后面一半也等价于一层分组卷积。
    • 可以证明 IGCV2 block 满足这种互补条件。
  3. 假设 IGCV2 block 的输入通道数为 $ MathJax-Element-712 $ ,输出通道数也为 $ MathJax-Element-712 $ ,其 L 层分组卷积中第 $ MathJax-Element-642 $ 层分组卷积每组卷积的输入通道数为 $ MathJax-Element-640 $ 。现在考虑 $ MathJax-Element-641 $ 需要满足的约束条件。

    对于IGCV2 block 的某个输入通道,考虑它能影响多少个IGCV2 block的输出通道。

    • 设该输入通道影响了第 $ MathJax-Element-642 $ 层分组卷积的 $ MathJax-Element-646 $ 个输出通道。因为互补条件的限制,这 $ MathJax-Element-646 $ 个通道在第 $ MathJax-Element-645 $ 层进入不同的分组,因此分别归属于 $ MathJax-Element-646 $ 组。而每个分组影响了 $ MathJax-Element-647 $ 个输出通道,因此有递归公式:

      $ C_{l+1} = K_l\times C_l $
    • 考虑初始条件,在第1 层分组卷积有: $ MathJax-Element-648 $ 。则最终该输入通道能够影响IGCV2 block的输出通道的数量为: $ MathJax-Element-649 $ 。

    • 由于互补条件的限制:每个输出通道,有且仅有一条路径,该路径将所有输入通道与该输出通道相连。因此每个输入通道必须能够影响所有的输出通道。因此有: $ MathJax-Element-650 $ 。

  4. 考虑仅仅使用尺寸为 1x1WxH 的卷积核。由于1x1 卷积核的参数数量更少,因此 L 层分组卷积中使用1层尺寸为 WxH 的卷积核、L-1 层尺寸为1x1 卷积核。

    • 假设第1层为WxH 卷积核,后续层都是1x1 卷积核,则总的参数数量为: $ MathJax-Element-651 $ 。

      • 第一项来自于1x1 分组卷积。对于第 $ MathJax-Element-668 $ 层的分组卷积,输入通道数为 $ MathJax-Element-712 $ 、分组数为 $ MathJax-Element-654 $ 、输出通道数为 $ MathJax-Element-712 $ 。则参数数量为: $ MathJax-Element-656 $ 。
      • 第二项来自于WxH 分组卷积。参数数量为: $ MathJax-Element-657 $ 。
    • 根据互补条件 $ MathJax-Element-658 $ ,以及Jensen 不等式有:

      $ Q\ge CL(WHK_1\prod_{l=2}^LK_l)^{1/L}=CL(WHC)^{1/L} $

      等式成立时 $ MathJax-Element-659 $ 。这称作平衡条件balance condition

  5. 考虑选择使得 $ MathJax-Element-673 $ 最小的 $ MathJax-Element-696 $ 。根据

    $ \frac{d \log Q}{ dL} = \frac 1L-\frac 1{L^2}\log(WHC) = 0 $

    则有: $ MathJax-Element-662 $ 。

  6. Block 的输出feature map 尺寸相对于输入feature map 尺寸减半(同时也意味着通道数翻倍)时,Block 的输出通道数不等于输入通道数。

    设输入通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ ,则有:

    • 互补条件: $ MathJax-Element-665 $ 。

    • 平衡条件:

      feature map 的尺寸缩减发生在3x3 卷积,则后续所有的1x1 卷积的输入通道数为 $ MathJax-Element-677 $ 、输出通道数也为 $ MathJax-Element-677 $ 。

      • 对于第 $ MathJax-Element-668 $ 层的分组卷积,参数数量为: $ MathJax-Element-669 $ 。
      • 对于第1层分组卷积,参数数量为: $ MathJax-Element-670 $ ,其中 $ MathJax-Element-671 $ 为分组数量。

      则总的参数数量为: $ MathJax-Element-672 $ 。等式成立时有:

      $ WHK_1=K_2=\cdots=(WHC_O)^{1/L} $
    • 选择使得 $ MathJax-Element-673 $ 最小的 $ MathJax-Element-696 $ 有: $ MathJax-Element-675 $ 。

    因此对于feature map 尺寸发生缩减的IGCV2 Block,互补条件&平衡条件仍然成立,只需要将 $ MathJax-Element-712 $ 替换为输出通道数 $ MathJax-Element-677 $ 。

9.4.2.3网络性能

  1. IGCV2 网络结构如下表所示:其中 $ MathJax-Element-684 $ 为网络第一层的输出通道数量,也就是后面 block 的输入通道数 $ MathJax-Element-712 $ 。

    • 网络主要包含3个stageB 表示每个stage 的块的数量。

    • 某些stage 的输出通道数翻倍,此时该stage 的最后一个 block 的步长为2(即该block 中的3x3 卷积的步长为2) 。

    • 每2个block 添加一个旁路连接,类似ResNet。 即在 $ MathJax-Element-680 $ 这种结构添加旁路连接。

    • $ MathJax-Element-681 $ 表示输入通道数为 $ MathJax-Element-684 $ 的 3x3 卷积。 $ MathJax-Element-683 $ 表示输出通道数为 $ MathJax-Element-684 $ 的 1x1 卷积。

    • $ MathJax-Element-696 $ 和 $ MathJax-Element-689 $ 为IGCV2 的超参数。 $ MathJax-Element-687 $ 表示有 $ MathJax-Element-688 $ 层分组卷积,每个组都是 $ MathJax-Element-689 $ 个输入通道的1x1 卷积。

      事实上 IGCV2 每个 stage 都是 L 层,只是第一层的分组数为 1 。

    • 对于 IGCV2(Cx), $ MathJax-Element-690 $ ;对于 IGCV2*(Cx), $ MathJax-Element-691 $ 。

      IGCV2*(3x3,64) 应该修改为 $ MathJax-Element-692 $ 。

  2. 通过一个简化版的、没有feature map 尺寸缩减(这意味着IGCV2 Block 的输入、输出通道数保持不变 )的IGCV2 网络来研究一些超参数的限制:

    • IGCV2 block 最接近互补条件限制条件 时,表现最好。

      如下所示,红色表示互补条件限制满足条件最好的情况。其中匹配程度通过 $ MathJax-Element-693 $ 来衡量。

    • IGCV2 block的 $ MathJax-Element-696 $ 最佳的情况是:网络的宽度(通过 $ MathJax-Element-712 $ 刻画)和稀疏性达到平衡,如下所示。

      • 下图中,每一种 $ MathJax-Element-696 $ 都选择了对应的Width (即 $ MathJax-Element-712 $ )使得其满足互补条件限制,以及平衡条件,从而使得参数保持相同。
      • Non-sparsity 指的是IGCV2 block 等效的密集矩阵中非零元素的比例。

    • IGCV2 网络越深越好、越宽越好,但是加宽网络比加深网络性价比更高。如下图所示:采用 IGCV2* ,深度用 D 表示、宽度用 C 表示。

  3. IGCV2 网络与不同网络比较:

  4. IGCV2 网络与MobileNet 的比较:(ImageNet

9.4.3 IGCV3

  1. IGCV3 结合了块稀疏的卷积核(如:交错卷积) 和低秩的卷积核(如:bottleneck 模块),并放松了互补条件。

9.4.3.1 IGCV3 block

  1. IGCV3block 修改自IGCV2 block ,它将IGCV2 block 的分组卷积替换为低秩的分组卷积。

    • 首先对输入feature map 进行分组,然后在每个分组中执行 1x1 卷积来扩张通道数。
    • 然后执行常规分组卷积,并对结果进行通道重排列。
    • 最后执行分组卷积,在每个分组中执行1x1 卷积来恢复通道数,并对结果进行通道重排。

    按照IGCV2 的描述方式,输入 feature map 的一个 patch $ MathJax-Element-698 $ ,经过IGCV3 block 之后的结果为:

    $ \mathbf{\vec y} =\mathbf P^2\mathbf W^2\mathbf P^1\mathbf W^1 \mathbf W^0\mathbf{\vec x} $

    其中 $ MathJax-Element-699 $ 为低秩的块稀疏矩阵; $ MathJax-Element-700 $ 为置换矩阵,用于重新调整通道顺序 。

  2. 下图分别展示了IGCV1 blockInverted 残差块、IGCV3 block 的区别。每个圆圈代表一个通道,箭头代表通道的数据流动。

    IGCV1 块中,两层分组卷积的卷积核都是稀疏的;在Inverted 残差块中,两层1x1 卷积的卷积核都是低秩的;在IGCV3 块中,两层1x1 卷积的卷积核是稀疏的,也都是低秩的。

  3. IGCV3 block 第一层分组卷积(1x1 分组扩张卷积) 的分组数量为 $ MathJax-Element-726 $ ;第二层分组卷积(普通分组卷积)的分组数不变,也是 $ MathJax-Element-726 $ ;第三层分组卷积(1x1 分组压缩卷积)的分组数量为 $ MathJax-Element-727 $ 。则 $ MathJax-Element-725 $ 是非常重要的超参数。

9.4.3.2 loose 互补条件

  1. 实验中发现:如果IGCV3 block如果严格遵守互补条件会导致卷积核过于稀疏,从而导致更大的内存消耗而没有带来准确率的提升。

    因此IGCV3 block提出了宽松互补条件loose complementary condition,从而允许输入通道到输出通道存在多条路径。

  2. IGCV3 block 中定义了超级通道 Super-Channel,设为 $ MathJax-Element-717 $ 。在一个IGCV3 block 中,每个feature map 都具有同等数量的Super-Channel

    • 输入feature map 的通道数假设为 $ MathJax-Element-712 $ ,因此每个输入超级通道包含 $ MathJax-Element-713 $ 条普通的输入通道。
    • 经过1x1 分组卷积扩张的输出通道数假设为 $ MathJax-Element-710 $ ,则这里的每个超级通道包含 $ MathJax-Element-711 $ 条普通的通道。
    • 经过常规分组卷积的输出通道数也是 $ MathJax-Element-710 $ ,则这里的每个超级通道也包含 $ MathJax-Element-711 $ 条普通的通道。
    • 最后经过1x1 分组卷积压缩的输出通道数也是 $ MathJax-Element-712 $ ,因此每个输出超级通道包含 $ MathJax-Element-713 $ 条普通的输出通道。
  3. loose complementary condition:第一层分组卷积中,同一个分组的不同超级通道会进入到第三层分组卷积的不同分组中;第三层分组卷积中,同一个分组的不同超级通道来自于第一层分组卷积的不同分组。

    由于超级通道中可能包含多个普通通道,因此输入通道到输出通道存在多条路径。

  4. 通常设置 $ MathJax-Element-714 $ ,即:超级通道数量等于输入通道数量。则每条超级通道包含的普通通道数量依次为: $ MathJax-Element-715 $ ,其中 $ MathJax-Element-716 $ 表示1x1 分组卷积的通道扩张比例。

    也可以将 $ MathJax-Element-717 $ 设置为一个超参数,其取值越小,则互补条件放松的越厉害(即:输入通道到输出通道存在路径的数量越多)。

9.4.3.3 网络性能

  1. IGCV3 网络通过叠加IGCV3 block 而成。因为论文中的对照实验是在网络参数数量差不多相同的条件下进行。为了保证IGCV3 网络与IGCV1/2,MobileNet,ShuffleNet 等网络的参数数量相同,需要加深或者加宽IGCV3网络。

    论文中作者展示了两个版本:

    • 网络更宽的版本,深度与对比的网络相等的同时,加宽网络的宽度,记做IGCV3-W。参数为: $ MathJax-Element-718 $ 。
    • 网络更深的版本,宽度与对比的网络相等的同时,加深网络的深度,记做IGCV3-D。参数为: $ MathJax-Element-719 $ 。
  2. IGCV3IGCV1/2 的对比:

    IGCV3 降低了参数冗余度,因此在相同的参数的条件下,其网络可以更深或者更宽,因此拥有比IGCV1/2 更好的准确率。

  3. IGCV3 和其它网络的在ImageNet 上的对比:

    • MAdds 用于刻画网络的计算量,单位是百万乘-加运算
    • $ MathJax-Element-720 $ 中的 $ MathJax-Element-721 $ 表示宽度乘子,它大概以 $ MathJax-Element-722 $ 的比例减少了参数数量,降低了计算量。

  4. 更深的IGCV 网络和更宽的IGCV 网络的比较:

    • 更深的网络带来的效果更好,这与人们一直以来追求网络的深度 的理念相一致。
    • 在宽度方向有冗余性,因此进一步增加网络宽度并不会带来额外的收益。

  5. ReLU的位置比较:

    第一个IGCV3 blockReLU 位置在两个1x1 卷积之后;第二个IGCV3 blockReLU 位置在3x3 卷积之后;第三个IGCV3 blockReLU 在整个block 之后(这等价于一个常规卷积+ReLU )。

  6. 超参数 $ MathJax-Element-725 $ 的比较:

    • 只要 $ MathJax-Element-725 $ 都是输入、输出通道数的公约数时,loose 互补条件就能满足,因此存在 $ MathJax-Element-725 $ 的很多选择。

    • 实验发现, $ MathJax-Element-726 $ 比较小、 $ MathJax-Element-727 $ 比较大时网络预测能力较好。但是这里的IGCV3 网络采用的是同样的网络深度、宽度。

      如果采用同样的网络参数数量,则 $ MathJax-Element-728 $ 可以产生一个更深的、准确率更高的网络。

9.5 CondenseNet

  1. CondenseNet 基于DenseNet网络,它在训练的过程中自动学习一个稀疏的网络从而减少了Densenet 的冗余性。

    这种稀疏性类似于分组卷积,但是CondenseNet 从数据中自动学到分组,而不是由人工硬性规定分组。

  2. CondenseNet 网络在GPU 上具有高效的训练速度,在移动设备上具有高效的推断速度。

  3. MobileNet、ShuffleNet、NASNet 都采用了深度可分离卷积,这种卷积在大多数深度学习库中没有实现。而CondenseNet 采用分组卷积,这种卷积被大多数深度学习库很好的支持。

    准确的说,CondenseNet 在测试阶段采用分组卷积,在训练阶段采用的是常规卷积。

9.5.1 网络剪枝

  1. 有一些工作(Compressing neural networks with the hashing trickDeep networks with stochastic depth)表明:CNN网络中存在大量的冗余。

    DenseNet 通过直接连接每个层的输出特征与之后的所有层来特征重用。但是如果该层的输出特征是冗余的或者不需要的,则这些连接会带来冗余。

  2. CNN 网络可以通过权重剪枝从而在不牺牲模型准确率的条件下实现小型化。有不同粒度的剪枝技术:

    • 独立的权重剪枝:一种细粒度的剪枝,它可以带来高度稀疏的网络。但是它需要存储大量的索引来记录哪些连接被剪掉,并且依赖特定的硬件/软件设施。
    • filter级别剪枝:一种粗粒度的剪枝,它得到更规则的网络,且易于实现。但是它带来的网络稀疏性较低。
  3. CondenseNet 也可以认为是一种网络剪枝技术,它与以上的剪枝方法都不同:

    • CondenseNet 的网络剪枝发生、且仅仅发生在训练的早期。这比在网络整个训练过程中都采用L1 正则化来获取稀疏权重更高效。
    • CondenseNet 的网络剪枝能产生比filter级别剪枝更高的网络稀疏性,而且网络结构也是规则的、易于实现的。

9.5.2 LGC

  1. 分组卷积在很多CNN 网络中大量使用。在DenseNet 中,可以使用3x3 分组卷积来代替常规的3x3 卷积从而减小模型大小,同时保持模型的准确率下降不大。

    但是实验表明:在DenseNet 中,1x1 分组卷积代替1x1 常规卷积时,会带来模型准确率的剧烈下降。

    对于一个具有 $ MathJax-Element-696 $ 层的 DenseNet Block1x1 卷积是第 $ MathJax-Element-775 $ 层的第一个操作。该卷积的输入是由当前 DenseNet Block 内第 $ MathJax-Element-368 $ 层输出feature map 组成。因此采用1x1 分组卷积带来准确率剧烈下降的原因可能有两个:

    • 第 $ MathJax-Element-368 $ 层输出feature 具有内在的顺序,难以决策哪些feature 应该位于同一组、哪些feature 应该位于不同组。
    • 这些输出feature 多样性较强,缺少任何一些feature 都会减小模型的表达能力。

    因此将这些输出feature 强制性的、固定的分配到不相交的分组里会影响特征重用。

  2. 一种解决方案是:在1x1 卷积之前,先对1x1 卷积操作的输入特征进行随机排列。

    这个策略会缓解模型准确率的下降,但是并不推荐。因为可以采用模型更小的DenseNet 网络达到同样的准确率,而且二者计算代价相同。与之相比,特征混洗+1x1分组卷积 的方案并没有任何优势。

  3. 另一种解决方案是:通过训练来自动学习出feature 的分组。

    考虑到第 $ MathJax-Element-368 $ 层输出feature中,很难预测哪些feature 对于第 $ MathJax-Element-642 $ 层有用,也很难预先对这些feature 执行合适的分组。因此通过训练数据来学习这种分组是合理的方案。这就是学习的分组卷积Learned Group Convolution:LGC

  4. LGC 中:

    • 卷积操作被分为多组filter,每个组都会自主选择最相关的一批feature 作为输入。

      由于这组filter 都采用同样的一批feature 作为输入,因此就构成了分组卷积。

    • 允许某个feature 被多个分组共享(如下图中的Input Feature 5、12),也允许某个feature 被所有的分组忽略(如下图中的Input Feature 2、4)。

    • 即使某个feature 被第 $ MathJax-Element-642 $ 层1x1 卷积操作的所有分组忽略,它也可能被第 $ MathJax-Element-645 $ 层1x1 卷积操作的分组用到。

9.5.3 训练和测试

  1. CondenseNet 的训练、测试与常规网络不同。

    • CondenseNet 的训练是一个多阶段的过程,分为浓缩阶段和优化阶段。

      • 浓缩阶段condensing stage:训练的前半部分为浓缩阶段,可以有多个condensing stage (如下图所示有2个浓缩阶段)。

        每个condensing stage 重复训练网络一个固定的iteration,并在训练过程中:引入可以产生稀疏性的正则化、裁剪掉权重幅度较小的filter

      • 优化阶段optimization stage:训练的后半部分为优化阶段,只有一个optimization stage

        在这个阶段,网络的1x1 卷积的分组已经固定,此阶段在给定分组的条件下继续学习1x1 分组卷积。

    • CondenseNet 的测试需要重新排列裁剪后的filter,使其重新组织成分组卷积的形式。因为分组卷积可以更高效的实现,并且节省大量计算。

    • 通常所有的浓缩阶段和所有的优化阶段采取1:1 的训练epoch 分配。假设需要训练 $ MathJax-Element-946 $ 个epoch,有 $ MathJax-Element-543 $ 个浓缩阶段,则:

      • 所有的浓缩阶段消耗 $ MathJax-Element-957 $ 个epoch,每个浓缩阶段消耗 $ MathJax-Element-1034 $ 个epoch
      • 所有的优化阶段也消耗 $ MathJax-Element-957 $ 个epoch

  2. 假设卷积核的尺寸为 $ MathJax-Element-601 $ ,输入通道数为 $ MathJax-Element-663 $ ,输出通道数为 $ MathJax-Element-677 $ 。当采用1x1 卷积核时4D 的核张量退化为一个矩阵,假设该矩阵表示为 $ MathJax-Element-1040 $ 。

    将该矩阵按行(即输出通道数)划分为同样大小的 $ MathJax-Element-1041 $ 个组,对应的权重为: $ MathJax-Element-1042 $ 。其中 $ MathJax-Element-1043 $ , $ MathJax-Element-1044 $ 对应第 $ MathJax-Element-582 $ 个分组的第 $ MathJax-Element-619 $ 个输出特征(对应于整体的第 $ MathJax-Element-1055 $ 个输出特征)和整体的第 $ MathJax-Element-620 $ 个输入特征的权重。

    • CondenseNet 在训练阶段对每个分组筛选出对其不太重要的特征子集。

      对于第 $ MathJax-Element-582 $ 个分组,第 $ MathJax-Element-620 $ 个输入特征的重要性由该特征在 $ MathJax-Element-582 $ 分组所有输出上的权重的绝对值均值来刻画: $ MathJax-Element-1083 $ 。如果 $ MathJax-Element-1085 $ 相对较小,则删除输入特征 $ MathJax-Element-620 $ ,这就产生了稀疏性。

    • 为了缓解权重裁剪带来的准确率损失,这里引入 L1 正则化。因为L1 正则化可以得到更稀疏的解,从而使得删除 $ MathJax-Element-1085 $ 相对较小的连接带来的准确率损失较小(因为这些权重大多数为0 或者很小的值)。

      CondenseNet 中引入分组L1 正则化group-lasso: $ MathJax-Element-1163 $ 。这倾向于将 $ MathJax-Element-1165 $ 的某一列 $ MathJax-Element-1190 $ 整体拉向 0 ,使得产生filter 级别的稀疏性(而不是权重级别的稀疏性)。

  3. 考虑到LGC 中,某个feature 可以被多个分组分享,也可以不被任何分组使用,因此一个feature 被某个分组选取的概率不再是 $ MathJax-Element-1191 $ 。 定义浓缩因子 $ MathJax-Element-712 $ ,它表示每个分组包含 $ MathJax-Element-1293 $ 的输入。

    • 如果不经过裁剪,则每个分组包含 $ MathJax-Element-663 $ 个输入;经过裁剪之后,最终保留 $ MathJax-Element-1299 $ 比例的输入。

    • filter 裁剪融合于训练过程中。给定浓缩因子 $ MathJax-Element-712 $ ,则CondenseNet 包含 $ MathJax-Element-1301 $ 个condensing stage (如上图中, $ MathJax-Element-1303 $ )。

      在每个condensing stage 结束时,每个分组裁剪掉整体输入 $ MathJax-Element-1306 $ 比例的输入。经过 $ MathJax-Element-1301 $ 个condensing stage之后,网络的每个分组仅仅保留 $ MathJax-Element-1293 $ 的输入。

  4. 在每个condensing stage 结束前后,training loss 都会突然上升然后下降。这是因为权重裁剪带来的突变。

    最后一个浓缩阶段突变的最厉害,因为此时每个分组会损失 50% 的权重。但是随后的优化阶段会逐渐降低training loss

    下图中,学习率采用cosine 学习率。

  5. 训练完成之后,CondenseNet引入index layer 来重新排列权重裁剪之后剩下的连接,使其成为一个1x1分组卷积。

    • 训练时,1x1 卷积是一个LGC
    • 测试时,1x1 卷积是一个index layer 加一个1x1分组卷积。

    下图中:左图为标准的 DenseNet Block,中间为训练期间的CondenseNet Block,右图为测试期间的CondenseNet Block

  6. 在训练早期就裁剪了一些权重,而裁剪的原则是根据权重的大小。因此存在一个问题:裁剪的权重是否仅仅因为它们是用较小的值初始化?

    论文通过实验证明网络的权重裁剪与权重初始化无关。

9.5.4 IGR 和 FDC

  1. CondenseNetDenseNet 做了两个修改:

    • 递增的学习率increasing growth rate:IGR

      原始的DenseNet 对所有的DenseNet Block 使用相同的增长率。考虑到DenseNet 更深的层更多的依赖high-level 特征而不是low-level 特征,因此可以考虑使用递增的增长率,如指数增长的增长率: $ MathJax-Element-1404 $ ,其中 $ MathJax-Element-636 $ 为 Block 编号。

      该策略会增加模型的参数,降低网络参数的效率,但是会大大提高计算效率。

    • 全面的连接fully dense connectivity:FDC

      原始的DenseNet 中只有DenseNet Block 内部的层之间才存在连接。在CondenseNet 中,将每层的输出连接到后续所有层的输入,无论是否在同一个CondenseNet Block 中。

      如果有不同的feature map 尺寸,则使用池化操作来降低分辨率。

  2. LGC、LGR、FDC 的实验分析如下:(CIFAR-10 数据集)

    • 配置:默认 $ MathJax-Element-359 $ ,3x3 卷积为分组数量为4的分组卷积。

      • LGC:learned group convolutionC=41x1 卷积为LGC
      • IGR:exponentially increasing learning rate: $ MathJax-Element-1480 $ 。
      • FDC:fully dense conectivity
    • 相邻两条线之间的gap 表示对应策略的增益。

      • 第二条线和第一条线之间的gap 表示IGC 的增益。

      • 第三条线和第二条线之间的gap 表示IGR 的增益。

      • 第四条线和第三条线之间的gap 表示FDC 的增益。

        FDC 看起来增益不大,但是如果模型更大,根据现有曲线的趋势FDC 会起到效果。

9.5.5 网络性能

  1. CondenseNet 与其它网络的比较:(* 表示使用cosine 学习率训练 600个 epoch)

  2. CondenseNet 与其它裁剪技术的比较:

  3. CondenseNet 的超参数的实验:(CIFAR-10DenseNet-50 为基准)

    • 裁剪策略:(G=4

      • Full Model :不进行任何裁剪。
      • Traditional Pruning :在训练阶段(300个epoch)完成时执行裁剪(因此只裁剪一次),裁剪方法与LGC 一样。然后使用额外的300个 epoch 进行微调。

    • 分组数量:(C=8

      • 这里的分组值得是3x3 分组卷积的分组数量。
      • 随着分组数量的增加,测试误差逐渐降低。这表明LGC 可以降低网络的冗余性。

    • 浓缩因子:(G=4)

      可以看到: $ MathJax-Element-1578 $ 可以带来更好的效益;但是 $ MathJax-Element-1580 $ 时,网络的准确率和网络的FLOPs 呈现同一个函数关系。这表明裁剪网络权重会带来更小的模型,但是也会导致一定的准确率损失。

  4. ImageNet 上的比较:

    • 网络结构:

      为了降低参数,在epoch 60 时(一共120epoch )裁剪了全连接层FC layer 50% 的权重。思想与1x1 卷积的LGC 相同,只是 $ MathJax-Element-1613 $ 。

    • CondenseNet 与其它网络的比较:

    • 网络在ARM 处理器上的推断时间(输入尺寸为224x224 ):

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文