颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构...

2023-11-01

梦晨 发自 凹非寺
量子位 报道 | 公众号 QbitAI

Transformer做视觉取得巨大成功,各大变体频频刷榜,其中谁是最强?

早期人们认为是其中的注意力机制贡献最大,对注意力模块做了很多改进。

后续研究又发现不用注意力换成Spatial MLP效果也很好,甚至使用傅立叶变换模块也能保留97%的性能。

争议之下,颜水成团队的最新论文给出一个不同观点

其实这些具体模块并不重要,Transformer的成功来自其整体架构

080e98cff381866b883f2aa66196d4de.png

他们把Transformer中的注意力模块替换成了简单的空间池化算子,新模型命名为PoolFormer

这里原文的说法很有意思,“简单到让人尴尬”……

7557ccd3cc15c1695e5314a270a5f306.png

测试结果上,PoolFormer在ImageNet-1K上获得了82.1%的top-1精度。

(PyTorch版代码已随论文一起发布在GitHub上,地址可在这篇推文末尾处获取。)

同等参数规模下,简单池化模型超过了一些经过调优的使用注意力(如DeiT)或MLP模块(如ResMLP)的模型。

5749355e661207a022321d715e302fba.png

这个结果让一些围观的CVer直接惊掉下巴:

b63f5bf45ddfce3c72f76f5dade9f454.png

太好奇了,模型简单到什么样才能令人尴尬?

PoolFormer

整体结构与其他模型类似,PoolFormer只是把token mixer部分换了一下。

28e50b2a1c8145629889a318f3a9a976.png

因为主要验证视觉任务,所以假设输入数据的格式为通道优先,池化算子描述如下:

c994e33e3745b176d25e7f9f633f992b.png

PyTorch风格的伪代码大概是这样:

657d4ed0ebd0e185243df1d063df27c6.png

池化算子的复杂度比自注意力和Spatial MLP要小,与要处理的序列长度呈线性关系。

其中也没有可学习的参数,所以可以采用类似传统CNN的分阶段方法来充分发挥性能,这次的模型分了4个阶段

假设总共有L个PoolFormer块,那么4个阶段分配成L/6、L/6、L/2、L/6个。

f7b8edfb3cee7e3810fb56f3088379ee.png

每个阶段的具体参数如下:

b47bbd92b69a21e69dd338e3dc87ce42.png

PoolFormer基本情况介绍完毕,下面开始与其他模型做性能对比。

首先是图像分类任务,对比模型分为三类:

  • CNN模型ResNet和RegNetY

  • 使用注意力模块的ViT、DeiT和PVT

  • 使用Spatial MLP的MLP-Mixer、ResMLP、Swin-Mixer和gMLP

在ImageNet-1K上,无论是按累计乘加操作数(MACs)还是按参数规模为标准,PoolFormer性能都超过了同等规模的其他模型。

e7c31d8f41a8549600c347e26c41f600.png

目标检测实例分割任务上用了COCO数据集,两项任务中PoolFormer都以更少的参数取得比ResNet更高的性能。

944a5bc57b24ff6c7c0edfae0ccfa817.png目标检测

eaf2a0398c35f2fa1421ce4c187d1a75.png实例分割

最后是ADE20K语义分割任务,PoolFormer的表现也超过了ResNet、ResNeXt和PVT。

ad078fc38159985f67c4875fef86b4a2.png

消融实验

上面可以看出,几大视觉任务上PoolFormer都取得了有竞争力的成绩。

不过这还不足以支撑这篇论文开头提出的那个观点。

到底是整体架构重要?还是说PoolFormer中的池化模块刚好是一种简单却有效的Token Mixer?

团队的验证方法是把池化模块直接替换成恒等映射(Identity Mapping)。

结果令人惊讶,替换后在ImageNet-1K上也保留了74.3%的Top-1精度。

在此基础上无论是改变池化核尺寸归一化方法激活函数影响都不大。

最重要的是,在4个阶段中把注意力和空间全连接层等机制混合起来用性能也不会下降。

其中特别观察到,前两阶段用池化后两阶段用注意力这种组合表现突出。

这样的配置下稍微增加一下规模精度就可达到81%,作为对比的ResMLP-B24模型达到相同性能需要7倍的参数规模和8.5倍的累计乘加操作。

5c896a453b5e656f315e72a5d1425b4a.png

最终,消融实验结果说明Transformer中具体到token mixer这个部分,具体用了哪种方法并不关键。

不增加模型规模的情况下,网络的整体结构才是对性能提升最重要的。

这样的整体结构被团队提炼出来,命名为MetaFormer

1b04da681af79ee72269be103dc70303.png

NLP上还会成立吗?

这项研究由颜水成领导的Sea AI Lab和来自新加坡国立大学的成员共同完成。

24dc6223e998b73266155e4f52625396.png
颜水成

论文的最后,团队表示下一步研究方向是在更多场景下继续验证,如自监督学习和迁移学习。

除了视觉任务,也要看看在NLP任务上结论是否也成立。

另外发这篇论文还有一个目的:

呼吁大家把研究的重点放在优化模型的基础结构,而不是在具体模块上花太多精力去打磨。

2b9632fc916e0bb2e3074e035e77095f.png

论文地址:
https://arxiv.org/abs/2111.11418

GitHub仓库:
https://github.com/sail-sg/poolformer

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构... 的相关文章

  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac

