Swin Transformer之相对位置编码详解

这篇具有很好参考价值的文章主要介绍了Swin Transformer之相对位置编码详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、概要

二、具体解析

1. 相对位置索引计算第一步

 2. 相对位置索引计算第二步

3. 相对位置索引计算第三步


一、概要

     在Swin Transformer采用了相对位置编码的概念。

Swin Transformer之相对位置编码详解

     那么相对位置编码的作用是什么呢?   

     解释:在解释相对位置编码之前,我们需要先了解一下在NLP中Position Encoder即PE,NLP中Position_Encoder理解

           在Swin Transformer中,将特征图 如按7*7 的窗口大小划分为多个小窗格,单独在每个小窗格内进行Attention计算。这样一来,窗口内就相当于有        49个Token即49个像素值,这些像素是有一定的位置关系的,故在Attention计算时,需要考虑这些像素的位置关系,故提出了相对位置编码,其与NLP        中的PE是有异曲同工之妙的。

            而不同的是NLP中是在QK.T之前加入了Position信息,而Swin Transformer是在QK.T之后加入的相对位置信息,但是在效果上都是一样的。

    维度解析:

          如果特征图的大小为2*2*N(N表示每个像素点的channels),那么经过拉直之后Q、K、V的维度都为4*N,那么QK.T 的维度就是4*4,其中第一个4表示4个像素点第二个4表示对于每个像素点,相对包括自己在内的四个像素点的重要程度;而相对位置编码要得到的结果也需要是4*4,其每行表示四个像素相对于某个固定像素的位置编码值

Swin Transformer之相对位置编码详解

那么我们求出的相对位置编码就是对应的编码值吗?

        答案是否定的,求出的相对位置编码只是对应的位置索引,其索引值取值范围为 0 ~ K,而这个索引其实对应的是一个长度为K的可学习向量

        这个可学习向量会在训练过程中逐步更新,而相对位置索引,就是提供索引值,从这个可学习向量中得到最终的位置编码值。如下图所示:

Swin Transformer之相对位置编码详解

    而接下来我们要做的就是,用尽可能形象的方式,解释明白这个相对位置索引矩阵是怎么获取的,计算公式为:

    其中的B就是根据相对位置索引矩阵(上图右侧)中的每个像素位置的索引,从可学习向量中获取的值,并组成的编码矩阵(上图左侧)

Swin Transformer之相对位置编码详解

二、具体解析

    假设输入的feature map高宽都为2,那么首先我们可以构建出每个像素的绝对位置(左下方的矩阵),对于每个像素的绝对位置是使用行号y和列号x表示的。

Swin Transformer之相对位置编码详解

1. 相对位置索引计算第一步

    比如蓝色的像素对应的是第0行第0列所以绝对位置索引是( 0 , 0 ),蓝色像素使用q与所有像素k进行匹配过程中,是以蓝色像素为参考点而相对位置偏置Bias就是相对每个像素情况下,不同QK的偏移值

    那么其他像素相对于该蓝色像素的相对位置是多少呢?

    用蓝色像素的绝对位置索引与其他位置索引进行相减,就得到其他位置相对蓝色像素的相对位置索引,如下图所示

    黄色(0,1)位置:(0,0) - (0,1) = (0,-1) 

    红色(1,0)位置:(0,0) - (1,0) = (-1,0)

    绿色(1,1)位置:(0,0) - (1,1) = (-1,-1) 

    蓝色(0,0)位置相对于自己那就是(0,0)-(0,0)= (0,0)

    如下图所示,每个位置都是相对于蓝色(0,0)位置的相对值,其实就是差值。

Swin Transformer之相对位置编码详解

     将其拉直后就为:

Swin Transformer之相对位置编码详解

    同理,当其他位置作为相对位置时,计算方式是一样的,都是让当前元素与其他四个位置的坐标位置相减。结果分别为:

Swin Transformer之相对位置编码详解

   将它们拉直后,分别为:

Swin Transformer之相对位置编码详解

 那么将上面拉直后的结果,放在一起的话,如下图所示:

Swin Transformer之相对位置编码详解

    那么用代码是怎么计算的呢,是每个位置单独计算后,再拼接在一起的吗?

    答案是否定的,往往在矩阵相关的计算中,都会以矩阵的方式进行统一计算。代码如下:

    先整体来看,后面回分步解析。

# 获取特征图所有像素点的位置坐标
coords_h = torch.arange(2)
coords_w = torch.arange(2)
coords = torch.meshgrid([coords_h, coords_w])
# 横纵坐标合并后并拉直
coords = torch.stack(coords) 
coords_flatten = torch.flatten(coords, 1)
# 计算坐标的相对位置差值
relative_coords_first = coords_flatten[:, :, None]
relative_coords_second = coords_flatten[:, None, :]
relative_coords = relative_coords_first - relative_coords_second
relative_coords = relative_coords.permute(1, 2, 0).contiguous() 

 分步解析:

