编码单词位置信息:为词元嵌入添加位置感知能力
#2026/01/01 #ai
目录
1. 问题背景
在大语言模型中,词元嵌入存在一个关键缺陷:自注意力机制无法感知词元在序列中的位置或顺序。这意味着无论词元ID在输入序列的哪个位置,都会被映射到相同的向量表示。

嵌入层始终将相同的词元 ID 转换为相同的向量表示,不受其在输入序列中的位置的影响。例如,无论词元 ID 为 5 的词元出现在输入向量的第一个位置还是第四个位置,它都将被映射为相同的嵌入向量
2. 位置嵌入的必要性流程图
graph TD
A[原始词元嵌入] --> B{存在问题}
B --> |无位置信息| C[相同词元ID在不同位置映射相同]
B --> |需要解决| D[引入位置嵌入]
D --> E[添加位置向量到词元嵌入]
E --> F[增强模型对序列顺序的理解]
3. 位置嵌入的两种策略
3.1 绝对位置嵌入(Absolute Positional Embedding)
import torch
# 创建绝对位置嵌入层
class AbsolutePositionalEmbedding:
def __init__(self, max_length, embedding_dim):
# 创建位置索引
self.position_indices = torch.arange(max_length)
# 创建位置嵌入层
self.pos_embedding_layer = torch.nn.Embedding(max_length, embedding_dim)
def __call__(self, token_embeddings):
# 获取当前输入的序列长度
batch_size, seq_len, embedding_dim = token_embeddings.shape
# 生成位置索引
pos_indices = torch.arange(seq_len, device=token_embeddings.device)
# 获取位置嵌入
pos_embeddings = self.pos_embedding_layer(pos_indices)
# 将词元嵌入和位置嵌入相加
return token_embeddings + pos_embeddings.unsqueeze(0)
# 示例使用
vocab_size = 50257
embedding_dim = 256
max_length = 4
# 创建词元嵌入层
token_embedding_layer = torch.nn.Embedding(vocab_size, embedding_dim)
# 创建位置嵌入层
pos_embedding = AbsolutePositionalEmbedding(max_length, embedding_dim)
# 随机生成词元ID
input_ids = torch.randint(0, vocab_size, (2, 4)) # batch_size=2, seq_len=4
# 转换词元ID为嵌入向量
token_embeddings = token_embedding_layer(input_ids)
# 添加位置嵌入
input_embeddings = pos_embedding(token_embeddings)
print("输入词元ID形状:", input_ids.shape)
print("词元嵌入形状:", token_embeddings.shape)
print("加入位置嵌入后的形状:", input_embeddings.shape)
3.2 相对位置嵌入(Relative Positional Embedding)
相对位置嵌入关注词元之间的相对距离,而非绝对位置。这种方法使模型能够更好地适应不同长度的序列。
4. 关键特点解析
位置嵌入向量的维度与词元嵌入向量相同- 可学习的位置嵌入(如GPT模型)
- 在训练过程中优化位置嵌入权重

在输入处理流水线中,输入文本首先被分割为独立的词元。随后,这些词元通过词汇表转换为词元 ID。这些词元 ID 继而被转换为嵌入向量,并添加与之大小相同的位置嵌入,最终形成用于大语言模型核心层的输入嵌入
5. 代码实践建议
- 绝对位置嵌入适合固定长度的序列
- 相对位置嵌入更灵活,适合可变长度序列
- 位置嵌入维度通常与词元嵌入维度相同
6. 示例输出解释
输入词元ID形状: torch.Size([2, 4])
词元嵌入形状: torch.Size([2, 4, 256])
加入位置嵌入后的形状: torch.Size([2, 4, 256])
上述输出显示:
- 批次大小为2
- 序列长度为4
- 嵌入维度为256
- 位置嵌入成功添加到词元嵌入中
7. 重点提示
- 位置嵌入是大语言模型理解序列顺序的关键机制
- 选择合适的位置嵌入策略取决于具体应用场景
- 位置嵌入可以是固定的,也可以是可学习的
结语
通过添加位置嵌入,大语言模型可以更好地理解词元的上下文和序列信息,从而提高模型的语言理解和生成能力。