经典CNN模型-DenseNet手写笔记

  |  

摘要: 2018 年左右 DenseNet 学习笔记

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


DenseNet 相比 ResNet 可能影响力小一点,但也是计算机视觉中很重要的一个模型。2018 年被提出,后来也出了变种,并且在产业中应用也比较广泛。

本文是 2018 年相关的手写笔记,涉及到 DenseNet 论文、DenseNet 内存高效实现的技术报告,以及作者解读 DenseNet 的文章。以后想复习的时候可以参考。

DenseNet 有一些很好的优点:有助于解决梯度消失问题,有利于特征传播,鼓励特征的重复利用,还可以减少参数量。论文《Densely Connected Convolutional Networks》如下:

梯度消失问题介绍

当 CNN 变得越来越深的时候,会出现梯度消失的问题:当输入或梯度信息在经过很多层的传递之后,在到达网络的最后(或开始)可能会消失或者“被冲刷掉”(wash out)。

由于梯度消失问题,早期的网络都是比较浅的,比如 LeNet5,VGG19。ResNets 网络和 Highway 网络取得了突破,使得 100 层的网络可以训练了,它们的做法是将旁路信息(bypass signal)进行连接。

在 ResNet 之后也有文章研究过这个问题,参考以下两篇:

(1) 《Stochastic depth shorten ResNet》中,随机深度(stochastic depth)在训练过程中随机丢掉一些层,进而缩短了ResNets网络,获得了更好的信息和梯度流。

(2) 2016 年的 《FractalNet Repeatly Combine Several Parallel Layer Sequence with Different Number of Convolutional Blocks》中,分形网络 FractalNets 使用不同数量的卷积 block 来重复的连接一些平行层,获得更深的网络同时还保留了网络中的 short paths。

这两篇的共同点是它们都在前几层和后几层之间产生了短路径(short paths)。

稠密连接

本文提出了一种新的连接模式:为了保证能够获得网络层之间的最大信息,将所有层(使用合适的特征图尺寸)都进行互相连接。为了能够保证前馈的特性,每一层将之前所有层的输入进行拼接,之后将输出的特征图传递给之后的所有层。

注意:不是在特征传递给某一层之前将其进行相加(combine),而是将其进行拼接(concatenate)。

这样最后一层分类器基于网络中所有的 feature map 做决策,某层都直接接触 loss 的梯度和输入。

稠密连接模块的一个优点是它比传统的卷积网络有更少的参数,因为它不需要再重新学习多余的特征图。

DenseNet层很窄(例如每一层有12个滤波器),仅仅增加小数量的特征图到网络的“集体知识”(collective knowledge),并且保持这些特征图不变——最后的分类器基于网络中的所有特征图进行预测。

除了具有更好的参数利用率,DenseNets还有一个优点是它改善了网络中信息和梯度的传递,这就让网络更容易训练。

相关工作

自从神经网络被提出之后,网络结构的探索就是神经网络研究的一部分。

1980s 提出级联结构,比较像本文提出的稠密网络。在级联网络之前的工作主要关注在全连接的多层感知机上。

在CNNs中利用跨层连接获得的多种特征在计算机视觉任务重很有效,这方面的工作和论文很多。Highway 其中第一个提出使用100多层的结构训练一个端到端的网络。使用旁路(bypassing paths)和门控单元(gating units),ResNet 中一本身的特征图作为旁路。

一种让网络更深(如跨层连接)的正交法(orthogonal approach)是增加网络的宽度。GooLeNet使用了“inception”模块,将不同尺寸的滤波器产生的特征进行组合连接。

DenseNets不是通过很深或者很宽的网络来获得表征能力,而是通过特征的重复使用来利用网络的隐含信息,获得更容易训练、参数效率更高的稠密模型。将不同层学到的特征图进行组合连接,增加了之后层输入的多样性,提升了性能。这同时也指出了DenseNets和ResNets之间的主要差异。尽管inception网络也组合连接了不同层的特征,但DenseNets更简单,也更高效。

NIN(Network in Network)结构将多层感知机与卷积层的滤波器相连来提取更复杂的特征。

DSN(Deeply Supervised Nets)中,通过辅助分类器来监督内部层,加强了前几层的梯度。

Ladder网络将横向连接(lateral connection)引入到自编码器中,在半监督学习任务中获得不错的效果。

DFNs(Deeply Fused Network)通过连接不同基础网络的中间层来改善信息的传递。


DenseNet

网络的符号表示

符号定义:

网络层数 $L$。

第 $l$ 层的非线性变换 $H_{l}(x_{l-1})$,其中 $H_{l}$ 可以是 BN、ReLU,Pooling、Conv 等的结合;$x_{l}$ 是第 $l$ 层的输出。

ResNet 可以表示为:

好处是梯度可以经过 Identity Function 从深层传到浅层,但是不好的地方是 Identity Function 与 $H_{l}$ 是通过加法连接,可能阻碍网络的信息流。

DenseNet 可以表示为:

其中 $[x_{0}, x_{1}, …, x_{l-1}]$ 表示第 0, …, n-1 层的 Concatenate。

在 DenseNet 中,Composite function($H_{l}$) 的定义参考 ResNet-V2,也就是【BN + ReLU + Conv3x3】。