(1)获取所有像素点的横坐标与纵坐标

   a. 获取纵坐标的取值范围

coords_h = torch.arange(2)
coords_w = torch.arange(2)
'''
coords_h:
	[0,1]
coords_w:
	[0,1]
'''

b.获取所有位置的纵坐标与横坐标

coords = torch.meshgrid([coords_h, coords_w])
'''
coords[0]:
[[0,0]
 [1,1]]
shape与特征图大小相同2x2,每个位置的值表示该像素点
的纵坐标,第一行纵坐标均为0,第二行纵坐标均为1

coords[0]:
[[0,1
 [0,1]]
shape与特征图大小相同2x2,每个位置的值表示该像素点
的横坐标,第一列横坐标均为0,第二列横坐标均为1
'''

c. 上面的coords是一个列表,里面包括两个矩阵,即横坐标矩阵与纵坐标矩阵

    将横坐标矩阵与纵坐标矩阵拼接起来,torch.stack,增加一个dim=0维度并拼接

coords = torch.stack(coords) 
'''
coords:
shape:(2,2,2),第一个2表示横纵两种坐标,后面的2表示两行两列
'''
coords_flatten = torch.flatten(coords, 1)
'''
	横坐标与纵坐标分别拉直
    torch.flatten(coords,1)表示从第1个维度起拉直,
    shape(2,2,2) -> (2,4)
'''

Swin Transformer之相对位置编码详解

 d. 一共四个像素点,让每个像素点都其他包括自己在内的四个像素点横纵坐标求差值

    所以就需要以行为单位(纵坐标与横坐标)每行各赋值4次,相当于每个像素的横纵坐标都复制4次,用于与四个像素点进行计算。

relative_coords_first = coords_flatten[:, :, None] 
'''
	增加一个维度,用于在以列为单位复制4次
    shape(2,4,1)
'''

     横坐标与纵坐标都分别复制了4份。

    复制后的,每行表示每个像素的横或纵坐标复制了4次。

Swin Transformer之相对位置编码详解

relative_coords_first = coords_flatten[:, None, :] 
'''
	增加一个维度,用于在以行为单位复制4次
    shape:(2,1,4)
'''

    所有坐标都分别复制4次。

    复制后,每行表示所有像素的横或纵坐标。

Swin Transformer之相对位置编码详解

relative_coords_first = coords_flatten[:, :, None]
relative_coords_second = coords_flatten[:, None, :]
relative_coords = relative_coords_first - relative_coords_second
relative_coords = relative_coords.permute(1, 2, 0).contiguous() 
'''
	上面的相减采用了广播机制,其广播的流程与上述的复制过程是一致的
'''

    上面这种做法是为了什么?

    是为了两个矩阵相减,得到的结果就相当于,四个像素点依次作为主像素点时,其他四个像素相对于该主像素点的相对位置。如下图所示:

Swin Transformer之相对位置编码详解

 2. 相对位置索引计算第二步

     注意!!! 这里描述的一直是相对位置索引,并不是相对位置偏执参数。后面我们会根据相对位置索引去取对应的参数。

    上面已经计算出来相对某一个像素,其他像素点与其的坐标差值,如下:

Swin Transformer之相对位置编码详解

    但是上面的结果是二维的,而最终获取的位置参数表对于每个Head来说是一维的,故需要将上面的这个结果转换为一维的形式。由于索引值的范围为[-M+1,M-1],原始的相对位置索引加上M-1,使得索引值大于等于0,变为[0,2M-2]。

    为什么要将索引值变为大于等于0呢?    

    这个问题其实很简单,因为我们在最后从参数表中获取最终值的方式,是通过索引,而索引值是不小于0的。

Swin Transformer之相对位置编码详解

 代码如下:

relative_coords[:, :, 0] += 2 - 1
relative_coords[:, :, 1] += 2 - 1
relative_coords[:, :, 1] += 2 - 1

3. 相对位置索引计算第三步

     对与每行,即不同像素间,希望得到的索引位置是不同的,但是如果直接横纵坐标相加的话,往往会出现像素不同,索引相同的情况,如下所示:

Swin Transformer之相对位置编码详解

         所以最后将所有横坐标都乘上2M-1,最后再将横坐标和纵坐标求和,这样每行不同像素间得到的索引就具有独一性。

Swin Transformer之相对位置编码详解

relative_coords[:, :, 0] *= 2 * 2 - 1

最后将行标和列标进行相加,得到独一的一维的索引,这样即保证了相对位置关系,而且不会出现上述0 +1 = 1  + 0 的问题了,是不是很神奇。

