文章目录

Transformer位置编码的正弦公式设计原理与相对位置编码

发布于 2026-07-10 18:50:25 · 浏览 53 次 · 评论 0 条

Transformer位置编码的正弦公式设计原理与相对位置编码

Transformer模型的自注意力机制本身不包含序列顺序信息,就像一堆被打乱的单词。因此,必须在输入中显式地注入位置信息,这一过程称为“位置编码”。本文将解析原始Transformer论文中正弦位置编码的设计,并阐明其如何优雅地处理相对位置,最终扩展到更现代的显式相对位置编码方法。


1. 明确位置编码的核心作用

在理解具体公式前,需先明确位置编码必须满足的几个关键特性。

  1. 提供唯一位置标识:为序列中的每一个位置(例如第1个、第100个词)分配一个唯一的、确定的向量,此向量与词嵌入相加。
  2. 编码相对位置关系:模型处理语言时,更关心词与词之间的相对距离(如“猫吃鱼”中,“猫”与“鱼”相隔2个位置)。一个优秀的位置编码应让模型容易计算出任意两个位置之间的距离。
  3. 泛化到更长序列:训练时序列长度固定,但推理时可能遇到更长的序列。编码方案应能平滑地扩展到训练时未见过的位置。
  4. 保持计算高效:生成和使用位置编码不应引入过多的计算开销。

2. 剖析原始Transformer的正弦位置编码方案

原始Transformer论文提出了基于正弦和余弦函数的编码方案。它并非用神经网络学习,而是用一个固定的公式生成。

1. 理解公式的构成
位置 pos(从0开始计数)的编码向量 PE(pos) 的维度与词嵌入维度 d_model 相同。对于维度索引 i(从0到 d_model/2 - 1),其计算公式为:

$$ 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) $$

2. 进行直观解读

  • 高维空间的“指纹”:将每个位置 pos 看作一个高维空间中的点。这个公式使用一系列不同频率的正弦/余弦波,为每个位置生成一个独一无二的坐标。
  • 频率变化规律:分母 10000^{2i/d_model} 控制了不同维度上的频率。当 i 很小时(即向量的前几个维度),频率很高,变化剧烈,负责精细的位置区分。当 i 接近 d_model/2 时,频率极低,变化平缓,负责宏观的位置区分。
  • 所有维度均为正弦/余弦:公式确保每个维度都是周期函数,这使得编码值始终保持在[-1, 1]之间,数值稳定。

3. 探究正弦公式如何隐式学习相对位置

此方案的精妙之处在于,通过固定的绝对位置编码,使模型能够轻易地学习到相对位置信息。其核心在于三角函数的线性变换性质。

1. 推导相对位置的线性表示
假设我们需要计算位置 pos+k 的编码向量 PE(pos+k)。对于任意维度,根据三角函数和角公式:

$$ \sin(A+B) = \sin A \cos B + \cos A \sin B $$
$$ \cos(A+B) = \cos A \cos B - \sin A \sin B $$

令 $A = \frac{pos}{10000^{2i/d_{model}}}$,$B = \frac{k}{10000^{2i/d_{model}}}$。则对于一对相邻的维度(2i2i+1),PE(pos+k) 可以表示为:

$$ \begin{bmatrix} PE_{(pos+k, 2i)} \\ PE_{(pos+k, 2i+1)} \end{bmatrix} = \begin{bmatrix} \cos B & \sin B \\ -\sin B & \cos B \end{bmatrix} \cdot \begin{bmatrix} PE_{(pos, 2i)} \\ PE_{(pos, 2i+1)} \end{bmatrix} $$

2. 理解推导结论
上述矩阵是一个旋转矩阵。这意味着,位置 pos+k 的编码,可以看作是位置 pos 的编码经过一个仅与 k(相对距离)相关的线性变换(旋转)得到的。

3. 体会设计优势

  • 相对位置即变换参数:矩阵中的元素 sin Bcos B 完全由相对距离 k 和维度频率决定。模型在注意力计算中,通过学习如何响应这种由 k 决定的变换,就能掌握相对位置关系。
  • 平滑的泛化性:由于正弦函数是连续且平滑的,对于训练中未出现过的相对距离 k,模型也能通过三角函数的插值特性进行合理的推断。
  • 高效计算:这种编码是纯数学函数生成,无需额外参数,计算速度快。

4. 迈向显式的相对位置编码

尽管原始正弦编码能隐式学习相对位置,但后续研究发现,更直接地显式建模相对位置能带来性能提升。以下介绍两种主流思想。

1. 基于可学习偏置的方法(以T5为例)
此方法不直接修改输入的位置编码,而是在计算注意力分数时,加入一个与相对位置相关的可学习偏置项。

  1. 定义相对位置:对于查询位置 i 和键位置 j,它们的相对位置为 i - j。由于序列长度可能很长,通常将超过一定阈值(如128)的相对位置映射到同一个桶(bucket)里,以控制参数量。
  2. 添加注意力偏置:标准注意力分数计算为 Q*K^T / sqrt(d_k)。在此基础上,加上一个由相对位置桶索引 b(i,j) 查询出的标量偏置 z_{b(i,j)}。最终分数变为 (Q*K^T)/sqrt(d_k) + z_{b(i,j)}
  3. 学习偏置:每个相对位置桶对应的偏置 z 是一个可学习的参数。模型通过训练,学会给相邻位置更高的注意力权重(z 值更大),从而显式地编码了“距离越近关系可能越密切”这一先验。

2. 旋转位置编码(RoPE)
RoPE将位置信息编码为旋转矩阵,作用于查询和键向量,使它们的内积天然地包含相对位置信息。

  1. 核心思想:对于查询向量 q_m 和键向量 k_n(分别位于位置 mn),将它们各自乘上一个与绝对位置相关的旋转矩阵 R_mR_n,得到 R_m q_mR_n k_n。然后计算它们的内积作为注意力分数。
  2. 精巧设计:通过数学推导,可以使得 (R_m q_m)^T (R_n k_n) 的结果只依赖于原始的 q_mk_n 以及相对位置 m - n。最终内积的形式为 Re[ q_m k_n^* e^{i(m-n)θ} ],其中 * 表示共轭,θ 是一个与维度相关的角度参数。
  3. 实现效果:RoPE直接将相对位置 m-n 作为一个复数旋转的乘子嵌入注意力计算中。它不增加额外参数,保持了计算的高效性,同时非常自然地将相对位置关系融入了点积注意力。由于其优越的性能和优雅的数学形式,RoPE已被广泛应用于最新的大语言模型(如LLaMA)中。

通过理解正弦编码的数学美感,分析其通过线性变换隐式编码相对位置的机制,再扩展到直接建模相对位置的偏置与旋转方法,可以全面把握Transformer位置编码从开创性设计到现代优化的发展脉络。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文