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

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

解读Pandas和Polars的区别及说明

《解读Pandas和Polars的区别及说明》Pandas和Polars是Python中用于数据处理的两个库,Pandas适用于中小规模数据的快速原型开发和复杂数据操作,而Polars则专注于高效数据... 目录Pandas vs Polars 对比表使用场景对比Pandas 的使用场景Polars 的使用