zoukankan      html  css  js  c++  java
  • CondenseNet: An Efficient DenseNet using Learned Group Convolutions

    1. 摘要

    作者提出了一个前所未有高效的新奇网络结构,称之为 CondenseNet,该结构结合了密集连接性和可学习的分组卷积模块。

    密集连接性有利于网络中的特征复用,而可学习的分组卷积模块则可以移除多余的特征复用之间的连接。在测试的时候,训练好的模型可以使用标准的分组卷积来实现,在实际中计算非常高效。

    2. 介绍和相关工作

    深度学习模型一般都是在多个 GPU 上进行训练,然后再在计算资源有限的移动设备上进行部署。因此,一个好的网络结构应该允许训练阶段可以快速并行,而在测试的时候可以压缩。

    一层一层堆叠卷积层的结构会使得网络需要通过学习来复制前面层的特征,而 DenseNet 通过直接将前面层的特征连接到后面的层来产生特征复用。尽管这很高效,但其实会产生一些冗余,也就是前面的一些特征在后面并不需要。因此,作者提出了一个方法来在训练阶段对这些多余的连接进行剪除,而在测试阶段则可以高效地通过分组卷积来实现。具体来说,作者将一层网络的卷积核分为几个组,然后逐渐移除每个组内不重要特征之间的连接。更重要的是,这些组不是预先定义好的,而是网络自己学出来的。

    相较于以前的权重剪枝和量化,CondenseNet 有两个不同的地方:它是在训练的早期阶段进行剪枝的,这比在整个过程中使用 L1 正则化更加高效;训练好的 CondenseNet 具有更高的稀疏度,然而依旧可以产生高效的分组卷积。

    标准的卷积层通过应用一个卷积核到所有的 (R) 个输入特征图来得到一个输出特征图,而分组卷积则将输入特征图分为 (G) 个组,一个输出特征图只与一个组内的输入特征图有关。

    3. CondenseNet

    下图左边为 DenseNet 中的一层,我们可以将分组卷积应用到 3×3 的卷积层,但是实验发现如果简单地将分组卷积应用到 1×1 的卷积层会导致准确率有很大的降低。输入到 1×1 卷积层的特征是上一层输出特征的拼接,它们有一个内在的顺序而且是非常多样化的,所以直接硬分组对特征复用是不利的。

    因此,作者提出了一个方法,让网络在训练阶段自己学习对输入特征自动分组,让每个组的卷积核自己选取最相关的输入特征。而且,允许一个输入特征被多个组共享,也允许一个输入特征被所有组都忽略。

    3.1. 可学习的分组卷积

    分组卷积是通过多个阶段学习到的,如下图所示。训练的前一半迭代过程由 condensing 阶段组成的,我们重复地训练网络来修剪掉权值比较小的不重要卷积核,也就是针对某些输入特征的权重置为零。训练的后一半是优化阶段,我们固定学习到的分组卷积来学习卷积核参数。当进行剪枝的时候,我们确保同一组的稀疏模式相同,也就是同一个组的输入特征图是一样的。这样,在测试阶段,稀疏化的层就可以通过标准的分组卷积来实现,这可以大大地降低计算代价。

    针对 1×1 的卷积,卷积核大小为 (O×1×1×R) 的矩阵 (F)(O) 是输出通道数,(R) 是输入通道数。在训练之前,我们将卷积核或者说是输出特征分为 (G) 个大小相同的组,每个组的卷积核表示为 (F^1, cdots, F^G) ,每个 (F^g) 大小为 (frac{O}{G}×R)(F^g_{ij}) 代表负责从第 j 个输入产生第 i 个输出的权重。

    那么,第 j 个输入对当前分组内输出特征的重要性可以通过某一列权重的平均绝对值来表示,也即 ( extstyle sum^{O/G}_{i=1}|F^g_{ij}|)。也就是说,我们移除 (F^g) 中的某一列(将这一列置为零),如果这一列的 (L_1) 范数比其它列的都小,实际上也就是第 j 个输入对当前组的输出特征不那么重要。这也就产生了结构上的稀疏性:同一个组内的卷积核接受同样的输入特征。

    为了减少权重剪枝对网络的准确性带来的负面影响,通常使用 (L_1) 正则化来产生稀疏性。针对 CondenseNet ,作者提出了一个组级别(group-level)的稀疏性,来在训练过程中加上一个正则项,这个正则项会让 (F^g) 中的某一列元素趋向于零。

    在实际中,一个组内使用的输入特征比例不一定要是 (1/G),作者定义了一个 condensation 因子 $C $,每个分组卷积的输入特征数目为 (lfloor frac{R}{C} floor)

    在训练阶段,每个组的卷积核最后只会有 (1/C) 得以保留,所以我们有 (C-1) 个 condensing 阶段,在每个阶段的最后面,我们修剪掉 (1/C) 的权重。修剪的操作是通过一个 mask 来实现的,那些修剪掉的权重在 mask 中对应的元素为 0 ,然后通过 mask 与权重进行一个逐元素的相乘,这样可以在 GPU 上高效地实现。作者在实验中设置每个 condensing 阶段的 (epochs=frac{M}{2(C-1)}),这样总训练次数的前一半就用来产生稀疏的分组卷积。

    作者采用余弦形状的学习率,一个训练过程中的损失函数和学习率变化情况如下图所示。迭代次数为 150 时损失函数的突然上升是因为移除了余下权重的一半,但是模型可以在优化阶段又逐渐恢复。

    在测试阶段,我们需要一个 index layer 来对输入特征图进行一个选择和重新排序,从而使得分组卷积能够实现,如上图 3 右边所示。

    3.2. 网络结构

    作者对 DenseNet 做了两个改变,来更简化网络结构改进计算效率。

    • 指数增加的增长率

    在原来的 DenseNet 中,每一层会产生 (k) 个特征图,(k) 是一个常数称之为增长率。网络中更深的层会更依赖一些高层信息,因此我们应该使得更近的特征图之间有更多的连接,也就是来自靠后面层特征的比例应该比来自更早层特征的比例多一些。作者设置更深的层增长率更大,(k=2^{m-1}k_0),其中 (m) 代表第几个密集块,(k_0) 是一个常数。

    • 全密集连接

    为了更加鼓励特征复用,作者连接输入层到其后面的所有层,甚至是不同块的也进行连接。如果特征图的空间大小不一样,则对分辨率较大的特征图进行平均池化下采样。

    另外,可学习的分组卷积只应用在每一个基本层的第一个 1×1 卷积上,然后会进行一个通道打乱操作,让特征图均匀分布在每一个组中,紧接着的 3×3 卷积是一个标准的分组卷积。

    4. 实验结果

    在 DenseNet 的基础上引入可学习的分组卷积后,测试误差大大降低,然后再加上指数级增加的增长率策略,模型的表现还可以进一步提高。

    在 CIFAR 和 ImageNet 数据集上的表现分别如下所示。

    分组卷积的组数和 condensation 因子的对比试验如下所示。

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    < java.util >-- Set接口
    Codeforces 627 A. XOR Equation (数学)
    Codeforces 161 B. Discounts (贪心)
    Codeforces 161 D. Distance in Tree (树dp)
    HDU 5534 Partial Tree (完全背包变形)
    HDU 5927 Auxiliary Set (dfs)
    Codeforces 27E. Number With The Given Amount Of Divisors (暴力)
    lght oj 1257
    Codeforces 219D. Choosing Capital for Treeland (树dp)
    Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
  • 原文地址:https://www.cnblogs.com/seniusen/p/12047968.html
Copyright © 2011-2022 走看看