CV method:最新Backbone---TransNeXt

文章目录

  • 前言
  • 一、提出问题
  • 二、模型结构
    • 1. Pixel-focused Attention(像素聚焦注意力机制)
    • 2. Aggregating Diverse Attentions in a Single Mixer Query embedding
    • 3. ConvGLU
    • 4. 整体模型架构
  • 三、方法论
    • 1. PFA设计原理
    • 2. Aggregating Diverse Attention原理
    • 3. GLU原理
    • 4. 长度缩放余弦注意力
    • 5. Position bias
  • 四、实验
  • 总结


前言

近几年,Vision Transformer(ViT)已成为各种CV任务的热门Backbone架构,也算是Transformer在CV领域的经典架构。注意力机制可以有效利用全局信息,获取每个像素间的相关性。但也由于这一特性,其平方复杂度和高内存消耗而面临挑战,这限制了其在高分辨率图像特征上的应用。本文主要介绍最新Backbone TransNeXt的改进和理论。

paper:https://arxiv.org/pdf/2311.17132.pdf
github:https://github.com/DaiShiResearch/TransNeXt

一、提出问题

为了减轻self-Attn中过多的计算成本,典型方法是局部注意力,限制了注意力在特征图上的一个窗口内。但是由于这种方式会牺牲全局感受野的能力,该方法通常需要交替堆叠与不同类型的Token混合器以实现跨窗口信息交换。

另一种典型的方法是空间下采样注意力中的Key和Value(例如,池化,网格采样)。由于它牺牲了Query对特征图的细粒度感知,这种方法也存在一定的局限性。

二、模型结构

在了解作者的研究思路之前,先来看看模型做了哪些改进:

1. Pixel-focused Attention(像素聚焦注意力机制)

请添加图片描述
整个模块的流程如下
1)输入图像首先经过两个并行的运算产生K和V,其中蓝色部分通过一个滑动窗口产生向量K和V黄色部分通过池化获得4个值,构成K和V
2)两个部分的K分别与细粒度的Q进行注意力运算得到两个注意力图
3)添加位置编码后进行concate,共同经过softmax后分开与各自的V相乘,最后相加并经过线性变换获得最终输出

2. Aggregating Diverse Attentions in a Single Mixer Query embedding

请添加图片描述
可以明显发现,相比上述模块,多了一个青色部分和一个额外的query embedding。embedding和Q相加,青色部分额外设置了一个可学习的token作为K和Q做注意力运算并和蓝色部分的Q*K进行融合。

3. ConvGLU

请添加图片描述

这部分结构就很简单了,不做详细说明

4. 整体模型架构

请添加图片描述
模型整体架构还是保留了原有的ViT架构。
TransNeXt采用与PVTv2相同的四阶段分层Backbone网络和重叠块嵌入。在阶段4中, 由于特征图大小已减少到 H/32 × W / 32 , 特征池化模块无法正常工作。作者采用了一种修改后的多头自注意力 (MHSA) 版本, 它应用Query嵌入和长度缩放余弦注意力。这与 PVTv2在第四阶段使用MHSA一致。对于1-4阶段的通道混合器, 作者使用卷积GLU与 GELU激活。扩展比也遵循PVTv2的 [ 8,8,4,4 ] 设置。

三、方法论

了解模型的改动之后,再来分析下作者的研究思路和改动原因(个人认为先看模型改进,再看思路更容易理解一些)

1. PFA设计原理

作者基于生物视觉特征进行设计,生物视觉对视觉焦点附近特征的分辨率更高,而对远处特征的分辨率较低。此外,眼球移动时,生物视觉这种特性在图像中任何位置的像素上都保持一致,这意味着像素级的平移等价性。
请添加图片描述
图中的红色星星表示Q的位置,黑色部分表示Q不能感知到的区域,可以发现传统局部窗口注意力机制没有全局视野,而如果将池化后的图像作为K和V,Q便可以以粗粒度感知全局信息(如图中第三个图),如果再引入局部窗口的K和V,便可以模拟生物视觉中的眼球追踪情况——局部窗口类似于焦点具有更高分辨率,远处特征从池化KV进行感知。

以上就是PFA的设计原理!!!

2. Aggregating Diverse Attention原理

在该部分模型层面设计了额外可学习的Q和K,原理如下:

Query embeding:将可学习的QueryToken集成到Backbone网络的注意力机制中(不同于传统的QKV注意力,它不使用输入中的Query,而是根据当前任务学习一个Query来执行交叉注意力),作者将这种方法归类为可学习的Key-Value(LKV)注意力,并与QKV注意力相平行作者发现,将传统QKV注意力中所有QueryToken的Query嵌入(QE)添加起来,可以实现与Query无关的信息聚合效果,且额外开销可以忽略不计
请添加图片描述

