有关swin transformer相对位置编码的理解:

假设window_size是7*7

那么窗口中共有49个patch,共有49*49个相对位置,每个相对位置有两个索引对应x和y两个方向,每个索引值的取值范围是[-6,6]。(第0行相对第6行,x索引相对值为-6;第6行相对第0行,x索引相对值为6;所以索引取值范围是[-6,6])

    # get pair-wise relative position index for each token inside the windowcoords_h = torch.arange(self.window_size[0])coords_w = torch.arange(self.window_size[1])coords = torch.stack(torch.meshgrid([coords_h, coords_w]))  # 2, Wh, Wwcoords_flatten = torch.flatten(coords, 1)  # 2, Wh*Ww# 2, Wh*Ww, Wh*Ww, https://www.cnblogs.com/sgdd123/p/7603004.htmlrelative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :]  # Wh*Ww, Wh*Ww, 2, [i,j,:]表示窗口内第i个patch相对于第j个patch的坐标relative_coords = relative_coords.permute(1, 2, 0).contiguous()

此时,构建出来的relative_coords的shape是[49, 49, 2],[i, j, :]表示窗口内第i个patch相对于第j个patch的坐标。

由于此时索引取值范围中包含负值,可分别在每个方向上加上6,使得索引取值从0开始。此时,索引取值范围为[0,12]

    relative_coords[:, :, 0] += self.window_size[0] - 1  # shift to start from 0relative_coords[:, :, 1] += self.window_size[1] - 1

有了这些相对位置坐标之后,就可以根据这些坐标获取对应的position bias,即论文中公式(4)中的B:
Attention⁡(Q,K,V)=SoftMax⁡(QKT/d+B)V\operatorname{Attention}(Q, K, V)=\operatorname{SoftMax}\left(Q K^{T} / \sqrt{d}+B\right) V Attention(Q,K,V)=SoftMax(QKT/d​+B)V
这个时候可以构建一个shape为[13,13]的table,则当相对位置为(i,j)时,B=table[i, j]。(i,j的取值范围都是[0, 12])

由于论文中使用的是multi-head-self-attention,所以table[i, j]的值应该是一个维度为num_heads的一维向量。

在代码中,实现如下:(注意,此时的table将二维的位置关系,合并为了一维的位置关系)

    # define a parameter table of relative position bias  # shape : 2*Wh-1 * 2*Ww-1, nHself.relative_position_bias_table = nn.Parameter(torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads))

为了与table对应,根据相对位置坐标取值时,也需要将二维相对坐标(i, j)映射为一维相对坐标(i*13+j), 在代码中体现为:

     relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1relative_position_index = relative_coords.sum(-1)  # Wh*Ww, Wh*Ww

最后,就可以根据映射后的坐标来对B进行取值了:

    relative_position_bias = self.relative_position_bias_table[self.relative_position_index.view(-1)].view(self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1)  # Wh*Ww,Wh*Ww,nHrelative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous()  # nH, Wh*Ww, Wh*Ww

附注:

将二维相对坐标(i, j)映射为一维相对坐标时,最简单的映射方式是将i和j相加,但这样无法区分(0, 2)和(2, 0),因为相加的结果都是2;所以作者采用了i*13+j这种方式,其中13 = 2*window_size - 1, 即j取值的个数(0-12,共13个数)。类似于将一个二维数组打平后,每个元素的位置。

有关swin transformer相对位置编码的理解:相关推荐

  1. Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking)

    Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking) 目录 位置编码(Positional encoding) 掩码 (Masking) 参考文献 ...

  2. Swin Transformer原文及其代码的理解

    Swin Transformer原文及其代码的理解 第一版 更好的排版笔记:Notion 名词解释 基础知识: 搞懂Vision Transformer 原理和代码,看这篇技术综述就够了(三) tok ...

  3. 5分钟理解transformer模型位置编码

    Bert模型是自然语言处理方面里程碑式的进步,其核心是transformer层, 而transformer采用自注意力编码器摒弃了循环网络,循环网络天生的顺序信息在自注意力编码器中没有了,而语言往往是 ...

  4. Swin Transformer

    一,原理介绍: Swin Transformer: Hierarchical Vision Transformer using Shifted Windows,绕不开的baseline,多模态 用有新 ...

  5. 【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

    目录 前言 一.注意力机制:Attention 二.自注意力机制:Self-Attention 三.多头注意力机制:Multi-Head Self-Attention 四.位置编码:Positiona ...

  6. 深入理解transformer中的位置编码

    文章目录 总览 问题1 问题2 问题3 问题4 问题5 问题6 总览 我们今天需要讲解transformer中的位置编码,这其实属于进阶内容.既然你会到这里,我默认你已经看过了transformer的 ...

  7. FLOATER:更加灵活的Transformer位置编码!

    NewBeeNLP公众号原创出品 公众号专栏作者 @Maple小七 北京邮电大学·模式识别与智能系统 来自 ICML2020 对Transformer位置编码的探索  论文:Learning to E ...

  8. Transformer架构:位置编码

    2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世.它的可并行化训练能力和优越的性能使其成为自然语言处理领 ...

  9. transformer引入位置信息--Sinusoidal位置编码《个人学习笔记》

    transformer引入位置信息--Sinusoidal位置编码 为什么transformer需要位置编码 Sinusoidal绝对位置编码 首先,所有技术都是个人理解,并感谢技术各位分享,由此根据 ...

最新文章

  1. redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类
  2. 计算机系统组成_网络教育统考计算机应用基础题库(计算机系统的组成2)
  3. 阿里内推算法岗位编程笔试题
  4. 信息系统项目管理师论文历年题目2005-2020
  5. 修改smb默认端口_centos7 ssh端口更改方法
  6. 调用一个Activity并返回结果
  7. apktool+dex2jar+xjad反编译APK文件
  8. IV 估计:工具变量不外生时也可以用!
  9. 漏型与源型、PNP与NPN
  10. 学计算机应用必备的软件,电脑装机六大必备软件神器推荐
  11. php?what=chinese,推荐4-ChineseUtil v1.1.2 发布,PHP 中文工具包
  12. 这才是在线Word转PDF的正确姿势
  13. python可变数据类型和不可变数据类型
  14. epub文件打开乱码_什么是EPUB文件(以及如何打开一个文件)?
  15. SSH日期录入,日期精确不能精准到时分秒处理
  16. JavaEE:网络编程套接字
  17. 如何在Mac版达芬奇中安装使用LUT调色预设?达芬奇lut调色预设安装使用教程
  18. JavaSE基本数据类型
  19. Java库:Jansi - 彩色日志输出体验
  20. 2月18日绿健简报,星期六,农历正月廿八

热门文章

  1. 程序员如何正确的自我提升?
  2. 大话数据结构二十二:图的存储结构之边集数组
  3. IE浏览器版本测试方法
  4. 西门子1200PLC控制加KPT1200触摸屏,污水处理厂自控项目实例
  5. wework oracle,氪空间总裁钟澍:中国联合办公已经不需要再去效仿WeWork
  6. excel表格末尾添加一行_教你使用Python批量读写excel文件
  7. 「UG/NX」BlockUI 枚举Enum
  8. Lync 2010升级到2013之部署企业语音!
  9. ECharts教程(未完)
  10. 微信红包封面小程序源码-逢年过节非常火爆