超大卷积核架构设计与高效实践

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

参考:www.bilibili.com/video/BV16Y…

论文名称:Scaling Up Y our Kernels to 31x31: Revisiting Large Kernel Design in CNNs

作者:Xiaohan Ding, Xiangyu Zhang, Jungong Han, Guiguang Ding

Code:github.com/megvii-rese…

摘要

本文重新审视了现代卷积神经网络中的大核设计,证明了使用一些大核比一堆小核可能更加强大,同时提出了五个设计准则,依据这些准则设计了RepLKNet——一个纯粹的CNN架构,其中卷积核的最大尺寸达到了 31 × 31 31\times 31

RepKLNet在ImageNet以及各种下游任务上取得了更好的结果,缩短了CNN与ViT之间的差距。基于大核的研究进一步表明,与小核相比,大核的CNN具有更大的有效感受野和更高的形状偏置(shape bias)

CNN与ViT

Transformer性能强的原因

众所周知,Transformer是由self-attention构成的,相较于Convolution,self-attention主要有两点区别:

一是self-attention多是在全局尺度内进行计算,即使是最近的Local Transformer也是在 7 × 7 7\times 7 的窗口内计算;

二是self-attention的核心机制——QKV运算。

那么其中的关键是哪一点呢?

目前很多相关工作都表明,更大的窗口大小或许才是Transformer强大的关键。

Demystifying local vision transformer: Sparse connectivity, weight sharing, and dynamic weight证明了即使将Swin中的self-attention换成同样大小的卷积性能不变甚至更好; Mlp-mixer证明将ViT中的attention替换为MLP性能也很好;Metaformer将attention替换为pooling性能还是很好。

CNN的感受野

自VGG以来,不断堆叠小kernel、加深网络层数成为了卷积神经网络设计的主流范式,因为我们相信,三层 3 × 3 3\times 3 的卷积核的感受野与一层 7 × 7 7\times 7 的感受野相同,并且性能更好,因为其中可以加入更多的非线性,层数越多就代表着拟合能力越强。

这是真的吗?

image-20220402214110912

上图为各个网络的输入对于输出中心点的贡献度,可以看到,即使ResNet堆叠了100多层,其有效感受野也没有多少变化,而RepLKNet-31的有效感受野几乎覆盖全图。

该观点在论文Understanding the effective receptive field in deep convolutional neural networks. NeurIPS 2016.中有所提及,其认为模型的有效感受野正比于 K L K\sqrt L ,即有效感受野的增长与堆叠层数成开方关系。

为什么我们不用大Kernel

这是一个很显而易见的问题,大kernel太大了,我们都清楚卷积核的参数量相对于kernel size是呈平方增长的,其速度也会慢很多。

另一个问题就是某些相关工作表明大kernel反而会掉点。

虽然历史淘汰了大Kernel,但是这不表明现在不能复兴它。

虽然标准的dence卷积参数量很大并且速度很慢,但是Depth-with卷积的参数增长并没有那么大,加上适当的底层优化速度或许也可以很快。

现代神经网络的架构设计或许可以使大kernel绽放出新的光彩,比如swin的结构。

如何复兴大Kernel

本文提出了使用使用大kernel的五大准则。

Depth-wise+底层优化

由于dence卷积的参数量与输入输出通道数都有关系,而Depth-wise卷积只与输入通道数有关系,一般来说其参数大小是dence卷积的几百分之一,即使增大kernel size,其参数量也只和dence卷积相当,论文中也给出了参数表格:

image-20220402215821752

可以看到即使kernel size提升了很多,参数量和浮点计算量也没有增加很多。

虽然解决了参数和计算量的问题,但是速度的问题怎么解决呢?

image-20220402220122237

dence卷积处于上图中的Compute Bound区域,其计算密度已经不会再增长了,除非计算能力上升。

depthwise卷积处于上图中的Memory Bound区域,其计算密度会随着kernel size的增长而增长,所以更大的kernel速度并不会太慢。

底层优化略过。。。或许下篇文章会介绍下。

效果如下:

image-20220402220424469

相比于Pytorch最高可加速20倍。

使用shortcut

image-20220402220545649

在MobileNet V2上的实验,可以看到没有shorcut掉点十分严重;这里的解释原因与RepVGG中的相同,使用shortcut相当于集成了很多隐式的模型,有很多不同大小组合式感受野;没有shortcut,感受野则单一且巨大,难以捕捉小的特征。

使用小kernl做重参数化

继续发扬重参数化,与RepVGG类似,同时使用一个并行的小kernel,推理时重参数化即可。

image-20220402220854590

不论大kernel有多大,同时添加一个3\times 3的小kernel,使得组合式的感受野更加丰富,更易提取小的特征。

但是在数据量很大(MegData-73M)时,小kernel重参数化效果不大。

看下游任务

7\times 7的大kernel在ImageNet分类任务上已经达到极限,即使size再增大,性能也不会变化,这点可能是因为ImageNet上主要依靠纹理信息。

而对于下游任务,如语义分割、目标检测等,更大的kernel还能获得更好的性能。

小feature map上使用大kernel

即使feature map尺寸小于kernel size也没有关系,底层实现会使用feature来卷kernel,虽然这样会一定程度上失去平移不变性,但是相关工作表明平移不变性不一定就是好的。

RepLKNet

image-20220402221621267

基于上述准则设计了RepLKNet,并且借鉴了Swin的宏观架构,并且继续加大kernel size,从7到13到25,再到最大31,在各类任务上都取得了十分优秀的效果。

Shape bias

人类用来分辨视觉信息多是因为shape bias,很多情况下都是根据形状来进行判断的。

而之前的小kernel模型由于有效感受野有限,其判断结果使用的为纹理信息,也有很经典的相关工作表明将不同类别的纹理进行替换,网络会错误的给出判断。

经过一些实验发现或许大kernel的shape bias会更高,而和attention的关系不大,这些都是后来的研究目标了。

科研哲学(鸡汤)

最后来喝一碗鸡汤,来看看从小kernel到大kernel的辛酸发展历程吧。

image.png

猜你喜欢

转载自juejin.im/post/7082013816048844837