CNN Model详解


LeNet

  1. 1998年LeCun 推出了LeNet 网络,它是第一个广为流传的卷积神经网络。

  2. LeNet 网络包含了卷积层、池化层、全连接层,这些都是现代CNN 网络的基本组件。

    • 输入层:二维图像,尺寸为32x32

    • C1、C3、C5 层:二维卷积层。

      其中C5 将输入的 feature map(尺寸 16@5x5 )转化为尺寸为120x1x1feature map,然后转换为长度为120 的一维向量。

      这是一种常见的、将卷积层的输出转换为全连接层的输入的一种方法。

    • S2、S4 层:池化层。使用sigmoid 函数作为激活函数。

      后续的 CNN 都使用ReLU 作为激活函数。

    • F6 层:全连接层。

    • 输出层:由欧式径向基函数单元组成。

      后续的CNN 使用softmax 输出单元。

      下表中,@ 分隔了通道数量和feature map 的宽、高。

      网络层 核/池大小 核数量 步长 输入尺寸 输出尺寸
      INPUT - - - - 1@32x32
      C1 5x5 6 1 1@32x32 6@28x28
      S2 2x2 - 2 6@28x28 6@14x14
      C3 5x5 16 1 6@14x14 16@10x10
      S4 2x2 - 2 16@10x10 16@5x5
      C5 5x5 120 1 16@5x5 120@1x1
      F6 - - - 120 84
      OUTPUT - - - 84 10

AlexNet

2012年Hinton 和他的学生推出了AlexNet 。在当年的ImageNet 图像分类竞赛中,AlexeNet 以远超第二名的成绩夺冠,使得深度学习重回历史舞台,具有重大历史意义。

网络结构

  1. AlexNet 有5个广义卷积层和3个广义全连接层。

    • 广义的卷积层:包含了卷积层、池化层、ReLULRN 层等。
    • 广义全连接层:包含了全连接层、ReLUDropout 层等。

  2. 网络结构如下表所示:

    • 输入层会将3@224x224 的三维图片预处理变成3@227x227 的三维图片。

    • 第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本GPU 内的通道数据进行计算。

      第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算。

    • 第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用same 填充。

      当卷积的步长为1,核大小为3x3 时,如果不填充0,则feature map 的宽/高都会缩减 2 。因此这里填充0,使得输出feature map 的宽/高保持不变。

      其它层的卷积,以及所有的池化都是valid 填充(即:不填充 0 )。

    • 第六层广义连接层的卷积之后,会将feature map 展平为长度为 4096 的一维向量。

    编号 网络层 子层 核/池大小 核数量 步长 激活函数 输入尺寸 输出尺寸
    第0层 输入层 - - - - - - 3@224x224
    第1层 广义卷积层 卷积 11x11 96 4 ReLU 3@227x227 96@55x55
    第1层 广义卷积层 池化 3x3 - 2 - 96@55x55 96@27x27
    第1层 广义卷积层 LRN - - - - 96@27x27 96@27x27
    第2层 广义卷积层 卷积 5x5 256 1 ReLU 96@27x27 256@27x27
    第2层 广义卷积层 池化 3x3 - 2 - 256@27x27 256@13x13
    第2层 广义卷积层 LRN - - - - 256@13x13 256@13x13
    第3层 广义卷积层 卷积 3x3 384 1 ReLU 256@13x13 384@13x13
    第4层 广义卷积层 卷积 3x3 384 1 ReLU 384@13x13 384@13x13
    第5层 广义卷积层 卷积 3x3 256 1 ReLU 384@13x13 256@13x13
    第5层 广义卷积层 池化 3x3 - 2 - 256@13x13 256@6x6
    第6层 广义连接层 卷积 6x6 4096 1 ReLU 256@6x6 4096@1x1
    第6层 广义连接层 dropout - - - - 4096@1x1 4096@1x1
    第7层 广义连接层 全连接 - - - ReLU 4096 4096
    第7层 广义连接层 dropout - - - - 4096 4096
    第8层 广义连接层 全连接 - - - - 4096 1000
  3. 网络参数数量:总计约 6237万。

    • 输出Tensor size 采用channel last 风格描述。即227x227x3 等价于前文的 3@227x227

    • 第6层广义连接层的卷积的参数数量最多,约3770万,占整体六千万参数的 60%。

      原因是该子层的卷积核较大、输入通道数量较大、输出通道数量太多。该卷积需要的参数数量为:

    编号 网络层 子层 输出 Tensor size 权重个数 偏置个数 参数数量
    第0层 输入层 - 227x227x3 0 0 0
    第1层 广义卷积层 卷积 55x55x96 34848 96 34944
    第1层 广义卷积层 池化 27x27x96 0 0 0
    第1层 广义卷积层 LRN 27x27x96 0 0 0
    第2层 广义卷积层 卷积 27x27x256 614400 256 614656
    第2层 广义卷积层 池化 13x13x256 0 0 0
    第2层 广义卷积层 LRN 13x13x256 0 0 0
    第3层 广义卷积层 卷积 13x13x384 884736 384 885120
    第4层 广义卷积层 卷积 13x13x384 1327104 384 1327488
    第5层 广义卷积层 卷积 13x13x256 884736 256 884992
    第5层 广义卷积层 池化 6x6x256 0 0 0
    第6层 广义连接层 卷积 4096×1 37748736 4096 37752832
    第6层 广义连接层 dropout 4096×1 0 0 0
    第7层 广义连接层 全连接 4096×1 16777216 4096 16781312
    第7层 广义连接层 dropout 4096×1 0 0 0
    第8层 广义连接层 全连接 1000×1 4096000 1000 4097000
    总计 - - - - - 62,378,344

