2017年,Vaswani等人在《Attention Is All You Need》中提出了Transformer架构,用纯粹的注意力机制取代了循环神经网络。然而,这个革命性的架构有一个致命缺陷:自注意力机制天生不知道顺序

对于自注意力来说,“我喜欢苹果"和"苹果喜欢我"完全等价——每个token都平等地与其他所有token交互,没有任何先验的位置偏好。为了让Transformer理解序列,原始论文引入了绝对位置编码:将位置信息作为额外的向量加到词嵌入上。

这个看似简单的方案开启了一场持续七年的技术探索。研究者们逐渐发现,相对位置——两个token之间的距离——往往比绝对位置更重要。这场从"在哪里"到"离多远"的认知转变,催生了T5、ALiBi、RoPE等一系列创新,也深刻影响了今天所有大语言模型的架构设计。

绝对位置的困境

原始Transformer的绝对位置编码有两种实现:正弦位置编码可学习位置编码

正弦位置编码使用固定的三角函数:

$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d})$$$$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d})$$

其中$pos$是位置索引,$i$是嵌入维度索引,$d$是嵌入维度。每个维度对应一个不同频率的正弦波,理论上可以唯一标识任意位置。

可学习位置编码则更直接:为每个位置分配一个可训练的向量。位置0有向量$\mathbf{p}_0$,位置1有向量$\mathbf{p}_1$,依此类推。

这两种方法都面临同一个根本问题:外推能力为零

假设模型训练时的最大序列长度是512。当推理时遇到位置513的token,正弦编码可以继续计算(数学公式适用于任意位置),但模型从未见过这些位置的表示;可学习编码更糟糕——根本不存在位置513的向量。

更深层的问题在于:绝对位置编码假设每个位置都有独立的意义。但在语言中,真正重要的是相对关系。句子"我爱自然语言处理"中,“处理"的绝对位置并不重要,重要的是它在"语言"之后、是句子的最后一个词。

graph LR
    subgraph "绝对位置 vs 相对位置"
        A["绝对位置编码<br/>位置5 = 向量P₅"] --> B["问题: P₅₁₃不存在"]
        C["相对位置编码<br/>距离3 = 偏置B₃"] --> D["优势: 距离可无限延伸"]
    end

这就是相对位置编码的核心洞察:位置信息应该在注意力计算中引入,而非简单地加到输入上

Shaw的开创性工作

2018年3月,Peter Shaw等人在arXiv发表了《Self-Attention with Relative Position Representations》,首次将相对位置信息融入自注意力机制。

核心思想

Shaw的方案不再向输入添加位置向量,而是修改注意力分数的计算方式。对于位置$i$的query和位置$j$的key,注意力分数变为:

$$e_{ij} = \frac{\mathbf{x}_i \mathbf{W}^Q (\mathbf{x}_j \mathbf{W}^K + \mathbf{a}_{ij}^K)^\top}{\sqrt{d_k}}$$

其中$\mathbf{a}_{ij}^K$是位置$i$和位置$j$之间的相对位置表示,只依赖于距离$i-j$,而非绝对位置。

flowchart TB
    subgraph "Shaw相对位置注意力计算"
        A[输入X] --> B[Q = XW_Q]
        A --> C[K = XW_K]
        A --> D[V = XW_V]
        E[相对位置索引 i-j] --> F[相对位置嵌入 a_ij]
        B --> G[注意力分数]
        C --> G
        F --> G
        G --> H[Softmax]
        H --> I[加权求和]
        D --> I
        I --> J[输出]
    end

类似地,value的计算也引入相对位置:

$$\mathbf{z}_i = \sum_{j=1}^{n} \alpha_{ij} (\mathbf{x}_j \mathbf{W}^V + \mathbf{a}_{ij}^V)$$

这里$\mathbf{a}_{ij}^V$是另一个相对位置表示,用于调制value向量。

关键设计:距离分桶

Shaw意识到,直接为每个相对距离分配独立的向量会带来巨大的参数量。对于序列长度$L$,相对距离范围是$[-L+1, L-1]$,共$2L-1$种可能。

解决方案是截断:只考虑一定范围内的相对距离。设最大距离为$k$,则:

$$\mathbf{a}_{ij} = \mathbf{w}_{\text{clip}(i-j, -k, k)}$$

其中$\text{clip}(x, -k, k)$将$x$限制在$[-k, k]$范围内。超出范围的距离都映射到边界值。

