论文提出SFR模块,直接重新激活一组浅层特征来提升其在后续层的复用效率,而且整个重激活模式可端到端学习。由于重激活的稀疏性,额外引入的计算量非常小。从实验结果来看,基于SFR模块提出的CondeseNetV2性能还是很不错的,值得学习



来源:晓飞的算法工程笔记 公众号

论文: CondenseNet V2: Sparse Feature Reactivation for Deep Networks

Introduction


 目前大多数SOTA卷积网络都只能应用于算力充足的场景,而低算力场景往往是多数算法落地的实际场景,所以轻量级网络的研究是十分重要的。近期有研究认为DenseNet的长距离连接是低效的,较深的层往往将早期特征认定为过时并在生成新特征时将其忽略,造成了额外的内存和计算消耗。

 为了缓解这一低效的设计,CondenseNet在训练过程中根据权重动态逐步裁剪不重要的层间连接,而ShuffleNetV2则通过分支和shuffle的设计使得层间连接随着层间距离增大而减少。对于这两个网络的具体介绍,可以看看公众号之前发的两篇解读:《CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改进 | CVPR 2018》《ShuffleNetV1/V2简述 | 轻量级网络》

 尽管上面的两个改进网络都有其提升,但论文认为直接淘汰浅层特征做法过于激进,浅层特征还是可能包含对生成深层特征有用的信息。在仔细研究后,论文提出了特征重激活(feature reactivation)的概念。整体思路如图1c所示,更新浅层特征从而可以更高效地被深层特征复用。

 但需要注意的是,如果直接更新全部特征会带来过度的计算量,影响整体的效率。实际上,从DenseNet的成功可以看出,大部分的特征是不需要每次都更新的。为此,论文提出可学习的SFR(sparse feature reactivation)模块,通过学习的方式选择浅层特征进行重新激活,仅引入少量计算量就可以保持特征的"新鲜"。在应用时,SFR模块可转换分组卷积,复用当前的加速技术保证实践性能。

 论文基于SFR模块和CondeseNet提出了CondenseNetV2,在性能和特征复用程度上都有很不错的表现,能媲美当前SOTA轻量级网络。实际上,SFR模块可简单地嵌入到任意卷积网络中,论文也将SFR模块嵌入ShuffleNetV2进行了相关实验,效果也是杠杠的。

Method


