CPVT(ICLR 2023)论文解读

paper:Conditional Positional Encodings for Vision Transformers

official implementation:GitHub - Meituan-AutoML/CPVT

存在的问题

  1. 位置编码的局限性:传统Transformer中的绝对位置编码(无论是可学习的还是固定的)在训练时会固定编码的长度和数值,导致模型在测试时难以处理比训练序列更长的输入数据。这种限制在视觉任务中尤其明显,如目标检测任务中需要处理不同大小的图像。
  2. 平移等变性问题:绝对位置编码会破坏平移等变性,即在输入图像中的目标对象移动时,模型的输出特征图不相应移动。

第一个问题或许可以通过删除位置编码来解决,因为除了位置编码之外,vision Transformer 的所有其他组件(如MHSA和FFN)都可以直接应用于更长的序列。然而,这种解决方案对模型的性能造成了严重影响。因为输入序列的顺序是一个重要的线索,而过没有位置编码,模型就无法提取顺序。去除位置编码后,DeiT-tiny在ImageNet上的精度从72.2%降低到了68.2%,如表1所示。

其次,DeiT通过对位置编码进行插值使其可以用于较长的输入序列,但这种方法需要对模型进一步微调,否则性能就会显著下降,如表1所示。

最后,相对位置编码可以同时应对上述两种问题,但是相对位置编码无法提供绝对位置信息,这对分类性能非常重要,如表1所示,相对位置编码的模型性能较差(70.5% vs. 72.2%)。

本文的创新点

  1. 条件位置编码(Conditional Position Encoding,CPE):本文提出了一种新的位置编码方法CPE,通过卷积操作保留位置关系,使得模型在处理不同大小的输入图像时无需重新训练或进行复杂的插值,从而保持了平移等变性。
  2. 位置编码生成器(Position Encoding Generator,PEG):通过一个简单的PEG实现CPE,它可以无缝地集成到当前的Transformer框架中。PEG通过局部邻域的动态编码,使得模型能够处理比训练期间见过的序列更长的输入序列。
  3. 全局平均池化(GAP):在分类任务中,提出用全局平均池化替代传统的可学习分类标记(class token),进一步增强了模型的平移等变性和性能。
  4. Conditional Position encoding Vision Transformer(CPVT):基于PEG构建的CPVT,在保持与学习到的位置编码相似的注意力图的同时,提供了更好的性能和泛化能力。

方法介绍

作者认为,一个成功的视觉任务的位置编码应该满足以下的要求:

  1. 使得输入序列对顺序敏感(permutation-variant)同时又具备平移不变性(translation-equivariance)。
  2. 能够处理比训练时更长的输入序列,有助于泛化到检测、分割等下游任务。
  3. 在一定程度上能够提供绝对位置,这对分类性能很重要。

作者发现,用位置编码描述局部关系就足以满足上述所有条件。首先,它满足permutation-variant,因为输入序列的排列顺序也会影响局部邻域的顺序。但对输入图像中的对象进行平移并不会改变其局部邻域的顺序,即translation-equivariance。其次,模型可以很容易地泛化到较长的输入序列,因为只涉及到一个token的局部邻域。此外,如果任何一个输入token的绝对位置都已知,则可以通过输入token之间的相互关系来推断出其它token的绝对位置。作者表明,由于zero-padding,边界上的token也可以知道它们的绝对位置。

因此作者提出了位置编码生成器(PEG)来动态地生成基于输入token的局部邻域的位置编码。PEG如图2所示,我们首先将DeiT中展平后的输入序列 \(X\in \mathbb{R}^{B\times N\times C}\) reshape回二维图片空间中得到 \(X'\in \mathbb{R}^{B\times H\times W\times C}\),然后将一个函数(如图2中的 \(F\))重复地作用于 \(X'\) 中的local patch来得到conditional位置编码 \(E\in \mathbb{R}^{B\times H\times W\times C}\)。PEG可以通过一个核大小为 \(k(k\ge3)\) 以及 \(\frac{k-1}{2}\) 的zero padding的二维卷积来实现,而 \(F\) 可以是各种形式比如各种类型的卷积。

基于条件位置编码,作者提出了条件位置编码Vision Transformer(CPVT),除了位置编码,作者完全遵循ViT和DeiT来设计CPVT,并有三种不同尺寸的模型CPVT-Ti、CPVT-S和CPVT-B。和DeiT中原始的位置编码类似,条件位置编码也被添加到输入序列之中,如图1(b)所示。在CPVT中,PEG的位置对模型的性能也很重要,具体将在实验部分进行研究。 

