1. 为什么Transformer需要位置编码?
在自然语言处理任务中,词序信息至关重要。"猫咬狗"和"狗咬猫"这两个句子虽然包含相同的词汇,但含义却截然相反。传统的RNN和CNN架构天然具备处理序列的能力,而Transformer的自注意力机制(self-attention)本质上是一个集合操作(set operation),它通过计算查询(Q)和键(K)之间的点积相似度来确定注意力权重,这个过程本身不包含任何位置信息。
自注意力机制的核心公式:Attention(Q,K,V)=softmax(QKTdk)V
其中完全不考虑token在序列中的位置关系
这种特性带来了两个主要问题:
- 词序敏感性缺失:模型无法区分"AB"和"BA"这样的序列
- 长距离依赖困难:在长文本中难以精确定位"前面提到的那个实体"
为了解决这些问题,我们需要向模型注入位置信息。目前主流的位置编码方案可以分为两类:绝对位置编码(Absolute Positional Encoding, APE)和旋转位置编码(Rotary Positional Embedding, RoPE)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 绝对位置编码(APE)深度解析
2.1 APE的基本原理
绝对位置编码的核心思想是为序列中的每个位置分配一个独特的"身份证"向量。这个位置向量与词嵌入(token embedding)具有相同的维度,通过简单的加法操作将位置信息注入到输入表示中。
数学表达为:
h_t = E[x_t] + P[t]
其中:
- E[x_t]:第t个token的词嵌入
- P[t]:第t个位置的位置编码
- h_t:最终输入到Transformer的表示
2.2 两种主流实现方式
2.2.1 可学习位置向量(Learned APE)
这是最直观的实现方式,直接维护一个位置嵌入矩阵P ∈ R^{max_len×d},其中:
- max_len:预设的最大序列长度
- d:模型隐藏层维度
在BERT等模型中常见这种实现。其特点是:
- 优点:简单直接,模型可以通过学习自动调整位置表示
- 缺点:外推性差,当序列长度超过训练时的max_len时,位置向量未定义
实际工程中,处理超长文本时常见的workaround:
- 位置ID截断:position_i