graph LR
    subgraph "Shaw距离分桶策略"
        A["距离 -3"] --> B["桶 w_{-3}"]
        C["距离 -2"] --> D["桶 w_{-2}"]
        E["距离 -1"] --> F["桶 w_{-1}"]
        G["距离 0"] --> H["桶 w_{0}"]
        I["距离 1"] --> J["桶 w_{1}"]
        K["距离 2"] --> L["桶 w_{2}"]
        M["距离 >2"] --> L
        N["距离 <-3"] --> B
    end

这意味着相对距离为-5和-10的token(假设$k=4$)会共享同一个位置表示。这个设计有两个好处:

  1. 参数效率:只需要$2k+1$个相对位置向量,而非$2L-1$个
  2. 泛化能力:模型可以处理任意长度的序列,因为任何距离都映射到已知的表示

实验结果

在WMT 2014英德和英法翻译任务上,相对位置编码比绝对位置编码分别提升了1.3和0.3 BLEU分。更有趣的是,研究者发现结合相对和绝对位置编码并没有额外收益——相对位置编码已经足够。

这个结果暗示了一个重要结论:对于序列建模,相对位置信息可能比绝对位置信息更本质

T5的分桶策略

Google的T5模型将相对位置编码推向了工业化应用。T5使用了一种更精细的分桶策略,平衡了位置精度和参数效率。

混合分桶方案

T5的相对位置偏置不是简单的截断,而是采用对数缩放的分桶

  • 近距离:前16个位置(距离0-15)每个距离独立分配一个桶
  • 中距离:距离增大后,多个距离共享一个桶,桶的大小随距离增加而增长
  • 远距离:超过某个阈值的所有距离映射到同一个最终桶
graph LR
    subgraph "T5相对位置分桶策略"
        A[距离0] --> B0[桶0]
        A2[距离1] --> B1[桶1]
        A3[距离2] --> B2[桶2]
        A4[...] --> B3[...]
        A5[距离15] --> B15[桶15]
        A6[距离16-20] --> B16[桶16]
        A7[距离21-26] --> B17[桶17]
        A8[距离27-33] --> B18[桶18]
        A9[...] --> B19[...]
        A10[距离>阈值] --> B32[桶32]
    end

这种设计的直觉是:近距离的相对位置更重要,需要更精确的建模。当两个token相邻时,它们的具体距离(是紧邻还是隔一个词)对语义影响很大。但当它们已经相距很远时,距离是100还是101几乎无关紧要。

数学表达

设相对距离为$d = i - j$,分桶函数$b(d)$定义为:

$$b(d) = \begin{cases} d + k & \text{if } -k \leq d \leq k \\ 2k & \text{if } d > k \\ 0 & \text{if } d < -k \end{cases}$$

T5实际使用的分桶数量是32。注意力偏置为:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}} + B\right)V$$

其中$B$是相对位置偏置矩阵,$B_{ij} = \text{Embedding}(b(i-j))$。

与Shaw方案的区别

T5的方案相比Shaw有几个重要改进:

  1. 更高效的内存:Shaw的方案需要$O(L^2 d)$内存存储相对位置矩阵,T5只需要$O(b d)$,其中$b$是桶的数量
  2. 更好的长距离建模:对数分桶允许模型"记住"远距离的相对关系,而非简单截断
  3. 跨层共享:T5只在第一层存储相对位置嵌入,后续层复用

Huang的Skewing技巧

Shaw原始方案的内存开销问题,在2018年被Huang等人(Music Transformer论文)巧妙解决。

问题分析

Shaw的方案需要计算一个$L \times L$的相对位置矩阵,对于每个注意力头,这需要$O(L^2 d)$的内存。对于长序列,这是不可接受的。

Huang观察到,相对位置矩阵有一个特殊的结构:每个位置的相对位置向量可以通过偏移得到

flowchart TB
    subgraph "Skewing技巧"
        A["原始矩阵 QEr<br/>[B,H,L,L]"] --> B["左填充一列<br/>[B,H,L,L+1]"]
        B --> C["重塑形状<br/>[B,H,L+1,L]"]
        C --> D["移除第一行<br/>[B,H,L,L]"]
        D --> E["最终Srel矩阵"]
    end

Skewing操作

Huang提出了一个巧妙的技巧,避免显式构建$L \times L$的相对位置矩阵:

  1. 计算Query与相对位置嵌入的乘积:$QE_r^\top$,其中$E_r$是一个$L \times d$的矩阵
  2. 通过填充、重整、切片操作,将结果转换为正确的$L \times L$矩阵
