当前位置:   article > 正文

Transformer位置编码(Position Embedding)理解_transformer的位置编码是绝对还是相对位置编码

transformer的位置编码是绝对还是相对位置编码

本文主要介绍4种位置编码,分别是NLP发源的transformer、ViT、Sw-Transformer、MAE的Position Embedding


一、NLP transformer 

使用的是1d的绝对位置编码,使用sin+cos将每个token编码为一个向量【硬编码】

Attention Is All You Need

在语言中,单词的顺序及其在句子中的位置非常重要。 如果重新排列单词,整个句子的意思可能会发生变化。 因此,位置信息被明确地添加到模型中,以保留有关句子中单词顺序的信息。

 

1、why 位置编码?

位置编码描述了序列中每个单词(token)的位置或位置,以便为每个位置分配一个唯一的表示。 不使用单个数字(例如索引值)来表示位置的原因有很多。 对于长序列,索引的幅度可能会变大, 如果将索引值规范化为介于 0 和 1 之间,则可能会为可变长度序列带来问题,因为它们的规范化方式不同。

Transformers 将每个单词的位置都映射到一个向量。 因此,一个句子的位置编码是一个矩阵,其中矩阵的每一行代表序列中的一个token与其位置信息相加。 下图显示了仅对位置信息进行编码的矩阵示例:

2、位置编码计算公式:

1D absolute sincos constant position embedding 位置编码的计算公式:

  • k:token在输入序列中的位置,0<=k<=L-1
  • d: 位置编码嵌入空间的维度
  • P(k,j): 位置函数,用于映射输入序列中k处的元素到位置矩阵的(k,j)处
  • n:用户定义的标量,由 Attention Is All You Need 的作者设置为 10,000。
  • i: 用于映射到列索引,0<=i<d/2,单个值i映射到正弦和余弦函数【这是因为使用了sin+cos,所以一次可以给张量的两个维度计算position value,所以只需要d/2个i就可以了】

3、位置编码计算示例

让我们以 n=100 和 d=4 的短语“I am a robot”为例。

这样就将每个单词的position映射到一个4维度的张量中了,并且每个单词对应的张量是不同的

一个简单的实现:

  1. import torch
  2. # Section : 1. 1D absolute sincos constant position embedding
  3. def create_1d_absolute_sincos_embedding(n_pos_vec, dim):
  4. # n_pos_vec: torch.arange(n_pos, dtype=torch.float)
  5. # dim: torch.arange(dim)
  6. assert dim % 2 == 0, "dim must be even"
  7. # 常数初始化一下position_embedding
  8. position_embedding = torch.zeros(n_pos_vec.numel(), dim, dtype=torch.float)
  9. # 完成指数部分的初始化
  10. omege = torch.arange(dim // 2, dtype=torch.float)
  11. omege /= dim / 2.
  12. omege = 1./(100 ** omege)
  13. # 扩充列向量和行向量:行数为pos, 列数为dim/2
  14. out = n_pos_vec[:, None] @ omege[None, :]
  15. emb_sin = torch.sin(out)
  16. emb_cos = torch.cos(out)
  17. # 交替填充:偶数列为sin, 奇数列为cos
  18. position_embedding[:, 0::2] = emb_sin
  19. position_embedding[:, 1::2] = emb_cos
  20. return position_embedding
  21. if __name__ == "__main__":
  22. n_pos = 4
  23. dim = 4
  24. n_pos_vec = torch.arange(n_pos, dtype=torch.float)
  25. position_embedding = create_1d_absolute_sincos_embedding(n_pos_vec, dim)
  26. print(position_embedding.shape)
  27. print(position_embedding)

输出: 

二、Vision Transformer

使用的是1d的绝对位置编码,但是这个位置编码是可训练的(可学习的)。【软编码】

其实我感觉这种软编码,相对于硬编码来说不是很好,因为它并没有将位置的归纳偏置给模型,这种方式更像是增加了模型参数量的感觉。

【ICLR 2021】An Image is Worth 16x16 Words + Transformers for Image Recognition at Scale

代码实现:

  1. import torch
  2. import torch.nn as nn
  3. # Section : 2. 1D absolute trainable position embedding
  4. def create_1d_absolute_trainable_embedding(n_pos_vec, dim):
  5. # 创建一个n_pos_vec * dim维度的绝对位置编码的embedding,这个embedding是可以训练的。【与torch.nn.Parameter()用法有一些类似】
  6. position_embedding = nn.Embedding(n_pos_vec.numel(), dim)
  7. # 初始化嵌入层的权重为0
  8. nn.init.constant_(position_embedding.weight, 0)
  9. return position_embedding
  10. if __name__ == "__main__":
  11. n_pos = 3
  12. dim = 4
  13. n_pos_vec = torch.arange(n_pos, dtype=torch.float)
  14. position_embedding = create_1d_absolute_trainable_embedding(n_pos_vec, dim)
  15. print(position_embedding)

三、Swin Transformer

四、Masked AutoEncoder(MAE)

# TODO:待更新...懒得写了,大概你知道PE的意思就行了

transformer计算位置编码的过程示例_哔哩哔哩_bilibili

Transformer位置编码图解 - BimAnt

46、四种Position Embedding的原理与PyTorch手写逐行实现(Transformer/ViT/Swin-T/MAE)_哔哩哔哩_bilibili

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/356903?site
推荐阅读
相关标签
  

闽ICP备14008679号