Transformer 架构自 2017 年诞生以来,彻底改变了自然语言处理(NLP)领域。它强大的自注意力机制 (Self-Attention)允许模型捕捉句子中的长距离依赖关系。然而,自注意力机制本身是与词序无关的,这意味着如果打乱一个句子的词序,自注意力层的输出可能保持不变。
为了解决这个问题,我们需要引入一种机制,让模型知道每个词在序列中的位置 。这就是 位置信息(Positional Information) 的作用。在不同的 Transformer 变体中,实现这一目标主要有两种方式:位置编码 (Positional Encoding) 和 位置嵌入 (Positional Embedding)。
虽然它们的目的相同,但其实现方式和性质却有本质区别。
🔑 核心差异:计算 vs. 学习
理解两者区别的关键在于:这些位置向量是预先计算好的 ,还是在训练中学习到的?
| 特性 | 位置编码 (Position Encoding) | 位置嵌入 (Position Embedding) |
|---|---|---|
| 获取方式 | 通过固定的、预定义的函数(如正弦和余弦函数)直接计算。 | 作为模型参数,在训练过程中学习和优化得到。 |
| 可学习性 | 不可学习(Non-learnable / Fixed)。 | 可学习(Learnable)。 |
| 典型应用 | 原始的 Transformer 模型(《Attention Is All You Need》)。 | BERT、GPT-2/3、T5 等(或后续许多使用可学习位置向量的模型)。 |
1. 详细解析:位置编码 (Positional Encoding)
🌊 什么是位置编码?
位置编码 是原始 Transformer 论文《Attention Is All You Need》中采用的方法。它不引入任何新的可训练参数,而是使用一种基于正弦和余弦函数的数学公式来生成与序列中每个位置相对应的向量。
📌 关键特点:
- 固定性与泛化性: 由于是基于函数计算,它具有天然的外推能力。即使模型在训练时只见过长度为 512 的序列,如果推理时遇到长度为 1000 的序列,它仍然可以通过公式计算出 等位置的编码。
- 相对位置信息: 正余弦函数的性质使得任意两个位置 和 之间的位置编码可以通过线性变换表示,这能帮助模型捕捉相对位置关系。
数学表达如下(其中 是位置, 是词嵌入的维度, 是维度的索引):
2. 详细解析:位置嵌入 (Positional Embedding)
📚 什么是位置嵌入?
位置嵌入 是将位置信息本身视为一个可训练的参数矩阵,类似于词嵌入(Word Embedding)矩阵。模型在训练过程中,会为每一个可能的序列位置学习一个唯一的向量表示。
📌 关键特点:
- 灵活性: 模型可以学习到最适合特定任务和数据集的位置表示,理论上比固定的函数编码更强大。
- 长度限制: 这种方法要求在训练之前确定一个最大序列长度 (例如 BERT 为 512)。位置嵌入矩阵的大小是固定的(
最大长度维度)。如果输入的序列超过了这个最大长度,模型将无法提供有效的位置信息。 - 广泛应用: 许多现代预训练模型(如 BERT)都采用了这种可学习的位置嵌入。
🤝 它们如何结合使用?
无论是采用位置编码 还是位置嵌入 ,它们最终都是通过向量相加的方式,将位置信息注入到词嵌入向量中。
最终进入 Transformer 层的输入嵌入 可以概括为:
其中 要么是固定的位置编码 向量,要么是学习得到的位置嵌入向量。
结论
在设计 Transformer 模型时,选择 Position Encoding 还是 Position Embedding 是一个重要的设计决策:
- 如果注重简单、无需训练 ,以及对超长序列的泛化能力 ,可以选择位置编码(固定函数)。
- 如果认为模型应该通过数据学习最有效的位置表示 ,且对序列长度有明确限制,则选择位置嵌入(可学习参数)。
随着 Transformer 架构的演进,也出现了更多高级的位置表示方法,例如相对位置编码 (Relative Position Encoding)、旋转位置嵌入 (RoPE) 等,它们进一步提升了模型处理序列关系的能力。