设计技巧

AlexNet 成功的主要原因在于:

  • 使用ReLU 激活函数。
  • 使用dropout、数据集增强 、重叠池化等防止过拟合的方法。
  • 使用百万级的大数据集来训练。
  • 使用GPU训练,以及的LRN 使用。
  • 使用带动量的 mini batch 随机梯度下降来训练。

数据集增强

局部响应规范化

多GPU 训练

AlexNet 使用两个GPU训练。网络结构图由上、下两部分组成:一个GPU运行图上方的通道数据,一个GPU 运行图下方的通道数据,两个GPU 只在特定的网络层通信。即:执行分组卷积。

  • 第二、四、五层卷积层的核只和同一个GPU 上的前一层的feature map 相连。
  • 第三层卷积层的核和前一层所有GPUfeature map 相连。
  • 全连接层中的神经元和前一层中的所有神经元相连。

重叠池化

  1. 一般的池化是不重叠的,池化区域的大小与步长相同。Alexnet 中,池化是可重叠的,即:步长小于池化区域的大小。

    重叠池化可以缓解过拟合,该策略贡献了0.4% 的错误率。

  2. 为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。

优化算法

VGG-Net

  1. VGG-Net 是牛津大学计算机视觉组和DeepMind公司共同研发一种深度卷积网络,并且在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名。
  2. VGG-Net 的主要贡献是:
    • 证明了小尺寸卷积核(3x3 )的深层网络要优于大尺寸卷积核的浅层网络。
    • 证明了深度对网络的泛化性能的重要性。
    • 验证了尺寸抖动scale jittering 这一数据增强技术的有效性。
  3. VGG-Net 最大的问题在于参数数量,VGG-19 基本上是参数数量最多的卷积网络架构。

网络结构

  1. 通用结构:

    • 输入层:固定大小的224x224RGB 图像。

    • 卷积层:卷积步长均为1。

      • 填充方式:填充卷积层的输入,使得卷积前后保持同样的空间分辨率。

        • 3x3 卷积:same 填充,即:输入的上下左右各填充1个像素。
        • 1x1 卷积:不需要填充。
      • 卷积核尺寸:有3x31x1 两种。

        • 3x3 卷积核:这是捕获左右、上下、中心等概念的最小尺寸。

        • 1x1 卷积核:用于输入通道的线性变换。

          在它之后接一个ReLU 激活函数,使得输入通道执行了非线性变换。

    • 池化层:采用最大池化。

      • 池化层连接在卷积层之后,但并不是所有的卷积层之后都有池化。
      • 池化窗口为2x2,步长为 2 。
    • 网络最后四层为::三个全连接层 + 一个softmax 层。

      • 前两个全连接层都是 4096个神经元,第三个全连接层是 1000 个神经元(因为执行的是 1000 类的分类)。
      • 最后一层是softmax 层用于输出类别的概率。
    • 所有隐层都使用ReLU 激活函数。

  2. VGG-Net 网络参数数量:

    其中第一个全连接层的参数数量为:7x7x512x4096=1.02亿 ,因此网络绝大部分参数来自于该层。

    AlexNet 相比,VGG-Net 在第一个全连接层的输入feature map 较大:7x7 vs 6x6512 vs 256

    网络 A , A-LRN B C D E
    参数数量 1.13亿 1.33亿 1.34亿 1.38亿 1.44

设计技巧

Inception

  1. Inception 网络是卷积神经网络的一个重要里程碑。在Inception 之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使得网络越来越深。这使得网络越来越复杂,参数越来越多,从而导致网络容易出现过拟合,增加计算量。

    Inception 网络考虑的是多种卷积核的并行计算,扩展了网络的宽度。

  2. Inception Net 核心思想是:稀疏连接。因为生物神经连接是稀疏的。

  3. Inception 网络的最大特点是大量使用了Inception 模块。

Inception v1

网络结构

  1. InceptionNet V1 是一个22层的深度网络。 如果考虑池化层,则有29层。如下图中的depth 列所示。

网络具有三组Inception 模块,分别为:inception(3a)/inception(3b)inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)inception(5a)、inception(5b)。三组Inception 模块被池化层分

  1. 下图给出了网络的层次结构和参数,其中:
  • type 列:给出了每个模块/层的类型。
  • patch size/stride 列:给出了卷积层/池化层的尺寸和步长。
  • output size 列:给出了每个模块/层的输出尺寸和输出通道数。
  • depth列:给出了每个模块/层包含的、含有训练参数层的数量。
  • #1x1列:给出了每个模块/层包含的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
  • #3x3 reduce列:给出了每个模块/层包含的、放置在3x3 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
  • #3x3列:给出了每个模块/层包含的3x3 卷积核的数量,它就是3x3 卷积核的输出通道数。
  • #5x5 reduce列:给出了每个模块/层包含的、放置在5x5 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
  • #5x5列:给出了每个模块/层包含的5x5 卷积核的数量,它就是5x5卷积核的输出通道数。
  • pool proj列:给出了每个模块/层包含的、放置在池化层之后的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
  • params列:给出了每个模块/层的参数数量。
  • ops列:给出了每个模块/层的计算量。

  1. Inception V1 的参数数量为 697.7 万,其参数数量远远小于AlexNet(6千万)、VGG-Net(超过1亿)。

