【CondConv】2019-NIPS-CondConv: Conditionally Parameterized Convolutions for Efficient Inference-论文阅读

CondConv

2019-NIPS-CondConv: Conditionally Parameterized Convolutions for Efficient Inference

来源:ChenBong 博客园

Introduction

CondConv卷积层可以对每个样本进行条件计算,CondConv可以为每个样本定制单独的卷积层,从而在不提高计算量的情况下,提高网络的性能。

CondConv卷积层是一种 plug-in 的 conv layer,可以和现有的 CNN 模型结合,替换 常规conv 即可。

conditional computation

条件计算是模型压缩的一个子方向,主要思想是根据不同的样本,选择不同的权重子集。

motivation:不同的 layer 提取的是不同的特征,对于不同的样本,所需要重视的特征应该也是不同的,能否让网络根据输入样本的差异(难度/类别/特征,方圆/颜色...),自动选择不同的 block/branch/layer/filter 进行计算(例如根据样本难度,自动选择推理深度,简单样本early exit)

BigNAS系列的文章可以看做是对计算资源的自适应;条件计算可以看做是一种对样本的自适应,条件计算有时也可以对计算资源自适应(资源不足,early exit / fewer branch)

ensemble

  • 模型集成:最简单的模型集成是针对相同的任务、相同的输入设计几个不同的网络(甚至有的时候直接取训练过程中的若干checkpoint,这种集成方法称为快照集成。
ModelEnsemble.png
  • 分支集成:模型集成的规模往往有些庞大,退而求其次我们可以共享一部分浅层特征,然后产生若干分支,最后融合各分支提取的特征达到集成的目的
BranchEnsemble.png
  • 带条件计算的分支集成:有的时候可能有的分支的“小专家”对一些样本不太擅长,我们可以选择不听取他们的意见
image-20210202165929876

从上到下,集成的粒度越来越细:

  • 多个model进行集成 √
  • head-1个stage-tail,1个stage中的多个branch进行集成 √
  • head-1个stage-tail,1个stage中的多个branch进行条件集成 √
  • head-N个stage-tail,每个stage中的多个branch都独立进行条件集成
  • 多个layer,每个layer都独立进行条件集成(本文)

但所有集成方式不可避免的带来参数量(计算量)的N倍增加,本文的方法一样会带来N倍的参数量增加,但计算量和原始模型是相当的(存储资源比计算资源更容易获得)。

attention

不同样本有不同的关注区域,让网络对不同样本关注不同的东西

Motivation

One fundamental assumption is that convolutional kernels should be shared for all examples in a dataset.

current approaches to increasing model capacity are computationally expensive.

Contribution

Method

CondConv

CondConv 可以看成是在layer粒度的条件集成,每个CondConv layer都有n套权重: (W_1 ... W_n)

input先和n套权重分别卷积,再combine(类似 googlenet 中的 multi-branch)

image-20210202171609075

由于这n个卷积运算(一种线性运算)的输入都是相同的,那么如果combine也是线性运算(如加权求和),则这组运算就可以重新表示为先combine再执行一个卷积运算(多个branch卷积整合成一个,如repVGG就是把2个卷积branch合成一个):

image-20210202172117329

这样就把N倍的卷积计算量减少到1倍的卷积计算量+少量的线性组合计算量,且两者是完全等价的!

image-20210202172443315

(alpha) 如何得到?

  • routing function: (alpha) 是输入x的函数,其中R是 fc 层的参数),将 pool(x) ==> n dim
  • (α=r(x)=sigmoid(fc(avg pool(x))))

如果 α 是定值的话,cond conv就等价于普通的conv

Experiments

expert num & width mult

image-20210202172848491

集成的 expert 越多,性能越好,且在不同规模的网络上都有效

plug-in

image-20210202173235538

与现有的方法结合,都可以提高性能,即插即用

Ablation Study

plug-in layer

image-20210202173349426

CC-mb1只在第7层开始使用cond conv

fc 层替换为 cond conv 会带来较多的计算开销

routing function

image-20210202174207599
  • CC-mb1:(第7层开始)每层都有单独的一组R参数(一个fc) (α=r(x)=sigmoid(fc(avg pool(x))))
  • single:(第7层开始)共用一组R
  • partially-share:(第7层开始)部分层共享
  • hidden:fc层的宽度
  • Hierarchical:
    • (α^l=r^l(x)=sigmoid(fc(avg_pool(x)+α^{l-1})))
  • softmax: (α=r(x)=softmax(fc(avg pool(x))))

mean routing weight

image-20210202180123424

不同层:越深的层,routing weight 对不同的类的差异越大

image-20210202180220513

同一层,不同类:同一层不同类所激活的 branch/expert 是不同的

image-20210202180212589

同一层的4个 branch/expert 激活值最大的10张样本,不同的expert对不同类型的样本感兴趣

Conclusion

Summary

pros:

  • 从注意力机制的角度,不同的卷积核对不同样本有不同的注意力
  • 从条件计算的角度,将条件计算的粒度细化到了layer级别,使得每个样本实际推理使用的conv都各不相同
  • 从集成的角度,cond conv模型集成了多个(32个)expert,通过多卷积branch等价融合的方法,计算量减少到一倍;虽然模型参数量急剧增加,但存储空间一般比计算内存更容易获得
  • 提升网络的表达容量,比提升模型计算量(宽度/深度)更重要,once for all 中共享

cons:

  • 本文是通过N倍的参数量来提高网络表达容量,参数量太大(32倍),能否通过1倍的参数量,通过线性/非线性的变换来得到多倍的表达容量(类似once for all 中共享7x7 center的做法其实也是用1倍的参数量+fc,来得到n倍的网络表达容量)

To Read

Reference

https://aijishu.com/a/1060000000021494

https://zhuanlan.zhihu.com/p/141868898

原文地址:https://www.cnblogs.com/chenbong/p/14392503.html