2021-Twins: Revisiting the Design of Spatial Attention

2023-10-28

1. Title

2. Summary

本文整体设计思路与之前的Vision Transformer Backbone一致,如何获取多尺度特征(PVT)以及如何降低Self-Attention的计算复杂度(SwinTransformer)。
第一点PVT的方法就是一种比较合适的方法,各个Stage将Embedding进行合并,从而减少Embedding的数目,以实现不同Stage具有不同分辨率的金字塔结构。
第二点SwinTransformer通过在Local Window内部计算Self-Attention的方式降低了计算复杂度,同时提出了一种比较复杂的Shift-Window的方式去捕获各个窗口之间的依赖关系。
作者认为SwinTransformer的Shift-Window方法较为复杂,且现代深度学习框架支持性不够好,因此,本文提出了一种更为简单的方法去实现。
整体思路可以认为是PVT+SwinTransformer的结合:在局部窗口内部计算Self-Attention(SwinTransformer),同时对每个窗口内部的特征进行压缩,然后再使用一个全局Attention机制去捕获各个窗口的关系(PVT)。
个人觉得Twins这种思路更加简单,而且也比较高效,SwinTransformer的实现包含了作者大量精巧的设计(阅读过SwinTransformer的代码应该都会觉得其实现是十分巧妙且美妙的),实际上也是比较复杂的。大道至简,还是Twins的设计更符合认知一点,不过其性能还有待验证。

3. Problem Statement

相较于CNN来说,Transformer由于其能高效地捕获远距离依赖的特性,近期在计算机视觉领域也引领了一波潮流。Transformer主要是依靠Self-Attention去捕获各个token之间的关系,但是这种Global Self-Attention的计算复杂度太高 O ( N 2 ) O(N^2) O(N2),不利于在token数目较多的密集检测任务(分割、检测)中使用。

基于以上考虑,目前主流有两种应对方法:

  1. 一种是以SwinTransformer为代表的Locally-Grouped Self-Attention。其在不重叠的窗口内计算Self-Attention,当窗口大小固定时,整体的计算复杂度将下降至 O ( N ) O(N) O(N),然后再通过其他方法例如SwinTransformer中的Shift-Window的方法去实现窗口间的互动。但这种方法的缺点在于窗口的大小会不一致,不利于现代深度学习框架的优化和加速。
  2. 一种是以PVT为代表的Sub-Sampled Version Self-Attention。其在计算Self-Attention前,会先对QKT Token进行下采样,虽然计算复杂度还是 O ( N 2 ) O(N^2) O(N2),但是在实际过程中也已经可以接受。

总结下来,目前的VisionTransformer的关键设计在于Spatial Attention的设计。
因此,本文将重点在Spatial Attention的设计上,期望提出一个高效同时简单的Spatial Attention方法。

4. Method(s)

作者有两个发现:

  1. PVT中的Global Sub-Sample Attention是十分高效的,当配合上合适的Positional Encodings(Conditional Positional Encoding)时,其能取得媲美甚至超过目前SOTA的Transformer结构。
  2. 更进一步,基于Separable Depthwise Convolution的思想,本文提出了一个Spatially Separable Self-Attention(SSSA)。该模块仅包含矩阵乘法,在现代深度学习框架下能够得到优化和加速。

4.1 Twins-PCPVT

PVT通过逐步融合各个Patch的方式,形成了一种多尺度的结构,使得其更适合用于密集预测任务例如目标检测或者是语义分割,其继承了ViT和DeiT的Learnable Positional Encoding的设计,所有的Layer均直接使用Global Attention机制,并通过Spatial Reduction的方式去降低计算复杂度。
作者通过实验发现,PVT与SwinTransformer的性能差异主要来自于PVT没有采用一个合适的Positional Encoding方式,通过采用Conditional Positional Encoding(CPE)去替换PVT中的PE,PVT即可获得与当前最好的SwinTransformer相近的性能。关于CPE的具体介绍,可以参见我的另一篇博客:Conditional Positional Encodings for Vision Transformers

4.2 Twins-SVT

通过提出的Spatially Separable Self-Attention(SSSA)去缓解Self-Attention的计算复杂度过高的问题。SSSA由两个部分组成:Locally-Grouped Self-Attention(LSA)和Global Sub-Sampled Attention(GSA)。

