跳转至

NLP高频面(46)Transformer 架构中的位置编码及其演化详解

本文讨论了Transformer架构中位置编码及其演化,介绍了不同位置编码方法的原理、优缺点和应用场景,为选择合适的位置编码方案提供参考。关键要点包括:

位置编码的必要性:Transformer自注意力机制对序列顺序信息不敏感,需注入位置信息,位置编码能解决此问题,但面临设计合适编码方式的挑战。

绝对位置编码:包括固定正弦位置编码和可学习绝对位置编码。前者无需训练、有多频率表示,但缺乏适应性、有周期性等;后者可根据任务学习,但无法天然外推、参数量随长度增长。

相对位置编码:核心是编码元素间相对关系,有基于相对位置嵌入和基于注意力偏置的方法。前者使模型对序列位移具等变性,后者实现简单、参数少,相对编码长序列泛化好、性能有提升,但实现复杂。

旋转位置编码(RoPE):通过旋转向量编码位置,融合绝对和相对长处,无需额外参数,在长文本任务有效,但频率基数选择重要,极长距离有潜在问题。

其他变种位置编码:如二进制、稀疏/低秩、轴向位置编码等。二进制编码参数效率高但有挑战;稀疏/低秩旨在降低复杂度;轴向编码适合长序列和多维输入,但有人为结构问题。

不同任务的位置编码选择:NLP任务中,短序列用绝对编码,长文档用相对编码或RoPE;CV任务中,定位任务需绝对编码,局部关系可用相对偏置;多模态任务各模态用各自编码再结合。

选择编码的考量:需综合考虑任务性质、模型结构和实现代价,未来可能出现新的位置编码理念和动态编码机制。

引言

Transformer 模型(Vaswani 等人,2017)在序列建模中取得了革命性突破,利用自注意力机制实现了并行的序列处理。然而,Transformer 本身对序列的顺序信息不敏感:输入序列元素在自注意力中是无排列的(Permutation-invariant)。换言之,Transformer 缺乏像 RNN 那样的自然顺序编码能力,必须显式地注入位置(顺序)信息才能让模型“知道”第一个词和第二个词的区别。为了解决这一问题,Transformer 引入了位置编码(Positional Encoding)的概念,为每个序列位置提供一个向量表示,用以表示该位置在序列中的相对或绝对顺序。

在最初的 Transformer 中,作者采用了固定的正弦位置编码来为每个位置生成独特的表示。随后,研究者们提出了许多不同的方案对位置信息进行编码,包括可学习的位置编码(如 BERT 等模型所用)、相对位置编码(relative positional encoding,如 Transformer-XL、T5 等模型所用)、旋转位置编码(Rotary Positional Encoding, RoPE,用于近期一些长文本模型)以及其他各种变种(如二进制编码)。


制编码、稀疏编码、轴向编码等)。这些方法各有其数学定义和设计动机,在不同任务中表现出不同的优势与局限。

本文将系统地梳理 Transformer 架构中位置编码方法的发展演化,对各种主要的位置编码方式进行分类讲解。我们将详细介绍每种方法的数学定义、核心动机和结构设计,并辅以公式推导和必要的示意图说明。此外,我们将比较不同位置编码在自然语言处理(NLP)、计算机视觉(CV)和多模态模型等任务中的应用场景、优势与局限。文章将提供清晰的公式推导和若干代码示例(PyTorch 实现),以帮助读者深入理解这些位置编码机制。

为什么需要位置编码?

在讨论具体的方法之前,我们先了解为什么 Transformer 需要位置编码。与 RNN 或 CNN 不同,Transformer 的自注意力机制在理论上对输入序列的位置排列不敏感。如果不给模型提供任何位置信息,Transformer 将无法区分“猫在沙发上”和“沙发在猫上”这样的句子,因为单词集合虽然相同但顺序不同。传统的序列模型(如 RNN)通过循环结构天然地捕获了顺序:在时间步 t t t 的隐藏状态隐含地包含了从 111 到 t t t 的顺序信息。而 CNN 则通过卷积窗口的相对位移捕获局部顺序。然而,Transformer 完全基于集合操作(attention),需要人工注入顺序线索。

位置编码就是为了解决这个问题而设计的。它为序列中每个位置 iii 赋予一个向量表示 pi \mathbf{p}_ip

,使模型在处理时能够利用这些向量来感知各元素之间的顺序关系。典型地,位置编码向量会与原有的词嵌入向量相加或拼接,从而在进入自注意力层前将顺序信息混入输入表示中。这样,自注意力可以基于包含顺序信息的表示计算相关性。

位置编码面临的挑战在于:如何设计一种合适的编码方式,使得模型既能方便地学习序列关系,又不过度依赖特定序列长度。绝对位置编码提供了序列中具体位置的标识,而相对位置编码直接提供元素之间的位置差距信息。不同任务对于位置的需求也有所不同:有些任务可能需要模型知道“第几个元素”,而有些任务更关心元素之间的相对顺序。接下来,我们将分类介绍主要的位置编码方法。

绝对位置编码:固定 vs 可学习

绝对位置编码(Absolute Positional Encoding)为每个位置赋予一个唯一的表示,该表示仅依赖该位置在序列中的绝对索引,而不考虑与其他元素的距离。绝对位置编码有两大分支:固定的函数型位置编码(如正弦编码)和可训练的嵌入式位置编码。这一节我们分别介绍它们的原理。


固定正弦位置编码(Sinusoidal Positional Encoding)

正弦位置编码是 Transformer 原论文中提出的方法。其核心思想是利用不同频率的正弦函数和余弦函数为序列位置生成固定的向量表示。具体而言,正弦位置编码为位置 pos 和编码维度索引 ii 定义如下公式:

对于偶数维度(2i):

$$ PE_{(pos,2i)}=\sin(pos/10000^{\frac{2i}{d_{model}}}) $$

对于奇数维度 $ 2i+1 $:

$$ PE_{(pos,2i+1)}=\cos\left(pos/10000^{\frac{d_{model}}{2i}}\right) $$

其中 $ d_{model} $ 是位置编码向量的维度,通常等于模型的隐藏状态维度。该公式为每个位置 pos 生成一个 $ d_{model} $ 维向量,其中一半维度使用正弦函数,一半维度使用余弦函数,不同维度采用不同的频率。频率通过分母 $ 10000^{2i/d_{model}} $ 来控制:当维度指数 i 较小时,分母的指数较小,频率较高(即随 pos 变化更快);反之维度指数较大时,频率较低(随 pos 变化较慢)。

这种设计使得不同维度对应不同周期的正弦/余弦波,从而编码了从高频局部信息到低频全局信息。例如,在 $ d_{model} = 512 $ 时,最低频率(最高周期)的正弦曲线跨越上万以上的位置才完整震荡一次,而最高频率的正弦在相邻的位置就会产生显著变化。模型可以组合不同频率的信号来推断任意跨度的位置信息。

(image)图1:长度100、维度16的正弦位置编码热力图。横轴为位置索引(0~99),纵轴为编码向量的维度索引(0~15)。颜色表示该维度在对应位置的取值(红色接近1,蓝色接近-1)。可以看到,较低的维度(底部)随位置高频振荡,而较高的维度(顶部)在这一区间内变化缓慢,接近一个常数。这体现了不同频率信号共同编码位置的特性。

动机与特性:正弦位置编码有几个显著特点和动机:

不需要训练:正弦位置编码是基于公式直接计算的,不引入额外的可训练参数。这对需要外推到比训练序列更长的序列时很有用,因为模型可以计算从未见过的更长位置的编码值。


任意长度的泛化:由于公式对 pos 连续有效,只需要处理更长序列,直接用公式计算相应 pos 的值即可。只要 pos 值不断增大,sin 和 cos 会以固定周期继续振荡,因此理论上位置编码可以扩展到无限长序列(尽管会出现周期重复的问题,我们稍后讨论)。

距离可推导:一个重要的潜在性质是,正弦编码使得相对位移的信息可以通过向量的点积等操作获得。例如,对于两个位置 i 和 j,它们编码向量的点积包含了诸如 $ \cos((i - j)/10000^{2k/d}) $ 这样的项。这意味着模型有可能通过几何操作学习到关于相对位置的知识(尽管并不显式给出,需要模型自身去学习)。

多频率表示:通过组合不同频率的正弦曲线,模型能够表示非线性的位置关系。例如,模型可以容易地学会将频率高的一两个维度输出对齐,从而近似地检测两个元素是否距离为特定值。这种多频特征提供了一种丰富的表示基底,让模型自己去线性组合得到所需的位置关系。

实现方式:在实践中,正弦位置编码通常在模型初始化时计算一个尺寸为(max_seq_len,d_model)的常数矩阵 PE,其中 max_seq_len 是模型支持的最大序列长度。然后对于每个输入序列,取出相应长度 L 的前 L 行,直接加到词嵌入(token embedding)上。由于没有可学习参数,这一步不需要梯度更新。下面是一个使用 PyTorch 生成正弦位置编码的简洁实现示例:

代码块

1 import torch 2 import math 3 4 def sinusoidal_pos_encoding(seq_len, d_model): 5 # seq_len: 最大序列长度, d_model: 编码维度

