当前位置: 首页 > news >正文

CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构

编辑 | Happy
首发 | AIWalker
链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw

alt

project, paper, code

Token Mixer是ViT骨干非常重要的组成成分,它用于对不同空域位置信息进行自适应聚合,但常规的自注意力往往存在高计算复杂度与高延迟问题。而直接移除Token Mixer又会导致不完备的结构先验,进而导致严重的性能下降。

基于此,本文基于重参数机制提出了RepIdentityFormer方案以研究无Token Mixer的架构体系。紧接着,作者改进了学习架构以打破无Token Mixer架构的局限性并总结了5条指导方针。搭配上所提优化策略后,本文构建了一种极致简单且具有优异性能的视觉骨干,此外它还具有高推理效率优势。

实验结果表明:通过合适的优化策略,网络结构的归纳偏置可以被集成进简单架构体系中。本文为后续优化驱动的高效网络设计提供了新的起点和思路。

背景与动机

Token Mixer是ViT架构中用于空域信息聚合的关键模块,但由于采用了自注意力机制导致其计算量与内存消耗与图像尺寸强相关(quadratic)。

alt

基于修正版12层ViT-B架构,作者进行了系统的延迟分析(可参考上图)。从仅包含Input Embedding的模块出发,逐步添加不同的操作单元,如LN、Attention、MLP等,最终构成了无GAP与分类头的ViT-Base架构。从图示可以看到: **Token Mixer部分耗时约为1433.6ms,约占整个架构耗时的46.3%**。

也就是说,Token Mixer对于模型延迟有非常大的影响,这无疑限制了其实际应用。不有而然升起一个疑问:是否可以移除Token Mixer同时保持其高性能呢?MetaFormer提出了无Token Mixer的架构,但发现会导致不可忽视的性能退化。基于此,本文旨在通过先进的优化策略(如知识蒸馏、结构重参数等)来挖掘极简ViT架构的潜力

RIFormer探索之路

alt

接下来,我们将呈现出从全监督到更先进训练体系的探索之路,调研并指定了不同的优化机制。RIFormer采用了与MetaFormer相同的宏观与微观模块,区别仅在于RIFormer未使用Token Mixer。

无Token Mixer的视觉骨干

本文旨在移除每个基础模块中的TokenMixer以得到更高推理速度且性能保持的视觉骨干(仅在推理时移除)。

alt

以PoolFormer-S12为起点,将其中用于TokenMixer的Pooling操作替换为Identity,同时采用常规监督方式进行训练,可以看到:RIFormer-S12会导致不可接受的性能下降(下降约2.7%)。也就是说,当没有TokenMixer操作时,常规的监督式训练在辅助模型学习有用信息时存在一定局限性,需要更先进的训练机制

接下来,作者调查并修改了一系列训练机制以改善基线模型性能,可总结如下:

  • Knowledge distillation
  • teacher type influence
  • Structure Re-parameterization
  • Module Imitation
  • Local partial parameters from teacher.

Distillation Paradigm Design

alt

上表对比了四种不同训练配置下的性能对比,默认老师模型为GFNet-H-B,从中可以看到:

  • Hard标签蒸馏可以将模型性能从72.31%提升至73.51%。这说明带TokenMixer的老师模型对于无TokenMixer的学生模型可以起到正面促进作用了;
  • Soft标签蒸馏可以取得最佳性能,学生模型性能可提升至74.05%。

总体来看:监督式训练范式看起来并非无TokenMixer架构的最佳训练方式;带TokenMixer的老师模型有助于引导训练,但仍无法弥补因移除TokenMixer导致的性能损失,即还需要引入其他策略。

Re-parameterization for Identity Mapping

这几年,重参数方法在各个领域得到了广泛的应用。RIFormer推理时的TokenMixer模块可以视作LN+Identity组合。因此,训练时模块续满足以下两个前提条件:

  • per-location操作以支撑等价变换;
  • parameteric操作以支撑额外的表达能力。
alt

基于上述分析,作者在训练阶段采用仿射变换以替代恒等变换,它仅在通道维度进行缩放与移位操作,见上图。在推理阶段,该仿射变换参数可以合并进LN层,故训练时的LN+仿射变换可以等价为LN+Identity。详细分析请查看原文,这里给出参数变换公式如下:

alt

