Transformer模型中的位置编码(Positional Encoding)原理与实现
1. 问题描述
Transformer模型完全基于自注意力机制,而自注意力本身是置换不变性(Permutation-Invariant)的,即输入序列的顺序变化不会影响输出。但自然语言、时间序列等数据依赖顺序信息,因此需要显式引入位置编码(Positional Encoding)来为序列中的每个位置添加位置信息。
2. 位置编码的核心需求
- 唯一性:每个位置有唯一的编码。
- 相对位置感知:模型应能捕捉不同位置之间的距离关系。
- 泛化性:支持比训练集更长的序列。
- 确定性:无需额外学习,直接计算生成。
3. 正弦余弦位置编码(Sinusoidal Positional Encoding)
原始Transformer论文采用正弦和余弦函数的组合来编码位置。假设序列位置为 \(pos\)(从0开始),编码维度为 \(d_{model}\),则第 \(i\) 维的编码值为:
\[PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) \]
\[PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) \]
4. 设计原理详解
- 频率递减:\(10000^{2i/d_{model}}\) 随着 \(i\) 增大而减小,低频(高波长)对应高维,高频(低波长)对应低维。
- 正弦余弦交替:偶数维用正弦,奇数维用余弦,保证每个位置编码唯一且可线性变换到相对位置(见后文推导)。
- 相对位置线性表达:对于偏移量 \(k\),存在线性变换矩阵 \(M\) 使得 \(PE(pos+k) = M \cdot PE(pos)\),便于模型学习相对位置关系。
5. 相对位置关系的数学证明
令 \(\omega_i = \frac{1}{10000^{2i/d_{model}}}\),则:
\[PE(pos+k, 2i) = \sin((pos+k)\omega_i) = \sin(pos\omega_i)\cos(k\omega_i) + \cos(pos\omega_i)\sin(k\omega_i) \]
\[PE(pos+k, 2i+1) = \cos((pos+k)\omega_i) = \cos(pos\omega_i)\cos(k\omega_i) - \sin(pos\omega_i)\sin(k\omega_i) \]
这可以表示为 \(PE(pos)\) 的线性组合,说明模型能通过注意力权重隐式学习相对位置。
6. 代码实现步骤
import torch
import math
def sinusoidal_positional_encoding(seq_len, d_model):
pe = torch.zeros(seq_len, d_model)
pos = torch.arange(0, seq_len).unsqueeze(1) # (seq_len, 1)
div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(pos * div_term) # 偶数维
pe[:, 1::2] = torch.cos(pos * div_term) # 奇数维
return pe
步骤说明:
- 初始化位置编码矩阵 \(PE \in \mathbb{R}^{seq\_len \times d\_model}\)。
- 计算位置序列 \(pos\) 和频率因子 \(div\_term\)(避免幂运算,使用指数对数变换优化)。
- 填充偶数维(正弦)和奇数维(余弦)。
7. 位置编码与输入嵌入的融合
将词嵌入向量 \(X \in \mathbb{R}^{seq\_len \times d\_model}\) 与位置编码相加:
\[X' = X + PE \]
注意:直接相加而非拼接,因为 \(d\_model\) 维度一致,且加法能保留位置信息与语义信息的交互。
8. 其他位置编码方法
- 可学习的位置编码:将 \(PE\) 作为可训练参数(如BERT)。优点:灵活适配数据;缺点:无法泛化到超长序列。
- 相对位置编码:在注意力计算中直接注入相对位置偏差(如Transformer-XL、T5)。
- 旋转位置编码(RoPE):通过旋转矩阵编码位置,常用于LLaMA、GPT-J等模型。
9. 总结
正弦余弦位置编码通过三角函数为序列注入位置信息,兼具唯一性、相对位置感知和泛化能力。其设计巧妙利用了三角函数的线性变换性质,使模型能高效学习序列顺序关系,是Transformer架构的核心组件之一。