【深度学习中的注意力机制9】11种主流注意力机制112个创新研究paper+代码——滑动窗口注意力(Sliding Window Attention)

news2024/11/26 2:22:21

【深度学习中的注意力机制9】11种主流注意力机制112个创新研究paper+代码——滑动窗口注意力(Sliding Window Attention)

【深度学习中的注意力机制9】11种主流注意力机制112个创新研究paper+代码——滑动窗口注意力(Sliding Window Attention)


文章目录

  • 【深度学习中的注意力机制9】11种主流注意力机制112个创新研究paper+代码——滑动窗口注意力(Sliding Window Attention)
  • 1. 滑动窗口注意力的起源与提出
  • 2. 滑动窗口注意力的原理
  • 3. 滑动窗口注意力的数学表示
  • 4. 滑动窗口注意力的发展
  • 5. 代码实现
  • 6. 代码解释
  • 7. 总结


欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz

1. 滑动窗口注意力的起源与提出

滑动窗口注意力(Sliding Window Attention)是针对大型图像和高维特征数据中注意力机制的计算复杂度问题提出的一种解决方案。标准的全局注意力机制需要对每个位置和其他所有位置计算注意力权重,其计算复杂度是 O ( N 2 ) O(N^2) O(N2),这里 N N N 是输入的特征长度。对于大尺寸图像,尤其是在自然语言处理和图像任务中的高分辨率场景,这种复杂度是非常高的。

滑动窗口注意力提出的目标是降低计算复杂度的同时保留局部相关性。它的基本思想是,不再在全局范围内计算每个位置的注意力,而是在局部窗口中进行计算,即将图像或序列分割成多个小的区域(滑动窗口),每个窗口仅计算其内部元素的注意力

该机制在视觉Transformer(Vision Transformer,ViT)以及类似的变体模型(如Swin Transformer)中被广泛应用。滑动窗口注意力机制在这些模型中能够有效降低全局注意力带来的高计算成本,并保留对局部信息的有效建模

2. 滑动窗口注意力的原理

滑动窗口注意力的核心思路是将输入特征(如图像)划分为多个局部窗口,每个窗口内的特征计算注意力权重,并在这些窗口间进行滑动,逐步覆盖整个输入的所有特征。这样既能避免全局注意力的高昂计算开销,又能保证局部信息的充分捕获。

滑动窗口注意力主要包括以下几个步骤:

  • 窗口划分:输入特征按照固定大小的窗口进行划分,例如对于二维图像,可以划分为多个大小为 M × M M×M M×M 的子块。
  • 局部注意力计算:在每个窗口内,应用标准的自注意力机制,即计算窗口内部所有位置的注意力权重。
  • 滑动窗口:为避免窗口之间的隔离,可以通过滑动窗口的方法,让不同窗口的边界部分重叠,从而实现跨窗口的信息交流。这一步类似于卷积操作中的滑动窗口机制。
  • 结果合并:最后,将所有窗口计算后的结果合并为完整的输出特征。

滑动窗口注意力的优势在于:

  • 计算效率高:每个窗口的计算限制在局部范围,避免了全局注意力的二次方复杂度。
  • 局部信息捕获:能够充分捕捉局部区域内的重要信息,尤其适合处理图像等局部相关性强的任务。
  • 可扩展性强:可以通过调整窗口大小或滑动步长来适应不同的任务需求。

3. 滑动窗口注意力的数学表示

假设输入的特征图为 X ∈ R H × W × C X∈R^{H×W×C} XRH×W×C,其中 H H H 为高度, W W W 为宽度, C C C 为通道数。

  • 窗口划分: 将输入划分为多个大小为 M × M M×M M×M 的窗口。假设窗口的大小为 M × M M×M M×M,则划分后会得到 H M × W M \frac{H}{M}×\frac{W}{M} MH×MW个窗口,每个窗口的特征为 M × M × C M×M×C M×M×C
  • 局部注意力计算: 对于每个窗口 W i W_i Wi ,计算其内部特征的自注意力。标准的自注意力机制可以表示为:
    -
    其中,Q、K、V 分别是查询、键和值矩阵, d k d_k dk是键向量的维度。
  • 滑动窗口: 在完成局部窗口的自注意力计算后,通过滑动窗口将不同窗口间的信息交互。滑动步长可以为窗口大小的一部分,例如 M / 2 M/2 M/2,从而使得相邻窗口有重叠部分。
  • 合并输出: 将所有窗口的计算结果合并,恢复原始输入的尺寸。

4. 滑动窗口注意力的发展

滑动窗口注意力作为局部注意力机制的一个重要变体,在ViT模型的改进模型中得到了广泛应用。最具代表性的是Swin Transformer,它通过滑动窗口机制和层次化结构,实现了对高分辨率图像的高效处理。Swin Transformer不仅在视觉任务中表现出色,还为后续的图像分割、目标检测等任务提供了有效的解决方案。