此外,DeiT和ViT都使用了一个额外的可学习的类别token来执行分类,即图1(a)和(b)中的cls_token。类别token本身的设计不是平移不变的,尽管它可以学习这种特性。一个简单的替代方法是直接使用全局平均池化(GAP),它本质上是平移不变的,从而得到了CPVT-GAP。结合CPE和CPVT-GAP得到了更好的分类性能。

实验结果

不同大小的CPVT的结构如下表所示

和其它SOTA模型在ImageNet上的性能对比,如表4所示,可以看到在相似的参数量和计算量区间范围内,CPVT的性能要优于DeiT。

 

消融实验

Class Token vs. GAP

本文提出的PEG忽略padding时是平移等变的,因此如果我们进一步使用具有平移不变性的GAP而不是cls_token,CVPT也具有了平移不变性。这对分类任务是有帮助的。实验结果如表3所示,使用GAP可以将CPVT的精度提升超过1%。

位置信息还是额外的参数?

有人可能会怀疑PEG带来的改进是由于PEG中的卷积层带来的额外的可学习参数,而不是它的位置表示能力。作者将PEG中3x3卷积的权重随机初始化后在训练阶段固定住,即不更新权重,仍然取得了71.3%的精度,由于不用位置编码的DeiT的68.2%,表明是通过zero padding引入的位置信息提升了性能而不是额外的参数。此外作者又用12层的1x1卷积替换PEG,此时可学习的参数更多了但没有引入位置信息,精度只有68.6%。

PEG的位置

作者又比较了将PEG放到不同位置时模型的性能,其中-1表示第一个encoder block的输入位置,0表示第一个encoder block的输出位置,作者认为两者性能差异这么大的原因在于感受野不同,经过第一个block后具有了全局感受野,如果在-1位置处增大感受野性能也会得到提升。为此作者将-1位置处的3x3卷积改成27x27的卷积,结果确实得到了提升,从而验证了作者的观点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“世界酒中国菜”系列活动如何助推乡村振兴和文化交流?

"世界酒中国菜"系列活动如何助推乡村振兴和文化交流? 《经济参考报》(2024年5月24日 第6版) 新华社北京(记者 张晓明) “世界酒中国菜”系列活动自启动以来,已在国内外产生了广泛影响。这一国家…

6,串口编程———通过串口助手发送数据,控制led亮灭

//功能:串口助手每次发送数据格式:0000& // 第二个字节控制LED1亮灭 // 第三个字节控制LED2亮灭 // 第四个字节控制LED3亮灭 // 第无个字节控制LED4亮灭 //要求:代码能够一直运行,能够接收多字节数据 上节讲了串口的基本…

生态融合促发展 YashanDB与丰图科技完成兼容性认证

近日,深圳计算科学研究院崖山数据库系统YashanDB V23与丰图科技智域城市数字孪生平台顺利完成兼容性互认证。经严格测试,双方产品完全兼容,稳定运行,充分满足企事业单位在高性能、高可用性、高稳定性及高可控性方面的核心需求&…

【Linux系统编程】冯诺依曼体系、操作系统、进程的认识

目录 一、认识冯诺依曼体系 二、认识操作系统 三、认识进程 一、认识冯诺依曼体系 我们日常使用的计算机,笔记本和我们不常见的计算机如服务器,它们都遵循冯诺依曼体系。 下图是冯诺依曼体系结构的图解: 我们可以看到冯诺依曼体系结构由…

String,StringBuffer ,StringBuilder 的区别及其详解

目录 一、String1.1 String介绍1.2 深入理解String的不可变性1.3 String 操作字符串方法 二、StringBuffer2.1 StringBuffer介绍2.2 StringBuffer 构造方法2.3 StringBuffer 常用方法 三、StringBuilder2.1 StringBuffer介绍 四、String,StringBuffer ,S…

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念: 当我们做了一些操作 (update/delete/insert),提交事务后要操作MySql中的数据。 为了能够提升性能,引入了两块区域:内存结构和磁盘结构。 磁盘结构: 主要存储的就是数据页&#x…

OSG学习记录