Image

正弦编码的局限:虽然正弦位置编码无需训练且具备良好的外推性,但也存在一些不足:

缺乏适应性:因为值是公式固定的,对所有任务都是相同的编码模式,模型需要自己去适应这些信号。有研究者怀疑,对于特定任务,也许有某种特定的位置编码模式会更有效,但正弦编码无法调整以适应任务需求。

周期性:正弦编码本质上是周期函数。当序列长度非常大时,位置编码会出现周期重复(例如对于最低频率分量,当 pos 增加约 $ 2\pi \approx 6.28 $ 时 sin 会重复接近之前的值,不过由于引入了不同频率组合,完


全周期重复会发生在远超训练长度的位置)。尽管这种周期性对绝大多数常见长度来说影响可以忽略,但在极长序列下可能会导致模型混淆非常遥远但编码相似的位置。

维度利用:正弦编码将维度的一半用于 $ \sin $,一半用于 $ \cos $,保证了不同位置编码彼此正交性(在足够长范围内近似正交)。然而,这也意味着模型可能需要结合两个维度才能重构一个完整的位置信息(因为单看某一维既有正也有余弦,信息是分散的)。不过在实践中这不算大问题,因为Transformer的注意力是多维综合考虑的。

总体而言,正弦位置编码提供了一种简单而有效的方案,已被证明在机器翻译等任务上与可学习位置编码具有相当的性能。Transformer 原始文选择正弦编码部分原因也是出于它的泛化能力,因为机器翻译可能需要翻译比训练语料更长的句子。

可学习绝对位置编码(Learnable Positional Embedding)

与固定的正弦编码相对,应运而生的另一类方案是可学习的位置嵌入。这种方法不使用预先设定的函数形式,而是直接为每个可能的序列位置设置一个可训练的向量,并在模型训练过程中学习这些向量的值。它的形式与词嵌入(word embeddings)非常相似:如果模型最大支持序列长度为 L max,那么我们就为位置 0,1,⋯,L max - 1 各设置一个 d model 维参数向量。这些向量在训练时会像其他参数一样更新。

定义:可学习位置编码通常初始化为随机值或零,然后在训练中优化。形式上可以表示为一个查表(Lookup Embedding):

$$ \mathbf{p}{i}=\mathbf{W}-1, $$ },\quad i=0,1,\ldots,L_{\max

其中 $ \mathbf{W}i \in \mathbb{R}^{d}}} $ 是需要学习的参数。当输入序列长度为 $ L $ 时,我们取前 $ L $ 个位置向量 $ {\mathbf{W0, \mathbf{W}_1, \ldots, \mathbf{W}} $,将它们加到对应的词表示上,提供位置信息。

实践用法:BERT、GPT-2等许多著名的预训练模型都采用了可学习的位置嵌入策略。以BERT为例,BERT的实现中包含一个nn.Embedding层用于位置:

代码块

1 import torch.nn as nn 2 3 max_len = 512 4 d_model = 768 5 position_embeddings = nn.Embedding(max_len, d_model) 6 # 假设输入序列长度为 L=100


position_indices = torch.arange(0, 100, dtype=torch.long) pos_encoding = position_embeddings(position_indices) # 得到 shape [100, 768] 的张量

将其加到词嵌入表示上:

x = word_embeddings + pos_encoding

在这个例子中,模型将学习 position_embeddings.weight 矩阵,使得其第 i 行就是位置 i 的编码向量。训练时,这些向量的梯度来自模型对顺序的偏好。例如,为了让模型学会“句尾”与“句中”的区别,它可能调整最后几个位置向量的值,使它们携带某种特殊信号。

动机与优势:可学习绝对位置编码相比正弦编码,有以下动机和潜在优势:

任务适应性:模型可以自由地为每个位置分配任何实数向量,只要有足够数据,它可以学习出最有利于当前任务的编码方式。例如,如果任务需要强调序列开头和结尾的位置重要性,模型或许会学习到将这些位置的编码与中间位置区别开。

不局限于特定函数形式:正弦编码虽然提供了丰富的基函数,但终究具有特定的结构。可学习编码完全让模型自己决定,这样理论上不损失表示能力(因为模型可以选择拟合出类似正弦的模式,或者任何其他模式,只要这对优化目标有利)。

实现简单:直接使用 embedding 查表在深度学习框架中很容易实现,也不需要手动设计公式,对使用者来说更直观。

劣势与局限:然而,可学习位置编码也有显著的局限性:

无法天然外推:固定长度限制是可学习编码的最大问题之一。模型只能学到训练中出现过的位置索引的表示,对于超出训练长度的新位置,没有任何学习到的表示可用。实际上,如果我们严格限定nn.Embedding(max_len, d_model)的大小,那么模型无法处理长度超过 max_len 的序列。如果希望外推,只能进行一些插值或沿用已有表示的策略(例如常见的做法是将超过最大长度的位置都映射为同一个特殊位置或进行插值【例如在ViT中对长图像做位置插值】),但这可能导致性能下降。

参数量随最大长度线性增长:要支持较长序列,可学习编码需要学习相应长度的参数向量。例如BERT需要为512个位置各学一个768维向量,这增加了约512×768的参数。对于512长度影响不大,但若要支持更长(如几千以上长度),参数量会显著上升,并增加过拟合风险。


可能缺少结构:虽然可学习编码灵活,但也意味着模型可能没有学到任何“通用的”位置信号,而只是凭记忆去识别特定位置。在极端情况下,如果训练数据的序列长度分布有限,模型可能过拟合于出现频率高的位置,对罕见长度的位置泛化较差。这在需要处理比训练序列长很多的情形下尤其成问题。

经验与比较:Transformer 原文报告中曾比较过正弦编码和可学习编码在机器翻译任务上的效果,发现两者性能相近。因此,Transformer 模型的实现有的沿用了固定编码(如早期的 Transformer 翻译模型),有的则改用可学习编码(如 GPT、BERT 等)。一般来说,在预训练 + 微调范式下,可学习位置编码因为微调过程中序列长度通常不会超出预训练长度,所以使用方便且有效;而在长序列建模任务或希望具有长度扩展性的场景下,固定编码或其他能够外推的编码更受青睐。

综上,绝对位置编码无论固定或可学习,都是为每个序列中具体位置赋予一个唯一标识。在Transformer的输入表示中加入绝对位置编码,相当于告诉模型“这是第1个词,这是第2个词,…”诸如此类的信息。绝对位置编码强调全局位置:模型能识别出句首句尾、中间、特定索引上的元素等。但是,绝对位置编码并没有直接提供关于元素之间距离的信息。例如,仅通过绝对位置,很难直接判断“词A比词B领先5个位置”。模型若想知道这一点,必须从两个绝对位置的编码中推算出差。这激发了下一类方法:直接编码相对位置信息。

相对位置编码:位置差距的融入

相对位置编码(Relative Positional Encoding)的核心思想是:模型关心的也许并非句子的具体绝对位置,而是序列元素之间的相对关系。在许多任务中,例如机器翻译或语言模型,判断两个词之间距离远近往往比它们各自在第几个位置更重要。相对位置编码通过直接编码元素之间的距离或顺序关系,让自注意力机制能够利用这些相对位置信息,而不仅仅是绝对索引。本节将介绍几种主要的相对位置编码方法,包括基于相对位置嵌入的方法和基于注意力偏置的方法。

基于相对位置嵌入的编码(Shaw 等人的方法)

一种早期且具代表性的相对位置编码方法由 Shaw 等人 (2018) 提出。他们的方法是为相对位置(也就是两个元素之间的距离)引入可学习的表示,并在自注意力计算中融入这些表示。

思想:对于序列中位置i和位置j的两个元素,我们希望注意力机制不仅依赖内容相关性,也能利用j−i(位置差)这一信息。例如,如果j比i大2(即j=i+2),我们可以为这个距离2赋予一个向量表示r2,让注意力知道这两个词相隔两个位置。

具体做法是:


定义一个相对位置嵌入表 $ \mathbf{R} $,对一定范围内的相对距离每个都学习一个向量表示。假设我们考虑的相对距离范围为 $ [-K, K] $(通常会取 $ K $ 为一个上限,过大的距离可以被“截断”为 $ K $)。那么对于距离 $ k $,有一个向量 $ \mathbf{r}k \in \mathbb{R}^{d $。}}

在计算自注意力时,原本计算注意力得分的公式是:

$$ e_{ij}=\frac{(\mathbf{q}{i}\cdot\mathbf{k} $$ })}{\sqrt{d}

其中 $ q_i $ 和 $ k_j $ 分别是位置 $ i $ 的查询向量和位置 $ j $ 的键向量。那么在加入相对位置编码后,我们将公式修改为:

$$ e_{ij}=\frac{(\mathbf{q}{i}\cdot\mathbf{k}})+(\mathbf{q{i}\cdot\mathbf{r}. $$ })}{\sqrt{d}

也就是说,我们让查询向量 $ \mathbf{q}i $ 点乘一个表示相对位移 $ (j - i) $ 的向量 $ \mathbf{r} $,并将其加到原本的内容相似度上。这一项提供了关于相对位置的额外得分。

此外,Shaw等人还提出,为了让最终的上下文表示也能直接利用相对位置信息,可以在计算注意力加权和时对值向量也加上一项偏移:

$$ \mathbf{z}{i}=\sum}\alpha_{ij}\left(\mathbf{v{j}+\mathbf{r}^{\prime}\right), $$

其中 $ \mathbf{r}'k $ 类似地是一套相对位置嵌入,用于值向量的调整, $ \alpha $ 是注意力权重(softmax 后)。这相当于在输出时也将相对位移的信息注入。

通常,为了限制参数规模,相对距离会设置一个最大绝对值,例如只区分 -K 到 K 之间的距离,超过这个范围的都视作 K 或 -K(截断)。例如设 K = 16,则距离大于 16 一律当作 16 对待,距离小于 -16 一律当作 -16 对待。这样嵌入表大小为 $ 2K + 1 $。

通过上述机制,自注意力的每一次“查询-键”交互都会考虑它们之间的距离:如果两个单词距离近或远,这都会通过 $ \mathbf{q}i \cdot \mathbf{r}} $ 体现出来。模型可以学习这些 $ \mathbf{rk $ 向量,使得它在计算注意力时倾向于某些相对距离。例如,模型或许会学到 $ \mathbf{r}_1 $ 和 $ \mathbf{r} $ 等向量点积结果较低甚至为负,从而抑制远距离依赖。} $(相邻词)提供一个较高的正相关值,这样注意力有偏向地更多关注相邻的词。而对于很远距离,可能 $ \mathbf{r}_{15


优势:Shaw 的相对位置编码方法使模型对于序列位移具有等变性:如果我们将整个句子平移(例如在前面插入一个额外的词,导致所有相对距离保持不变但绝对位置变了),理想情况下自注意力的模式不应改变太多,因为绝对编码会乱套但相对编码不变。这意味着模型更关注元素间关系而非其在序列中的具体位置。他们在机器翻译实验中发现,相对位置编码比绝对位置编码提升了 BLEU 分数。

实现细节:在实现上,相对位置编码需要对注意力的计算过程进行一些修改。以Pseudo-code形式,看起来类似这样:

代码块

假设输入序列长度为 L

相对位置嵌入表 R,有索引范围 [-K, K] 映射到向量

初始化注意力logits矩阵 E (LxL)

for i in range(L): for j in range(L): rel_dist = j - i if rel_dist > K: rel_dist = K if rel_dist < -K: rel_dist = -K # 计算内容相关性 content_score = torch.dot(Q[i], K[j]) # 计算相对位置相关性 pos_score = torch.dot(Q[i], R[rel_dist]) E[i, j] = (content_score + pos_score) / math.sqrt(d) # 然后对 E[i, j] 做 softmax 得到注意力权重,再计算上下文向量

真实的实现会更优化,如利用张量并行计算。同时值向量的那部分相对偏移 $ \mathbf{r}'_{(j-i)} $ 常通过对V加权结果后再加一个额外根据相对距离加权的项实现。

局限:Shaw 等人的方法虽引入了相对位置信息,但也有一些缺点:

  • 需要维护一个大小为 $ (2K + 1) \times d $ 的嵌入矩阵。当 $ K $(可感知的最大距离)较大时,参数和计算开销增加。如果序列很长,相对距离范围不能覆盖所有距离(远距离都被截断为 $ K $),这可能丢失一些长程位置信号。
  • 实现上稍复杂,需要定制 Attention 计算逻辑,给许多基于标准Transformer实现的框架引入了一些麻烦。例如,需要在每次计算注意力score时根据 $ i,j $ 算 $ j - i $ 索引,相比标准注意力略微增加计算量。
  • 对于非常长距离的依赖,截断会导致模型无法区分比如100词距离和101词距离(如果 $ K \ll 100 $)。不过通常设 $ K $ 不会太小,或者任务本身很少需要关注极端远的依赖。

Transformer-XL 的相对位置编码(基于可计算的位置偏置)

在Shaw方法之后,Transformer-XL (Dai等人, 2019)提出了一种高效的相对位置编码方案,其核心思想是使用可计算的相对位置偏置而非显示的嵌入表。Transformer-XL 的相对位置编码通常结合正弦位置编码一并使用,达到了无需限定最大长度且计算高效的目的。这里我们概要介绍其原理。

Transformer-XL 首先仍然使用一套正弦位置编码向量 $ u_0, u_1, \ldots $,但这些向量不直接加在词上,而是用于 attention 计算。他们引入了两个可学习的参数向量 $ u $ 和 $ v $(维度等于 attention head 大小),并将注意力得分计算修改为:

$$ e_{i j}=\frac{(\mathbf{q}{i}+\mathbf{u})\cdot\mathbf{k}}+(\mathbf{q{i}+\mathbf{v})\cdot\mathbf{k}, $$ }^{\prime}}{\sqrt{d}

其中 $ \mathbf{k}_{(i-j)}^{\prime} $ 是一个与相对距离有关的向量。这听起来复杂,我们逐步解释:

· k_{j} 表示位置 j 的“内容”键向量(由词内容得到)。

• k'_{(i-j)} 表示一个仅依赖于距离 (i - j) 的“位置”键向量,可以通过正弦位置编码得到(他们实际上使用正弦编码的值,或称 R 矩阵,在实现中可以通过一些线性变换得到 k')。

$ q_{i} $ 是位置 i 的查询向量。

· u 和 v 是两个全局向量(每个注意力头一个),用于调节内容相关和位置相关部分的相对权重。

这个公式展开可以看到四项点积:

