论文解读:On the Integration of Self-Attention and Convolution

news2024/11/25 0:39:06

自注意力机制与卷积结合:On the Integration of Self-Attention and Convolution(CVPR2022)

引言

1:卷积可以接受比较大的图片的,但自注意力机制如果图片特别大的话,运算规模会特别大,即上图中右边(卷积)会算得比较快,左边(自注意力机制)会算得比较慢,所以我们要想些办法让自注意力机制规模小一点,本篇文章就只让qkv计算部分区域,而不是整个全局图片了。

2:自注意力机制中的qkv与卷积中的卷积核(比如说3x3的卷积核)能否一起得到?额,好像两者不是一类东西,但如果qkv用1x1的卷积核话,似乎有可能..

但是1x1的卷积核与3x3的卷积核似乎很难配套,有没有可能将3x3的卷积核用9个1x1的卷积核去替代呢?那既然两者(自注意力机制与卷积)都用到1x1的卷积,不妨两者共享1x1的卷积?

3. Revisiting Convolution and Self-Attention

3.1. Convolution

原理

这里先不扎进去研究论文上的公式,先用图看原理

9个1x1的卷积核输出的结果,再拼接起来

例子:4个1x1的卷积核代替1个2x2的卷积核

最左边的3x3正方形为图片特征(这里channel=1)

注意:需要3x3的卷积中pading=1;1x1的卷积中pading=0;这样的话输出结果的形状大小才相同

从这里我们可以看出来,其实这种代替的方法得出的数值结果是不相同的,只不过是4个1x1的卷积核模仿了1个2x2的卷积核的学习过程而已。

公式讲述

标准卷积公式

标准公式中的f_{i+p-\lfloor k/2 \rfloor,j+p-\lfloor k/2 \rfloor}的讨论?

i+p-\lfloor k/2 \rfloor,j+p-\lfloor k/2 \rfloor应该是对Stage2中Conv1输出结果偏移大小的描述

这里k=3,则\lfloor k/2 \rfloor=1,所以Conv1的输出结果偏移\pm{=1}

重写卷积公式

将上式进行重写

其中g_{i,j}^{(p,q)}为一个卷积核输出的结果

g_{i,j}为所有卷积核的结果相加

定义Shift操作

将Shift定义为

定义为:

其中\Delta{x},\Delta{y}分别为水平和垂直位移。则等式3可以改写为

将标准卷积分为两个阶段

第一阶段,将输入的特征图沿某个位置的核权重进行线性投影,即(p,q)。这与标准的1 × 1卷积相同。

第二阶段,投影后的特征图根据核位置进行平移(所以到底下图用多大的Filter(下图是3x3)得提前定好,因为这个跟每个Conv 1x1得到结果的平移,即与S(\Delta{x},\Delta{y})息息相关?不是,这是由\lfloor k/2 \rfloor

决定的,即S(\pm{\lfloor k/2 \rfloor},\pm{\lfloor k/2 \rfloor})),最后聚合在一起。可以很容易地观察到,大部分的计算开销是在1 × 1卷积中进行的,而接下来的移位和聚合是轻量级的。

3.2. Self-Attention

原理

很简单,这里用一句话来描述:用三个1x1的卷积核得到Q、K、V,之后,由于(a)卷积与(b)self-attention是并行计算的,为了让(b)self-attention赶上(a)卷积,这里只做局部区域的自注意力机制(与swin-transformer有点像,链接:论文解读:SwinTransformer-减少Q、K、V的运算规模-CSDN博客),局部区域对应公式中给出的N_{k}(i,j)

公式解读

这里为一个具有 N 个头的标准自注意力模块。F\in{R^{C_{in}*H*W}},G\in{C_{out}*H*W}为输入特征图和输出的特征图,其中H,W的图片的大小,输出与输入图片的尺寸保持不变。f_{ij}\in{R^{C_{in}}}.g_{ij}\in{R^{C_{out}}}分别为F和G对应的像素(i,j)的特征张量,则注意力模块的的计算为。