Swin Transformer之相对位置编码详解

relative_position_index = relative_coords.sum(-1)

    至此就计算出了相对位置的索引,其并不是公式中的位置偏置参数。

    真正使用到的可训练参数使保存在相对位置偏置表 relative position bias table中的,这个表的size为9,因为上面矩阵中索引值为0到8 是9个数。

    即N = (2M-1)* (2M-1) = (4-1) * (4-1) =9.其是可训练的,随着训练过程,其内部的数值是不断优化更新的。

self.relative_position_bias_table = nn.Parameter(
            	torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)) 

如relative position bias table如下所示:

Swin Transformer之相对位置编码详解

 所以可以,操作相对位置索引的数值,依次从table中获取对应的参数

Swin Transformer之相对位置编码详解

 至此,最终的相对位置编码才计算完毕。总体流程如下图所示:

Swin Transformer之相对位置编码详解文章来源地址https://www.toymoban.com/news/detail-415682.html

到了这里,关于Swin Transformer之相对位置编码详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • transformer概述和swin-transformer详解

    目录 1.transformer架构 1.1输入部分实现 1.2编码器部分实现 1.2.1掩码张量 1.2.2注意力机制 1.2.3多头注意力机制 1.2.4前馈全连接层 1.2.5规范化层 1.2.6子层连接层 1.2.7编码器层 1.2.8编码器 1.3解码器部分实现 1.3.1解码器层 1.3.2解码器 1.4输出部分实现 2.swin-transformer transformer的整体网络架

    2024年02月03日
    浏览(35)
  • Swin-Transformer 详解

    由于Transformer的大火,相对应的也出来了许多文章,但是这些文章的速度和精度相较于CNN还是差点意思,2021年微软研究院发表在ICCV上的一篇文章Swin Transformer是Transformer模型在视觉领域的又一次碰撞,Swin Transformer可能是CNN的完美替代方案。 论文名称:Swin Transformer: Hierarchical

    2024年02月04日
    浏览(37)
  • Swin-transformer详解

    这篇论文提出了一个新的 Vision Transformer 叫做 Swin Transformer,它可以被用来作为一个计算机视觉领域一个通用的骨干网络.但是直接把Transformer从 NLP 用到 Vision 是有一些挑战的,这个挑战主要来自于两个方面 一个就是尺度上的问题。因为比如说现在有一张街景的图片,里面有很

    2024年02月05日
    浏览(40)
  • Swin-Transformer(原理 + 代码)详解

    图解Swin Transformer Swin-Transformer网络结构详解 【机器学习】详解 Swin Transformer (SwinT) 论文下载 官方源码下载 学习的话,请下载 Image Classification 的代码,配置相对简单,其他的配置会很麻烦。如下图所示: Install : pytorch安装:感觉pytorch 1.4版本都没问题的。 2、pip install timm==

    2023年04月08日
    浏览(47)
  • Swin-Transformer网络结构详解

    Swin Transformer是2021年微软研究院发表在ICCV上的一篇文章,并且已经获得 ICCV 2021 best paper 的荣誉称号。Swin Transformer网络是Transformer模型在视觉领域的又一次碰撞。该论文一经发表就已在多项视觉任务中霸榜。该论文是在2021年3月发表的,现在是2021年11月了,根据官方提供的信息

    2024年02月04日
    浏览(39)
  • Transformer架构:位置编码

    2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世。它的可并行化训练能力和优越的性能使其成为自然语言处理领域(Natural Language Processing,NLP)以及计算机视觉领域(Computer Vision,CV)研究人员的热门选择。

    2023年04月27日
    浏览(40)
  • Transformer 位置编码

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 Attention Is All You Need 是 Google 于 2017 年发表的

    2024年01月16日
    浏览(34)
  • Transformer正余弦位置编码理解

    在学习Transformer模型过程中不可避免的一个过程便是要对序列进行位置编码,在Transformer中分为固定位置编码与可学习的位置编码,其一般采用固定位置编码中的正余弦位置编码方式。 今天便以DETR模型为例,介绍正余弦编码的原理与实现过程。 首先给出其公式: 其中i指的是

    2024年02月07日
    浏览(44)
  • 相对位置编码之RPR式:《Self-Attention with Relative Position Representations》论文笔记

    😄 额,本想学学XLNet的,然后XLNet又是以transformer-XL为主要结构,然后transformer-XL做了两个改进:一个是结构上做了segment-level的循环机制,一个是在attention机制里引入了相对位置编码信息来避免不同segment的同一位置采用相同的绝对位置编码的不合理。但无奈看到相对位置编码

    2024年02月17日
    浏览(41)
  • transformer学习笔记:Positional Encoding(位置编码)

    对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。举个例子来说: I  do not  like the story of the movie, but I 

    2023年04月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包