def skew(QEr):
    # QEr: [batch, heads, seq_len, seq_len]
    # 步骤1: 左侧填充一列
    padded = F.pad(QEr, (1, 0))
    # 步骤2: 重塑形状
    reshaped = padded.reshape(batch, heads, seq_len+1, seq_len)
    # 步骤3: 移除第一行,得到正确的相对位置矩阵
    S_rel = reshaped[:, :, 1:, :]
    return S_rel

这个技巧将内存复杂度从$O(L^2 d)$降低到$O(Ld)$,同时保持了完全相同的计算结果。

ALiBi:线性偏置的优雅

2021年,Ofir Press等人提出了ALiBi(Attention with Linear Biases),这是相对位置编码的一次范式转变。

核心洞察

之前的方法都需要学习相对位置表示——无论是Shaw的可学习向量,还是T5的分桶嵌入。ALiBi提出了一个惊人的问题:相对位置信息是否根本不需要学习?

答案是:用固定的线性函数就够了

算法原理

ALiBi完全不使用位置嵌入。相反,它在注意力分数上添加一个与距离成比例的偏置:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(QK^\top - m \cdot |i-j|\right)V$$

其中$m$是一个固定的斜率,每个注意力头使用不同的$m$值。对于$n$个头,斜率按几何级数设置:

$$m_h = \frac{1}{2^{8h/n}}$$

这意味着第一个头的斜率最大(最强烈的近邻偏好),最后一个头的斜率最小(最弱的近邻偏好)。

graph TD
    subgraph "ALiBi多头斜率设计"
        A["Head 1: m=2^0=1.0"] --> B["强近邻偏好<br/>惩罚大"]
        C["Head 2: m=2^-0.67"] --> D["中等近邻偏好"]
        E["Head 3: m=2^-1.33"] --> F["较弱近邻偏好"]
        G["Head n: m=2^-8"] --> H["弱近邻偏好<br/>惩罚小"]
    end

为什么线性偏置有效

ALiBi的设计蕴含了深刻的语言学直觉:

  1. 近邻偏好是先验知识:在大多数语言任务中,相邻token之间的关系比远距离token更紧密。这个先验不需要学习。

  2. 多尺度建模:不同斜率的头捕捉不同范围的依赖关系。大斜率的头关注局部结构,小斜率的头可以"看到"更远。

  3. 无限外推:线性函数可以延伸到任意距离。模型在训练时见过距离0-1023,推理时可以自然处理距离1024-2047甚至更远。

实验验证

ALiBi在WikiText-103上的表现令人印象深刻:

  • 在1024长度上训练,直接在2048长度上推理,达到与在2048长度上训练的模型相同的困惑度
  • 训练速度快11%,内存占用少11%(不需要位置嵌入参数)

更重要的是,ALiBi在BLOOM等大规模模型中被采用,证明了其在工业规模上的可行性。

Swin Transformer:2D相对位置编码

相对位置编码不仅适用于NLP,在计算机视觉领域同样重要。Swin Transformer将相对位置编码扩展到二维空间。

从1D到2D

在图像中,位置是二维的$(x, y)$。两个像素之间的相对位置也是二维的$(\Delta x, \Delta y)$。

Swin的方案是为每个相对位置$(\Delta x, \Delta y)$分配一个可学习的偏置。对于一个$M \times M$的窗口,相对位置范围是$[-M+1, M-1] \times [-M+1, M-1]$。

graph TB
    subgraph "Swin 2D相对位置索引"
        A["像素位置 i: x_i, y_i"] --> C["Δx = x_i - x_j"]
        B["像素位置 j: x_j, y_j"] --> D["Δy = y_i - y_j"]
        C --> E["一维索引 = Δy × 2M-1 + Δx"]
        D --> E
        E --> F["查表得到偏置值"]
    end

索引计算

二维相对位置索引的计算比一维更复杂:

  1. 计算行方向相对位置:$\Delta y = y_i - y_j$
  2. 计算列方向相对位置:$\Delta x = x_i - x_j$
  3. 将二维索引转换为一维索引:$\text{idx} = (\Delta y + M - 1) \times (2M - 1) + (\Delta x + M - 1)$

这样,$M \times M$窗口内的相对位置可以映射到$(2M-1)^2$个桶中。

实现细节

Swin的相对位置偏置表是一个$(2M-1)^2 \times \text{num\_heads}$的可学习矩阵。在注意力计算时:

$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}} + B\right)V$$

其中$B$的每个元素$B_{ij}$通过相对位置索引从偏置表中查表得到。

DeBERTa:解耦注意力

Microsoft的DeBERTa提出了一种更精细的相对位置建模方式:解耦注意力

内容与位置分离

传统方法将内容和位置混合在同一个向量中。DeBERTa将它们完全分离:

  • 每个token有两个向量:内容向量$\mathbf{H}$和相对位置向量$\mathbf{P}$
  • 注意力计算考虑三种交互:内容-内容、内容-位置、位置-内容
flowchart TB
    subgraph "DeBERTa解耦注意力"
        A[输入Token] --> B[内容向量H]
        A --> C[相对位置向量P]
        B --> D[Qc = HWq]
        B --> E[Kc = HWk]
        B --> F[V = HWv]
        C --> G[Qr = PWq_r]
        C --> H[Kr = PWk_r]
        D --> I["注意力 = QcKc + QcKr + QrKc"]
        E --> I
        H --> I
        G --> I
        I --> J[Softmax]
        J --> K[加权Value]
        F --> K
    end

数学公式

解耦注意力的计算公式为:

$$A_{i,j} = \text{softmax}\left(\frac{Q_c K_c^\top + Q_c K_r^\top + Q_r K_c^\top}{\sqrt{2d}}\right)$$

其中:

  • $Q_c = \mathbf{H}_i \mathbf{W}_q^c$(内容Query)
  • $K_c = \mathbf{H}_j \mathbf{W}_k^c$(内容Key)
  • $Q_r = \mathbf{P}_{i-j} \mathbf{W}_q^r$(位置Query)
  • $K_r = \mathbf{P}_{j-i} \mathbf{W}_k^r$(位置Key)

注意这里的位置Query和位置Key使用对称的相对位置:$i-j$和$j-i$。这允许模型捕捉双向的相对位置关系。

为什么解耦更有效

解耦设计有几个优势:

  1. 更清晰的建模:内容和位置各自独立建模,避免信息混淆
  2. 更灵活的交互:模型可以学习内容-位置和位置-内容的不同交互模式
  3. 更好的泛化:相对位置编码允许处理任意长度的序列

Transformer-XL:递归中的相对位置

Transformer-XL将相对位置编码与段级递归结合,解决了超长序列建模问题。

段级递归的挑战

Transformer-XL将长序列分成多个段,每段的隐藏状态传递给下一段。这带来了一个问题:如何表示跨段的相对位置?

如果使用绝对位置编码,每段的token都有相同的位置索引(0, 1, 2, …),无法区分段内和跨段的位置关系。

相对位置的解决方案

Transformer-XL使用相对位置编码,自然解决了这个问题:

$$A_{i,j} = \frac{(\mathbf{W}_q \mathbf{E}_{x_i})^\top (\mathbf{W}_{k,E} \mathbf{E}_{x_j} + \mathbf{W}_{k,R} \mathbf{R}_{i-j})}{\sqrt{d}}$$

其中$\mathbf{R}_{i-j}$是相对位置编码。关键在于:相对位置$i-j$可以跨越段边界。如果当前段token位置是$i$,上段缓存的token位置是$j$,则$i-j$表示跨段距离。

这允许模型在保持位置感知的同时,无缝处理任意长度的序列。

长度外推:终极考验

相对位置编码的终极优势在于长度外推:在短序列上训练,在长序列上推理。

不同方法的对比

2023年,Kazemnejad等人系统比较了不同位置编码方法的长度外推能力,得出了一些反直觉的结论:

方法 外推能力 参数量 实现复杂度
绝对位置编码 $O(Ld)$ 简单
T5相对偏置 $O(bd)$ 中等
ALiBi 0 简单
RoPE 0 中等
无位置编码 0 最简单

最令人惊讶的是:无位置编码(NoPE)表现最好

NoPE的秘密

为什么移除所有位置编码后,模型仍然能理解序列顺序?

答案在于因果掩码。在decoder-only Transformer中,因果掩码强制每个token只能看到之前的token。这种结构本身就隐含了位置信息:位置$i$的token能看到$i$个token,位置$j$的token能看到$j$个token。

研究者进一步发现,NoPE训练后的注意力模式与T5的相对位置编码模式惊人相似。这表明:因果掩码已经提供了足够的相对位置信息,显式的位置编码可能是冗余的

工程实践:如何选择

在实际项目中,如何选择合适的位置编码方案?

