DenseNet详细解释
卷积神经网络,在沉睡了近20年之后,已经成为深度学习方向最重要的网络结构之一。从最初五层结构的LeNet,到19层结构的VGG,再到首次跨越100层网络的Highway Networks和ResNet,网络层的深化成为CNN的主要发展方向之一。
随着CNN网络层数的增加,梯度消失和模型退化的问题出现在人们面前,批处理化的广泛使用在一定程度上缓解了梯度消失的问题。ResNet和公路网通过构造身份映射设置旁路,进一步减少了梯度消失和模型退化的产生。分形网将不同深度的网络并行化,在获得深度的同时保证了梯度的传播。随机深度网络使网络中的一些层不活动。它不仅证明了ResNet深度的冗余性,而且缓解了上述问题。虽然这些不同的网络框架通过不同的实现方式加深了网络层的数量,但它们都包含了相同的核心思想,即跨网络层连接特征地图。
何明凯在提出ResNet的时候做了一个假设,如果一个较深的网络有几层另一个浅的网络能够学习身份映射,那么这个较深的网络训练出来的模型的性能不会弱于这个浅的网络。通俗地说,如果在某个网络中加入一些可以学习身份映射的层,形成一个新的网络,那么最坏的结果就是新网络中的这些层经过训练后会变成完全相同的映射,不会影响原网络的性能。同样,DenseNet也做出了这样的假设:特征重用是比多次学习冗余特征更好的特征提取方法。
ResNet的一个主要优点是梯度可以流过恒等式函数到达上一层,但是恒等式映射和非线性变换输出的叠加方式是加法,这在一定程度上破坏了网络中的信息流。
为了进一步优化信息流的传播,DenseNet提出了一种图形网络结构。
如图所示,I层的输入不仅与i-1层的输出有关,还与前面所有层的输出有关。注意:
由于DenseNet中需要对不同层的特征图进行猫操作,不同层的特征图需要保持相同的特征大小,这就限制了网络中下采样的实现。为了使用降采样,作者将DenseNet分成几个Denseblock,如下图所示:
在同一个稠密块中,要求特征尺寸保持相同,在不同的稠密块之间设置过渡层,实现降采样。在作者的实验中,过渡层由BN+conv (1× 1)+2× 2平均池组成。
在Denseblock中,假设每个非线性变换H的输出为K个特征映射,那么I层网络的输入为K ^ 0+(I-1)×K,这里我们可以看到DenseNet与现有网络的一个主要区别:DenseNet可以接受更少的特征映射作为网络层的输出,如下图所示。
原因是同一Denseblock中的每一层都与所有先前的层相关联。如果我们把特征看作一个Denseblock的全局状态,那么每一层的训练目标就是通过已有的全局状态来判断需要添加到全局状态的更新值。因此,每个网络层输出的特征图的数量k也称为增长率。它还决定了每一层需要多少信息来更新全局状态。正如我们将在后面看到的,在作者的实验中,只需要一个小k就可以达到最先进的性能.
虽然DenseNet接受较少的k,也就是特征图的个数作为输出,但是由于不同层的特征图是通过cat运算组合在一起的,最终特征图的通道会很大,成为网络的负担。作者采用1×1 Conv(瓶颈)作为特征降维方法来减少通道数。为了提高计算效率,改进后的非线性变换变成了BN-RELU-conv(1×1)-BN-RELU-conv(3×3),使用瓶颈层的DenseNet称为Densenet-B,在实验中作者使用了1× 65433。
为了进一步优化模型的简单性,我们还可以减少过渡层中特征图的数量。如果一个Denseblock包含m个特征映射,那么我们可以生成其输出连接的过渡层。θm?输出要素地图。其中θ为压缩因子,当θ=1时,过渡层将保持原特征尺寸不变。
压缩且θ=0.5的DenseNet命名为DenseNet-C,瓶颈压缩且θ=0.5的DenseNet命名为DenseNet-BC。
由于DenseNet对输入做cat操作,一个直观的效果是每一层学习到的特征图可以直接被后续所有层使用,使得特征在整个网络中可以重用,模型更加简洁。
从上图可以看出DenseNet的参数效率:左图包含了DenseNet的各种结构参数和最终性能的统计,可以看到当模型实现同样的测试误差时,原来的DenseNet往往比DenseNet-BC多2-3倍的参数数量。中间的图显示了DenseNet-BC和ResNet之间的比较。在相同的模型精度下,DenseNet-BC只需要ResNet的三分之一左右的参数。右边是训练时参数超过1001层的ResNet和参数只有0.8M的DenseNet-BC的100层的对比,虽然它们收敛在大约相同的训练历元DenseNet-BC。
DenseNet具有如此高性能的另一个原因是,网络中的每一层不仅接受来自原始网络中损耗的监督,而且因为有多个旁路和捷径。网络的监管是多种多样的。深度监督的优势也在深度监督网络(DSN)中得到证实。(DSN中的每个隐藏层都有一个分类器,迫使它学习一些有区别的特征。)与DSN不同,DenseNet具有单一的损失函数,使得模型构建和梯度计算更加容易。
DenseNet在设计之初就被设计成一层网络可以使用前面所有层的特征图的网络结构。为了探索特征的重用,作者进行了相关实验。作者用L = 40,K = 12训练的DenseNet,对于任意Denseblock中的所有卷积层,计算该层中前一层的特征图的权重的平均绝对值。此平均值显示了此图层对于前一个要素图层的利用率,下图显示了此平均值绘制的热点图:
从图中,我们可以得出以下结论:
a)从早期层提取的一些特征仍然可以被更深的层直接使用。
b)甚至过渡层也将使用先前Denseblock中所有层的特征。
c)与之前的过渡层相比,第2-第3 dense block中的层的利用率非常低,这表明过渡层输出了大量冗余特征。这也为DenseNet-BC提供了证据支持,这就是压缩的必要性。
d)虽然最后一个分类层使用了前面Denseblock中的多层信息,但它更喜欢使用最后几个特征图的特征,这表明在网络的最后几层中可能会生成一些高级特征。
作者在几个基准数据集上训练了几个DenseNet模型,并与最先进的模型(主要是ResNet及其变体)进行了比较:
从上表可以看出,DenseNet只需要很小的增长率(12,24)就可以达到最先进的性能,而结合了瓶颈和压缩的DenseNet-BC的参数数量比ResNet及其变体少得多,DenseNet和DenseNet-BC都在原始数据集和增广数据集上取得了超越ResNet的性能。
DenseNet详细解释