随机推荐

  • Mysql sql优化

    这里引用深入Mysql实战 为什么要优化 提高资源利用率 避免短板效应 提高系统吞吐量 同时满足更多用户的在线需求 简单来说 优化的目的是为了提高资源的利用率 让资源充分发挥价值 常见场景下 一台服务器有四大资源 cup 内存网络和磁盘 一
  • 第五讲----bs4

    bs4简介 基本概念 Beautiful Soup 是可以从HTML或XML文件中提取数据的网页信息提取库 安装 pip install lxml pip install bs4 File bs4快速入门 py import bs4 fro
  • VMware导入虚拟系统

    导入虚拟系统的前提是安装好VMware软件 首先下载虚拟系统文件 随后点击左上角的文件按钮 点击打开 选择 ovf文件 点击打开 3 修改系统存放的地址 因为虚拟系统比较大 不建议存放在C盘 4 随后等待软件加载系统 5 加载完毕之后 在软
  • java判断文本字符集

    这是一个sourceforge项目 能够判断指定文本或流的字符集 下面是这个库的简单封装 package me jor util import info monitorenter cpdetector io ByteOrderMarkDet
  • chatgpt赋能python:用Python轻松给手机用户发送短信——优秀的工具在手,无限可能!

    用Python轻松给手机用户发送短信 优秀的工具在手 无限可能 作为一个有10年Python编程经验的工程师 我想分享一下如何用Python给手机用户发送短信 Python是目前非常流行的编程语言之一 它可以轻松地完成很多任务 而给用户发送
  • Unity使用脚本模拟Button按下

    目的 想用脚本来模拟Button的按下动作 button上绑定的有方法 自动调用方法 正常操作是鼠标点击按钮 using UnityEngine using UnityEngine UI using System Collections u
  • 记录js-判断一串数字数组,是否是连续的

    场景 假如有一组数组 如 1 2 3 4 5 6 可以看出这数组是连续的 那么如 1 2 3 5 6 这串数组就不是连续的了 用js写判断方法 实现代码 判断一串数字是否是连续的 function isContinuityNum num l
  • Docker 网络互相访问

    对于docker容器 我们知道它是沙箱隔离的 每一个docker容器都是独立运行的 相当于一个独立的虚拟机 所以他们只能进行网路访问 如果我们使用docker run时启动容器 没有指定网路 net参数 默认使用的bridge的网络类型 查
  • wirshark发包工具源码

    需要下载https link csdn net target https 3A 2F 2Fwww winpcap org 2Finstall 2Fbin 2FWpdPack 4 1 2 zip开源库并且使用 目前只能发送udp的码流 def
  • 主流ETL工具汇总

    一 kettle 说明 是国外开源ETL工具 支持数据库 FTP 文件 rest接口 hdfs hive等平台的灵敏据进行抽取 转换 传输等操作 Java编写跨平台 C S架构 不支持浏览器模式 特点 易用性 有可视化设计器进行可视化操作
  • Go语言实训二:Go语言基础知识

    第1关 Go语言基本数据类型 任务描述 用 Go 语言写一个程序 把 int 类型强制转化为 rune 类型 并验证原生的 rune 类型和转换后的 rune 类型是否具有可比较性 相关知识 介绍 在 Go 语言中 数据类型用于声明函数和变
  • 调参经验

    1 假设一次训练有10个epoch 可能会出现以下情况 训练好一次模型去测试 测试的准确率为0 92 又去训练一次模型 不是在之前训练模型的基础上 而是单独进行一次训练 模型训练好去测试 测试准确率为0 93或者0 89 如果我改变一个模型
  • JAVA字符串格式化-String.format()和MessageFormat的使用

    String format 常规类型的格式化 String类的format 方法用于创建格式化的字符串以及连接多个字符串对象 熟悉C语言的同学 应该记得C语言的sprintf 方法 两者有类似之处 format 方法有两种重载形式 form
  • TCP&UDP

    TCP 面向连接的服务 可靠的进程到进程的通信协议 因为TCP里面封装了端口号 端口号就意味着一个服务 进程 应用场景 如 文件传输 HTTP应用层协议 UDP 无连接服务 不可靠的传输协议 应用场景 广播 早期的QQ 视频传输等 ACK
  • 2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

    题目简评 看下来C题是三道题目里简单一些的 考察的点比较综合 偏数据分析 涉及预测模型和运筹优化 线性规划 还设了一问开放型问题 适合新手入门 发挥空间大 题目分析与思路 背景 在生鲜商超中 一般蔬菜类商品的保鲜期都比较短 且品相随销售时间
  • Groovy 的SQL模块

    Groovy的SQL模块提供了对JDBC的抽象 让我们使用JDBC更简单 相关类在groovy sql包下 本文参考自Working with a relational database 一些代码引用了官方文档 需要了解详细信息请参见原文
  • [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web applica...

    1 06 Aug 2019 22 01 22 261 信息 localhost startStop 1 org apache catalina startup HostConfig deployDirectory Deploying web
  • TCP/IP网络江湖——数据链路层的协议与传承(数据链路层中篇:数据链路层的协议与帧)

    0 引言 网络江湖 宛如千年武林 承载着代代传承的文化和传统 在这个广袤的江湖之中 数据链路层犹如武林门派 代代传承着网络通信的精华 这一部分将带领我们深入探讨数据链路层的协议与传承 揭示其在网络江湖中的精彩故事 就如同江湖中的武者需要基本
  • java将list转化为string

    可以使用Java中的join 方法将List转化为String 例如 List
  • 颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构...

    梦晨 发自 凹非寺量子位 报道 公众号 QbitAI Transformer做视觉取得巨大成功 各大变体频频刷榜 其中谁是最强 早期人们认为是其中的注意力机制贡献最大 对注意力模块做了很多改进 后续研究又发现不用注意力换成Spatial M