2022_07_11_10_51x51的kernelsize暴力美学:SLaK论文解读

2023-11-03 18:30

本文主要是介绍2022_07_11_10_51x51的kernelsize暴力美学:SLaK论文解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


title: 2022_07_11_10_51x51的超大kernelsize真的管用吗:SLaK论文解读
date: 2022-07-11 22:33:33
category: 默认分类

本文介绍 2022_07_11_10_51x51的kernelsize暴力美学:SLaK论文解读

2022_07_11_10_51x51的kernelsize暴力美学:SLaK论文解读

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

今天有一篇论文很有意思,也就是SLaK,直接把卷积的kernelsize加大到了51x51。你要说之前超越transformer的纯卷积模型ConvNext是把7x7再一次带入了人们的视野,让我们有了一种返璞归真的感觉,那么前段时间旷世的RepLKNet,让人们再一次刷新了认知,直接31x31的卷积也能work的很好,甚至超越了Swin-Transformer等结构。而今天,SLaK再次刷新了我们的认知,好家伙,人家直接把卷积kernel 搞到了51x51. 那我这图片丢进去卷积几次就没了啊。。所以我看到这篇论文的时候就很好奇,他到底是怎么做的。

我们主要有几个疑问,抛砖引玉,一起来思考思考,本人纯属菜鸡观点:

  • 为什么大卷积也能work?
  • 是什么动力让大家在探索大卷积?是更高效?是要探索出了transformer之外的更原始的路?
  • 他有没有什么应用缺点。

SLaK对比Convnext

首先说一下ConvNext,笔者最近也在检测算法中尝试了ConvNext,结论是效果非常不错,简单的convnext-tiny就可以轻松超越resnet50,基于YOLO的检测架构(类似于YOLOX的AnchorFree结构),可以在tiny上做到44左右,这还是没有加augmentation,并且warmup等参数没有细调的情况下,训练尺寸也没有像convnext官方paper训练maskrcnn一样加到1024这么大。

尽管如此,如果你自己去训convnext + YOLO是肯定会训崩的,为什么?因为非常难训,训练及其不稳定,你需要用训transformer的那一套去训这种组合的检测才能得到一个稍微稳定的结果,需要有足够的耐心外加一点点运气,而且收敛速度非常非常慢。这就引入了大卷积的一个思考:类似于SLaK这样的超大卷积核结构,是怎么确保训练稳定的? 我可以很明确的告诉你,没有一些手段,这种大卷积的结构是不太可能收敛的

上图可以很直观的看到Slak里面使用的的大卷积核的结构实现。SLak并没有直接暴力的简单吧RepLKNet的31x31卷积核增加到61x61,而是进行了上面结构的更改,基于两个观察:

  • 第一个是直接暴力加到51x51,就会导致精度下降,说明此路不通;
  • 改为分拆成两个小卷积核组合,可以解决这个问题;
  • 最后加上Sparsity,可以大大提高精度,也就是 用更多的组卷积,加宽宽度

最后就有了:

可以看到,精度超越了Convnext-Tiny,参数量差不多,但是flops增加了(比了个寂寞)。

最后在检测上的精度如上图,检测上提高了一个点,但是没有对比coco的结构,不知道是不是不敢放,还是没做这个实验,其实对比一下mAP-Large可能更有意思。

动机

为什么大家现在开始探索大卷积结构的可行性?我认为主要原因有3个:

  • transformer结构正在不断的超越Convnet-based模型,可以说,出来一个吊打一个,因此convnets应该予以还击了;
  • 一直以来我们都是用的小卷积,smaller convs, deeper networks,探索大卷积核下可行性是必然的;
  • 最后就是SLak作者在一个talk中提到的:

小卷积的设计一直以来是跟随者硬件水平来的,以前算量不足的时候,我们尽可能的减少kernelsize,现在在一些根本不缺算力的场合下,是否有可能大力出奇迹呢?
小卷积的设计虽然可以让模型参数更少,但flops其实不一定低,这些传统的设计也是有一些代价的:例如,在GPU下太小的卷积就无法做到更高效,另外,小卷积也会让模型缺乏全局视野能力,这也就是为什么目标检测有时候很难检测超大物体,或者无法根据全局去推断一个物体的类别,而这个人类是可以做到的。

最后其实还有一个动机,我不知道各位有没有发现,反正我是发现了。也就是Transformer这一脉方法的缺点,这些缺点,如果不在实际场合下以非常高的要求去使用,你会觉得还可以忍受,但是一点要求高了,这些缺点就不容忽视,主要是:

  • 平方级的计算复杂度上升,随着输入的尺寸增大,如果你做自动驾驶,你用的是8k的resolution,那你应该可以感受到;
  • 参数很多,transformer的参数量(模型体积)通常比conv大很多,这是有结构决定的,那么多FNN,参数不多才怪;
  • 难以叠加太复杂的结构,难以像conv一样复用多层次的结构(例如FPN PAN等);

而这些,或许是大卷积核的Convnets才是出路。当然,就像我前面所说,要让他work,可能还是离不开transformer。

总结

大卷积核结构还是有点用,但我觉得更大的价值还是在于,怎么解决transformer结构带来的平方级计算复杂度上升问题。毫无疑问,未来会有更多transformer + conv结合的工作。这些结果,在充分利用GPU算力上还是大有用途。例如像Convnext这种结构,我个人认为就很优雅,集众家之长,补自家之短,非常英明的一个模型结构

这篇关于2022_07_11_10_51x51的kernelsize暴力美学:SLaK论文解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/340062

相关文章

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Jupyter notebook安装步骤解读

《Jupyternotebook安装步骤解读》:本文主要介绍Jupyternotebook安装步骤,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、开始安装二、更改打开文件位置和快捷启动方式总结在安装Jupyter notebook 之前,确认您已安装pytho

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4