从上表可以看到:直接使用结构重参数机制并无显著优势。作者认为:导致该现象的原因在于LN中的仿射变换是一种线性变换。因此,如果仅仅通过模型的输出进行监督训练,额外参数的潜力可能并未得到充分挖掘。与此同时,老师与学生模型的同构设计促使我们探索一种更有效的方式进行模块间的知识迁移。

Module Imitation

alt

有鉴于上述分析,作者进一步提出了Module Imitation以充分利用老师模型TokenMixer后的有用信息。如上图所示,作者希望:在训练过程中仿射操作能近似模拟TokenMixer的行为。此时,两者之间的MSE可以计算如下:

考虑到当前层的输入为前一Block的输出特征,因此,作者从Block层面进行匹配,此时上述损失简化为:

此外,在输出特征层面还进行隐状态蒸馏:

仿射操作与TokenMixer输出的MSE计算如下:

组合上述公式即可得到最终总损失:

alt

从上表可以看到:Module Imitation对与学生模型有正向促进作用。最贱方案已取得了75.13%,超越了PoolFormer-S12的75.01%。

alt

从上表可以看到:尽管GFNet-H-B并没有最佳指标,但它仍是更佳的选择(无论是否使用Module Imitation)。可能这与感受野有关,对于有限感受野的RIFormer而言,具有更大感受野的模型会是更优的老师选型,而GFNet具有全局感受野。

最后,作者还尝试了直接加载老师模型中除TokenMixer之外的预训练参数到学生模型,学生模型的性能可以**从75.13%提升至75.36%**。

本文实验

alt

上表给出了RIFormer与其他方案的性能对比,从中可以看到:

  • RIFormer-M36的吞吐量可达1185,同时精度高达82.6%;而PoolFormer-M36的吞吐量为109,精度为82.1%。
  • 对比GFNet与RIFormer,GFNet-H-B吞吐量为939,精度为82.9%,但需要特殊的、硬件不友好的FFT操作;而RIFormer可达到与之相关的水准且无复杂的操作。

全文到此结束,更多消融实验与分析请移步原文。

送书福利

本次活动准备赠送三本《ChatGPT全能应用一本通》,小伙伴们可以扫描下方二维码参与抽奖,抽奖活动截至2023年06月06日22:00,届时请中奖的小伙伴及时联系我们(AIWalker-zhushou)喔!

抽奖进行中:ChatGPT全能应用一本通,点击参与

本文由 mdnice 多平台发布

相关文章:

CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构

编辑 | Happy 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw project, paper, code Token Mixer是ViT骨干非常重要的组成成分,它用于对不同空域位置信息进行自适应聚合,但常规的自注意力往往存在高计算复杂度与高延迟问题。…...

瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)

瑞萨MCU零基础入门系列教程 前言 得益于瑞萨强大的MCU、强大的软件开发工具(e studio),也得益于瑞萨和RA生态工作室提供的支持,我们团队编写了《ARM嵌入式系统中面向对象的模块编程方法》,全书37章,将近500页: 讲解面向对象编程…...

【Java】采用 Tabula 技术对 PDF 文件内表格进行数据提取

某天项目组来了个需求说需要提取 PDF 文件中数据作为数据沉淀使用,这是因为第三方系统不提供数据接口所以只能够出此下策。 就据我所知,PDF 文件内数据提取目前有 3 种解决方案: 第一种,资金足够的话可以直接通过人工智能对 PDF…...

完全保密的以太坊交易:Aztec网络的隐私架构

1. 引言 Aztec为隐私优先的以太坊zkRollup:即其为具有完全隐私保护的L2。 为了理解私有交易的范式变化性质,以及为什么将隐私直接构建到网络架构中很重要,必须首先讨论为什么以太坊不是私有的。 2. 以太坊:公有链 以太坊为具有…...

初识Java 9-1 内部类

目录 创建内部类 到外部类的链接 使用.this和.new 内部类和向上转型 在方法和作用域中的内部类 匿名内部类 嵌套类 接口中的类 从多嵌套的内部类中访问外部人员 本笔记参考自: 《On Java 中文版》 定义在另一个类中的类称为内部类。利用内部类,…...

合宙Air724UG LuatOS-Air LVGL API控件-屏幕横屏竖屏切换(Rotation)