当 Feature map 变化的时候,Concatenate 不可以直接用,CNN 需要下采样层改变 Feature Map 的大小。具体做法是把网络拆成好几个 Dense Block,Block 之间的层称为 Transition Layer【BN + conv1x1 + 2x2 avgpool】。

Growth Rate

若每一层产生 k 个 Feature Map,则第 l 层输入 feature map 个数为 $k_{0} + k \times (l - 1)$。其中 $k_{0}$ 为输入层的通道数。

DenseNet 相比其他网络结构的一个重要的特点是 DenseNet 的网络很窄,例如 k = 12。这里的 k 称为增长速率

增长速率控制着每一层有多少信息对全局状态有效,也就是每层贡献多少新信息。

Bottleneck Layer (改进1)

虽然 k 规定了输出 Feature Map,但还是有很多 Feature Map。

conv1x1 作为 Bottleneck layer 引入,放在 conv3x3 前可以用于减少输入 feature map。这种做法对 DenseNet 很有效。

在 DenseNet 中使用了 BN-ReLU-Conv1x1-BN-ReLU-Conv3x3 的结构成为 DenseNet-B。

Compression (改进2)

在 transition layer 减少 feature map 个数。

一个 Dense Block 含有 m 个 feature map,则令它接的 transition layer 产生 $\theta m$ 个输出特征图。

其中 $0 < \theta \leq 1$ 称为压缩系数

如果 $\theta < 1$,则为 DenseNet-C。

如果 $\theta < 1$ 同时使用了 Bottleneck 则为 DenseNet-BC。

ImageNet 上的实现细节

见笔记图。

ImageNet 上的训练

90 epoch,batchsize = 256,初始学习率 0.1。

在 30, 60 epoch 处降学习率为 1/10。

weight decay 为 1e-4。参考《Traning and Investigating Residual Nets》。

Nesterov Momentum 0.9,不使用动量阻尼(dampening)。

初始化使用《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中的设置。

DenseNet 的优缺点

DenseNet 结构的优点:

  • 前向:每一层都可以看到所有之前得输入,对于网络已经学到的知识(即已有的 Feature Map),以及原始输入,都可以直接访问到(多层特征融合),再添加自己的知识到知识库(全局)。这样就达到了特征重用的效果,减少了不必要的计算量。

  • 反向:跳跃结构很近地连接到最后的 loss,训练起来容易,且能起到正则化的作用。

DenseNet 结构的缺点:

特征爆炸,随着层数变深,特征越来越多,需要用增长率控制。例如一层有 4/16 个 channel,不像通常的每层上百个 channel。每层都很轻且每层都用 conv1x1 降维。

作者解读 DenseNet

从哪些启发提出的 DenseNet

《Deep Networks with stachastic depth》中用了一种类似 Dropout 的方法改进 ResNet,训练中每一步都随机扔一些层,可以显著提升泛化性能。

这就带来两点启发:

  1. NN 不一定要是递进层级结构,即某一层不仅依赖上一层的特征,还可以依赖更前层的特征。
  2. 训练中随机扔很多层也不破坏收敛,说明 ResNet 有明显冗余

DenseNet 的优点

省参数

ImageNet 上达到同样的准确率,DenseNet 所需参数量不到 ResNet 一半,模型体积更小。

省计算

与 ResNet 相当的精度,计算量也只有一半左右,计算效率在 DL 实际应用中需求很强。

黄高团队也在研究更高效的 DenseNet,初步表明,DenseNet 很有潜力,即使不用 Deep Saperate Convolution 也能达到比现有方法更好的效果。

黄高团队还提出可自适应推理的多尺度 DenseNet,参考《Multi-Scale Dense Convolutional Networks for Efficient Prediction》。

抗过拟合

有很好的抗过拟合性能,尤其训练数据缺乏的时候。

稠密连接是否会冗余

每层计算量下降,特征重复利用。这么多稠密连接是否全部必要,是否去掉一些也不影响性能。

文章给出了一个热力图,见笔记,确定靠后的层也会用到浅层特征,若有好的剪枝方法,应该是可以去掉一部分连接不影响性能的。

推理时的内存占用

DenseNet 与普通网络在推理时的内存占用是相当的。

  • 普通网络:计算好一层的特征图后就将前层的释放掉
  • DenseNet:始终保存前层输出,但每层的特征图很少

使用细节

  1. 每层开始的瓶颈层(Conv1x1)对减少参数量和计算量很有用
  2. 像VGG和ResNet那样,每做一次下采样都把宽度加一倍,可提高 DenseNet 的计算效率
  3. 与其它网络一样,DenseNet 的宽度深度均应均衡变化
  4. 每层设计的较窄会降低 DenseNet 在 GPU 上的运算效率,但可能提升在 CPU 上的计算效率

其他任务

语义分割

基于 DenseNet 的 FCN 在无预训练下达到比其他预训练方法更高的精度,比达到相同效果的其他方法体积小十倍。参考《The One Hundred Layers Tiramisu: FC DenseNet for Semantic Segmentation》

检测

基于 DenseNet 的检测也可以在无 ImageNet 预训练下达到 SOTA。参考《DSON: Learning Deeply Supervised Object Detectors from Scratch》。


Share