Sparse Feature Reactivation

  • Feature reuse mechanism

 先定义DenseNet中的特征复用机制。假设block共\(L\)层,每层的特征输出为\(x_{l}\),\(x_0\)为block输入。由于当前层会以稠密连接的形式复用前面所有层的输出,\(l\)层的复合函数会接受所有的前层特征作为输入:

 在CondenseNet中,\(H_l\)为可学习分组卷积(LGC),用于自动学习输入的分组以及去掉不重要的连接。而在ShuffleNet中,\(H_l\)的输入会根据与当前层的距离进行丢弃。上面的两种网络设计倾向于丢弃冗余的长距离连接,取得了很不错的性能提升,然而这样的设计可能会阻碍高效的特征复用机制的探索。实际上,导致深层不再使用浅层特征的主要原因是特征\(x_l\)一旦产生就不再改变。为此,论文提出计算消耗少的SFR模块,使得过时的特征可以被廉价地复用。

  • Reactivating obsolete features

 对第\(l\)层引入重激活模块\(G_l(\cdot)\),该模块将层输入\(x_l\)转换为\(y_l\),用于激活前面的层输出特征。定义激活操作\(U(\cdot, \cdot)\)为与\(y_l\)相加,稠密层的输入重激活可公式化为:

 \(x_l^{out}\)为重激活的输出特征,\(l\)层的可学习分组卷积操作\(H(\cdot)\)输出新特征\(x_l\)。此外,旧特征\((x_i, i=1,\cdots,l-1)\)会被重新激活以提高其作用。

 显然,重激活所有的特征是不必要的,DenseNet的成功说明大部分特征是不需要重新激活的,而且过多的重激活也会带来过多的额外计算。为此,论文希望能自动找到需要重激活的特征,只对这部分特征进行重激活。于是,论文提出了SFR(sparse feature reactivation)模块,如图2所示,基于剪枝的方法逐步达到这个目标。

  • Spare feature reactivation(SFR)

 重激活模块\(G_l(\cdot)\)包含卷积层、BN层和ReLU层,卷积核的权值矩阵\(F\)的大小表示为\((O, I)\),\(O\)和\(I\)分别表示输出维度和输入维度。将\(G_l(\cdot)\)模块的输入\(x_l\)分成\(G\)组,权值矩阵\(F\)也随之分为\(G\)组\(F^1,\cdots,F^G\),每个的大小变为\((O,I/G)\)。注意这里的分组不是将卷积变为分组卷积,只是为了方便稀疏化而进行的简单分组,计算量和参数量没改变。为了将重激活连接稀疏化,定义稀疏因子\(S\)(也可以每组不同),使得每组在训练后只能选择\(\frac{O}{S}\)个维度进行重激活。

 在训练期间,每个\(G_l(\cdot)\)中的连接方式由\(G\)个二值掩码\(M^g\in\{0,1\}^{O\times\frac{1}{G}},g=1,\cdots,G\)控制,通过将对应的值置零来筛选出\(F^g\)中不必要的连接。换句话说,第\(g\)组的权值变为\(M^g\odot F^g\),\(\odot\)为element-wise相乘。

 SFR模块参考了CondenseNet的训练方法进行端到端训练,将整体训练过程分为\(S-1\)个稀疏阶段和最终的优化阶段。假设总训练周期为\(E\),则每个稀疏阶段的周期数为\(\frac{E}{2(S-1)}\),优化阶段的周期数为\(\frac{E}{2}\)。在训练时,SFR模块先重激活所有特征,即将\(M^g\)初始为全1矩阵,随后在稀疏阶段逐步去掉多余的连接。在每个稀疏阶段中,\(g\)组内重激活\(i\)输出的重要程度通过计算对应权值的L1-norm \(\sum^{I/G}_{j=1}|F^g_{i,j}|\)得到,将每个组中重要程度最低的\(\frac{O}{S}\)个输出(除掉组内已裁剪过的)裁剪掉,即将\(j\)输出对应的\(g\)组权值\(M^g_{i,j}\)设为零。如果\(i\)输出在每个组中都被裁剪了,则代表该特征不需要重激活。在训练之后,每组输入只更新\(1/S\)比例的输出,\(S\)的值越大,稀疏程度越高。

  • Convert to standard group convolution

 在测试阶段,SFR模块可转换为标准分组卷积和index层的实现,这样的实现在实际使用中可以更高效地计算。如图3所示,转换后的分组卷积包含\(G\)组,输出和输入维度为\((\frac{OG}{S}, I)\)。在分组卷积产生中间特征后,index层用于重排输出的顺序,从而获得\(y_l\)。在排序时,需要将相同序号的中间特征相加再进行排序。

Architecture Design

 基于提出的SFR模块,论文在CondenseNet的基础上改造出CondeseNetV2的新稠密层,结构如图4右所示。LGC层先选择重要的连接,基于选择的特征产生新特征\(x_l\)。随后SFR模块将\(x_l\)作为输入,学习重激活过时的特征。跟CondenseNet一样,为了增加组间交流,每次分组卷积后面都接一个shuffle操作。从图4的结构对比可以看出,CondenseNet和CondenseNetV2之间的差异在于旧特征的重激活,CondenseNetV2的特征复用机制效率更高。

 CondenseNetV2沿用了CondenseNet指数增长以及全稠密连接的设计范式,加入了SFR-DenseLayer。结构图表1所示,SE模块和hard-swish非线性激活依旧使用。表1展示的是参考用的基础设计,调整的超参数或网络搜索可以进一步提升性能。

Sparse Feature Reactivation in ShuffleNetV2

 SFR模块可嵌入到任意CNN中,除了CondenseNet,论文还尝试了ShuffleNet的改造。改造后的结构如图5所示,论文称之为SFR-ShuffleNetV2,仅应用于非下采样层。

Experiment


 对不同层的卷积核权值进行可视化,纵坐标可认为是来自不同层的特征。可以看到,CondenseNet更关注相邻层的特征,而CondenseNetV2则也会考虑较早层的特征。

 通过卷积核权值之和直接展示了层间的关联层度,进一步展示了CondenseNet对较早层的复用程度较高。

 不同参数下的准确率对比,其中图b的\(S=1\)即CondenseNet。

 论文提出了三种不同大小的CondenseNetV2,参数如表2所示,而ImageNet上的性能对比如表3所示。

 在ImageNet上对比各模块的实际提升效果。

 与SOTA模块在ImageNet上进行对比。

 在端侧设备上进行推理速度对比。

 CIFAR数据集上的网络对比。

 作为检测主干网络的性能对比。

Conclusion


 论文提出SFR模块,直接重新激活一组浅层特征来提升其在后续层的复用效率,而且整个重激活模式可端到端学习。由于重激活的稀疏性,额外引入的计算量非常小。从实验结果来看,基于SFR模块提出的CondeseNetV2性能还是很不错的,值得学习。