5. 代码实现

下面是基于PyTorch的滑动窗口注意力的简单实现代码示例,展示如何在局部窗口内计算注意力并通过滑动窗口机制实现信息交互。

import torch
import torch.nn as nn

class WindowAttention(nn.Module):
    def __init__(self, dim, window_size, num_heads):
        super(WindowAttention, self).__init__()
        self.dim = dim  # 输入特征的维度
        self.window_size = window_size  # 窗口大小
        self.num_heads = num_heads  # 注意力头的数量

        # 定义Query、Key、Value的线性投影层
        self.qkv = nn.Linear(dim, dim * 3, bias=False)
        self.attn_drop = nn.Dropout(0.1)  # 注意力dropout
        self.proj = nn.Linear(dim, dim)  # 输出的线性投影层
        self.proj_drop = nn.Dropout(0.1)  # 输出的dropout

        self.softmax = nn.Softmax(dim=-1)  # softmax函数

    def forward(self, x):
        # 输入x的形状: [batch_size * num_windows, window_size * window_size, dim]
        B_, N, C = x.shape
        
        # 1. 生成Q, K, V矩阵
        qkv = self.qkv(x).reshape(B_, N, 3, self.num_heads, C // self.num_heads)
        q, k, v = qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2]  # 分别获取query, key, value

        # 2. 计算注意力得分
        attn = (q @ k.transpose(-2, -1)) * (1.0 / (C // self.num_heads) ** 0.5)
        attn = self.softmax(attn)  # 通过softmax获得注意力权重
        attn = self.attn_drop(attn)  # 加入dropout防止过拟合

        # 3. 计算加权后的值
        x = (attn @ v).transpose(1, 2).reshape(B_, N, C)

        # 4. 输出投影
        x = self.proj(x)
        x = self.proj_drop(x)

        return x

# 定义滑动窗口Attention机制
class SwinAttention(nn.Module):
    def __init__(self, dim, window_size=7, num_heads=8):
        super(SwinAttention, self).__init__()
        self.window_size = window_size  # 窗口大小
        self.attn = WindowAttention(dim, window_size, num_heads)  # 局部窗口的注意力

    def forward(self, x, H, W):
        B, L, C = x.shape
        assert L == H * W, "输入特征的大小与给定的高度和宽度不匹配"

        # 将输入特征重新reshape为二维图像的形状
        x = x.view(B, H, W, C)

        # 1. 将特征划分为多个窗口
        pad_l = pad_t = 0
        pad_r = (self.window_size - W % self.window_size) % self.window_size
        pad_b = (self.window_size - H % self.window_size) % self.window_size
        x = nn.functional.pad(x, (0, 0, pad_l, pad_r, pad_t, pad_b))
        _, Hp, Wp, _ = x.shape

        # 2. 划分窗口
        x_windows = x.unfold(1, self.window_size, self.window_size).unfold(2, self.window_size, self.window_size)
        x_windows = x_windows.contiguous().view(-1, self.window_size * self.window_size, C)

        # 3. 对每个窗口应用注意力机制
        attn_windows = self.attn(x_windows)

        # 4. 恢复窗口后的特征图
        attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C)
        x = attn_windows.permute(0, 3, 1, 2).contiguous()

        return x.view(B, H, W, C)

# 测试滑动窗口注意力机制
if __name__ == "__main__":
    B, H, W, C = 2, 32, 32, 96  # batch_size, height, width, channels
    x = torch.randn(B, H * W, C)
    swin_attn = SwinAttention(dim=C, window_size=8, num_heads=4)
    output = swin_attn(x, H, W)
    print("输出尺寸:", output.shape)

6. 代码解释

  • WindowAttention: 实现了局部窗口内的注意力机制。定义了 qkv 线性投影层,生成 Query、Key 和 Value矩阵,并通过自注意力计算局部窗口内的特征交互。
  • SwinAttention: 实现了滑动窗口的注意力机制。通过 unfold函数将输入特征划分为多个局部窗口,并在每个窗口内应用注意力机制。最后将所有窗口的计算结果合并。
  • 在测试部分,随机生成了一个大小为 32 × 32 32×32 32×32 的输入特征图,验证了滑动窗口注意力机制的正确性。

7. 总结

滑动窗口注意力有效解决了全局自注意力机制的计算瓶颈问题,特别适用于处理大尺寸图像等高维数据通过局部窗口的划分和滑动窗口操作,它在保证计算效率的同时,也能有效捕捉局部特征信息。在Swin Transformer等视觉模型中,滑动窗口注意力机制表现出了极高的应用价值。

欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz

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

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

相关文章

RK3568平台(PWM篇)红外遥控适配

一.红外遥控简介 红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外 接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送 后置放大器。 鉴于家用电器的品种多样化和用户的使用特点,生产厂家对进行…

【Linux初阶】指令操作

上一篇文章(⭐点这里⭐⭐点这里)我们初步对Linux有了一些基本的认识,了解到了Windows的图形化界面操作和Linux的纯命令指令是操作上二者最大的区别,今天我们来继续深入的学习Linux的操作指令,学习一些基本的指令来控制…

跨平台开发支付组件,实现支付宝支付

效果图: custom-payment : 在生成预付订单之后页面中需要弹出一个弹层,弹层中展示的内容为支付方式(渠道),由用户选择一种支付方式进行支付。 该弹层组件是以扩展组件 uni-popup 为核心的,关于…

MFC图形函数学习04——画矩形函数

MFC中绘制矩形函数是MFC的基本绘图函数,它的大小和位置由左上角和右下角的坐标决定;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。 一、绘制矩形函数 原型:BOOL Rectangle(int x1,int y1,int x2,int y2); …

【网络面试篇】TCP连接建立(笔记)

目录 一、三次握手 1. 过程描述 2. 为什么是三次握手?不是两次、四次? (1)三次握手才可以阻止重复历史连接的初始化 (2)三次握手才可以同步双方的初始序列号 (3)三次握手才可以…

04.DDD与CQRS

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…

树莓派全网最全安装测试(包括系统,显示器,灯,舵机灯测试)

1.下载ubuntu https://cdimage.ubuntu.com/releases/20.04.5/release/ 2.格式化和烧录镜像源 3.修改自己的wifl sd卡直接放回树莓派 4.IP地址 https://www.bilibili.com/video/BV1YD421H7zF/?buvidXU5DB1750D0CD69E8D83AEE359EB6582A7396&is_story_h5false&midMJB9z…

LabVIEW涡扇发动机加力泵测试

LabVIEW软件开发的涡扇发动机加力泵测试平台采用高度集成的硬件设备,实现了对涡扇发动机加力泵的全面测试和分析,从而确保其性能满足严格的航空标准。 项目背景 涡扇发动机是现代飞机的重要动力来源之一,其加力泵的性能直接影响飞机的整体动…

车载中控系统的UI自动化测试实践

本文主要介绍了如何在车载中控系统中实施UI自动化测试的过程,从测试环境的准备到测试用例的设计,再到具体实现方法及注意事项等方面进行了详细的阐述。 引言 随着汽车行业的快速发展,车载中控系统已成为提升驾驶体验的重要组成部分。为了保…

echarts属性之dataZoom

dataZoom-slider 滑动条型数据区域缩放组件(dataZoomInside) 滑动条型数据区域缩放组件提供了数据缩略图显示,缩放,刷选,拖拽,点击快速定位等数据筛选的功能。下图显示了该组件可交互部分 所有属性 data…

牛客小白月赛103(打表、二进制、几何、思维)

文章目录 牛客小白月赛103(打表、二进制、几何、思维)A. 小冰的正多边形B. 冰冰的电子邮箱C. 冰冰的异或(打表、二进制)D. 冰冰的分界线(几何、浮点数处理)E. 冰冰的 GCD(调和级数、思维) 据说F是假题&…

「C/C++」C++17 之 std::variant 安全的联合体(变体)

#1024程序员节|征文# ✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计…

Web3的去中心化社交网络:区块链技术如何改变互动方式

随着互联网技术的不断进步,社交网络正在经历一场深刻的变革。Web3,作为新一代互联网技术的代表,正通过区块链和去中心化理念改变着我们与他人互动的方式。传统的社交网络通常由大型公司控制,用户数据的集中化管理和隐私问题备受关…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上判断两个节点是否在…

HarmonyOS 5.0应用开发——文件读写

【高心星出品】 文章目录 文件读写文件操作创建目录删除目录或者文件扫描目录中文件 文本读写写入文本读取文本内容 文件读写文件写入边读边写 文件读写 Core File Kit(文件基础服务)为开发者提供一套访问和管理应用文件和用户文件的能力。帮助用户更高…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中,已经识别到了camera sensor ID,并且可以拿到raw图和isp处理后的图像,但是isp处理后的图像偏绿,来看查看后台服务发现rkaiq_3A_server没有运行,然后单独运行rkaiq_3A_s…

Linux 宝塔安装(各操作系统命令合集)

由于CentOS官方已全面停止维护CentOS Linux项目,公告指出 CentOS 7和8在2024年6月30日停止技术服务支持,详情见CentOS官方公告。导致CentOS系统源已全面失效,比如安装宝塔等等会出现网络不可达等报错,需要切换源。系统源问题&…

Android 获取OAID

获取OAID 老规矩,直接上: implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid,还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

基于微信小程序的公务员考试信息查询系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field 来访问或设置…