Inception V1 参数数量能缩减的一个主要技巧是:在inception(5b)输出到linear之间插入一个平均池化层avg pool

  • 如果没有平均池化层,则inception(5b)linear 之间的参数数量为:7x7x1024x1024,约为 5 千万。
  • 插入了平均池化层之后,inception(5b)linear 之间的参数数量为:1x1x1024x1024,约为 1百万。

Inception 模块

  1. 原始的Inception 模块对输入同时执行:3个不同大小的卷积操作(1x1、3x3、5x5)、1个最大池化操作(3x3 )。所有操作的输出都在深度方向拼接起来,向后一级传递。

    • 三种不同大小卷积:通过不同尺寸的卷积核抓取不同大小的对象的特征。

      使用1x1、3x3、5x5 这些具体尺寸仅仅是为了便利性,事实上也可以使用更多的、其它尺寸的滤波器。

    • 1个最大池化:提取图像的原始特征(不经过过滤器)。

  2. 原始Inception 模块中,模块的输出通道数量为四个子层的输出通道数的叠加。这种叠加不可避免的使得Inception 模块的输出通道数增加,这就增加了Inception 模块中每个卷积的计算量。因此在经过若干个模块之后,计算量会爆炸性增长。

    解决方案是:在3x35x5 卷积层之前额外添加1x1 卷积层,来限制输入给卷积层的输入通道的数量。

    注意:

    • 1x1 卷积是在最大池化层之后,而不是之前。这是因为:池化层是为了提取图像的原始特征,一旦它接在1x1 卷积之后就失去了最初的本意。
    • 1x1 卷积在3x35x5 卷积之前。这是因为:如果1x1 卷积在它们之后,则3x3 卷积、5x5 卷积的输入通道数太大,导致计算量仍然巨大。

辅助分类器

  1. 为了缓解梯度消失的问题,InceptionNet V1 给出了两个辅助分类器。这两个辅助分类器被添加到网络的中间层,它们和主分类器共享同一套训练数据及其标记。其中:

    • 第一个辅助分类器位于Inception(4a) 之后,Inception(4a) 模块的输出作为它的输入。
    • 第二个辅助分类器位于Inception(4d) 之后,Inception(4d) 模块的输出作为它的输入。
    • 两个辅助分类器的结构相同,包括以下组件:
      • 一个尺寸为5x5、步长为3的平均池化层。
      • 一个尺寸为1x1、输出通道数为128 的卷积层。
      • 一个具有1024 个单元的全连接层。
      • 一个drop rate = 70%dropout 层。
      • 一个使用softmax 损失的线性层作为输出层。
  2. 在训练期间,两个辅助分类器的损失函数的权重是0.3,它们的损失被叠加到网络的整体损失上。在推断期间,这两个辅助网络被丢弃。

    Inception v3 的实验中表明:辅助网络的影响相对较小,只需要其中一个就能够取得同样的效果。

    事实上辅助分类器在训练早期并没有多少贡献。只有在训练接近结束,辅助分支网络开始发挥作用,获得超出无辅助分类器网络的结果。

  3. 两个辅助分类器的作用:提供正则化的同时,克服了梯度消失问题。

Inception v2

  1. Inception v2 的主要贡献是提出了Batch Normalization 。论文指出,使用了Batch Normalization 之后:

    • 可以加速网络的学习。

      相比Inception v1,训练速度提升了14倍。因为应用了BN 之后,网络可以使用更高的学习率,同时删除了某些层。

    • 网络具有更好的泛化能力。

      ImageNet 分类问题的top5 上达到4.8%,超过了人类标注 top5 的准确率。

  2. Inception V2 网络训练的技巧有:

    • 使用更高的学习率。
    • 删除dropout层、LRN 层。
    • 减小L2 正则化的系数。
    • 更快的衰减学习率。学习率以指数形式衰减。
    • 更彻底的混洗训练样本,使得一组样本在不同的epoch 中处于不同的mini batch 中。
    • 减少图片的形变。
  3. Inception v2 的网络结构比Inception v1 有少量改动:

    • 5x5 卷积被两个3x3 卷积替代。

      这使得网络的最大深度增加了 9 层,同时网络参数数量增加 25%,计算量增加 30%。

    • 28x28inception 模块从2个增加到3个。

    • inception 模块中,有的采用最大池化,有的采用平均池化。

    • inception 模块之间取消了用作连接的池化层。

    • inception(3c),inception(4e) 的子层采用步长为 2 的卷积/池化。

    Pool+proj 列给出了inception 中的池化操作。

    • avg+32 意义为:平均池化层后接一个尺寸1x1、输出通道32 的卷积层。
    • max+pass through 意义为:最大池化层后接一个尺寸1x1、输出通道数等于输入通道数的卷积层。

  4. Inception V2 的网络参数约为1126 万。

    参数数量
    conv1 9408
    conv2 114688
    inception-3a 218094
    inception-3b 259072
    inception-3c 384000
    inception-4a 608193
    inception-4b 663552
    inception-4c 912384
    inception-4d 1140736
    inception-4e 1447936
    inception-5a 2205696
    inception-5b 2276352
    fc 1024000
    11264111
  5. Inception V2ImageNet 测试集上的误差率:

Inception v3

虽然Inception v1 的参数较少,但是它的结构比较复杂,难以进行修改。原因有以下两点:

  • 如果单纯的放大网络(如增加Inception 模块的数量、扩展Inception 模块的大小),则参数的数量会显著增长,计算代价太大。
  • Inception v1 结构中的各种设计,其对最终结果的贡献尚未明确。

因此Inception v3 的论文重点探讨了网络结构设计的原则。