[ 输出特征 = 多个注意力头的相同位置值相加( 注意力权重 × Value ) ]

其中 || 是 N 个注意力头的输出的相同位置值相加(参考文章中说是: N 个注意力头的输出的串联,我觉得有点不对,因为他们是并行得到,串联有种一个头依赖另一个头的感觉)。W_{l}^{(q)},W_{l}^{(k)},W_{l}^{(v)}是queris,keys,values的投影矩阵。

自注意力机制的特点

1:N_{k}(i,j)为像素的局部区域,其自注意力机制以(i,j)为中心,这说明自注意力机制并非全局的,而是仅在自己(i,j)为中心的区域做自注意力机制。

2:A(W_{q}^{(l)}f_{ij},W_{k}^{(l)}f_{ab})是关于N_{k}(i,j)内特征相应的权重。

广泛采用的自我注意模块权重计算如下:

其中d是W_{q}^{(l)}f_{ij}的特征尺寸。

留意:softmax的作用范围是在N_{k}(i,j)这个区域里面的。

将多头注意力机制分成两个阶段

第一阶段类似于传统卷积,进行1×1卷积,将输入特征投影为查询、键和值。

第二阶段包括注意力权重的计算和价值矩阵的聚合,即收集局部特征。

3.3. Computational Cost(比较一、二阶段的计算代价)

为了充分了解卷积和自注意力模块的计算瓶颈,本文分析了每个阶段的浮点运算(FLOPs)和参数数量,并在下表中进行了总结。

研究表明,中卷积中第一阶段的理论FLOPs 和参数对通道大小C呈二次(即平方)复杂性,而第二阶段的计算成本与C呈一次线性关系。在自注意力模块中也有同样的情况,其中所有的训练参数被保存在阶段I。至于理论得到FLOPs,考虑正常情况下,在ReNET模型中,其中K_{a}=7,对于不同的层深度有C=64, 128, 256,512。结果表明,当3C^{2}>2k^{2}_{a}C时,第一阶段消耗的操作明显大于第二阶段的消耗,并且随着通道大小的增加,差异更明显。

所以随着通道越大,第一阶段的消耗是非常可怕。那么如果我们能够在卷积和自注意力机制中都共享第一阶段,即用同样的一阶段参数,那么将会大大节省计算代价,这便是 4.1. Relating Self-Attention with Convolution 讲的内容。

4. Method

4.1. Relating Self-Attention with Convolution

额,这里说得很抽象...,其实就是上面3.3最后的结论。

自注意力和卷积模块这两个阶段的作用非常相似。第一阶段是特征学习模块,两种方法通过执行1×1卷积来共享相同的操作,从而将特征投影到更深的空间。另一方面,第二阶段对应于特征聚合的过程,尽管他们的学习方法不同。

从计算角度来看,在卷积模块和自注意力模块的第一阶段进行的1×1卷积需要理论的FLOPs和的参数与通道大小C呈2次相关的。相比之下,在第二阶段,两个模块都是轻量级的或几乎没有计算,毕竟只是呈线性关系。

总结:

(1)卷积和自注意力在通过1×1卷积投影输入特征图时实际上共享相同的操作,这能够大大节省计算开销。

(2) 虽然对于捕获语义特征至关重要,但第二阶段的聚合操作是轻量级的,并且不会获得额外的学习参数。

4.2. Integration of Self-Attention and Convolution

ACmix包括两个阶段。

第一阶段:

输入特征通过三个1×1卷积投影得到3个H*W*C,之后通过reshape将每个H*W*C

reshape成H*W*\frac{C}{N}*N,其中N是第二阶段中自注意力机制的头数。

第二阶段:

卷积的stage2在进行偏移之前,先将H*W*\frac{C}{N}*3N通过全连接得到K^{2}H*W*\frac{C}{N}

,之后偏移聚合得到H*W*\frac{C}{N}*N自注意力机制为N个头分别进行self-attention,每个头的结果H*W*\frac{C}{N}为之后再把N个头拼接起来,得到H*W*\frac{C}{N}*N

