Transformer正余弦位置编码理解

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

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

Transformer正余弦位置编码理解

创建mask

这里的mask是DETR的骨干网络在对图像进行特征提取时为将所有图片统一到相同大小而采取填充方式生成的,主要是为了区别那块是填充的信息,这些信息在我们后面的注意力计算过程与位置编码过程中是不考虑的。
假设mask为4X4大小,输入图像大小为3X3。

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])#输入图像只是提供一个大小而已
a = torch.tensor(a)

下图为mask生成的4X4维度的矩阵,根据对应与输入图像大小3X3生成以下的mask编码tensor,下右图为反mask编码tensor,这一步就得到了图像的大小及对应与mask下的位置。

mask = [[False, False, False, True], [False, False, False, True], [False, False, False, True], [True, True, True, True]]
mask = torch.tensor(mask)
not_mask = ~mask

Transformer正余弦位置编码理解

生成Y_embed和X_embed的tensor

y_embed = not_mask.cumsum(0, dtype=torch.float32)
x_embed = not_mask.cumsum(1, dtype=torch.float32)

DETR中运用两行编码实现Y_embed和X_embed,生成大小为(bitch_size , h , w)的tensor。这里认为batch-size=1即可。
根据反mask编码,生成的Y_embed和X_embed如下。
Y_embed对为mask编码True的进行行方向累加1,X_embed对为mask编码True的进行列方向累加1。下图所示:
Transformer正余弦位置编码理解

运用10维(这个可以自行变化,代表的是你的要进行位置编码的维度)position进行编码,detr中设置为256。