4.2.1 Locally-Grouped Self-Attention(LSA)

首先将2D feature map划分为多个Sub-Windows,并仅在Window内部进行Self-Attention计算,计算量会大大减少,由 ( H 2 W 2 d ) \left(H^{2} W^{2}d\right) (H2W2d)下降至 O ( k 1 k 2 H W d ) \mathcal{O}\left(k_{1} k_{2} H W d\right) O(k1k2HWd),其中 k 1 = H m , k 2 = W n k_{1}=\frac{H}{m}, k_{2}=\frac{W}{n} k1=mH,k2=nW,当 k 1 , k 2 k_1,k_2 k1,k2固定时,计算复杂度将仅与 H W HW HW呈线性关系。

4.2.2 Global Sub-Sampled Attention(GSA)

LSA缺乏各个Window之间的信息交互,比较简单的一个方法是,在LSA后面再接一个Global Self-Attention Layer,这种方法在实验中被证明也是有效的,但是其计算复杂度会较高: O ( H 2 W 2 d ) \mathcal{O}\left(H^{2} W^{2} d\right) O(H2W2d)

另一个思路是,将每个Window提取一个维度较低的特征作为各个window的表征,然后基于这个表征再去与各个window进行交互,相当于Self-Attention中的Key的作用,这样一来,计算复杂度会下降至: O ( m n H W d ) = O ( H 2 W 2 d k 1 k 2 ) \mathcal{O}(m n H W d)=\mathcal{O}\left(\frac{H^{2} W^{2} d}{k_{1} k_{2}}\right) O(mnHWd)=O(k1k2H2W2d)
这种方法实际上相当于对feature map进行下采样,因此,被命名为Global Sub-Sampled Attention。
综合使用LSA和GSA,可以取得类似于Separable Convolution(Depth-wise+Point-wise)的效果,整体的计算复杂度为: O ( H 2 W 2 d k 1 k 2 + k 1 k 2 H W d ) \mathcal{O}\left(\frac{H^{2} W^{2} d}{k_{1} k_{2}}+k_{1} k_{2} H W d\right) O(k1k2H2W2d+k1k2HWd)。同时有: H 2 W 2 d k 1 k 2 + k 1 k 2 H W d ≥ 2 H W d H W \frac{H^{2} W^{2} d}{k_{1} k_{2}}+k_{1} k_{2} H W d \geq 2 H W d \sqrt{H W} k1k2H2W2d+k1k2HWd2HWdHW ,当且仅当 k 1 ⋅ k 2 = H W k_{1} \cdot k_{2}=\sqrt{H W} k1k2=HW
考虑到分类任务中, H = W = 224 H=W=224 H=W=224是比较常规的设置,同时,不是一般性使用方形框,则有 k 1 = k 2 k_1=k_2 k1=k2,第一个stage的feature map大小为56,可得 k 1 = k 2 = 56 = 7 k_1=k_2=\sqrt{56}=7 k1=k2=56 =7
当然可以针对各个Stage去设定其窗口大小,不过为了简单性,所有的 k k k均设置为7。

整个Transformer Block可以被表示为:
z ^ i j l =  LSA  (  LayerNorm  ( z i j l − 1 ) ) + z i j l − 1 z i j l =  FFN  (  LayerNorm  ( z ^ i j l ) ) + z ^ i j l z ^ l + 1 =  GSA  (  LayerNorm  ( z l ) ) + z l z l + 1 =  FFN  (  LayerNorm  ( z ^ l + 1 ) ) + z ^ l + 1 , i ∈ { 1 , 2 , … , m } , j ∈ { 1 , 2 , … , n } \begin{array}{l} \hat{\mathbf{z}}_{i j}^{l}=\text { LSA }\left(\text { LayerNorm }\left(\mathbf{z}_{i j}^{l-1}\right)\right)+\mathbf{z}_{i j}^{l-1} \\ \mathbf{z}_{i j}^{l}=\text { FFN }\left(\text { LayerNorm }\left(\hat{\mathbf{z}}_{i j}^{l}\right)\right)+\hat{\mathbf{z}}_{i j}^{l} \\ \hat{\mathbf{z}}^{l+1}=\text { GSA }\left(\text { LayerNorm }\left(\mathbf{z}^{l}\right)\right)+\mathbf{z}^{l} \\ \mathbf{z}^{l+1}=\text { FFN }\left(\text { LayerNorm }\left(\hat{\mathbf{z}}^{l+1}\right)\right)+\hat{\mathbf{z}}^{l+1}, \\ i \in\{1,2, \ldots, m\}, j \in\{1,2, \ldots, n\} \end{array} z^ijl= LSA ( LayerNorm (zijl1))+zijl1zijl= FFN ( LayerNorm (z^ijl))+z^ijlz^l+1= GSA ( LayerNorm (zl))+zlzl+1= FFN ( LayerNorm (z^l+1))+z^l+1,i{1,2,,m},j{1,2,,n}同时在每个Stage的第一个Block中会引入CPVT中的的PEG对位置信息进行编码。