请添加图片描述

Positional attention: 信息聚合的另一种替代方法是使用一组可学习的Key,这些Key与来自输入的Query相互作用以获得注意力权重,即Query-Learnable-Value(QLV)注意力。这种方法与传统的QKV注意力不同,因为它破坏了Key和Value之间的一对一对应关系,导致为当前Query学习更多的隐式相对位置信息(额外学习一些特征)。因此,它通常与滑动窗口相结合在视觉任务中使用。与静态的亲和矩阵(如卷积或相对位置偏差)不同,这种通过数据驱动建模方法生成的亲和矩阵考虑了当前Query的影响,并可以基于它动态适应。

3. GLU原理

ViT时代的门控通道注意力:以前的工作,由Squeeze-and-Excitation(SE)机制代表,首先将通道注意力引入计算机视觉领域,该机制使用一个带有激活函数的分枝来控制网络输出。在门控通道注意力中,门控分支具有比value分支更大的决策权,最终决定相应的输出元素是否为零。从这个角度来看,SE机制解决了CNN结构中感受野不足的问题。然而,在ViT时代,全局感受野不再是稀缺的。各种全局Token混合器由自注意力表示,已经比全局平均池化实现了更高的全局信息聚合质量。这使得SE机制使用的全局池化方法表现出一些缺陷,例如该方法使特征图上的所有Token共享相同的门控信号,导致其通道注意力缺乏灵活性并过于粗糙。尽管如此,ViT结构缺乏通道注意力。最近的研究发现,将SE机制集成到通道混合器中可以有效提高模型鲁棒性(如图中第四个结构图)
请添加图片描述

最近的研究表明,将3×3的零填充卷积引入到视觉Transformer中可以被视为一种条件位置编码(CPE),它有效地捕获了零填充带来的位置信息(图中第五个结构图)


全新的Channel Mixer设计:
  
  Gated Linear Unit (GLU)GLU已在各种 NLP任务中显示出比多层感知机(MLP)更好的性能。GLU由两个线性投影组成,其中一个是通过激活函数激活的元素乘法。与SE机制不同,每个Token的gating信号都来自Token本身,并且其感受野大小不超过value分支的感受野。

作者发现,在GLU的gating分支的激活函数之前,简单地添加一个最小形式的卷积,可以使它的结构符合基于最近邻特征的门控通道注意力的设计概念,并将其转换为门控通道注意力机制。

特征分析:在卷积GLU(ConvGLU)中的每个Token都具有基于其最近精细特征的独特gating信号,这解决了全局平均池化在SE机制中的过于粗糙的问题。它也满足了某些没有位置编码设计的ViT模型,这些模型需要由卷积提供的位置信息

此外,这种设计的值分支仍保持与MLP和GLU相同的深度,使其易于反向传播。

4. 长度缩放余弦注意力

与缩放点积注意力不同,长度缩放余弦注意力使用了余弦相似度,已被观察到可以生成更适中的注意力权重,并有效地增强了大型视觉模型的训练稳定性。长度缩放余弦注意力通常将一个额外的可学习系数乘到Query和Key的余弦相似度结果上,使得注意力机制可以有效地忽略不重要的Token。

最近的研究发现,随着输入序列长度的增加,注意力输出的置信度会降低。因此,注意力机制的缩放因子应该与输入序列长度相关。有文章研究了当Query和Key被近似为具有大小 d \sqrt{d} d 的向量,缩放点积注意力熵的估计:
请添加图片描述
请添加图片描述
关于变量的定义,文章描述如下:
请添加图片描述

5. Position bias

请添加图片描述这部作者其实主要使用了log-CPB,我其实看的不是很明白,大概意思是对于两条路径分别用log-CPB进行了测试,结果是其中一条路径效果不太好,作者在附录里也详细探讨了实验。log-CPB出自Swin-V2模型,这篇文章我暂时没看过,后续也了解一下。很感兴趣的同学可以去读读Swin-V2。

四、实验

请添加图片描述

总结

作者基于生物模仿视杆细胞视觉设计的Token混合器聚合注意力和一种具有门控通道注意力的通道混合器卷积GLU。另外作者也在新结构中设计了很多最新技术,将它们结合起来,提出TransNeXt。在预训练模型上达到了SOTA性能。此外,作者还提供了一个CUDA实现,在训练中实现了高达103.4%的加速,在推理中实现了60.5%的加速。

看论文可以发现作者做了大量实验的,公式也较为复杂,其实本文核心的公式就是聚焦注意力了,如下:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架?二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli,并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…