决策框架

flowchart TD
    A[选择位置编码方案] --> B{需要长度外推?}
    B -->|是| C{外推幅度}
    C -->|大于4倍| D[ALiBi]
    C -->|2-4倍| E[RoPE + 插值]
    B -->|否| F{上下文长度}
    F -->|固定且短| G[可学习位置编码]
    F -->|固定且长| H[RoPE或T5]
    
    D --> I{实现复杂度约束}
    E --> I
    H --> I
    I -->|简单| J[ALiBi或可学习]
    I -->|中等| K[RoPE]
    I -->|复杂| L[T5或DeBERTa]

具体建议

  1. 短文本任务(<4K):可学习位置编码足够,实现简单
  2. 中等长度(4K-32K):RoPE是当前主流选择,平衡了性能和外推能力
  3. 超长文本或未知长度:ALiBi提供最佳外推能力
  4. 视觉任务:Swin的2D相对位置编码是标准选择
  5. 需要位置精确建模:DeBERTa的解耦注意力提供最精细的控制

实现注意事项

RoPE实现要点

  • 旋转角度通常使用$\theta_i = 10000^{-2i/d}$
  • 支持动态缩放以扩展上下文长度
  • 可以与ALiBi结合使用

ALiBi实现要点

  • 斜率按几何级数设置
  • 只在注意力分数上添加偏置,不修改Q、K、V
  • 因果模型中只需要考虑$j < i$的情况

T5实现要点

  • 分桶数量通常为32
  • 相对位置嵌入可以跨层共享
  • 需要处理padding token的位置

技术演进的时间线

timeline
    title 相对位置编码技术演进
    2017 : 原始Transformer
         : 正弦/可学习绝对位置编码
    2018 : Shaw等人
         : 相对位置表示
         : 截断分桶策略
    2018 : Huang等人
         : Skewing技巧
         : 内存优化
    2019 : Transformer-XL
         : 段级递归
         : 跨段相对位置
    2020 : DeBERTa
         : 解耦注意力
         : 内容-位置分离
    2020 : T5
         : 对数分桶
         : 工业化应用
    2021 : Swin Transformer
         : 2D相对位置编码
         : 窗口注意力
    2021 : ALiBi
         : 线性偏置
         : 零参数外推
    2023 : NoPE研究
         : 因果掩码隐含位置
         : 无需显式编码

总结与展望

从2018年Shaw的开创性工作到今天的ALiBi和NoPE,相对位置编码经历了从"可学习参数"到"固定公式"再到"隐式编码"的演进。这个演进过程反映了研究者对序列建模本质理解的深化:

  1. 位置的本质是关系:绝对位置编码假设每个位置独立存在,而相对位置编码认识到位置的意义在于关系。

  2. 近邻偏好是先验:ALiBi证明了线性距离惩罚是有效的先验知识,不需要从数据中学习。

  3. 结构即位置:NoPE表明,因果掩码的结构本身就编码了位置信息,显式的位置编码可能是冗余的。

未来的研究方向包括:更高效的实现(减少计算开销)、更灵活的表示(适应不同类型的位置关系)、以及与其他结构先验的结合(如层次结构、语义结构)。

相对位置编码的演进告诉我们:在深度学习中,有时候更简单的假设比更多的参数更有效。理解数据的本质结构,比盲目增加模型容量更能带来真正的进步。


参考文献

  1. Shaw, P., Uszkoreit, J., & Vaswani, A. (2018). Self-Attention with Relative Position Representations. arXiv:1803.02155.

  2. Raffel, C., et al. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Model. Journal of Machine Learning Research.

  3. Press, O., Smith, N. A., & Lewis, M. (2022). Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation. ICLR 2022.

  4. Huang, C. Z. A., et al. (2018). Music Transformer: Generating Music with Long-Term Structure. ICLR 2019.

  5. Liu, Z., et al. (2021). Swin Transformer: Hierarchical Vision Transformer using Shifted Windows. ICCV 2021.

  6. He, P., et al. (2021). DeBERTa: Decoding-enhanced BERT with Disentangled Attention. ICLR 2021.

  7. Dai, Z., et al. (2019). Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context. ACL 2019.

  8. Kazemnejad, A., et al. (2023). The Impact of Positional Encoding on Length Generalization in Transformers. arXiv:2305.19466.

  9. Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.

  10. Su, J., et al. (2024). RoFormer: Enhanced Transformer with Rotary Position Embedding. Neurocomputing.