Arxiv 2106 | Vision Transformers with Hierarchical Attention

2023-10-18 14:40

本文主要是介绍Arxiv 2106 | Vision Transformers with Hierarchical Attention,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Arxiv 2106 | Vision Transformers with Hierarchical Attention

image.png

  • 论文:https://arxiv.org/abs/2106.03180
  • 代码:https://github.com/yun-liu/HAT-Net
  • 本文地址:https://www.yuque.com/lart/papers/cbsx8x

关注的问题

本文重新设计了视觉Transformer中的多头自注意力(MHSA),以实现更高效的全局关系建模过程,同时又不牺牲细粒度信息。
具体过程可以简单概述为将原始细粒度的全局交互拆解为细粒度的局部交互和粗粒度的全局交互的多步处理的形式。

现有问题及方案

Transformer在NLP领域中以成为了处理长距离依赖关系的事实标准(the de-facto standard)。Transformer依赖于自注意力机制来建模序列数据的全局关系。

随着视觉Transformer的代表性工作ViT的出现,基于像素patch构建Transformer模型的方式已经成为了视觉Transformer的主流范式,但是由于视觉数据中patch序列长度依然较长,其所依赖的Self-Attention操作在实际应用中仍然面临着较高的计算量和空间复杂度的问题。

最近的一些工作主要在尝试通过各种手段来压缩序列长度从而提升视觉Transformer的计算效率。

  • Local Attention:Swin Transformer中使用固定大小的窗口,并搭配Shift Window并多层堆叠从而模拟全局建模。这种手段仍然次优,因为其仍然延续着CNN的堆叠模拟长距离依赖的思路。
  • Pooling Attention:PVT对特征图下采样,从而缩小了序列长度。但是因为下采样了key和value,也因此丢失了局部细节。而且使用了固定尺寸的下采样比例,这使用的是具有与卷积核大小相同的步长的跨步卷积实现的。如果需要调整配置,就得需要重新训练。
  • Channel Attention:CoaT计算了通道形式的注意力,这可能没有模拟全局特征依赖那么有效。

本文方法

image.png

提出模块

针对MHSA提出了一种更加有效和灵活的变体——分层多头自注意力(Hierarchical Multi-Head Self-Attention,H-MHSA)。其通过将直接计算全局相似关系的MHSA拆解成了多个步骤,每步中具有不同粒度的短序列之间的相似性建模,从而既保留了细粒度信息,又保留了短序列计算的高效。

而且H-MHSA涉及到缩短序列的操作都是无参数的,所以对于下游任务更加灵活,不需要因为调整而重新预训练。

具体而言,H-MHSA中包含一下几个步骤:

  1. 对于输入的query、key以及value对应的patch token,首先将它们进行分组,分成不重叠的数个grid。
B, C, H, W = x.shape
qkv = self.qkv(self.norm(x))grid_h, grid_w = H // self.grid_size, W // self.grid_size
qkv = qkv.reshape(B, 3, self.num_heads, self.head_dim, grid_h,self.grid_size, grid_w, self.grid_size)
qkv = qkv.permute(1, 0, 2, 4, 6, 5, 7, 3)
qkv = qkv.reshape(3, -1, self.grid_size * self.grid_size, self.head_dim)
q, k, v = qkv[0], qkv[1], qkv[2]
  1. 在grid内的patch之间计算attention,从而捕获局部关系,产生更具判别性的局部表征。这里是基于残差形式。
attn = (q * self.scale) @ k.transpose(-2, -1)
attn = attn.softmax(dim=-1)
grid_x = (attn @ v).reshape(B, self.num_heads, grid_h, grid_w,self.grid_size, self.grid_size, self.head_dim)
grid_x = grid_x.permute(0, 1, 6, 2, 4, 3, 5).reshape(B, C, H, W)
grid_x = self.grid_norm(x + grid_x)
  1. 将这些小patch合并,获得更大层级的patch token。这允许我们直接基于这些数量较少的粗粒度的token来模拟全局依赖关系。这里计算时,对k、v使用平均池化进行进行压缩处理。
q = self.q(grid_x).reshape(B, self.num_heads, self.head_dim, -1)
q = q.transpose(-2, -1)
kv = self.kv(self.ds_norm(self.avg_pool(grid_x)))
kv = kv.reshape(B, 2, self.num_heads, self.head_dim, -1)
kv = kv.permute(1, 0, 2, 4, 3)
k, v = kv[0], kv[1]
  1. 最后来自局部和全局层级的特征被集成,从而获得具有更加丰富粒度的特征。
attn = (q * self.scale) @ k.transpose(-2, -1)
attn = attn.softmax(dim=-1)
global_x = (attn @ v).transpose(-2, -1).reshape(B, C, H, W)
if self.grid_size > 1:global_x = global_x + grid_x

基于提出的H-MHSA,文章构建了Hierarchical-Attention-based Transformer Networks (HAT-Net)的多个变体。在多个基础视觉任务上获得了良好的效果。

整体代码如下:

