Transformer模型中的位置编码(Positional Encoding)原理与实现
字数 1763 2025-11-24 04:16:21

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

步骤说明

  1. 初始化位置编码矩阵 \(PE \in \mathbb{R}^{seq\_len \times d\_model}\)
  2. 计算位置序列 \(pos\) 和频率因子 \(div\_term\)(避免幂运算,使用指数对数变换优化)。
  3. 填充偶数维(正弦)和奇数维(余弦)。

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架构的核心组件之一。

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. 代码实现步骤 步骤说明 : 初始化位置编码矩阵 \( 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架构的核心组件之一。