常见的位置编码 Positional Encoding
位置编码(Positional Encoding)
——理解序列顺序的关键机制
关键词:Transformer、位置编码、人工智能、自然语言处理、深度学习、序列建模
一、引言
在现代人工智能系统中,Transformer 架构已成为处理序列数据的主流模型。它被广泛应用于自然语言处理(NLP)、语音识别、时间序列预测等多个领域。然而,Transformer 的核心机制——自注意力(Self-Attention)本身不包含序列顺序信息。这就带来了一个关键问题:模型如何感知输入序列中元素的顺序?
为了解决这一问题,研究者引入了位置编码(Positional Encoding)。位置编码的作用是为模型提供输入序列中各个元素的位置信息,使其能够区分“猫追老鼠”和“老鼠追猫”这类语序不同的句子。
本文将详细介绍位置编码的基本原理、常见类型及其在主流模型中的应用,并探讨其未来发展方向。
二、基本概念
1. 什么是位置编码?
位置编码是一种向量化表示方法,用于将序列中每个元素的位置信息嵌入到模型输入中。通常,位置编码与词嵌入(Token Embedding)具有相同的维度,并在输入 Transformer 之前与其相加。
举个例子:
假设我们有两句话:
- “猫追老鼠”
- “老鼠追猫”
虽然这两个句子包含相同的词,但语义完全不同。如果没有位置信息,模型可能会认为这两个句子是相同的。
因此,位置编码的作用就是赋予模型对顺序的理解能力。
公式表示如下:
Input = TokenEmbedding ( x i ) + PositionalEncoding ( p o s i ) \text{Input} = \text{TokenEmbedding}(x_i) + \text{PositionalEncoding}(pos_i) Input=TokenEmbedding(xi)+PositionalEncoding(posi)
其中:
- x i x_i xi 是第 i i i 个输入元素;
- p o s i pos_i posi 是其在序列中的位置;
- TokenEmbedding 是词嵌入函数;
- PositionalEncoding 是位置编码函数。
三、常见的位置编码类型
1. 正弦/余弦位置编码(Sinusoidal Positional Encoding)
这是 Google 在 2017 年的原始 Transformer 论文中提出的一种固定式位置编码方法。
数学形式:
对于位置 pos
和维度 i
,定义如下:
P E ( p o s , 2 i ) = sin ( p o s 1000 0 2 i d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i)=sin(10000dmodel2ipos)
P E ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d_{\text{model}}}}}\right) PE(pos,2i+1)=cos(10000dmodel2ipos)
其中:
pos
是元素在序列中的位置;i
是嵌入向量的维度索引;d_model
是模型的输入维度。
优点:
- 可推广到训练中未见过的序列长度;
- 有助于模型捕捉相对位置关系。
缺点:
- 不可学习,无法根据任务优化;
- 对于某些任务,固定编码可能不如学习型编码表现好。
2. 学习型位置编码(Learned Positional Encoding)
在该方法中,位置编码作为可学习参数,在模型训练过程中不断优化。通常为每个位置分配一个可学习的向量,构成一个大小为 (max_seq_len, d_model)
的矩阵。
实现方式:
- 初始化一个形状为
(max_seq_len, d_model)
的位置嵌入矩阵; - 每个位置对应的向量在训练中通过反向传播更新。
优点:
- 更适合特定任务;
- 可以捕捉复杂的模式;
- 与模型整体联合优化。
缺点:
- 限制了最大序列长度;
- 参数量增加;
- 无法泛化到比训练时更长的序列。
3. 相对位置编码(Relative Positional Encoding)
相对位置编码关注两个元素之间的距离,而非其绝对位置。适用于建模长距离依赖关系。
应用场景:
- Transformer-XL
- 改进版 BERT 模型
优点:
- 更好地建模上下文关系;
- 有助于捕捉长距离依赖。
缺点:
- 实现复杂度较高;
- 需要额外的参数或计算。
4. 旋转位置编码(Rotary Position Embedding, RoPE)
RoPE 通过旋转矩阵将位置信息嵌入查询(Query)和键(Key)向量中,从而实现对位置信息的编码。
核心思想:
对于每个位置,定义一个旋转矩阵,作用于 Q 和 K 向量:
Q i ′ = rotate ( Q i , θ i ) Q_i' = \text{rotate}(Q_i, \theta_i) Qi′=rotate(Qi,θi)
K j ′ = rotate ( K j , θ j ) K_j' = \text{rotate}(K_j, \theta_j) Kj′=rotate(Kj,θj)
其中旋转角度与位置相关。
优点:
- 支持任意长度的序列;
- 保持相对位置信息;
- 不需要额外参数;
- 推理效率高。
缺点:
- 实现较为复杂;
- 需要一定的数学基础理解其原理。
应用模型:
- LLaMA 系列(Meta)
- ChatGLM(智谱 AI)
- Phi-2(Microsoft)
5. ALiBi(Attention with Linear Biases)
ALiBi 方法通过在注意力分数中加入基于位置的线性偏置项来建模位置信息,而不需要显式的嵌入层。
原理公式:
Attention ( Q , K , V ) = softmax ( Q K T d k + bias ( p o s ) ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}} + \text{bias}(pos)\right)V Attention(Q,K,V)=softmax(dkQKT+bias(pos))V
其中 bias(pos) 是一个基于位置的线性项。
优点:
- 无需额外参数;
- 支持非常长的上下文;
- 推理效率高;
- 可用于训练和推理阶段。
缺点:
- 可能不如其他方法表达能力强;
- 对位置信息的建模较为简单。
应用模型:
- BLOOM(BigScience)
- MPT(MosaicML)
- Falcon(TII)
四、位置编码在主流模型中的应用
模型 | 位置编码类型 | 特点 |
---|---|---|
Transformer (2017) | Sinusoidal | 最早提出,不可学习 |
BERT | Learned | 可学习,固定长度 |
Transformer-XL | Relative | 支持跨段落建模 |
LLaMA / LLaMA2 / LLaMA3 | RoPE | 支持长上下文,无长度限制 |
ChatGLM / GLM-130B | RoPE | 高效建模长文本 |
Phi-2 (Microsoft) | RoPE | 小模型大能力 |
GPT-Neo / GPT-J | Rotary / Learned | 多种变体 |
ALiBi-Enabled 模型 | ALiBi | 无显式位置编码 |
五、位置编码的演进趋势
时间 | 方法 | 特点 |
---|---|---|
2017 | Sinusoidal | 最初版本,不可学习 |
2018-2020 | Learned | 更灵活,但受长度限制 |
2020-2022 | Relative | 支持长程依赖 |
2021-现在 | RoPE & ALiBi | 更高效、支持无限长度、无需额外参数 |
六、如何选择合适的位置编码?
使用场景 | 推荐方法 |
---|---|
短文本任务(如分类) | Learned |
长文本生成 | RoPE 或 ALiBi |
需要相对位置建模 | Relative |
想要轻量化设计 | ALiBi |
兼容性要求高 | Sinusoidal(通用性强) |