$$ \left(\mathbf{q}{i}\cdot\mathbf{k}}\right)+\left(\mathbf{q{i}\cdot\mathbf{k}}^{\prime}\right)+\left(\mathbf{u}\cdot\mathbf{k{j}\right)+\left(\mathbf{v}\cdot\mathbf{k}\right). $$ }^{\prime

第一项是内容-content 相关性,第二项是内容-position 相关性(类似 Shaw 的 $ \mathbf{q}i \cdot \mathbf{r}} $),第三项 $ \mathbf{u} \cdot \mathbf{kj $ 可以看作是一个只与被关注词 $ j $ 有关的全局偏置(content bias),第四项 $ \mathbf{v} \cdot \mathbf{k} $ 是可学习的,模型可以调整它们来改变位置影响的强弱。}^{\prime} $ 则是只与距离有关的全局偏置(position bias)。由于 $ \mathbf{u} $ 和 $ \mathbf{v

Transformer-XL 的这一方案实现了无需为每个距离学习独立参数(只用了 v 来乘以正弦函数形式的 $ k' $),而且利用正弦函数无限长的性质来计算 $ k_{(i-j)}^{'} $。这样,不管多长的距离 $ (i-j) $ 都可以通过正弦公式计算出相应的向量值,而不需要训练更多参数。同时,通过 u, v 两个参数,模型依然具有可学习的灵活性去校准内容和位置的相对贡献。

Transformer-XL 的相对位置编码在长序列语言模型任务上带来了显著提升,使模型能更好地利用超出训练片段长度的上下文。它证明了正弦编码+轻量级可学习偏置的组合可以实现非常强大的相对位置效果。后续一些模型(如Transformer-XL的改进版XLNet,以及一些长文档Transformer)也采用了类似思想。


注意力偏置法:T5 相对位置和 ALiBi

另一类相对位置编码方法是将相对位置信息作为注意力得分的偏置项。这种方法与上文Shaw的方法有相似之处,但实现更简单一些:它不涉及查询与相对向量的点积,而是直接为注意力logits增加一个与位置差相关的数值偏置。代表性例子包括T5模型的相对位置编码和近期提出的ALiBi(Attention with Linear Bias)方法。

T5 的桶化相对位置偏置:T5 (Raffel et al. 2019) 使用了一种基于相对位置桶 (relative position bucket)的策略。具体来说,他们没有为每个可能距离都学独立向量,而是将距离划分为若干桶(bucket)。这些桶对应距离范围,比如“距离为1”、“距离为2”、“距离为3-4”、“距离为5-8”、“距离 $ \geq $9”等等(具体桶划分策略T5论文有详细规则,包括对正向和反向距离分别处理)。然后为每个桶学习一个标量偏置值。在注意力计算中,如果 query 和 key 之间的相对距离落入某个桶,则将该桶对应的偏置加到注意力得分上。

形式上,如果我们用 $ \mathbf{b}(\mathbf{i},\mathbf{j}) \mathbf{b}(\mathbf{i},\mathbf{j}) \mathbf{b}(\mathbf{i},\mathbf{j}) $ 表示 iii 到 jjj 的距离所属的桶,那么 T5 的注意力得分计算为:

形式上,如果我们用 $ b(i,j) $ 表示 i 到 j 的距离所属的桶,那么 T5 的注意力得分计算为:

$$ e_{i j}=\frac{\mathbf{q}{i}\cdot\mathbf{k}, $$ }}{\sqrt{d}}+B_{b(i,j)

其中 $ B_{b} $ 是该桶的可学习偏置标量。这样,相距不同程度的元素在注意力score上会有不同的恒定加成或减成,而不改变内容向量本身。

T5 将每个注意力头都分配了一套独立的偏置值(因为不同注意力头可能希望关注不同尺度的距离),因此 B B B 的形状是 (num_heads, num_buckets)。在实际实现中,会构造一个相对距离矩阵,然后查表获取对应的偏置矩阵加到注意力scores上。这样做的效果与 Shaw 方法相似,但实现上更加简洁,因为它融入注意力softmax之前的一次加法操作,不额外改变 Q, K, V 的维度交互。


ALiBi(Attention with Linear Biases):这是2021年提出的一种更简单的相对位置偏置方法,其目标是让Transformer在训练较短序列的情况下,也能在推理时处理更长序列而不性能严重下降。ALiBi的做法是,为每个注意力头预设一个固定的斜率值,并按照相对距离线性地减小注意力得分。具体而言,针对自回归(因果)注意力场景,它定义对于查询位置i、键位置j(通常 $ j \leq i $),增加一个偏置:

$$ e_{i j}:=\frac{\mathbf{q}{i}\cdot\mathbf{k}\cdot(i-j), $$ }}{\sqrt{d}}=-m_{h

其中 $ m_{h} $ 是第 h 个注意力头的一个常数斜率。也就是说,对于相差 $ (i-j) $ 个位置的两词,按距离乘以 $ m_{h} $ 给予一个负的惩罚bias,距离越远惩罚越大(使得注意力得分降低)。这些斜率 $ m_{h} $ 选择为一组预先定义的值(例如论文中使用了不同头不同的斜率,从较大到较小,以确保有的头关注更局部,有的头可关注更全局)。

ALiBi 的显著特点是不用训练任何位置参数(斜率是固定的超参),并且因为偏置是线性随距离增长的,它在序列长度超出训练长度时可以自然外推(继续线性增长)。实验显示,ALiBi 模型在训练只用512长度的情况下,推理长度拓展到2倍、4倍时性能依然保持较好,相对标准绝对位置模型有明显优势。在大型语言模型应用上,ALiBi提供了一种训练成本低又能泛化的方法。不过ALiBi的缺点是它编码的信息较粗,只是简单的“越远越罚”,没有捕获具体的距离模式(不像桶化那样精细区分不同距离段)。

小结:无论Shaw的embedding法,Transformer-XL的偏置法,还是T5/ALiBi这种显式bias法,它们都属于相对位置编码范畴,目标是在注意力机制中直接或间接引入 $ |i-j| $ 或 $ (j-i) $ 的信息。其共同优势在于:

长序列泛化好:模型对模式的学习更多地基于相对距离而非固定位置,因此更容易泛化到比训练序列更长的情况,因为长序列虽然有新的绝对位置,但相对距离分布可能还是类似的。

顺序移位不敏感:当输入序列前面插入或删除一些元素时,相对位置编码驱动的注意力模式受影响较小,因为只要相对关系不变,注意力就不致发生剧烈变化。这对处理如段落插入、列表交换等情况有益。

性能提升:在机器翻译、语言模型等任务上,相对编码往往带来小幅到中等的性能提升。这已在多篇研究中得到验证。


当然,相对位置编码的代价是实现复杂度提升,以及有时引入额外参数或计算(不过诸如ALiBi没有额外参数)。现在Transformer的一些优化实现(如Google的Tensor2Tensor库、Fairseq等)已经集成了相对位置编码作为可选项。

值得注意的是,相对位置编码并不是对所有任务都必要或有效。例如,一些需要明确绝对序列位置的任务(如某些需要预测全局位置的设置)下,纯相对编码可能不足。因此有研究也探讨结合绝对和相对编码。Shaw等人曾发现,单独相对编码已经足够,与绝对编码叠加并未进一步提升翻译质量。实际应用中,一些模型(如T5)完全摒弃了绝对编码,而诸如BERT这类模型则仍用绝对编码(因为预训练句子长度有限且固定512,没有特别需求用相对编码)。

旋转位置编码 (Rotary Positional Encoding, RoPE)

近年来提出的旋转位置编码 (RoPE) 为绝对位置编码提供了新的实现思路。它由 Su 等人 (2021) 提出并用于 RoFormer 模型,此后被应用在一些长文本Transformer如 GPT-NeoX、LLaMA 等中。RoPE 的独特之处在于:它并不为位置生成一个可加的向量,而是通过在多维空间中旋转向量来编码位置信息。这种方法自然地将绝对位置转换为了查询与键之间相对位移影响,同时具备灵活长度和低开销等优点。

原理概述

旋转位置编码的想法可以这样理解:对于 Transformer 中注意力的 Query 和 Key 向量,我们对它们应用一个依赖各自绝对位置的旋转变换,使得它们的点积内含相对位置的信息。

具体来说,假设我们有查询向量 $ \mathbf{q}i $(对应序列位置 $ i $)和键向量 $ \mathbf{k}_j $(对应序列位置 $ j $)。在标准注意力中,它们的点积 $ \mathbf{q}_i \cdot \mathbf{k}_j $ 决定了位置 $ i $ 对位置 $ j $ 的注意力相关度。RoPE 引入一个特殊的变换 $ \text{RoPE}(\cdot) $,将原始向量映射为“旋转后的”向量:}

