论文提出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. 以解析csv数据为例,讨论string、char[]、stream 不同类型来源是否能进行高性能读取解析封装可能性

    篇幅较长,所以首先列举结果,也就是我们的目的 核心目的为探索特定场景对不同类型数据进行统一抽象,并达到足够高性能,也就是一份代码实现,对不同类型数据依然高性能 以下为结果,也就是我们的目的: 对1w行 ...

  2. Python函数每日一讲 - 一文让你彻底掌握Python中的getattr函数

    引言 在 Python 中,getattr() 函数是一种强大的工具,它允许我们在运行时动态地访问对象的属性和方法.本文将介绍 getattr() 函数的基本语法.常见用法和高级技巧,帮助大家更好地理 ...

  3. 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手

    扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上 ...

  4. 浅入Kubernetes(13):dashboard、api、访问配置

    目录 Kubectl 命令大全 安装 Kubernetes-Dashboard RESTful API 鉴权 注解 Pod YAML 结构 配置 Kubectl 命令大全 在前面,我们学习到了一些 K ...

  5. C++ //案列-评委打分 //(容器添加 删除 算法排序 随机数 字符串追加)描述:5名选手 ABCDE,10个评委分别对每一位选手打分,去除最高分,去除评委中的 //的最低分,取平均分

    1 #include<iostream> 2 #include<string> 3 #include<deque> 4 #include<vector> ...

  6. 如何获取拼多多推流码并使用OBS进行直播-疯狂URL

    简介 拼多多直播在PC端可以用多多视频|多多直播端进行开播,它的功能类似于常见的抖音直播助手和快手直播伴侣等等客户端.此教程测试时间 2023-7-12,第三方随时可能会升级,无法保证时效,建议不要升 ...

  7. Kubernetes: kube-controller-manager 源码分析

    0. 前言 在 Kubernetes 架构中,controller manager 是一个永不休止的控制回路组件,其负责控制集群资源的状态.通过监控 kube-apiserver 的资源状态,比较当前 ...

  8. 适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器

    适用mybatis和jpa的全数据库类型主键生成插件,分布式高并发有序id生成器

  9. Obsidian 0.15.9 知识笔记 使用说明

    我感觉这个软件是一个非常好用的软件,经过初步体验. 全局搜索快捷键 Ctrl + Shift + F 打开快速切换快捷键 Ctrl + O 添加标签 #测试标签 反向链接 Obsidian支持反向链接 ...

  10. idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes

    idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes git stash save "save me ...