最后,两条路径的输出相加,其中\alpha,\beta为可学习参数

4.3. Improved Shift and Summation

如图4.2节中的图所示,中间特征为卷积路径遵循传统卷积模块中进行的移位和求和操作。尽管理论上它们是轻量级的,但向不同方向移动张量实际上会破坏数据,并且局部性和矢量化难以实现。这可能会大大损害我们的实际效率。

作为补救措施,我们采用固定核的深度卷积来替代低效的卷积张量位移。取Shift(f,−1,−1)

例如,位移特征计算为:

其中c代表输入特性的通道数。

因此,通过针对特定移位方向精心设计的核权重,卷积输出相当于简单的张量移位。为了进一步结合来自不同方向的特征之和,将所有输入特征和卷积核分别连接起来,并将移位运算表示为单组卷积。

在此基础上,作者还引入了一些调整,以增强模块的灵活性。如上图(c.II)所示,将作为偏移使用的卷积核作为可学习的参数,并将移位核作为初始化。这提高了模型容量,同时保持了原始轮流操作的能力。

另外,还使用多组卷积核来匹配卷积和自注意力路径的输出通道维度,如上图(c.III)所示。

一个例子:用矩阵乘法来代替平移

论文里对应的图

4.5. 探索注意力权重

[⋅]表示特征串联,\phi(.)表示两个具有中间非线性激活函数的线性投影层,W_{k}(i,j)表示每个查询标记的专用接收域,W表示整个特征图。然后,计算出的注意力权重可应用于等式(12),并符合一般公式。

5. Experiments

5.1. ImageNet Classification

本篇文章将ACmix应用在4个基本模型当中,包括:ResNet, SAN, PVT and Swin-Transformer,并进行比较。

文章还应用在其他下游任务中,这里就不列举了。

参考资料

论文下载

📎论文On the Integration of Self-Attention and Convolution.pdf

代码

GitHub - LeapLabTHU/ACmix: Official repository of ACmix (CVPR2022)

参考文章

On the Integration of Self-Attention and Convolution-CSDN博客

📎On the Integration of Self-Attention and Convolution-CSDN博客 (2023_12_19 16_38_40).html

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

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

相关文章

c语言:求算数平均数|练习题

一、题目 输入3个数&#xff0c;求这三个数的算术平均数 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<math.h> //输入正整数a、b、c的值&#xff0c; //求其算术平均值,并保留两个小数位输出 int pass0;//定义一个开关&#xff0c;…

《JVM由浅入深学习【一】 2023-12-19》JVM由简入深学习提升

JVM由浅入深一&#xff08;类加载&#xff09; JVM的类加载1. java运行时是什么时候被加载的&#xff1f;2. JVM类加载过程大致阶段3. 父类与子类初始化各个类型顺序4. 什么是类加载器&#xff1f;6. 双亲委派机制 JVM的类加载 1. java运行时是什么时候被加载的&#xff1f; …

win10部署安装Elasticsearch8.1.2

环境准备&#xff1a;JDk是1.8以上版本 1、官方下载Elasticsearch部署安装 访问官网,进入主页下载。 2、在下载页面&#xff0c;可以看到选择操作系统&#xff0c;选择系统后点击下载。&#xff08;我这里下载的Windows版本&#xff09; 3下载完成后&#xff0c;解压文件&am…

多级缓存:亿级流量的缓存方案

文章目录 一.多级缓存的引入二.JVM进程缓存三.Lua语法入门四.多级缓存1.OpenResty2.查询Tomcat3.Redis缓存预热4.查询Redis缓存5.Nginx本地缓存6.缓存同步 一.多级缓存的引入 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未…

FA2016ASA (MHz范围晶体单元,内置热敏电阻) 汽车