【JS】JSON把我的function搞丢了怎么办?深入理解与灵活运用 JSON 序列化与反序列化

引言 在日常开发中,我们经常遇到需要将 JavaScript 对象转化为 JSON 字符串进行传输或者持久化存储的情况,这时 JSON.stringify() 和 JSON.parse() 成为了我们的得力助手。然而,原生的 JSON 序列化并不能处理函数、日期、正则等非基础类型数…

ARM Cortex-M处理器中的SysTick定时器简介

ARM Cortex-M处理器中的SysTick是一个内部的系统定时器,它提供了一种简单而有效的方式来生成定时的中断请求。SysTick定时器是一个24位的下计数定时器,它可以配置为周期性地产生中断,这些中断可以用于操作系统的任务调度、性能测量、时间延迟…

String类比较方法全览:深入解析equals、compareTo与regionMatches

1. 概述 String类的比较方法主要用于判断两个字符串是否相等,或者比较它们的字典顺序。这些方法在编程中十分常见,特别是在处理文本数据、比较用户输入、排序字符串列表等场景中。 2. 用途 String类的比较方法的主要用途包括: 判断两个字符…

【算法】合并两个有序链表

本题来源---《合并两个有序链表》 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] /*** Definition for singl…

C++ - STL详解—vector类

一. vector的概念 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 …

win/mac达芬奇19下载:DaVinci Resolve Studio 19

DaVinci Resolve Studio 19 是一款功能强大的视频编辑和调色软件,广泛应用于电影、电视和网络节目的后期制作。这款软件不仅提供了专业的剪辑、调色和音频处理工具,还引入了全新的DaVinci Neural Engine AI工具,对100多项功能进行了大规模升级…

Vue3(五):组件通信详解(九种方法)

主要有九种方法,以下是详细解释及使用方法: 1.props props实现父子间的通信,是使用频率最高的。 (1)父传子:属性值是非函数。 以Father.vue和Child.vue 为例。 父组件中,引入子组件并给子组…

34、链表-合并K个升序链表

思路 1、直接全部放入集合中,然后排序,在进行构造节点返回 2、使用归并排序的方式,两两排序合并,最后合并大的。 3、第三中思路就比较巧妙了,可以使用小根堆,每次弹出堆顶,最小值&#xff0c…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

基于 RT-Thread 的 CMUX 串口多路复用的详细使用

一、CMUX 软件包的介绍 CMUX(Connection Multiplexing ),即连接(串口)多路复用,其功能主要在一个真实的物理通道上虚拟多个通道,每个虚拟通道上的连接和数据通讯可独立进行。  CMUX 软件包常用…

DRF ModelSerializer序列化类

ModelSerializer序列化类 【0】准备 模型表创建 from django.db import modelsclass Book(models.Model):name models.CharField(max_length64, verbose_name书名)price models.DecimalField(max_digits6, decimal_places2, verbose_name价格)publish models.ForeignKey(…

【C++打怪之路】-- C++开篇

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ &…

三元运算符可选链操作符

三元运算符 &#xff08; ?: &#xff09;又叫条件运算符&#xff0c;接受三个运算数&#xff1a;条件 ? 条件为真时要执行的表达式 : 条件为假时要执行的表达式 <script>var a truevar b false// 单个条件a ? console.log(1) : console.log(2); // 1// 多个条件…

【SpringBoot】Spring Boot 项目中整合 MyBatis 和 PageHelper

目录 前言 步骤 1: 添加依赖 步骤 2: 配置数据源和 MyBatis 步骤 3: 配置 PageHelper 步骤 4: 使用 PageHelper 进行分页查询 总结 前言 Spring Boot 与 MyBatis 的整合是 Java 开发中常见的需求&#xff0c;特别是在使用分页插件如 PageHelper 时。Page…

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别&#xff08;vue-cli2 与 vue-cli3 &#xff09; 2、例子1&#xff08;vue2项目&#xff09; 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 &#xff08;1&#xff09;package.json 文件 &#xff08;2&#xff09;webpack.dev.conf.js文件 &#…

[大模型]Qwen-7B-hat Transformers 部署调用

Qwen-7B-hat Transformers 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下…

【JavaScript】异步函数(async和await详解)

异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题。为此&#xff0c;ECMAScript 对函数进行了扩展&#xff0c;为其增加了两个新关键字&#xff1a;async 和 await。 1. async async 关键字用于声明异步函数。这个关键字可以用在函数声明、函数表达式、箭头…

NLP自然语言处理_序章

开一个新篇章&#xff0c;立一个flag&#xff0c;用一段时间来学习一下NLP&#xff0c;涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门&#xff0c;此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理&#xff1f; NLP…