网络结构

  1. Inception v3 的网络深度为42层,它相对于Inception v1 网络主要做了以下改动:

    • 7x7 卷积替换为3个3x3 卷积。

    • 3个Inception模块:模块中的5x5 卷积替换为2个3x3 卷积,同时使用后面描述的网格尺寸缩减技术。

    • 5个Inception 模块:模块中的5x5 卷积替换为2个3x3 卷积之后,所有的nxn 卷积进行非对称分解,同时使用后面描述的网格尺寸缩减技术。

    • 2个Inception 模块:结构如下。它也使用了卷积分解技术,以及网格尺寸缩减技术。

  2. Inception v3 的网络结构如下所示:

    • 3xInception 表示三个Inception 模块,4xInception 表示四个Inception 模块,5xInception 表示五个Inception 模块。

    • conv padded 表示使用0填充的卷积,它可以保持feature map 的尺寸。

      Inception 模块内的卷积也使用0填充,所有其它的卷积/池化不再使用填充。

  3. 3xInception 模块的输出之后设有一个辅助分类器。其结构如下:

  4. Inception v3 整体参数数量约 23,626,728万(论文Xception: Deep Learning with Depthwise Separable Convolutions)。

设计技巧

Inception v3 总结出网络设计的一套通用设计原则:

  • 避免representation 瓶颈:representation 的大小应该从输入到输出缓缓减小,避免极端压缩。在缩小feature map 尺寸的同时,应该增加feature map 的通道数。

    representation 大小通常指的是feature map 的容量,即feature mapwidth x height x channel

  • 空间聚合:可以通过空间聚合来完成低维嵌入,而不会在表达能力上有较大的损失。因此通常在nxn 卷积之前,先利用1x1 卷积来降低输入维度。

    猜测的原因是:空间维度之间的强相关性导致了空间聚合过程中的信息丢失较少。

  • 平衡网络的宽度和深度:增加网络的宽度或者深度都可以提高网络的泛化能力,因此计算资源需要在网络的深度和宽度之间取得平衡。

卷积尺寸分解

  1. 大卷积核的分解:将大卷积核分解为多个小的卷积核。

    如:使用2个3x3 卷积替换5x5 卷积,则其参数数量大约是1个5x5 卷积的 72% 。

  2. nxn 卷积核的非对称分解:将nxn 卷积替换为1xn 卷积和nx1 卷积。

    • 这种非对称分解的参数数量是原始卷积数量的 四、Inception - 图11 。随着n 的增加,计算成本的节省非常显著。
    • 论文指出:对于较大的feature map ,这种分解不能很好的工作;但是对于中等大小的 feature map (尺寸在12~20 之间),这种分解效果非常好。

网格尺寸缩减

标签平滑正则化

Inception v4 & Inception - ResNet

  1. Inception v4Inception-ResNet 在同一篇论文中给出。论文通过实验证明了:结合残差连接可以显著加速Inception 的训练。

  2. 性能比较:(综合采用了 144 crops/dense 评估的结果,数据集:ILSVRC 2012 的验证集 )

    网络 crops Top-1 Error Top-5 Error
    ResNet-151 dense 19.4% 4.5%
    Inception-v3 144 18.9% 4.3%
    Inception-ResNet-v1 144 18.8% 4.3%
    Inception-v4 144 17.7% 3.8%
    Inception-ResNet-v2 144 17.8% 3.7%
  3. Inception-ResNet-v2 参数数量约为 5500万,Inception-ResNet-v1/Inception-v4 的参数数量也在该量级。

Inception v4

  1. Inception v4 结构的主要改动:

    • 修改了 stem 部分。

    • 引入了Inception-AInception-BInception-C 三个模块。这些模块看起来和Inception v3 变体非常相似。

      Inception-A/B/C 模块中,输入feature map 和输出feature map 形状相同。而Reduction-A/B 模块中,输出feature map 的宽/高减半、通道数增加。

    • 引入了专用的“缩减块”(reduction block),它被用于缩减feature map 的宽、高。

      早期的版本并没有明确使用缩减块,但是也实现了其功能。

  2. Inception v4 结构如下:(没有标记V 的卷积使用same填充;标记V 的卷积使用valid 填充)

    • stem 部分的结构:

    • Inception-A模块(这样的模块有4个):

    • Inception-B模块(这样的模块有7个):

    • Inception-C模块(这样的模块有3个):

    • Reduction-A模块:(其中 四、Inception - 图35 分别表示滤波器的数量)

      网络 k l m n
      Inception-v4 192 224 256 384
      Inception-ResNet-v1 192 192 256 384
      Inception-ResNet-v2 256 256 256 384
    • Reduction-B模块:

