Transformer位置编码(Position Embedding)理解
创作时间:
作者:
@小白创作中心
Transformer位置编码(Position Embedding)理解
引用
CSDN
1.
https://blog.csdn.net/weixin_43135178/article/details/136853202
位置编码是Transformer模型中的关键组件,用于为序列中的每个元素添加位置信息。本文详细介绍了四种主要的位置编码方式,包括NLP领域的Transformer、Vision Transformer、Swin Transformer和Masked AutoEncoder中的实现方法。通过理论讲解和代码示例,帮助读者深入理解位置编码的原理和应用。
一、NLP Transformer
在NLP领域中,Transformer使用的是1D的绝对位置编码,通过sin+cos函数将每个token编码为一个向量。这种编码方式被称为"硬编码"。
1. 为什么需要位置编码?
位置编码的主要目的是为序列中的每个单词(token)分配一个唯一的表示。使用单个数字(例如索引值)来表示位置存在以下问题:
- 对于长序列,索引的幅度可能会变大
- 如果将索引值规范化为介于0和1之间,可能会为可变长度序列带来问题
因此,Transformer将每个单词的位置映射到一个向量。一个句子的位置编码矩阵中,每一行代表序列中的一个token与其位置信息的组合。
2. 位置编码计算公式
1D绝对sin-cos常量位置编码的计算公式如下:
- 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
3. 位置编码计算示例
以n=100和d=4为例,对短语"I am a robot"进行位置编码:
import torch
def create_1d_absolute_sincos_embedding(n_pos_vec, dim):
assert dim % 2 == 0, "dim must be even"
position_embedding = torch.zeros(n_pos_vec.numel(), dim, dtype=torch.float)
omege = torch.arange(dim // 2, dtype=torch.float)
omege /= dim / 2.
omege = 1./(100 ** omege)
out = n_pos_vec[:, None] @ omege[None, :]
emb_sin = torch.sin(out)
emb_cos = torch.cos(out)
position_embedding[:, 0::2] = emb_sin
position_embedding[:, 1::2] = emb_cos
return position_embedding
if __name__ == "__main__":
n_pos = 4
dim = 4
n_pos_vec = torch.arange(n_pos, dtype=torch.float)
position_embedding = create_1d_absolute_sincos_embedding(n_pos_vec, dim)
print(position_embedding.shape)
print(position_embedding)
输出结果为:
torch.Size([4, 4])
tensor([[0.0000, 1.0000, 0.0000, 1.0000],
[0.0156, 0.9999, 0.0313, 0.9995],
[0.0313, 0.9995, 0.0625, 0.9976],
[0.0469, 0.9980, 0.0938, 0.9922]])
这表明每个单词都被映射到了一个4维的张量中,且每个单词对应的张量都是不同的。
二、Vision Transformer
Vision Transformer使用的是1D的绝对位置编码,但与NLP中的Transformer不同,这种位置编码是可训练的(软编码)。虽然这种方式增加了模型的参数量,但可以更好地适应图像数据的特性。
代码实现
import torch
import torch.nn as nn
def create_1d_absolute_trainable_embedding(n_pos_vec, dim):
position_embedding = nn.Embedding(n_pos_vec.numel(), dim)
nn.init.constant_(position_embedding.weight, 0)
return position_embedding
if __name__ == "__main__":
n_pos = 3
dim = 4
n_pos_vec = torch.arange(n_pos, dtype=torch.float)
position_embedding = create_1d_absolute_trainable_embedding(n_pos_vec, dim)
print(position_embedding)
三、Swin Transformer
Swin Transformer使用的是相对位置编码,通过相对位置偏移量来计算位置信息。这种方式可以更好地处理局部和全局信息的交互。
四、Masked AutoEncoder(MAE)
MAE使用的是基于网格的绝对位置编码,通过将图像划分为固定大小的patch,并为每个patch分配一个位置编码。这种方式可以有效地处理大规模图像数据。
参考资料
热门推荐
云想衣裳花想容,春风拂槛露华浓:《清平调词三首》赏析
云想衣裳花想容:揭秘李白笔下的传世佳句为谁而写
打卡中国唐城:穿越千年,感受盛唐繁华
探访襄阳古城墙:千年风华尽收眼底
太平天国杨秀清逼宫洪秀全:一场触目惊心的权力斗争
去瑞士需要带哪些东西
订婚了却放不下前任?专家支招解心结
陈皮普洱茶的健康益处及适宜饮用人群
两代人抹不掉的记忆——随身听的历史(上)
太平天国运动的失败:内忧外患的共同作用
旧影|老牌匾上的云冈石窟和光阴故事
五子棋的秘诀,五子棋高手秘诀大揭秘
飞天茅台的鉴别方法及茅台酿造所用大曲揭秘
分手话术大揭秘:如何优雅说再见?
《XX》分手戏爆火,教你如何优雅挽回
高情商分手话术:让彼此都体面
亚国宁祛湿贴:真的能祛湿吗?
同时期日本人对太平天国的评价
太平天国天京事变:从有预谋的内部清洗到失控的暴力屠杀
佳佳教你如何引导孩子表达生气情绪
弗吉尼亚理工专家解析:孩子生气背后的五大原因及应对策略
凯迪克大奖推荐:《菲菲生气了》,教孩子管理愤怒
《疯狂的麦咭》与《23号牛乃唐》,谁更懂孩子心?
超绝水下迎财神!广州位居春节旅游热度最高城市第二
洛阳春节出行指南来了,请查收!
轻松连接蓝牙收音机,享受高品质音频体验的全攻略
头孢配酒?你敢试试?
别再乱吃阿莫西林了!增强免疫力有妙招
《我也曾醉过》:一首唱出爱情真谛的经典之作
太平天国诸王后人今何在:陈玉成后人是马来西亚第一位华人少将