4.3 Model Variants

在这里插入图片描述在这里插入图片描述

5. Evaluation

5.1 Experiments

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过以上实验结果可以看出,Twins系列在各个任务上均取得了与SwinTransformer相当甚至是超过的水平,不过相比较而言,除了Small,Twins的模型参数比SwinTransformer系列都稍微大一点,而且运行速度似乎也没有明显优势。

5.2 Ablation Studies

在这里插入图片描述
在这里插入图片描述

6. Conclusion

本文提出了两种Vision Transformer Backbone,同时适用于图片级的分类任务或是其他密集预测任务,并且在分类、分割、检测等多个任务上,均取得了新的SOTA。

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

2021-Twins: Revisiting the Design of Spatial Attention 的相关文章

  • [深度解剖C语言] --关键字 static

    static 最名不副实的关键字 目录 1 static修饰全局变量 2 static修饰函数 3 static修饰局部变量 static的作用 1 static修饰全局变量 我们创建两个源文件 一个test c 一个main c 现在我们
  • 【日常问题记录】visual studio 出现 E0266 “data“ 不明确 错误

    解决方法 定义的变量和内部变量冲突 将变量的把名字改成其他名字即可
  • 【Kubernetes】mac 安装minikube

    1 一 官网安装 官网 https minikube sigs k8s io 搜了下网上如何通过Mac 安装看网上文章很多 但是受限于国内网络环境 很多都不行 各种下载失败 如果你有VPN 那么官方的步骤就容易走通 brew install
  • 小酌Django3——HTTP/URL/ORM简述

    小酌Django3 HTTP URL ORM简述 HTTP Hyper Text Transfer Protocol 超文本传输协议 是客户端与服务端请求和应答的标准 TCP 封装了Web服务的整个过程 通常 由客户端发起 建立到服务器指定