Inception-ResNet

  1. Inception-ResNet 中,使用了更廉价的Inception 块:inception 模块的池化运算由残差连接替代。

    Reduction 模块中能够找到池化运算。

  2. Inception ResNet 有两个版本:v1v2

    • v1 的计算成本和Inception v3 的接近,v2 的计算成本和Inception v4 的接近。
    • v1v2 具有不同的stem
    • 两个版本都有相同的模块A、B、C 和缩减块结构,唯一不同在于超参数设置。
  3. Inception-ResNet-v1 结构如下:

    • stem 部分的结构:

    • Inception-ResNet-A模块(这样的模块有5个):

    • Inception-B模块(这样的模块有10个):

    • Inception-C模块(这样的模块有5个):

    • Reduction-A模块:同inception_v4Reduction-A模块

    • Reduction-B模块:

  4. Inception-ResNet-v2 结构与Inception-ResNet-v1 基本相同 :

    • stem 部分的结构:同inception_v4stem 部分。

      Inception-ResNet-v2 使用了inception v4stem 部分,因此后续的通道数量与Inception-ResNet-v1 不同。

    • Inception-ResNet-A模块(这样的模块有5个):它的结构与Inception-ResNet-v1Inception-ResNet-A相同,只是通道数发生了改变。

    • Inception-B模块(这样的模块有10个):它的结构与Inception-ResNet-v1Inception-ResNet-B相同,只是通道数发生了改变。

    • Inception-C模块(这样的模块有5个):它的结构与Inception-ResNet-v1Inception-ResNet-C相同,只是通道数发生了改变。

    • Reduction-A模块:同inception_v4Reduction-A模块。

    • Reduction-B模块:它的结构与Inception-ResNet-v1Reduction-B相同,只是通道数发生了改变。

  5. 如果滤波器数量超过1000,则残差网络开始出现不稳定,同时网络会在训练过程早期出现“死亡”:经过成千上万次迭代之后,在平均池化之前的层开始只生成 0 。

    解决方案:在残差模块添加到activation 激活层之前,对其进行缩放能够稳定训练。降低学习率或者增加额外的BN都无法避免这种状况。

    这就是Inception ResNet 中的 Inception-A,Inception-B,Inception-C 为何如此设计的原因。

    • Inception-A,Inception-B,Inception-C 放置在两个Relu activation 之间。
    • 通过线性的1x1 Conv(不带激活函数)来执行对残差的线性缩放。

Xception

  1. 一个常规的卷积核尝试在三维空间中使用滤波器抽取特征,包括:两个空间维度(宽度和高度)、一个通道维度。因此单个卷积核的任务是:同时映射跨通道的相关性和空间相关性。

    Inception 将这个过程明确的分解为一系列独立的相关性的映射:要么考虑跨通道相关性,要么考虑空间相关性。Inception 的做法是:

    • 首先通过一组1x1 卷积来查看跨通道的相关性,将输入数据映射到比原始输入空间小的三个或者四个独立空间。
    • 然后通过常规的3x3 或者 5x5 卷积,将所有的相关性(包含了跨通道相关性和空间相关性)映射到这些较小的三维空间中。

    一个典型的Inception 模块(Inception V3 )如下:

    可以简化为:

  2. Xception 将这一思想发挥到极致:首先使用1x1 卷积来映射跨通道相关性,然后分别映射每个输出通道的空间相关性,从而将跨通道相关性和空间相关性解耦。因此该网络被称作Xception:Extreme Inception ,其中的Inception 块被称作 Xception 块。

  3. Xception 块类似于深度可分离卷积,但是它与深度可分离卷积之间有两个细微的差异:

    • 操作顺序不同:
      • 深度可分离卷积通常首先执行channel-wise 空间卷积,然后再执行1x1 卷积。
      • Xception 块首先执行1x1 卷积,然后再进行channel-wise 空间卷积。
    • 第一次卷积操作之后是否存在非线性:
      • 深度可分离卷积只有第二个卷积(1x1 )使用了ReLU 非线性激活函数,channel-wise 空间卷积不使用非线性激活函数。
      • Xception 块的两个卷积(1x13x3 )都使用了ReLU 非线性激活函数。

    其中第二个差异更为重要。

  4. Xception 进行以下的修改,都可以加快网络收敛速度,并获取更高的准确率:

    • 引入类似ResNet 的残差连接机制。
    • 1x1 卷积和3x3 卷积之间不加入任何非线性。
  5. Xception 的参数数量与Inception V3 相同,但是性能表现显著优于Inception V3 。这表明Xception 更加高效的利用了模型参数。

    • 根据论文Xception: Deep Learning with Depthwise Separable ConvolutionsInception V3 参数数量为 23626728,Xception 参数数量为 22855952 。

    • ImageNet 上的benchmark 为(单个模型,单次crop ):

      模型 top-1 accuracy top-5 accuracy
      VGG-16 71.5% 90.1%
      ResNet-152 77.0% 93.3%
      Inception V3 78.2% 94.1%
      Xception 79.0% 94.5%

ResNet

  1. ResNet 提出了一种残差学习框架来解决网络退化问题,从而训练更深的网络。这种框架可以结合已有的各种网络结构,充分发挥二者的优势。

  2. ResNet以三种方式挑战了传统的神经网络架构:

    • ResNet 通过引入跳跃连接来绕过残差层,这允许数据直接流向任何后续层。

      这与传统的、顺序的pipeline 形成鲜明对比:传统的架构中,网络依次处理低级feature 到高级feature

    • ResNet 的层数非常深,高达1202层。而ALexNet 这样的架构,网络层数要小两个量级。

    • 通过实验发现,训练好的 ResNet 中去掉单个层并不会影响其预测性能。而训练好的AlexNet 等网络中,移除层会导致预测性能损失。

  3. ImageNet分类数据集中,拥有152层的残差网络,以3.75% top-5 的错误率获得了ILSVRC 2015 分类比赛的冠军。

  4. 很多证据表明:残差学习是通用的,不仅可以应用于视觉问题,也可应用于非视觉问题。

网络退化问题

  1. 学习更深的网络的一个障碍是梯度消失/爆炸,该问题可以通过Batch Normalization 在很大程度上解决。

  2. ResNet 论文作者发现:随着网络的深度的增加,准确率达到饱和之后迅速下降,而这种下降不是由过拟合引起的。这称作网络退化问题。

    如果更深的网络训练误差更大,则说明是由于优化算法引起的:越深的网络,求解优化问题越难。如下所示:更深的网络导致更高的训练误差和测试误差。

  3. 理论上讲,较深的模型不应该比和它对应的、较浅的模型更差。因为较深的模型是较浅的模型的超空间。较深的模型可以这样得到:先构建较浅的模型,然后添加很多恒等映射的网络层。

    实际上我们的较深的模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题表明:通过多个非线性层来近似横等映射可能是困难的。

  4. 解决网络退化问题的方案:学习残差。