num_pos_feats = 10
temperature = 10000
dim_t = torch.arange(num_pos_feats, dtype=torch.float32,device=a.device)#生成10维数,代表2i。
dim_t = temperature ** (2 * (dim_t // 2) / num_pos_feats) #i=dim_t // 2#对10维数进行计算

转换后的为:

Transformer正余弦位置编码理解

生成pos_x以及pos_y

pos_x = x_embed[:, :, None] / dim_t
pos_y = y_embed[:, :, None] / dim_t
pos_x = torch.stack((pos_x[:, :, 0::2].sin(), pos_x[:, :, 1::2].cos()), dim=3).flatten(2)#不降维
pos_y = torch.stack((pos_y[:, :, 0::2].sin(), pos_y[:, :, 1::2].cos()), dim=3).flatten(2)#不降维

Transformer正余弦位置编码理解

Transformer正余弦位置编码理解
完成后直观效果如上图所示,可以对照第二步的X_embed和Y_embed,会发现pos_x,y的tensor分母和X,Y_embed对应 ,很好理解,其中i对应的是10维position的不同维度的数,d代表的是position编码维度。

组合Pos_x和Pos_y

因为上述位置编码的生成是行列方向分开的,这一步需要进行组合。

pos = torch.cat((pos_y, pos_x), dim=2)

Transformer正余弦位置编码理解
组合以后直观图的样子如上,这时会发现16个位置的分母已经根据pos的不同,达到了位置编码的不同,因为本文采用的是10维的position,分子i的范围为0-10,每个位置就形成了1X20的tensor数据。

Transformer正余弦位置编码理解
上述两个位置的编码就可以理解为1X20的tensor数据,因为比较长,分开写了,不是4X5的,而是1X20的tensor数据,通过上图可以很直观的理解position encoding。
Transformer正余弦位置编码理解
完整代码如下:文章来源地址https://www.toymoban.com/news/detail-467315.html

import torch
import numpy as np
import math

# 正余弦位置编码
num_pos_feats = 10
temperature = 10000
normalize = False
scale = 2 * math.pi#圆周率

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a = torch.tensor(a)
mask = [[False, False, False, True], [False, False, False, True], [False, False, False, True], [True, True, True, True]]
mask = torch.tensor(mask)
print(mask)
assert mask is not None
not_mask = ~mask
print(not_mask)
y_embed = not_mask.cumsum(0, dtype=torch.float32)
x_embed = not_mask.cumsum(1, dtype=torch.float32)
print(y_embed)
print(x_embed)

if normalize:
    eps = 1e-6
    # b = a[i:j:s]表示:i,j与上面的一样,但s表示步进,缺省为1.
    # 所以a[i:j:1]相当于a[i:j]
    # 当s<0时,i缺省时,默认为-1. j缺省时,默认为-len(a)-1
    # 所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序。
    # 对于X[:,:,m:n]是取三维矩阵中第m维到第n-1维的所有数据
    # 归一化
    y_embed = y_embed / (y_embed[-1:, :] + eps) * scale  # y_embed[:, -1:, :]代表取三维数据中的最后一行数据
    x_embed = x_embed / (x_embed[:, -1:] + eps) * scale  # x_embed[:, :, -1:]代表取三维数据中的最后一列数据
    print(y_embed)
    print(x_embed)
dim_t1 = torch.arange(num_pos_feats, dtype=torch.float32, device=a.device)
print(dim_t1)
dim_t = temperature ** (2 * (dim_t1 // 2) / num_pos_feats)  # i=dim_t1 // 2
print(dim_t)
pos_x = x_embed[:, :, None] / dim_t
pos_y = y_embed[:, :, None] / dim_t
print(pos_x)
print(pos_y)
pos_x = torch.stack((pos_x[:, :, 0::2].sin(), pos_x[:, :, 1::2].cos()), dim=3).flatten(2)  # 不降维
pos_y = torch.stack((pos_y[:, :, 0::2].sin(), pos_y[:, :, 1::2].cos()), dim=3).flatten(2)  # 不降维
print(pos_x)
print(pos_y)
pos = torch.cat((pos_y, pos_x), dim=2)
print(pos)

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

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

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

相关文章

  • 深入理解深度学习——注意力机制(Attention Mechanism):位置编码(Positional Encoding)

    分类目录:《深入理解深度学习》总目录 相关文章: ·注意力机制(AttentionMechanism):基础知识 ·注意力机制(AttentionMechanism):注意力汇聚与Nadaraya-Watson核回归 ·注意力机制(AttentionMechanism):注意力评分函数(AttentionScoringFunction) ·注意力机制(AttentionMechanism):Bahda

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

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

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

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

    2024年01月16日
    浏览(33)
  • Swin Transformer之相对位置编码详解

    目录 一、概要 二、具体解析 1. 相对位置索引计算第一步  2. 相对位置索引计算第二步 3. 相对位置索引计算第三步      在 Swin Transformer 采用了 相对位置编码 的概念。       那么相对位置编码的作用是什么呢?           解释: 在解释相对位置编码之前,我们需要先了解

    2023年04月16日
    浏览(37)
  • 相对位置编码(二) Relative Positional Encodings - Transformer-XL

    在Transformer-XL中,由于设计了segments,如果仍采用transformer模型中的绝对位置编码的话,将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于segmenti��������的第k个token,和segmentj��������的第k个token的绝对位置编码是完全相同的。 鉴于这样的

    2024年02月12日
    浏览(37)
  • Transformer | DETR目标检测中的位置编码position_encoding代码详解

    本文主要描述的是DETR论文中的position_encoding,详细DETR论文解析可参考  论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)_夏天|여름이다的博客-CSDN博客_dert目标检测 Transformer不像RNN可以根据位置顺序接受和处理单词,所以为了得到词的

    2023年04月08日
    浏览(45)
  • 【人工智能】Transformer 模型数学公式:自注意力机制、多头自注意力、QKV 矩阵计算实例、位置编码、编码器和解码器、常见的激活函数等

    Transformer模型由多个编码器和解码器层组成,其中包含自注意力机制、线性层和层归一化等关键构造模块。虽然无法将整个模型完美地表示为单个数学公式,但我们可以提供一些重要构造模块的数学表示。以下是使用LaTeX格式渲染的部分Transformer关键组件的数学公式: 自注意力

    2024年02月14日
    浏览(53)
  • 机器学习&&深度学习——BERT(来自transformer的双向编码器表示)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——transformer(机器翻译的再实现) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 我们首先理解一下相关的一些概念,首先我们知道在自然语言系统中,词是意义的基

    2024年02月12日
    浏览(44)
  • 机器学习&&深度学习——自注意力和位置编码(数学推导+代码实现)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——注意力分数(详细数学推导+代码实现) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 在深度学习中,经常使用CNN和RNN对序列进行编码。有了自注意力之后,我们

    2024年02月12日
    浏览(70)
  • 深度学习——Transformer的理解整理

    transformer刚被提出的时候就是被用于处理机器翻译的。在transformer架构中的不同位置Q,K,V指代的变量是不一样的。 假设现在处理的是英文-德文的翻译任务。 在encoder的输入端,这里执行的是 self-attention , Q、K、V 都是指代英 文的embedding 。 在decoder的输入端,这里执行的是

    2024年04月28日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包