屏幕横屏竖屏切换(Rotation) lvgl.disp_set_rotation(nil, lvgl.DISP_ROT_angle) 屏幕横屏竖屏切换显示,core版本号要>3202参数 参数类型释义取值nil无意义nilangle显示角度0,90,270,360 返回值nil 例子 lvgl.init()- -初始化 lvgl.disp_set_rotation(nil,…...

在Unity中,Instantiate函数用于在场景中创建一个新的游戏对象实例

在Unity中,Instantiate函数用于在场景中创建一个新的游戏对象实例。它的语法如下所示: public static Object Instantiate(Object original, Vector3 position, Quaternion rotation); original:要实例化的原始游戏对象。position&#xff1…...

解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./

问题描述 我们在初次使用tesserocr库的时候,可能会报以下错误: RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 这是因为我们在使用 conda 创建的环境中找不到"tessdata"这个文件夹。 解决办法 这时候把Tessera…...

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重,于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下: import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…...

Python分享之对象的属性

Python一切皆对象(object),每个对象都可能有多个属性(attribute)。Python的属性有一套统一的管理方案。 属性的__dict__系统 对象的属性可能来自于其类定义,叫做类属性(class attribute)。类属性可能来自类定义自身,也可能根据类定义继承来的…...

编程参考 - std::exchange和std::swap的区别

这两个功能是C standard library中的Standard template library中的一部分。容易混淆,我们来看下它们的区别。 exchange: 这个函数是一个返回原先值的set函数。 std::exchange is a setter returning the old value. int z std::exchange(x, y); Af…...

Sentinel整合RestTemplate

resttemplate开启sentinel保护配置resttemplate.sentinel.enabledtrue配置sentinel-dashboard地址spring.cloud.sentinel.transport.dashboardlocalhost:8858\ spring.cloud.sentinel.transport.dashboard.port8739 实例化RestTemplate并加入SentinelRestTemplate注解Configura…...

微前端学习(下)

一、课程目标 qiankun 整体运行流程微前端实现方案二、课程大纲 qiankun 整体流程微前端方案实现DIY微前端核心能力1、微前端方案实现 基于 iframe 完全隔离的方案、使用纯的Web Components构建应用EMP基于webpack module federationqiankun、icestark 自己实现JS以及样式隔离2…...

Android Splash实现

1、创建Activity package com.wsy.knowledge.ui.splashimport android.animation.Animator import android.animation.AnimatorListenerAdapter import android.annotation.SuppressLint import android.os.Build import android.os.Looper import android.util.Log import an…...

FPGA projet : VGA

在vga屏幕上显示 &#xff1a; 野火科技 相比于上个工程&#xff0c;只需要修改 vga_pix 模块即可。 注意存储器类型变量的定义&#xff1a;reg 【宽度】<名称>【深度】 赋值 always &#xff08;poseedge vga_clk&#xff09;begin 为每一行赋值&#xff0c;不可位赋…...

JDK8 升级至JDK19

优质博文IT-BLOG-CN 目前部分项目使用JDK8&#xff0c;部分项目使用JDK19因此&#xff0c;环境变量中还是保持JDK8&#xff0c;只需要下载JDK19免安装版本&#xff0c;通过配置IDEA就可以完成本地开发。 一、IDEA 环境设置 【1】通过快捷键CTRL SHIFT ALT S或者File->P…...

Python3.10 IDLE更换主题

前言 自定义主题网上有很多&#xff0c;3.10IDLE的UI有一些新的东西&#xff0c;直接扣过来会有些地方覆盖不到&#xff0c;需要自己测试着添几行配置&#xff0c;以下做个记录。 配置文件路径 Python安装目录下的Lib\idlelib\config-highlight.def。如果是默认安装&#xf…...

C# OpenVino Yolov8 Pose 姿态识别

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenVino_Yolov8_Demo {public…...

北邮22级信通院数电:Verilog-FPGA(1)实验一“跑通第一个例程” 过程中遇到的常见问题与解决方案汇总(持续更新中)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 问题一&#xff1a;Verilog代码没有跑通 报…...

CSS - 鼠标移入整行高亮显示,适用于会员套餐各参数对比页面(display: table,div 转表格形式)

效果图 可根据基础示例和进阶示例&#xff0c;复制进行改造样式。 如下图所示&#xff0c;本文提供 2 个示例。 基础示例 找个 HTML 页面&#xff0c;一键复制运行。 <body><h1 style"text-align: center;">基础示例</h1><section class"…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...