残差块

ResNet 分析

  1. Veit et al. 认为ResNet 工作较好的原因是:一个ResNet 网络可以看做是一组较浅的网络的集成模型。

    但是ResNet 的作者认为这个解释是不正确的。因为集成模型要求每个子模型是独立训练的,而这组较浅的网络是共同训练的。

  2. 论文《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》ResNet 进行了深入的分析。

    • 通过分解视图表明:ResNet 可以被视作许多路径的集合。
    • 通过研究ResNet 的梯度流表明:网络训练期间只有短路径才会产生梯度流,深的路径不是必须的。
    • 通过破坏性实验,表明:
      • 即使这些路径是共同训练的,它们也不是相互依赖的。
      • 这些路径的行为类似集成模型,其预测准确率平滑地与有效路径的数量有关。

分解视图

路径长度分析

路径梯度分析

路径破坏性分析

网络性能

  1. plain 网络:一些简单网络结构的叠加,如下图所示。图中给出了四种plain 网络,它们的区别主要是网络深度不同。其中,输入图片尺寸 224x224 。

    ResNet 简单的在plain 网络上添加快捷连接来实现。

    FLOPsfloating point operations 的缩写,意思是浮点运算量,用于衡量算法/模型的复杂度。

    FLOPSfloating point per second的缩写,意思是每秒浮点运算次数,用于衡量计算速度。

  2. 相对于输入的feature map,残差块的输出feature map 尺寸可能会发生变化:

    • 输出 feature map 的通道数增加,此时需要扩充快捷连接的输出feature map 。否则快捷连接的输出 feature map 无法和残差块的feature map 累加。

      有两种扩充方式:

      • 直接通过 0 来填充需要扩充的维度,在图中以实线标识。
      • 通过1x1 卷积来扩充维度,在图中以虚线标识。
    • 输出 feature map 的尺寸减半。此时需要对快捷连接执行步长为 2 的池化/卷积:如果快捷连接已经采用 1x1 卷积,则该卷积步长为2 ;否则采用步长为 2 的最大池化 。

  3. 计算复杂度:

    VGG-19 34层 plain 网络 Resnet-34
    计算复杂度(FLOPs) 19.6 billion 3.5 billion 3.6 billion
  4. 模型预测能力:在ImageNet 验证集上执行10-crop 测试的结果。

    • A 类模型:快捷连接中,所有需要扩充的维度的填充 0 。
    • B 类模型:快捷连接中,所有需要扩充的维度通过1x1 卷积来扩充。
    • C 类模型:所有快捷连接都通过1x1 卷积来执行线性变换。

    可以看到C 优于BB 优于A。但是 C 引入更多的参数,相对于这种微弱的提升,性价比较低。所以后续的ResNet 均采用 B 类模型。

    模型 top-1 误差率 top-5 误差率
    VGG-16 28.07% 9.33%
    GoogleNet - 9.15%
    PReLU-net 24.27% 7.38%
    plain-34 28.54% 10.02%
    ResNet-34 A 25.03% 7.76%
    ResNet-34 B 24.52% 7.46%
    ResNet-34 C 24.19% 7.40%
    ResNet-50 22.85% 6.71%
    ResNet-101 21.75% 6.05%
    ResNet-152 21.43% 5.71%

ResNet 变种

恒等映射修正

在论文《Identity Mappings in Deep Residual Networks》中,ResNet 的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。

新残差块

  1. 新的残差单元中,恒等映射添加到ReLU 激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。

快捷连接验证

激活函数验证

网络性能

ILSVRC 2012 验证集上的评估结果:

方法 数据集增强 train crop test crop top-1 误差 top-5 误差
ResNet-152,原始残差块 scale 224x224 224x224 23.0% 6.7%
ResNet-152,原始残差块 scale 224x224 320x320 21.3% 5.5%
ResNet-152,full pre-activation scale 224x224 320x320 21.1% 5.5%
ResNet-200,原始残差块 scale 224x224 320x320 21.8% 6.0%
ResNet-200,full pre-activation scale 224x224 320x320 20.7% 5.3%
ResNet-200,full pre-activation scale + asp ratio 224x224 320x320 20.1% 4.8%
Inception v3 scale + asp ratio 299x299 299x299 21.2% 5.6%

ResNeXt

  1. 通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。

    ResNeXt 网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。

  2. ResNeXt 的设计参考了VGGInception 的设计哲学。

    • VGG:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。

    • Inception:通过执行分裂-变换-合并策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并行为预期能够达到一个大的dense 层的表达能力,但是计算复杂度要低的多。

      其缺点是:

      • 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
      • 一旦需要训练新的任务(如新任务是一个NLP 任务),可能需要重新设计网络结构。因此可扩展性不高。
    • ResNeXt 结合了二者的优点:

      • 网络结构也是通过简单地层叠相同结构的层来实现。
      • 网络的每一层都执行了分裂-变换-合并策略。
  3. 在相同的参数数量和计算复杂度的情况下,ResNeXt 的预测性能要优于ResNet

    • 它在ILSVRC 2016 分类任务中取得了第二名的成绩。
    • 101 层的ResNeXt 就能够获得超过200ResNet 的准确率,并且计算量只有后者的一半。
  4. ResNeXt 改进了ResNet 网络结构,并提出了一个新的维度,称作“基数”cardinality。基数是网络的深度和网络的宽度之外的另一个重要因素。

    作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。