$$ \tilde{\mathbf{q}}{i}=\mathrm{R o P E}}(\mathbf{q{i}),\qquad\tilde{\mathbf{k}}}=\mathrm{R o P E{j}(\mathbf{k}). $$

然后,用 $ \tilde{\mathbf{q}}i \cdot \tilde{\mathbf{k}}_j $ 进行注意力计算。关键在于,RoPE 设计 $ \mathrm{RoPE} $ 使得这个点积可转换为关于 $ (i - j) $ 的函数,进而实现相对依赖。

那么 RoPE_{pos} 究竟是何种变换?简单来说,它是对向量按照固定的二维分块进行平面旋转。将向量的维度按每2维分成对,比如对 $ \mathbf{x} = [x_0, x_1, x_2, x_3, \ldots] $ 这样一个d维向量,我们把每相邻的2维看成一对:(x_0, x_1)、(x_2, x_3)、...。对于每一对,我们定义一个与位置相关的旋转角度,将该二维向量在平面上旋转该角度。这个旋转角度通常设置为与正弦位置编码类似的形式,以确保不同维的旋转角不同。


具体定义如下:令 d 为偶数。对于位置 pos 和向量维度对索引 m(即第 2m 和 2m+1 维),定义旋转角度:

$$ \theta_{m}(p o s)=p o s\times\omega_{m}, $$

其中 $ \omega_{m} $ 是一个预设的频率因子,可取 $ \omega_{m} = 10000^{-2m/d} $,与正弦编码的频率分布一致。然后定义:

$$ \mathrm{R o P E}{p o s}(x)(p o s), $$ }=x_{2m}\cos\theta_{m}(p o s)-x_{2m+1}\sin\theta_{m

$$ \mathrm{R o P E}{p o s}(x)(p o s). $$ }=x_{2m}\sin\theta_{m}(p o s)+x_{2m+1}\cos\theta_{m

这实际上就是将 $ (x_{2m}, x_{2m+1}) $这个二维向量顺时针旋转 $ \theta_{m} $ (pos) 角度(注意上面公式是经典二维旋转矩阵乘法的形式)。对每一对维度都做类似的旋转,角度大小随维度指数 $ m $线性变化(因为 $ \omega_{m} $ 通常取指数规律下降)。

这样,我们对查询和键分别根据各自的位置旋转。在旋转后的空间中,它们的点积可以展开分析。对于每个二维对来说,如果忽略不同对之间的耦合(假设向量各对独立),可以推导得到:

$$ \tilde{\mathbf{q}}{i}\cdot\tilde{\mathbf{k}}}=\mathbf{q{i}\cdot\mathbf{k}(j))+(一些正弦交叉项)。 $$ }\cos(\theta_{m}(i)-\theta_{m

其中出现 $ \cos(\theta_m(i) - \theta_m(j)) = \cos((i - j)\omega_m) $。这意味着每个维度对对点积的贡献都含有一个 $ \cos((i - j)\omega_m) $ 因子。当我们把所有维度求和,点积就包含了各种 $ \cos((i - j)\omega_m) $ 和 $ \sin((i - j)\omega_m) $ 组合的项。总效果类似于模型获得了与相对距离 $ (i - j) $ 有关的振荡因子调制,从而使点积值依赖于相对位置。

尽管上式还有一些 \(\sin\) 的交叉项,但通过更加形式化的推导,\(\mathbf{S}\mathbf{u}\) 等人证明这种旋转会带来显式的相对位置相关性。直观理解,如果 \(i = j\)(相对距离0),那么 \(\tilde{\mathbf{q}}_i \cdot \tilde{\mathbf{k}}_j = \mathbf{q}_i \cdot \mathbf{k}_j\),没变化。但如果 \(j\)\(i\) 差1,那么 \(\tilde{\mathbf{q}}_i \cdot \tilde{\mathbf{k}}_{i+1}\) 会因旋转角度差 \(\theta_m (i + 1) - \theta_m (i) = \omega_m\) 而打一个相应的余弦折扣。距离越大,不同维度的旋转位相差越多,叠加后整体点积值往往随距离增大而减小(因为各维度可能出现正负抵消,更远距离导致更多相位错位,点积平均值趋向降低)。这实际带来了一个随距离衰减的效果,这也是论文所称“decaying inter-token dependency with increasing relative distances”的由来。

特性和优势

RoPE 的特点可以总结如下:

绝对位置->相对关系:RoPE编码是绝对位置的函数,但经过点积,自然融入了相对位移。因此它既保持绝对定位,又将效果体现在相对关系上。这有点类似于同时拥有绝对和相对编码的优点。


无限长的扩展性:与正弦位置类似,RoPE通过公式确定旋转角度,对于任意大的 pos 都可以计算。不会存在embedding矩阵的长度限制问题。理论上它也存在周期性(当 θ m(pos)增加 2 π 时回到原角度),不过通过合理选择频率(和正弦编码一致)使得周期非常长,不易在正常长度内重复。

参数零增加:RoPE 不需要额外的可学习参数(除了可能固定的频率基数外,一般直接用10000基底或者其他常数因子即可)。仅仅改变向量的使用方式,这对模型参数量和内存没有任何额外开销。

训练稳定:实践中,RoPE 被发现有助于大模型训练的稳定性和泛化。例如LLaMA模型使用RoPE后,允许在较短上下文训练下仍能拓展到更长上下文应用,而且相比绝对embedding在长距离上困惑度上升缓慢。

实现简单:虽然概念新颖,但实现RoPE相对简单。只需在Transformer每层计算Q,K时,对它们应用旋转。很多开源实现已经提供了RoPE的高效向量化操作。下面是一个PyTorch风格的伪代码来演示RoPE应用:

上面代码展示了对每个位置预先算好对应各维度对的 $ \sin $ 和 $ \cos $ 值表 $ \sin_{table} $、 $ \cos_{table} $(这相当于 $ \sin(\theta_m(pos)) $ 和 $ \cos(\theta_m(pos)) $)。然后 apply_rope 函数对任意给定的 Q 或 K 向量矩阵应用 RoPE 变换。实际实现会处理多头和 batch 维度,但原理相同。

值向量是否旋转:值得一提的是,RoPE通常只对Q和K应用(影响注意力计算),对V(value)是否应用理论上可以选择。RoFormer论文指出,对V进行旋转也能在某些场景提升性能。但在大多数实现中,如GPT-NeoX和HuggingFace的RoPE实现,通常仅对Q,K使用旋转(即rotary_value=False),因为值向量携带内容,旋转与否对最终表示如何解码影响未完全明确。仅Q,K旋转已经足够提供相对位置信息。

应用效果: RoPE 在长文本分类、语言模型上被验证有效。例如RoFormer在长文本分类基准上超过其他位置编码方法。同时,RoPE在一些开源大模型如GPT-J、GPT-NeoX中作为默认位置编码,用于支持较长上下文长度。Meta的LLaMA模型也采用了RoPE,使其在2k上下文训练后可以较稳健地扩展到4k甚至更长。在图像Transformer中,最近也有工作尝试将RoPE用于视觉patch的位置编码,以增加相对位置信息。

可能的局限:虽然RoPE看起来很理想,但也要考虑:

频率基数选择:RoPE的旋转频率选择和正弦编码一样重要。如果频率过低,模型在给定长度内感知不到显著变化;频率过高则可能导致周期过短、干扰注意力。所以通常沿用正弦编码的经验(基数


10000),这似乎在各种长度下工作良好。一些实现可能尝试不同基数调整RoPE的“分辨率”。

极长距离:理论上,如果序列长度接近某些维度的周期,可能出现注意力混淆。但由于频率指数关系,各维周期差异巨大,很难同时周期对齐,因此问题不大。

直观解释:RoPE的效果有点难以直接解读,相比embedding方法,每维数值不再直观表示“位置特征”,而是一种隐式通过向量匹配体现的位置关系。这对人类来说不太透明。不过从模型效果角度,这并不妨碍其实用性。

综上,旋转位置编码提供了一种巧妙且高效的位置编码机制,正日益受到关注并应用于新型Transformer模型中。它融合了绝对和相对的长处,在无需额外参数的情况下,使模型具备相对位移的敏感性,是Transformer位置编码演化中的一座重要里程碑。

其他变种位置编码

除了上述主要的方法之外,学术界和工业界还探索了其他多种位置编码的思路,以满足特定场景需求或改进模型效率。本节我们介绍几类值得注意的变种,包括二进制位置编码、稀疏/低秩位置编码以及轴向位置编码等。这些方法有的仍处于探索阶段,但为我们理解位置编码的灵活性提供了有益启发。

二 进制位置编码 (Binary Positional Encoding)

二进制位置编码的出发点是:与其为每个位置学习一个独立的向量,是否可以用一组更简洁的基来组合表示位置?二进制编码借鉴了数字的二进制表示法,将位置索引视为一个二进制数,然后用每个二进制位对应的嵌入来组合出最终的位置表示。

举例来说,假设我们考虑位置的二进制表示,有 \(m\) 位(二进制位)可以覆盖所需的位置范围。对于位置 \(pos\),我们计算它的二进制位序列 \((b_{m-1}, b_{m-2}, \ldots, b_0)\),其中 \(b_k \in \{0,1\}\)。然后我们为每个位位置 \(k\) 准备两个向量:\(\mathbf{e}_{k,0}\) 表示该位为0时的向量,\(\mathbf{e}_{k,1}\) 表示该位为1时的向量。那么我们可以定义 \(pos\) 的位置编码为:

$$ \mathbf{p}{pos}=\sum. $$ }^{m-1}\mathbf{e}_{k,b_k


这意味着我们将 pos 的表示看作是由它的各二进制位的“贡献”累加而成。当某一位为1时,加上该位对应的1向量,为0时则加上0向量(或者可以不加,因为0向量可以定义为零向量)。通过这种方式,我们只需要学习 $ m \times 2 $ 个向量(或 m 个,如果将0对应的向量设为零)就能表示高达 $ 2^m $ 个不同的位置。比如,如果我们用16位二进制来编码位置,那么只需学习16组向量,就能区分最多 $ 2^{16} = $ 65536 个位置——相当于传统embedding长度65536的情况下参数大幅减少。

优点:二进制编码的优点在于参数效率极高且具有一定泛化性。因为在训练时模型会见到各种组合的位向量,从而理论上可以推广到比见过的更大位置(只要这些位置在二进制位上不出现全新模式,其模式其实不新,只是数字更大,但由已有位组合而成)。例如,如果模型训练时见过0-127(7位二进制)的位置,那么对于128(1000 0000)这样训练未见过的位置,它的二进制组合模式虽然没同时出现过,但各个位向量都见过,模型可以组合它们表示128的位置。

挑战:然而,二进制位置编码也有挑战:

叠加的线性可分性:将位向量线性相加是否足以让模型区分不同位置?两个不同的位置的二进制组合可能有部分位相同,导致部分向量相加模式相似,模型需要通过非线性层去区分这种线性组合,这增加了一定难度。Transformer 的注意力和后续层需要有能力解混这些叠加的位信号。

缺少顺序递增的直观结构:二进制表示在数值上相近的两个数,二进制形式可能差别很大(比如7是0111,8是1000,汉明距离为4)。这意味着相邻位置在二进制编码空间中可能距离较远。如果模型没有足够能力去学习顺序关系,可能会对局部顺序不敏感。相比之下,正弦编码或可学习编码通常保证相邻位置的表示在向量空间距离较近,二进制编码在这方面有所牺牲。

尽管如此,二进制位置编码代表了一种有趣的思路,即用更少的基函数来表示更多的位置。类似的,还有使用其他基数的编码(比如三进制、四进制)或者Gray码(格雷码,邻近数只有一位不同)来改进邻近位置的汉明距离问题。此外,也可以对二进制位的embedding使用小的前馈网络进一步处理,从而缓解简单线性叠加的局限。这些变种在学术上都有一定讨论,但尚未成为主流方案。不过,随着对超长序列(如十万甚至百万长度)的需求出现,二进制编码的参数节省特性可能变得有吸引力。

稀疏和低秩位置编码

“稀疏位置编码”没有一个严格统一的定义,这里我们借此概念指一些旨在降低位置编码参数复杂度或者引入稀疏结构的方法,包括将位置编码向量表示为若干基向量组合、或者通过函数生成位置编码而非查表。一些相关的思路如下:


低秩分解位置编码:既然每个位置向量维度很高(与模型维度相同),是否可以用更低维的表示组合出这些向量?一种想法是将每个位置向量看作若干基向量的线性组合。这类似于主成分分析的想法。如果发现所有位置向量实际上在某个子空间内变化,那么只需学习子空间基向量和每个位置对应的系数。这将减少参数存储。不过预先并不知道这个子空间,可以尝试用训练中自适应学习。

显式稀疏编码:选择让每个位置向量在某种基空间中是稀疏的。例如,可以令每个位置向量只有极少的若干维非零,其余为零(这相当于每个位置激活少数几个基向量)。这样模型如果能利用这些稀疏结构,也许对泛化有益。不过硬编码这个结构比较困难,需要模型自己学习出稀疏。

函数生成位置编码:正弦编码其实就是一种由解析函数生成的位置编码。有没有其他函数可以生成“更好”的编码?研究者尝试过使用随机函数或可学习的函数。例如,使用随机初始化的小网络(比如MLP)输入pos输出embedding,让这个小网络的参数在训练中更新或者干脆固定随机。这种方法能产生像正弦那样平滑的模式,但会引入参数和计算开销,不见得优于直接embedding。

混合编码:有些模型同时使用多种位置编码,例如既有绝对embedding又有相对bias。这可以视为一种“稀疏组合”,因为模型可以通过调整权重决定依赖哪个来源。DeBERTa模型就是一个例子:它使用绝对位置编码(disentangled方式)和相对偏置两种,发现二者结合带来了提升。不过DeBERTa的定位更多是将内容和位置分开编码,再融合,相当特别。

总的来说,“稀疏/低秩”角度的方法目前并没有成熟的通用方案,多是理论探讨。其出发点往往是希望减少参数或增强泛化,但需要确保模型仍能容易地解码出准确的位置关系。目前主流实践中,直接embedding或固定函数法已经能满足大部分情形,除非遇到极端长序列或设备受限,否则动力略显不足。

轴向位置编码 (Axial Positional Encoding)

轴向位置编码是一种针对长序列或多维输入的特殊位置编码方案。它最早在图像Transformer中引入,后来在长序列Transformer(如BigBird、ETC等)中也有应用。轴向编码通过拆分序列位置为多维坐标来减少参数和方便扩展。


Image

$$ \mathbf{p}{pos}=\mathbf{a}. $$ }+\mathbf{b}_{j

轴向编码本质是一种因式分解:它假设序列位置可以由多维因子刻画。这在文本序列中本是人为制造的维度,但在二维数据如图像中是自然而然存在的维度(行和列)。因此,轴向编码在图像Transformer中首先出现:比如早期的Image Transformer模型,将图像看成 H × W的patch网格,分别给每个行和列embedding,再相加得到patch的位置embedding。这样可以高效地扩展到不同分辨率,因为若图像尺寸变化,只需要行或列embedding适当插值/延长即可,不必完全重新学新的embedding矩阵。

优点:

参数高效:如前所述,极大减少embedding参数量,在长序列Transformer(如512以上长度)中非常有用,减小模型体积和内存占用。

隐含结构:轴向编码为序列引入了一个“矩形结构”假设。这有时可以带来额外好处。例如,在文本中,可以人为地将长序列切块,当成多行排列,让轴向编码的两轴分别代表粗略的位置和细粒度的位置,模型也许能更好捕获段落级别模式(虽然这是推测)。在图像中,轴向编码明确捕获了横向和纵向的位置,当图像大小变化时可以相应调整embedding而不失去位置先验。

组合泛化:轴向编码的两个轴embedding组合起来,可以表示比训练时更大范围。例如,如果需要支持 $ P \times Q $ 网格比训练时更大,我们可以增加一点 P 或 Q,模型对新出现的 $ (i,j) $ 组合可能也能处理(只要新增加的行向量或列向量得到初始化并训练fine-tune)。不像绝对embedding必须整个向量是新的,轴向embedding扩展时大部分维度(另一轴)仍沿用已有embedding。


可能的问题:

人为结构未必最佳:将序列强行视为二维可能并不总有意义。文本序列按轴分解只是数学手段,没有真正的“行列”概念(除非是诗歌或分段文本有自然二维结构)。因此轴向编码在文本上更多是为压缩参数,而非提供更好的表示。当然模型可以学着把这当技巧忽略或善用。

边界效应:在轴向编码中,一个序列位置在行轴上和下一个位置如果跨行,那么他们的行embedding完全不同、列embedding从最大变到0,这种不连续性可能需要模型去适应。不过如果序列按顺序填满网格,这种跨行位置本就是不相邻的,自注意力本就不强调紧邻顺序,所以影响不大。

灵活性:轴向编码通常固定分解大小,比如 $ 64 \times 64 $。如果序列长度不是这个正好乘积,可能需要一些padding或者不规则处理。BigBird等模型由于是固定长输入,还好安排。但在可变长场景,下满最后一行的部分embedding需要处理(通常直接也加相应行列embedding,只是有些列embedding永远不会被用到因为最后一行没填满,不过这不伤大雅)。

总的来说,轴向位置编码提供了一种折中方案:它牺牲了一定的绝对唯一性,用组合来表示位置,从而换取参数效率,并在某些情况下带来泛化或适应优势。对于超长序列(上万长度)的Transformer,以及多维输入(图像、表格等),轴向编码是一个值得考虑的方法。

值得一提的是,除了轴向,还有类似的分块位置编码思想。例如,将长序列按块标号,每块内部再编码局部位置。这可视作一种两段式绝对编码,也能够减少embedding大小并稍带相对性质。这些与轴向思路类似,都是试图因式分解位置。

其他新兴方法

除了以上类别,还有一些新兴或零散的方法值得一提:

Permute, Retrieve, Generate: 有研究探索不使用固定位置编码,而是在训练中让模型自己产生或调整位置编码。例如2021年的一些工作尝试用小的RNN或者Flow模型根据索引生成embedding,而不是简单查表。这可以看作将固定函数(如sinusoid)换成一个可训练函数。这类方法目前尚未显示决定性优势。

混合模型:部分Transformer替代模型(如一些图结构Transformer)抛弃了全局序列位置概念,而是用节点之间的关系(图邻接)替代位置。这离开了我们本文的范畴,但值得知道有些任务上位置可以通过其他方式提供,例如通过附加坐标特征到输入(特别在多模态任务里,如给视觉Transformer提供patch在图像中的坐标值作为一个特征embedding)。


相对位置的扩展:相对位置编码也在不断改进。例如,将Shaw的方法扩展到更高阶关系,不仅编码距离,还编码方向(上下文方向)甚至语法距离等。但这些更像任务特定的特征工程,在通用Transformer层面少见泛用。

总体来说,各类变种方法体现了研究者在参数效率、泛化能力和任务适配方面的多种尝试。尽管目前Transformer的位置编码主要还是几种主流方案统治,但这些探索丰富了Transformer的工具箱,对于特殊需求时可能提供更好的选择。

不同任务中的位置编码选择

位置编码在不同任务和领域的重要性和最佳选择有所不同。本节我们对比NLP、CV(视觉)和多模态等领域中位置编码的应用,讨论它们各自的背景需求、常用方案以及优劣取舍。

NLP任务中的位置编码

在自然语言处理(NLP)任务中,Transformer广泛应用于机器翻译、语言模型、文本分类、问答等各类问题。对于大多数NLP任务,输入是一维的单词/字序列(或子词序列)。以下是NLP中位置编码的应用情况:

机器翻译:Transformer 最初就是为机器翻译设计的。在典型的翻译模型中,输入和输出都是句子序列长度通常在几十以内,但可能有长句出现。原始Transformer使用正弦位置编码,被证明在翻译质量上足以媲美可学习编码。后来一些翻译模型(如Transformer with relative position)引入相对位置编码,报告了小幅提升。总体而言,在翻译场景,由于句子通常不会超过数百长度,使用固定绝对或可学习绝对都可以胜任,提升不明显。而相对编码可以提升一点BLEU,因为翻译需要捕捉远距离依赖,如主语和谓语相隔较远,Relative可以帮助对齐这些依赖。

语言模型(文本生成):自回归语言模型(如GPT系列)基于TransformerDecoder来生成文本,典型长度从几百到几千词。早期的GPT-2使用可学习绝对位置编码(长度设为1024)。后来GPT-3扩展上下文到2048,也还是可学习绝对编码。实践中发现,如果硬要扩展GPT-2模型到超出训练长度(比如训练到1k要用到2k),性能会急剧下降,因为embedding没有定义或外推性差。为此OpenAI的GPT-3索性在训练时就用了2k长度embedding。近年来,为了扩展上下文长度到更大,很多开源LM如GPT-J、GPT-NeoX改用RoPE或ALiBi。这些方法在训练较短长度时仍能推理较长长度,而且对长距离文本的困惑度上升更缓慢。例如,使用RoPE的模型LLaMA在训练2k长度后,被用户实验发现可以稳定地生成4k甚至更长的文本,而GPT-2若超出训练长度会变得混乱。对于双向的语言模型如BERT,由于预训练句子最长512,使用可学习绝对embedding已足够且方便微调,所以BERT及其变种(RoBERTa等)基本都沿用了绝对embedding。然而,也有如DeBERTa模型用相对编码结合绝对(disentangled)实现提升,在GLUE基准取得好成绩。此外,用于长文档的BERT扩展(Longformer、BigBird等)为了处


理4k+长度,采用轴向编码或者局部+全局相对偏置,有效地扩展了BERT的长度能力。这些都属于NLP领域内因任务长度需求而做的位置编码调整。

长文档理解:摘要、长篇QA、小说生成等需要处理上千甚至上万词的任务,普通绝对位置编码难以应付这么长范围的信息。研究者开发了专门的长文Transformer,如Transformer-XL(相对位置+循环机制)、Longformer(局部注意力+全局token,绝对embedding)、BigBird(随机稀疏注意力+轴向位置编码)等。这些模型无一例外都对位置编码做了改动以适应长序列。Transformer-XL采用相对编码保证跨段连续;Longformer沿用RoBERTa绝对embedding但通过局部机制间接强调邻近关系;BigBird使用轴向embedding压缩参数。结论:对于需要处理超过512长度的NLP任务,相对位置编码或改进的绝对编码(如轴向)变得几乎必需,否则训练和推理都会遇到困难。

序列标注、句子分类等短文本任务:如果任务中的文本长度较短且固定(如单句分类通常几十词以内,NLI推理等),位置编码方法的选择对结果影响甚微。很多情况下,人们直接沿用预训练模型的embedding。如果从零训练小Transformer,也常用绝对可学习embedding,因为简单有效,模型不会出错即可。

预训练 vs 微调:有意思的是,一些NLP预训练模型在微调时尝试改变位置编码遇到了问题。例如T5预训练使用相对偏置,但有人尝试在微调阶段替换成别的方法并未取得好结果,说明位置编码最好在预训练时就定型。同时,微调时如果任务序列长度小于预训练,embedding没问题;若任务需要更长序列,则往往需要采用和预训练一致的方法拓展(如插值embedding、或者用相对编码继续用)。因此,预训练模型的选择也决定了微调怎么处理。当前趋势是新的大模型预训练普遍考虑长上下文,因此在NLP预训练中RoPE和相对偏置正变得流行(如T5、LLaMA都用这些)。

NLP任务中,若序列不长,绝对位置编码足以胜任且实现简单;当需要长文档能力时,相对编码、RoPE等提供了更好的选择,可提升性能和扩展性。下表总结了常见NLP模型的位置编码选择:

Transformer (原版,翻译): 固定正弦绝对编码 (长句少于512,一般够用)

BERT/RoBERTa (双向预训练): 可学习绝对编码 (512限制)

GPT-2/3 (单向LM): 可学习绝对编码 (1k-2k限制,训练覆盖上限长度)

T5 (encoder-decoder): 相对位置偏置 (更好泛化,便于跨句子)

Transformer-XL/XLNet (LM): 相对位置编码 (长依赖、跨segment)

Longformer(长文理解):可学习绝对+局部注意力(模式不同)

BigBird (长文): 轴向绝对编码 + 稀疏注意力 (高效长文)

LLaMA/GPT-NeoX (大模型): RoPE (长上下文泛化)


DeBERTa (双向预训练): 绝对disentangled + 相对bias (融合优点)

可以看到,越新的模型越倾向于相对或RoPE,传统模型多用绝对。

计算机视觉任务中的位置编码

视觉中的Transformer(如ViT、Swin Transformer、DETR等)需要处理图像/视频等二维甚至三维信号,位置编码的情况相比文本更为多样。主要区别在于:

数据天然有二维/三维结构:图像有高度和宽度两个维度,视频多了时间维度。因此,位置编码需要考虑多维坐标。

模型结构差异:有的视觉Transformer是纯Transformer输入为patch序列(如ViT将图像切成16x16块序列),有的是CNN+Transformer混合或特殊架构(如Swin对图像分区域做注意力)。因此位置编码注入的方式不同。

以下分情况讨论:

图像分类 (ViT):Vision Transformer (ViT) 将图像切成固定大小的patch序列(如 $ 14 \times 14 = 196 $ $ 14\times14 = 196 $ 个 patch,每 patch embedding 类似一个“词”)。ViT 采用可学习的绝对位置 embedding,长度等于 patch 数量。例如,对于 $ 14\times14 $ patches,就有一个长度为 196 的 embedding 序列。另外 ViT 还加入一个 class token 作为第 0 位置。ViT 作者报告,如果不加任何位置编码,模型性能会明显下降;用可学习位置编码效果良好。如果改用 2D 正弦位置编码(为每个 patch 的 $ (x,y) $ 坐标计算 sin/cos 类似 DETR 的方法),性能也可以但差异不大。因此他们选择了简单的 learnable 绝对编码。由于图像尺寸固定,外推性不是主要考虑(如果用不同尺寸,可以插值位置 embedding 的方法解决,比如将原有 embedding 看成网格插值到新尺寸网格上)。

目标检测与图像嵌入 (DETR):DETR是transformer应用于检测的模型。它在backbone提取的特征图上加位置编码,再送Transformer。DETR使用了2D的正弦位置编码:分别对宽度方向和高度方向用正弦公式编码,然后交织在一起形成每个像素位置的编码向量。公式与文本sinusoid类似,只是posx和posy分别编码不同维度。正弦编码在检测中有个优势:它提供了坐标的“度量”意义。模型可以从编码里解读出物体的实际位置、相对图像中心的位置等等(例如余弦模式可以让模型算出两个框距离)。DETR表明这种编码对Transformer理解空间位置信息很关键。

Swin Transformer 等局部注意力模型:Swin 将图像分成窗口,在窗口内做注意力,并引入相对位置 bias。具体来说,每个注意力头有一组参数,对窗口内像素(其实是 patch)之间的相对位移 ( $ \Delta x $, $ \Delta y $) 赋予一个偏置。这和 T5 的相对偏置概念类似,但换成 2D 的。由于窗口大小固定,这个相对偏置表不


大,可以学习。Swin发现加了相对bias的模型在ImageNet分类精度上有提升,说明局部相对位置帮助模型更好区分邻近关系。类似的,后续一些改进版ViT也尝试给global attention加一个相对bias以提升性能。

轴向编码在视觉:轴向embedding在视觉中其实很自然,因为图像就是二维。例如,一个简单做法是分别给每个可能的x坐标和y坐标各学习一个embedding,patch的最终位置编码=x_embed+y_embed。这种方案在一些实现中被采用,因为它参数更少而且能应对可变图像尺寸(如果图像尺寸变化,只需对embedding插值或截断,不用重新学一个全位置embedding矩阵)。Facebook的dinoViT等在处理不同尺寸patch时用过插值embedding。

视频Transformer:对视频帧序列处理时,有时间和空间3维。常见做法是在二维空间编码基础上,再对时间维再加一个编码,或者将时间看做第三轴做轴向embedding。例如TimeSformer模型对时间轴用正弦编码,空间用2D编码,结合起来作为整体位置。

卷积混合模型:一些视觉Transformer结合CNN,因此位置可能部分由CNN隐式提供,不完全依赖外加embedding。例如 Convolutional Vision Transformer(CvT)中卷积downsample提供位置信息,但仍可加小的相对偏置。DeiT(是ViT的一个变种)同ViT一样embedding。总之,在视觉分类/检测任务中,绝对位置编码依然常见,因为图像大小通常固定或变化不大,可学习embedding足够;而相对位置偏置作为提高局部关系捕获的补充也开始流行。

3D点云、图像生成等:在点云处理Transformer中,会用物体的三维坐标直接作为一种embedding(归一化为0-1),类似绝对位置。图像生成如GAN+Transformer,把二维位置编码进Transformer提升模型对像素位置的感知。

总的来说,视觉任务对位置编码的需求取决于任务是否需要精确的空间坐标。检测、分割等需要模型知道像素的绝对位置(左上角还是右下角),因此绝对位置编码(固定或学习)非常重要。如果模型没有绝对坐标,将无法输出定位信息。而分类任务主要需要知道相对局部模式(某特征在左上或右下对分类无影响,但整体结构影响分类),因此相对位置或有限的绝对位置信号即可,模型可以自己learn translational invariance。视觉中卷积天生有平移不变性,这和相对编码有点像,所以纯Transformer的视觉模型才需要补上位置信息,而CNN通常不需要特别的位置编码(除非做检测需加位置坐标)。


视觉任务模型位置编码方案
ViT (图像分类)可学习绝对位置embedding (按patch序列)
DETR (目标检测)2D固定正弦位置编码 (H×W特征图)
Swin (图像分类)滑动窗口+相对位置偏置 (窗口内相对坐标bias)
Axial-Deeplab 等轴向编码 (行+列embedding)
TimeSformer (视频)空间2D绝对 + 时间绝对/相对位置
Conviformer 等卷积提供部分位置, 另外可能加相对bias

在CV中,绝对位置编码往往不可或缺(特别是定位任务),相对编码多用作局部补充提升性能。轴向编码在图像中等价于2D绝对编码,常用于降低参数或适应变尺寸。RoPE目前在CV中少见应用,因为绝对坐标信息的直接解读对任务更重要(而RoPE提供的更多是相对信息)。当然,不排除未来视觉模型也尝试RoPE以获得某些旋转/尺度不变特性等。

多模态和其他领域中的位置编码

Transformer 也应用于多模态任务(如图文结合、语音文本结合)以及其他领域(如强化学习、蛋白质序列分析等)。这些场景下位置编码的处理需要兼顾不同模态各自的“位置”概念,有时相当复杂:

视觉-语言:如图像描述、视觉问答等任务通常有文本和图像两部分输入。常见做法是:图像部分用自己的位置编码(例如图像region特征会加上其bbox坐标编码或CNN位置信息),文本部分用文本的位置编码,然后通过Cross-Attention融合。为了让模型区分两个模态,有时还加上模态类型embedding或Segment embedding。在这种融合中,各自模态内的位置编码和单模态时一致。而如果是CLIP那种对比学习,文本Transformer和图像Transformer各自处理各自模态,互不影响,也各自有embedding。

音频-文本(语音识别):语音信号经过处理通常转成帧序列输入Transformer编码器,会用绝对位置编码(大多可学习或sinusoid)对音频帧编号。文本解码部分一样用自己embedding。因为语音帧相对顺序也很重要(时间顺序),不能丢。语音处理里也有人尝试Relative位置,考虑长语音,类似长文本处理。

强化学习序列建模:Transformer用于RL时输入可能是状态序列、动作序列等,也需要位置编码来区分时间步。通常用绝对embedding足够。如果把RL看成一段序列决策,Relative不常见,因为起始、终止时刻等绝对信息有意义。


蛋白质序列:生物序列(DNA、蛋白质)用Transformer也需要位置编码,它们序列往往很长(上千碱基)。有研究使用Alphabetembedding加相对位置偏置让模型关注邻近氨基酸关系。这有点类似NLP长序列情况。

代码序列:源代码作为序列输入代码Transformer,可用绝对embedding。但代码有结构(AST),有方法把AST关系当成相对位置的图关系嵌入,不过那属于Graph Position Encoding,不在本文细讲。

Segment Embedding:值得一提的是在BERT中,有一个“句子段embedding”,用于区分句子A和句子B。这其实不是时间顺序的信息,而是句子身份信息。严格说不算位置编码范畴,但有时跟位置embedding一起提到。Segment embedding也是一个简单的embedding加到每个词上,使模型知道这个词属于哪段。多模态中类似地会有模态embedding。这提醒我们,Transformer输入可以叠加多种embedding:词语embedding + 位置编码 + 段落/模态embedding + …。这些可以在不改变模型结构下,提供额外的信息。

小结:在多模态任务中,各模态通常各用各的位置编码,然后再结合。如果需要模型统一处理不同模态的序列,有时会在不同模态的序列位置上做一些偏置,防止模型混淆。例如,若将图像patch和文本token拼在一起给Transformer,可以将图像部分的位置index编号有意错开文本部分,比如文本0-127,图像128-255,即使长度各自没那么长,也是给它们预留区间,避免冲突。这种手工策略简单但有效。

各类位置编码的优势与局限对比

综合以上讨论,我们可以从多个维度对各种位置编码方法的优劣进行总结比较:

绝对固定正弦编码:

优点:无需训练参数;能外推到任意长度;提供多频率基信息帮助模型学习相对关系。

缺点:不能适应任务数据分布(模型需要自行拟合信号);长度非常长时会周期重复;无法针对特定位置赋予特殊意义(完全固定)。

典型用途:原始Transformer翻译模型,一些需要泛化长度的模型中继续采用或作为相对编码计算基底(如Transformer-XL)。

绝对可学习编码:

优点:灵活,由模型根据任务自由学习;实现简单高效;对于固定长度场景往往表现非常好(因为模型可以针对训练分布微调位置向量)。


缺点:不具备长度泛化能力,超出训练范围性能急剧下降;需要存储每个位置的参数,长度很大时内存和参数开销高。

典型用途:BERT、GPT等预训练模型(长度有限制但任务合适);ViT等视觉模型。

相对位置编码 (基于embedding):

优点:直接对关注的相对距离编码,位置移位不影响模型;适合长序列,泛化性好;往往提升模型对远距离依赖的捕捉能力。

缺点:实现复杂一些;需要限制相对距离范围,否则参数过多;对模型表示绝对位置不利(完全相对的话模型不知道句子开头结尾等全局位置)。

典型用途:Transformer相对位置信变体(翻译提升)、长文语言模型(Transformer-XL)、诸如BERT改进版(DeBERTa融合绝对和相对)。

相对位置编码(注意力偏置):

优点:实现简单(加bias);参数少(尤其ALiBi无参);易于结合预训练模型使用(如可在已有模型基础上加bias调优);能泛化到长距离(特别是ALiBi的设计)。

缺点:仅提供距离的信息,没有提供方向(有的实现分正负方向,有的例如ALiBi只能用于自回归单向,因为假设过去相对距离);表征能力较弱(一个标量vs一个向量,对复杂关系区分有限)。

典型用途:T5相对bias用于通用Encoder-Decoder;ALiBi在一些大语言模型上作为省事的长上下文方案。

旋转位置编码 (RoPE):

优点:无训练参数;无限长度可扩展;自然结合相对关系;经实验证明对长文本建模效果好且稳定;理论上和正弦类似不会损失表示能力。

缺点:需要定制实现(不难,但常规框架没有开箱支持,需要手工处理Q,K);对非常大长度潜在周期性(但极少涉及);目前研究多数在文本,对其他模态效果尚需探索。

典型用途:新一代大语言模型(LLaMA等);一些需要长上下文的文本任务模型。

二进制/组合基编码:

优点:参数极少,表示范围极大;理论上可泛化;引入了一种更离散的编码方式。

缺点:相邻位置表示相差较大,模型学习顺序关系困难;尚无证据在大型模型上性能优于传统方法。

典型用途:学术探索(目前主流模型未使用,在超长序列特殊任务可尝试)。

轴向位置编码:


优点:参数效率高,适合超长序列;对2D/3D数据直观贴合;可一定程度泛化到不同长度/尺寸;实现也不复杂(embedding分两份求和)。

缺点:人为假设位置分解结构,不一定最优;需要选择合适的分解尺寸;对某些序列(如不能整齐填充grid)需处理边界。

典型用途:长文档Transformer(BigBird等);视觉Transformer(可变图像尺寸下);以及多维序列数据(接上文)

无位置编码:值得一提,一些特殊Transformer尝试不使用任何明确的位置编码,由模型自己在训练中推导顺序关系。这基本只在某些受限条件下可行(如输入序列本身携带顺序信息,例如序列元素是带时间戳的信号等)。大多数情况下,没有位置编码Transformer效果会大幅下降。因此除非有特殊原因,Transformer必须配备某种位置编码。

上表/上述比较可以帮助我们根据任务需求选择合适的位置编码方案。例如:

如果任务序列长度固定且不长(如短文本分类),可学习绝对位置编码可能是最直接有效的选择。

如果需要模型对顺序移位保持鲁棒(如机器翻译不同句法结构),相对位置编码有优势。

如需处理远超训练长度的序列(长文档总结等),考虑RoPE或ALiBi等容易外推的方法,以防长度分布变化。

在视觉和需要精确定位的任务上,绝对位置(二维编码)必不可少,而在局部关系建模上可以叠加相对bias增强。

参数受限场景(设备存储小但要处理长序列),轴向编码等能有效减小模型尺寸。

想进一步提升模型性能且愿意增加实现复杂度,可以尝试结合多种编码,如DeBERTa那样融合绝对和相对信息,或Dual-positional encoding等。需要注意的是融合可能需要仔细平衡,以免信息冗余或冲突。

结语

Transformer 架构中的位置编码从最初的简单正弦函数,发展出丰富多样的形式。它们从不同角度解决了 Transformer 对顺序敏感性的关键问题。绝对位置编码赋予模型对序列每个具体位置的标识,使 Transformer 能够区别开头、中间、结尾。相对位置编码则让模型直接感知元素之间的距离和顺序关系,提升了模型对长距离依赖的刻画能力和顺序不变性。旋转位置编码提供了一种结合绝对和相对的创新方案,在保留绝对信息的同时,通过向量空间操作实现了相对位移效果。其它诸如二进制、轴向等变种则从参数高效性和结构先验出发,为特殊场景提供了可借鉴的思路。

如何选择和设计位置编码,需要综合考虑任务性质(序列长度、是否需要绝对位置信号)、模型结构(Encoder/Decoder、自回归/双向、多模态等)和实现代价。幸运的是,越来越多的研究给出了经验。例如,在长文本语言模型中引入RoPE或相对bias已成为趋势;在视觉Transformer中使用二维绝


对位置加局部相对bias能取得优秀结果;在需要泛化长度的模型中,避免纯可学习embedding而采用可外推的方法是稳健的做法。

未来,随着Transformer应用范围的扩展,位置编码可能还会出现新的变体和改进。例如,在极端长序列(如整本书)上,如何编码超长距离的段落信息?在非序列结构(如知识图谱)上,如何结合结构位置和序列位置?这些都可能诞生新的位置编码理念。同时,我们也可能看到动态位置编码(随输入内容调整)等高级机制的探索。

无论形式如何变化,位置编码始终服务于一个根本目的:赋予Transformer对顺序和结构的感知能力。这使得Transformer能够在不依赖递归或卷积的情况下,仍然高效地处理序列数据,建模元素间的先后和依赖关系。位置编码的重要性,犹如语言中的语法规则,虽不直接承载语义,但却是理解序列含义的基石。在Transformer架构不断演进的浪潮中,位置编码也将继续扮演举足轻重的角色。