如果本文对你有帮助,麻烦点个赞或在看呗~

更多内容请关注 微信公众号【晓飞的算法工程笔记】

CondeseNetV2:清华与华为出品,保持特征的新鲜是特征复用的关键 | CVPR 2021的更多相关文章

  1. OpenCV特征点检测------ORB特征

    OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt ...

  2. Spark连续特征转化成离散特征

    当数据量很大的时候,分类任务通常使用[离散特征+LR]集成[连续特征+xgboost],如果把连续特征加入到LR.决策树中,容易造成overfit. 如果想用上连续型特征,使用集成学习集成多种算法是一 ...

  3. 处理离散型特征和连续型特征共存的情况 归一化 论述了对离散特征进行one-hot编码的意义

    转发:https://blog.csdn.net/lujiandong1/article/details/49448051 处理离散型特征和连续型特征并存的情况,如何做归一化.参考博客进行了总结:ht ...

  4. 图像的特征工程:HOG特征描述子的介绍

    介绍 在机器学习算法的世界里,特征工程是非常重要的.实际上,作为一名数据科学家,这是我最喜欢的方面之一!从现有特征中设计新特征并改进模型的性能,这就是我们进行最多实验的地方. 世界上一些顶级数据科学家 ...

  5. GhostNet: 使用简单的线性变换生成特征图,超越MobileNetV3的轻量级网络 | CVPR 2020

    为了减少神经网络的计算消耗,论文提出Ghost模块来构建高效的网络结果.该模块将原始的卷积层分成两部分,先使用更少的卷积核来生成少量内在特征图,然后通过简单的线性变化操作来进一步高效地生成ghost特 ...

  6. OpenCV特征点提取----Fast特征

    1.FAST(featuresfrom accelerated segment test)算法 http://blog.csdn.net/yang_xian521/article/details/74 ...

  7. XGBoost 输出特征重要性以及筛选特征

    1.输出XGBoost特征的重要性 from matplotlib import pyplot pyplot.bar(range(len(model_XGB.feature_importances_) ...

  8. OpenCV特征点检测——ORB特征

            ORB算法 目录(?)[+] 什么是ORB 如何解决旋转不变性 如何解决对噪声敏感的问题 关于尺度不变性 关于计算速度 关于性能 Related posts 什么是ORB 七 4 Ye ...

  9. sift特征点检测和特征数据库的建立

    类似于ORBSLAM中的ORB.txt数据库. https://blog.csdn.net/lingyunxianhe/article/details/79063547   ORBvoc.txt是怎么 ...

  10. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

随机推荐

  1. 关于“非法的前向引用(illegal forward reference)”的探究

    1.问题: 有如下代码: public class Test { static { i = 0;// 给变量赋值可以正常编译通过 System.out.print(i);// 编译器会提示" ...

  2. jvm调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    目录 前言 jps(Java Virtual Machine Process Status Tool) jstack jmap(Memory Map)和jhat(Java Heap Analysis ...

  3. 【Azure 应用服务】在App Service中新建WebJob时候遇见错误,不能成功创建新的工作任务

    问题描述 在Azure App Service界面上,添加新的Web Job(工作任务)时,一直添加失败.无详细错误提示,在App Service的Activity Logs(活动日志)中,根本没有添 ...

  4. 【Azure 存储服务】存储在Azure Storage Table中的数据,如何按照条件进行删除呢?

    问题描述 如何按条件删除 Storage Table 中的数据,如果Table中有大量的条记录需要删除,Java代码如何按条件删除 Table中的数据(Entity)? (通过Azure Storag ...

  5. 聊聊 HTTP 性能优化

    哈喽大家好,我是咸鱼. 作为用户的我们在 "上网冲浪" 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢.响应延迟的情况. 而 HTT ...

  6. Jmeter json断言的使用

    1 添加方式:取样器右键->添加->断言->JSON断言 作用:使用JSON表达式提取实际数据与预期进行比较   2首先我们来了解下断言组件的各个功能: Asset JSON Pat ...

  7. 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位

    说明 所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面.究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸, ...

  8. debian在使用Thunderbird时英文改为中文

    sudo apt-get install thunder* 随后重启应用!

  9. Java Springboot javax.net.ssl.SSLException: Connection reset解决方案

    接口设置HTTPS TLS1.2后,随机出现SSLException: Connection reset报错: javax.net.ssl.SSLException: Connection reset ...

  10. 2层for循环生成 TreeView

    C# TreeView 利用2层for循环生成,代码如下: //生成树 treeView1.Nodes.Clear(); //封装了数据库查询方法 MyDS_Grid = MyDataClass.ge ...