随机推荐

  • 矩阵基本知识

    1 identity matrix 单位矩阵 除了正对角线上是1 其它地方都是0 2 square matrix 方阵 行数和列数都相等的矩阵 3 diagonal matrix 对角矩阵 只在正对角线上有值 其它地方为0 4 matrix
  • js获取昨天,今天,明天,上周,本周,下周,上月,本月,下月,去年,本年,明年,上季度,本季度,下季度,向前推日期等

    配合的elementul的日期选择器使用的 参数是这样的 1代表 上 0代表 本 1代表 下 本月 1号到今天 意思就是比如今天是10月27号 那点击这个获取的是10月1号到10月27号得 效果如图 按顺序点了一遍 从左到右 上代码
  • 双十一前4小时,CentOS 6.5server启动错误排查

    11月10日晚上8点多 眼看要到双十一了 但我要说的这段经历却和双十一毫无关系 哈哈 这天准备向CentOS6 5server的svn上传一些文件 结果开机启动时 却出现了以下的界面 这是肿么回事 依据屏幕的提示 先使用root账号登录到系
  • JSP page指令errorPage属性起什么作用呢?

    转自 JSP page指令errorPage属性起什么作用呢 下文讲述JSP中page指令的errorPage功能简介说明 如下所示 errorPage功能 errorPage 属性用于设置JSP页面 当出现异常时的跳转页面 注意事项 er
  • STM32G431控制窗帘电机-窗帘电机拆机

    前言 最近做了一个电动窗帘的控制工程 简单点说就是实现电动窗帘的校准模式 窗帘移动到任意位置 说明 本文档为原创 转载请注明出处 要进行商业合作请联系本人1151313194 qq com 一 电机爆炸图拆解 窗帘电机主要时由三部分构成 电
  • Docker的隔离机制

    Docker的隔离性主要运用Namespace 技术 传统上Linux中的PID是唯一且独立的 在正常情况下 用户不会看见重复的PID 然而在Docker采用了Namespace 从而令相同的PID可于不同的Namespace中独立存在 如
  • 自动生成GFM目录

    自动生成GFM目录 自动生成GFM目录 参考文献 引言 使用方法 对于本地文档 对于远程文档 对于多个文档 本地与远程结合 自动插入和更新目录 输出目录文件 工作流程 目前工作流程注意事项及问题 参考文献 https github com
  • Go语言--Nohup后台启动

    linux的nohup命令用法 在应用Unix Linux时 我们一般想让某个程序在后台运行 于是我们将常会用 在程序结尾来让程序自动运行 nohup命令格式 nohup root start sh 在shell中回车后提示 appendi
  • HTML5(六)preserve and recover

    HTML5 六 preserve and recover 1 save the state of canvas context 2 So we have two method to save and restore the state of
  • run nerf

    install cuda install cudnn install anoconda 2022 08 18 wget https repo anaconda com archive Anaconda3 2022 05 Linux x86
  • 接口自动化get请求一些小知识点

    get 请求 requests get get请求的参数可以写在url里 写在url里时 参数和url之间需要加 get 请求的参数可以不写在url里 可以组织为字典传给参数param get 请求可以不传参数 获取响应信息 r reque
  • React之Hook(四)——使用 Effect Hook

    Effect Hook 可以让你在函数组件中执行副作用操作 import React useState useEffect from react function Example const count setCount useState
  • Doris数据划分

    数据划分 基本概念 Row Column 一张表包含行 Row 和列 Column Column可以分为两大类 Key和Value Tablet Partition 在Doris的存储引擎中 用户数据被水平划分为若干个数据分片 Tablet
  • Android面试题(32)-android编译过程和安装流程

    android app的编译过程 从网上拷了一张图 这张图很好的讲述了android的编译打包过程 接下来就具体的分析分析 大致分为7步 1 aapt Android Asset Packaging Tool android构建工具 在an
  • 网络前三层(物理,数据链路层,网络)数据包传输过程

    前三层 起始 第一层 物理层 hub 第二层 数据链路层 交换机 第三层 网络层 路由器 起始 起始 我就是一台电脑A 有一天 突然另一台电脑B想和我进行通话 于是我们各自开了个网口 用一根网线连接起来 这样就可以进行通信了 至于为什么可以
  • 教你如何使用解决keil编译大小限制问题

    关于上一篇我们讲解到可能刚接触keil的人会因为没有使用注册机 好像不能使用注册机 所以就缩写吧 导致编译超出32K文件时候会报错的问题 于是在这一篇我们就来好好讲解一下如何使用keil注册机去破解keil 解决方法 参考我的这篇文章 因为
  • PyQt中QLabel背景与字体的一些设置

    本文原创 原文地址 http blog csdn net jiuzuidongpo article details 45485127 一般来说 对QLabel的背景和字体设置的话 有两种方法 一种是使用样式表 就是stypesheet 另一
  • 华为OD机试 - 九宫格(Java)

    题目描述 九宫格是一款广为流传的游戏 起源于河图洛书 游戏规则是 1到9九个数字放在3 3的格子中 要求每行 每列以及两个对角线上的三数之和都等于15 在金麻名著 射雕英雄传 中黃蓉曾给九宫格的一种解法 口诀 戴九恩一 左三右七 二四有肩
  • 脉冲星测时软件TEMPO2安装

    下载 https bitbucket org psrsoft tempo2 downloads 在安装TEMPO2之前需要安装pgplot FFTW CFITSIO等数学库 安装时 注意运行 configure后输出的日志信息 会提示是否缺
  • 2021-Twins: Revisiting the Design of Spatial Attention

    文章目录 1 Title 2 Summary 3 Problem Statement 4 Method s 4 1 Twins PCPVT 4 2 Twins SVT 4 2 1 Locally Grouped Self Attention