# https://github.com/yun-liu/HAT-Net/blob/3240bc014d51cb3f4215e6c086dfb02496b48215/HAT-Net.py#L42-L101
class Attention(nn.Module):def __init__(self, dim, head_dim, grid_size=1, ds_ratio=1, drop=0.):super().__init__()assert dim % head_dim == 0self.num_heads = dim // head_dimself.head_dim = head_dimself.scale = self.head_dim ** -0.5self.grid_size = grid_sizeself.norm = nn.GroupNorm(1, dim, eps=1e-6)self.qkv = nn.Conv2d(dim, dim * 3, 1)self.proj = nn.Conv2d(dim, dim, 1)self.proj_norm = nn.GroupNorm(1, dim, eps=1e-6)self.drop = nn.Dropout2d(drop, inplace=True)if grid_size > 1:self.grid_norm = nn.GroupNorm(1, dim, eps=1e-6)self.avg_pool = nn.AvgPool2d(ds_ratio, stride=ds_ratio)self.ds_norm = nn.GroupNorm(1, dim, eps=1e-6)self.q = nn.Conv2d(dim, dim, 1)self.kv = nn.Conv2d(dim, dim * 2, 1)def forward(self, x):B, C, H, W = x.shapeqkv = self.qkv(self.norm(x))if self.grid_size > 1:grid_h, grid_w = H // self.grid_size, W // self.grid_sizeqkv = qkv.reshape(B, 3, self.num_heads, self.head_dim, grid_h,self.grid_size, grid_w, self.grid_size)qkv = qkv.permute(1, 0, 2, 4, 6, 5, 7, 3)qkv = qkv.reshape(3, -1, self.grid_size * self.grid_size, self.head_dim)q, k, v = qkv[0], qkv[1], qkv[2]attn = (q * self.scale) @ k.transpose(-2, -1)attn = attn.softmax(dim=-1)grid_x = (attn @ v).reshape(B, self.num_heads, grid_h, grid_w,self.grid_size, self.grid_size, self.head_dim)grid_x = grid_x.permute(0, 1, 6, 2, 4, 3, 5).reshape(B, C, H, W)grid_x = self.grid_norm(x + grid_x)q = self.q(grid_x).reshape(B, self.num_heads, self.head_dim, -1)q = q.transpose(-2, -1)kv = self.kv(self.ds_norm(self.avg_pool(grid_x)))kv = kv.reshape(B, 2, self.num_heads, self.head_dim, -1)kv = kv.permute(1, 0, 2, 4, 3)k, v = kv[0], kv[1]else:qkv = qkv.reshape(B, 3, self.num_heads, self.head_dim, -1)qkv = qkv.permute(1, 0, 2, 4, 3)q, k, v = qkv[0], qkv[1], qkv[2]attn = (q * self.scale) @ k.transpose(-2, -1)attn = attn.softmax(dim=-1)global_x = (attn @ v).transpose(-2, -1).reshape(B, C, H, W)if self.grid_size > 1:global_x = global_x + grid_xx = self.drop(self.proj(global_x))return x

构建模型

image.png

  • 使用全局平均池化和全连接层作为分类结构。
  • 使用SiLU替换常用的GELU,因为后者训练期间更占内存。
  • 在MLP中使用深度分离卷积。
  • 模型开始使用两个步长为2的3x3卷积实现4倍下采样。
  • 后续分别堆叠多个H-MHSA和MLP的集成单元构成四个不同尺度的阶段。
  • 每个阶段为了下采样特征,在结尾会使用步长为2的3x3卷积操作。
  • 这里的多头设定中,使用的是固定大小的头,对于Tiny版本中设置为48,其他版本中为64。

实验结果

image.pngimage.png
image.png
image.png
image.png

这篇关于Arxiv 2106 | Vision Transformers with Hierarchical Attention的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233221

相关文章

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的, 论文可以从 https://arxiv.org/abs/2205.14135 页面下载,点击 View PDF 就可以下载。 下面我

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

复盘高质量Vision Pro沉浸式视频的制作流程与工具

在探索虚拟现实(VR)和增强现实(AR)技术的过程中,高质量的沉浸式体验是至关重要的。最近,国外开发者Dreamwieber在其作品中展示了如何使用一系列工具和技术,创造出令人震撼的Vision Pro沉浸式视频。本文将详细复盘Dreamwieber的工作流,希望能为从事相关领域的开发者们提供有价值的参考。 一、步骤和工作流 构建基础原型 目的:快速搭建起一个基本的模型,以便在设备

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

一键部署Phi 3.5 mini+vision!多模态阅读基准数据集MRR-Benchmark上线,含550个问答对

小模型又又又卷起来了!微软开源三连发!一口气发布了 Phi 3.5 针对不同任务的 3 个模型,并在多个基准上超越了其他同类模型。 其中 Phi-3.5-mini-instruct 专为内存或算力受限的设备推出,小参数也能展现出强大的推理能力,代码生成、多语言理解等任务信手拈来。而 Phi-3.5-vision-instruct 则是多模态领域的翘楚,能同时处理文本和视觉信息,图像理解、视频摘要

阅读笔记--Guiding Attention in End-to-End Driving Models

作者:Diego Porres1, Yi Xiao1, Gabriel Villalonga1, Alexandre Levy1, Antonio M. L ́ opez1,2 出版时间:arXiv:2405.00242v1 [cs.CV] 30 Apr 2024 这篇论文研究了如何引导基于视觉的端到端自动驾驶模型的注意力,以提高它们的驾驶质量和获得更直观的激活图。 摘 要   介绍

基于 BiLSTM+Attention 实现降雨预测多变量时序分类——明日是否降雨

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆、自然语言处理、深度强化学习、大型语言模型和迁移学习。 降雨预测作为气象学和水文学领域的重要研究课题,‌对于农业、‌城市规划、

Show,Attend and Tell: Neural Image Caption Generation with Visual Attention

简单的翻译阅读了一下 Abstract 受机器翻译和对象检测领域最新工作的启发,我们引入了一种基于注意力的模型,该模型可以自动学习描述图像的内容。我们描述了如何使用标准的反向传播技术,以确定性的方式训练模型,并通过最大化变分下界随机地训练模型。我们还通过可视化展示了模型如何能够自动学习将注视固定在显着对象上,同时在输出序列中生成相应的单词。我们通过三个基准数据集(Flickr9k,Flickr