为什么Transformer必须引入位置编码(Positional Encoding)?
Transformer 必须引入位置编码(Positional Encoding)的核心原因可以用一句话来概括:Transformer 的核心组件“自注意力机制(Self-Attention)”本身是“排列不变的(Permutation Invariant)”,它无法识别输入序列中单词的顺序。
如果没有位置编码,Transformer 只能把一句话看作是一个“词袋(Bag of Words)”,而不是一个有顺序的句子。
以下是详细的原因拆解:
1. 自注意力机制的数学本质:丢失了顺序信息
在自注意力机制中,输入矩阵会分别乘上权重矩阵得到 (Query)、(Key)、(Value)。计算公式为:
在这个纯矩阵乘法和加权求和的过程中,没有任何操作是依赖于输入词的位置的。
如果你把输入序列打乱(例如把第1个词和第5个词交换),自注意力机制计算出的这两个词的注意力权重和输出表示完全不会发生改变(只是输出矩阵中的两行跟着交换了位置)。它只关注“词与词之间的相关性”,而不关心“谁在谁前面”。
2. 语言的语义高度依赖语序
在自然语言中,词汇的顺序直接决定了句子的含义。
- 例子 1:“狗咬人” vs “人咬狗”。这两个句子的词汇完全一样,但主谓宾的位置变了,意思截然相反。
- 例子 2:“我不认为他是个好人” vs “他认为我不是个好人”。
如果 Transformer 没有位置编码,它处理这两个句子时,提取到的特征会是完全一样的,这在自然语言理解中是灾难性的。
3. 架构对比:为什么 RNN 和 CNN 不需要专门的位置编码?
- RNN / LSTM / GRU:它们是串行处理的。处理完第 1 个词,其隐状态(Hidden State)才会传递给第 2 个词。时间步(Time Step)本身就天然蕴含了绝对位置和相对位置信息。
- CNN(用于文本时):卷积核在文本上滑动,每次覆盖一个局部窗口(如连续的3个词)。这种滑动窗口机制天然捕捉了局部相邻词的顺序信息。
- Transformer:为了解决 RNN 无法高度并行计算的缺点,Transformer 采用全局并行处理,所有词同时进入网络。这种高度并行的代价,就是彻底抛弃了隐式的顺序信息。因此,必须通过显式的位置编码把顺序信息“硬塞”进去。
4. 引入位置编码的作用方式
既然网络结构不提供位置信息,Transformer 的做法是在输入端做文章:
输入表示 = 词嵌入(Token Embedding) + 位置编码(Positional Encoding)
- 词嵌入:表达这个词“是什么意思”(例如“狗”的语义向量)。
- 位置编码:表达这个词“在什么位置”(例如“第1个位置”的向量)。
相加之后,模型看到的就不再是单纯的“狗”,而是“位于句首的狗”。这样,同样的词在不同位置,其最终的输入向量是不同的,自注意力机制就能据此区分词的先后顺序。
补充:位置编码的发展
Transformer 引入位置编码后,这个领域也一直在演进:
- 绝对位置编码:
- 正弦/余弦位置编码(原论文《Attention Is All You Need》采用):使用不同频率的三角函数生成,不需要训练,具备一定的外推性。
- 可学习绝对位置编码(如 BERT、GPT-2 采用):将位置信息也作为参数,让模型自己去学习。缺点是序列长度受限于训练时的最大长度。
- 相对位置编码:
- 不关注词在句子中的绝对位置(第几个),只关注词与词之间的相对距离(相隔几个词)。
- RoPE(旋转位置编码):目前大模型(如 LLaMA, Qwen, ChatGLM)的主流方案,巧妙地通过复数乘法将绝对位置引入,但在计算注意力时又只依赖相对位置,效果极佳。
- ALiBi:直接在注意力分数(Attention Score)上根据距离增加惩罚项,具有极强的长文本外推能力。
总结:
Transformer 必须引入位置编码,是因为它的核心架构(自注意力机制)为了实现高效的全局并行计算,牺牲了对序列顺序的感知能力。位置编码是弥补这一缺陷、让模型重新获得语序理解能力的唯一桥梁。