FA2016ASA是爱普生推出的一款内置热敏电阻、频率范围为38.4MHz的晶振&#xff0c;确保数据的准确传输&#xff0c;同时有效避免频谱干扰的出现。可以在-40C to 125C 的温度内稳定工作。在汽车内部空间有限的情况下&#xff0c;FA2016ASA以其小型超薄的外形尺寸2.0 1.6 0.68mm…

【分享】如何给Excel加密?码住这三种方法!

想要给Excel文件进行加密&#xff0c;方法有很多&#xff0c;今天分享三种Excel加密方法给大家。 打开密码 设置了打开密码的excel文件&#xff0c;打开文件就会提示输入密码才能打开excel文件&#xff0c;只有输入了正确的密码才能打开并且编辑文件&#xff0c;如果密码错误…

Jenkins 构建环境指南

目录 Delete workspace before build starts&#xff08;常用&#xff09; Use secret text(s) or file(s) &#xff08;常用&#xff09; Add timestamps to the Console Output &#xff08;常用&#xff09; Inspect build log for published build scans Terminate a …

MFC 消息映射机制

目录 消息映射机制概述 宏展开 宏展开的作用 消息映射机制的执行流程 消息处理 消息映射机制概述 MFC的消息映射映射机制是可以在不重写WindowProc虚函数的大前提下&#xff0c;仍然可以处理消息。 类必须具备的要件 类内必须添加声明宏 DECLARE_MESSAGE_MAP() 类外…

【音视频 | AAC】AAC格式音频文件解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

33 在Vue3中如何通过插槽向父组件传值

概述 通过插槽向父组件传值&#xff0c;是一种比较高级的&#xff0c;但是非常使用的技术&#xff0c;在很多UI组件库里面经常看到。 这节课我们来学习一下这种用法。 基本用法 我们创建src/components/Demo33.vue&#xff0c;代码如下&#xff1a; <script setup> …

U盘无法读取怎么办?U盘无法读取修复方法

U盘无法读取是常见的故障&#xff0c;可能的原因包括U盘驱动程序未安装、U盘损坏、文件系统损坏等。为了解决这个问题&#xff0c;可以尝试重新安装U盘驱动程序、格式化U盘、检查U盘是否损坏等方法。如果以上方法均无效&#xff0c;建议寻求专业人士的帮助。 U盘无法读取怎么办…

MySQL——基础篇

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/?spm_id_from333.999.0.0&vd_source619f8ed6df662d99db4b3673d1d3ddcb 前言✴️ 基础篇——MySQL概述、SQL、函数、约束、多表查询、事务 进阶篇——存储引擎、索引、SQL优化、视图/存储过程/触发…

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

GitHub two-factor authentication开启教程

问题描述 最近登录GitHub个人页面动不动就有一个提示框”… two-factor authentication will be required for your account starting Jan 4, 2024 …“&#xff0c;点击去看了一下原来是GitHub对所有的用户登录都要开启双重身份认证&#xff0c;要在1月4号前完成 解决办法 …

Jenkins + gitlab 持续集成和持续部署的学习笔记

1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle)&#xff1a;它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…

清风数学建模学习笔记-斯皮尔曼相关系数

内容&#xff1a;斯皮尔曼相关系数 一.原理&#xff1a; 二.算法&#xff1a; 1.MATLAB: 2.SPSS&#xff1a; 分析-相关-双变量相关-勾选标注显著性相关性 3. 相关性系数的选择&#xff1a;

三大主流前端框架介绍及选型

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

自动化测试|Eolink Apikit 如何保存、使用测试用例

测试用例是测试过程中很重要的一类文档&#xff0c;它是测试工作的核心&#xff0c;是一组在测试时输入和输出的标准&#xff0c;是软件需求的具体对照。 测试用例可以帮助测试人员理清测试思路&#xff0c;确保测试覆盖率&#xff0c;发现需求漏洞&#xff0c;提高软件质量&a…

HarmonyOS 应用事件打点开发指导

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志&#xff0c;难以识别其中的关键信息。因此&#xff0c;应用开发者需要一种数据打点机制&#xff0c;用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent 是在系统层面…