分裂-变换-合并

ResNeXt 块

通常ResNeXt 模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。

  • 此时并没有通过 1x1 卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。
  • 如下图所示,它等价于图(c) 中,去掉中间的变换层(128,3x3,128 层),同时将第一层、第三层的 1x1 替换为3x3 卷积层。

网络性能

  1. ResNeXt 的两种重要超参数是:基数C 和颈宽d

    • 基数 C:决定了每个ResNeXt 模块有多少条路径。
    • 颈宽(bottleneck widthd:决定了ResNeXt 模块中第一层1x1 卷积降维的维度。

    这二者也决定了ResNeXt 模块等价形式中,通道分组卷积的通道数量为 Cxd

  2. ResNeXt 的网络参数和计算量与同等结构的ResNet 几乎相同。以ResNet-50 为例(输入图片尺寸224x224 ):

    ResNeXt-50(32x4d) 意思是:基数C=32,颈宽d=4

  3. ImageNet 上进行的对比实验(验证集误差,single crop ):

    • 基数 vs 颈宽:基数越大越好。

      模型 配置 top-1 error(%)
      ResNet-50 C=1,d=64 23.9
      ResNeXt-50 C=2,d=40 23.0
      ResNeXt-50 C=4,d=24 22.6
      ResNeXt-50 C=8,d=14 22.3
      ResNeXt-50 C=32,d=4 22.2
      ResNet-101 C=1,d=64 22.0
      ResNeXt-101 C=2,d=40 21.7
      ResNeXt-101 C=4,d=24 21.4
      ResNeXt-101 C=8,d=14 21.3
      ResNeXt-101 C=32,d=4 21.2
    • 基数 vs 深度/宽度:基数越大越好。

  4. 与其它模型的预测能力比较(验证集误差,single crop):

    ResNet/ResNeXt 的图片尺寸为224x224320x320Inception 的图片尺寸为299x299

随机深度网络

  1. 随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。

    如图所示:在CIFAR-10 上,1202 层的ResNet 测试误差要高于 110 层的ResNet ,表现出明显的过拟合。而 1202 层的随机深度网络(结合了ResNet )的测试误差要低于 110 层的ResNet

  2. 神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的feature 消失、训练时间过长。

    • 虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。

    • 随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:

      • 在网络训练期间,对每个mini batch 随机地移除部分层来显著的减小网络的深度。

        移除操作:删除对应的层,并用跳跃连接来代替。

      • 在网络测试期间,使用全部的网络层。

  3. 随机深度的思想可以和ResNet 结合。因为ResNet 已经包含了跳跃连接,因此可以直接修改。

随机深度

网络性能

SENet

  1. SENet 提出了一种新的架构单元来解决通道之间相互依赖的问题。它通过显式地对通道之间的相互依赖关系建模,自适应的重新校准通道维的特征响应,从而提高了网络的表达能力。
  2. SENet2.251% top-5 的错误率获得了ILSVRC 2017 分类比赛的冠军。
  3. SENet 是和ResNet 一样,都是一种网络框架。它可以直接与其他网络架构一起融合使用,只需要付出微小的计算成本就可以产生显著的性能提升。

SE 块

squeeze 操作

excitation 操作

SE 块使用

网络性能

  1. 网络结构:其中 fc,[16,256] 表示 SE 块中的两个全连接层的输出维度。

  2. ImageNet 验证集上的计算复杂度和预测误差比较(single-crop)。

    • original 列:从各自原始论文中给出的结果报告。
    • re-implementation 列:重新训练得到的结果报告。
    • SENet 列:通过引入SE块之后的结果报告。
    • GFLOPs/MFLOPs:计算复杂度,单位为 G/M FLOPs
    • MobileNet 采用的是 1.0 MobileNet-224ShuffleNet 采用的是 1.0 ShuffleNet 1x(g=3)
    • 数据集增强和归一化:
      • 随机裁剪成 224x224 大小(Inception 系列裁剪成 299x299 )。
      • 随机水平翻转。
      • 输入图片沿着通道归一化:每个像素减去本通道的像素均值。

    七、SENet - 图70

  3. ImageNet 验证集上的预测误差比较(single-crop):

    其中 SENet-154(post-challenge) 是采用 320x320 大小的图片来训练的。

DenseNet

  1. DenseNet不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。

  2. ResNet 的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet 做得更为彻底:将所有层以前馈的形式相连,这种网络因此称作DenseNet

  3. DenseNet 具有以下的优点:

    • 缓解梯度消失的问题。因为每层都可以直接从损失函数中获取梯度、从原始输入中获取信息,从而易于训练。
    • 密集连接还具有正则化的效应,缓解了小训练集任务的过拟合。
    • 鼓励特征重用。网络将不同层学到的 feature map 进行组合。
    • 大幅度减少参数数量。因为每层的卷积核尺寸都比较小,输出通道数较少 (由增长率 k 决定)。
  4. DenseNet 具有比传统卷积网络更少的参数,因为它不需要重新学习多余的feature map

    • 传统的前馈神经网络可以视作在层与层之间传递状态的算法,每一层接收前一层的状态,然后将新的状态传递给下一层。

      这会改变状态,但是也传递了需要保留的信息。

    • ResNet 通过恒等映射来直接传递需要保留的信息,因此层之间只需要传递状态的变化

    • DenseNet 会将所有层的状态 全部保存到集体知识中,同时每一层增加很少数量的feture map 到网络的集体知识中

  5. DenseNet 的层很窄(即:feature map 的通道数很小),如:每一层的输出只有 12 个通道。

DenseNet 块

增长率

非线性变换 H_l

bottleneck

过渡层

网络性能

内存优化

内存消耗

内存优化

优化结果

小型网络

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

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

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

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

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

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

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

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

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

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

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

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

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

SqueezeNet 系列

SqueezeNet

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

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

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

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

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

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

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

Fire 模块

网络性能

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

  1. 模型性能:
  • 网络压缩方法列:给出了网络裁剪方法,包括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 Accuracy top-5 Accuracy
AlexNet None 32 bit 240 MB 1x 57.2% 80.3%
AlexNet SVD 32 bit 48 MB 5x 56.0% 79.4%
AlexNet Network Pruning 32 bit 27 MB 9x 57.2% 80.3%
AlexNet Deep Compression 5-8 bit 6.9 MB 35x 57.2% 80.3%
SqueezeNet None 32 bit 4.8 MB 50x 57.5% 80.3%
SqueezeNet Deep Compression 8 bit 0.66 MB 363x 57.5% 80.3%
SqueezeNet Deep Compression 6 bit 0.47 MB 510x 57.5% 80.3%

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

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

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

SqueezeNext

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

SqueezeNext Block

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

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

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

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

网络性能

  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 准确率 参数数量(百万) 参数降低倍数
    AlexNet 57.10% 80.30% 60.9 1x
    SqueezeNet 57.50% 80.30% 1.2 51x
    SqueezeNext-23 59.05% 82.60% 0.72 84x
    G-SqueezeNext-23 57.16% 80.23% 0.54 112x
    SqueezeNext-34 61.39% 84.31% 1.0 61x
    SqueezeNext-44 62.64% 85.15% 1.2 51x
  3. 更宽和更深版本的SqueezeNext网络在ImageNet 上的预测准确率:

    • 1.5/2.0 分别表示将网络拓宽1.5/2 倍。拓宽指的增加网络的feature map 的通道数,做法是增加第一个conv 的输出通道数。
    • 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
    模型 top-1 准确率 top-5 准确率 参数数量(百万)
    1.5-SqueezeNext-23 63.52% 85.66% 1.4
    1.5-SqueezeNext-34 66.00% 87.40% 2.1
    1.5-SqueezeNext-44 67.28% 88.15% 2.6
    VGG-19 68.50% 88.50% 138
    2.0-SqueezeNext-23 67.18% 88.17% 2.4
    2.0-SqueezeNext-34 68.46% 88.78% 3.8
    2.0-SqueezeNext-44 69.59% 89.53% 4.4
    MobileNet 67.50%(70.9%) 86.59%(89.9%) 4.2
    2.0-SqueezeNext-23v5 67.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 和计算。

MobileNet 系列

MobileNet

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

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

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

深度可分离卷积

网络结构

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

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

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

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

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

宽度乘子 & 分辨率乘子

网络性能

MobileNet V2

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

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

线性bottleneck

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 中这二者是独立的,而传统网络中这二者是相互纠缠的。

网络性能

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

    • 每一行代表一个或者一组相同结构的层,层的数量由 九、小型网络 - 图146 给定。
    • 相同结构指的是:
      • 同一行内的层的类型相同,由Operator 指定。其中bottleneck 指的是bottleneck block
      • 同一行内的层的膨胀比相同,由 t 指定。
      • 同一行内的层的输出通道数相同,由c 指定。
      • 同一行内的层:第一层采用步幅s,其它层采用步幅1
    • 采用ReLU6 激活函数,因为它在低精度浮点运算的环境下表现较好。
    • 训练过程中采用dropoutBN
  2. MobileNet V1 类似,MobileNet V2 也可以引入宽度乘子、分辨率乘子这两个超参数。

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

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

    • 最后一列给出了预测单张图片的推断时间。
    网络 Top 1 Params(百万) 乘-加 数量(百万) CPU
    MobileNet V1 70.6 4.2 575 113ms
    ShuffleNet (1.5) 71.5 3.4 292 -
    ShuffleNet (x2) 73.7 5.4 524 -
    NasNet-A 74.0 5.3 564 183ms
    MobileNet V2 72.0 3.4 300 75ms
    MobileNet V2(1.4) 74.7 6.9 585 143ms

ShuffleNet 系列

ShuffleNet

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

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

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 减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。

网络性能

  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 测试集上的表现:

    比较分为三组,每一组都有相差无几的计算量。九、小型网络 - 图153 给出了在该组中,模型相对于 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,单线程):

ShuffleNet V2

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

小型网络通用设计准则

  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. 小型网络通用设计准则:

ShuffleNet V2 block

网络性能

  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 ,有一半通道的数据()直接进入下一层。这可以视作某种特征重用,类似于DenseNet

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

IGCV 系列

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

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

IGCV

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

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

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

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

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

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

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

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

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

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

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 块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。

网络性能

  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 占据统治地位,随着 九、小型网络 - 图203 的增加模型准确率先上升到最大值然后缓缓下降。

IGCV2

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

IGCV2 block

互补条件 & 平衡条件

网络性能

IGCV3

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

IGCV3 block

loose 互补条件

网络性能

CondenseNet

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

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

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

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

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

网络剪枝

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

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

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

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

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

LGC

训练和测试

IGR 和 FDC

网络性能

  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)

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

  4. ImageNet 上的比较:

    • 网络结构:

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

    • CondenseNet 与其它网络的比较:

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


文章作者: 杰克成
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杰克成 !
评论
  目录