osg开发配置与第一个osg程序-CSDN博客 #include <osg/Geode> #include <osg/ShapeDrawable> #include <osgViewer/Viewer> #include <iostream>int main(int argc, char** argv) {std::cout << "Hello, osg!" << std::endl;osg:…

【Qt系列教程】一、认识Qt、安装Qt、运行Hello Qt

文章目录 1.1 Qt 简介1.2 Qt 的安装1.3 编写 Hello World 1.1 Qt 简介 Qt&#xff08;官网&#xff1a;https://www.qt.io&#xff09;于1995年5月首次公开发布&#xff0c;是一个跨平台的应用程序开发框架&#xff0c;也是最主流的 C 开发框架&#xff1b; Qt 具有其他编程…

Windows安装Kibana7.17.0

安装 Kibana 是通过下载 Kibana 压缩包并解压&#xff0c;然后进行简单的配置即可。以下是在 Windows 系统上安装 Kibana 的基本步骤&#xff1a; 1. 下载 Kibana 访问 Elastic 官网的下载页面&#xff0c;选择适用于你系统的 Kibana 版本进行下载。根据你的系统选择 Windows…

【Linux】进程间通信(System V IPC)

这节我们开始学习System V IPC方案。 分别是共享内存&#xff0c;消息队列与信号量 会着重讲解共享内存&#xff0c;但是消息队列与信号量只会说明一下原理。 原因&#xff1a;System V是新设计的一套标准 与文件的整合度不高只能进行本地通信 更何况&#xff0c;我们现在有…

【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

flink Jobmanager metaspace oom 分析

文章目录 现象作业背景分析现象分析类卸载条件MAT 分析 解决办法flink 官方提示 现象 通过flink 页面提交程序&#xff0c;多次提交后&#xff0c;jobmanager 报metaspace oom 作业背景 用户代码是flink 代码Spring nacos 分析 现象分析 从现象来看肯定是因为有的类没有被…

[学习笔记](b站视频)PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】(ing)

视频来源&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】 前面P1-P5属于环境安装&#xff0c;略过。 5-6.Pytorch加载数据初认识 数据文件: hymenoptera_data # read_data.py文件from torch.utils.data import Dataset …

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…

使用低代码系统的意义与价值主要体现在哪里?

使用低代码系统的意义与价值主要体现在以下几个方面&#xff0c;这些观点基于驰骋低代码设计者的专业洞察和行业经验&#xff1a; 快速原型创建&#xff1a; 低代码平台通过提供图形化界面和预构建的模块&#xff0c;极大地加速了系统原型的创建过程。这意味着企业能够更快地验…

Aras Innovator-Team(群组)的使用方法

当Aras Innovator在处理权限时&#xff0c;在不使用Team的情况下&#xff0c;系统的权限配置可以满足大部分业务场景&#xff0c;如&#xff1a;常见的按照组织架构&#xff0c;成员和角色分配权限&#xff0c;按照生命周期分配权限等。 如果遇到比较复杂的权限需求&#xff0c…

Docker安装启动Mysql

1、安装Docker&#xff08;省略&#xff09; 网上教程很多 2、下载Mysql5.7版本 docker pull mysql:5.7 3、查看镜像是够下载成功 docker images 4、启动镜像&#xff0c;生成容器 docker run --name mysql5.7 -p 13306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 5…

通过非欧几何体改变 AI 嵌入

目录 一、说明 二、LLM嵌入的形势 三、了解一些背景信息 3.1 什么是嵌入&#xff1f; 3.2 为什么嵌入在 NLP 中很重要&#xff1f; 3.3 复数Complex 几何的角色 3.4 C主动学习 3.5 角度嵌入 &#xff08;AE&#xff09;&#xff1a;解锁稳健排序 3.6 RotatE&#xff1a;将关系…

探索 Python 的 vars() 函数

大家好&#xff0c;在软件开发的过程中&#xff0c;调试是一个不可或缺的环节。无论你是在解决 bug&#xff0c;优化代码&#xff0c;还是探索代码的执行流程&#xff0c;都需要一些有效的工具来帮助你更好地理解和调试代码。在 Python 编程中&#xff0c;vars() 函数是一个非常…

无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码

一、无人机模型介绍 无人机三维航迹规划_无人机航迹规划-CSDN博客 二、部分代码 close all clear clc warning (off) global model global gca1 gca2 gca3 gca4 model CreateModel(); % Create search map and parameters load(BestPosition5.mat); load(ConvergenceCurve5…