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$)会共享同一个位置表示。这个设计有两个好处:
- 参数效率:只需要$2k+1$个相对位置向量,而非$2L-1$个
- 泛化能力:模型可以处理任意长度的序列,因为任何距离都映射到已知的表示
实验结果
在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有几个重要改进:
- 更高效的内存:Shaw的方案需要$O(L^2 d)$内存存储相对位置矩阵,T5只需要$O(b d)$,其中$b$是桶的数量
- 更好的长距离建模:对数分桶允许模型"记住"远距离的相对关系,而非简单截断
- 跨层共享: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$的相对位置矩阵:
- 计算Query与相对位置嵌入的乘积:$QE_r^\top$,其中$E_r$是一个$L \times d$的矩阵
- 通过填充、重整、切片操作,将结果转换为正确的$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的设计蕴含了深刻的语言学直觉:
-
近邻偏好是先验知识:在大多数语言任务中,相邻token之间的关系比远距离token更紧密。这个先验不需要学习。
-
多尺度建模:不同斜率的头捕捉不同范围的依赖关系。大斜率的头关注局部结构,小斜率的头可以"看到"更远。
-
无限外推:线性函数可以延伸到任意距离。模型在训练时见过距离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
索引计算
二维相对位置索引的计算比一维更复杂:
- 计算行方向相对位置:$\Delta y = y_i - y_j$
- 计算列方向相对位置:$\Delta x = x_i - x_j$
- 将二维索引转换为一维索引:$\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$。这允许模型捕捉双向的相对位置关系。
为什么解耦更有效
解耦设计有几个优势:
- 更清晰的建模:内容和位置各自独立建模,避免信息混淆
- 更灵活的交互:模型可以学习内容-位置和位置-内容的不同交互模式
- 更好的泛化:相对位置编码允许处理任意长度的序列
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]
具体建议
- 短文本任务(<4K):可学习位置编码足够,实现简单
- 中等长度(4K-32K):RoPE是当前主流选择,平衡了性能和外推能力
- 超长文本或未知长度:ALiBi提供最佳外推能力
- 视觉任务:Swin的2D相对位置编码是标准选择
- 需要位置精确建模: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,相对位置编码经历了从"可学习参数"到"固定公式"再到"隐式编码"的演进。这个演进过程反映了研究者对序列建模本质理解的深化:
-
位置的本质是关系:绝对位置编码假设每个位置独立存在,而相对位置编码认识到位置的意义在于关系。
-
近邻偏好是先验:ALiBi证明了线性距离惩罚是有效的先验知识,不需要从数据中学习。
-
结构即位置:NoPE表明,因果掩码的结构本身就编码了位置信息,显式的位置编码可能是冗余的。
未来的研究方向包括:更高效的实现(减少计算开销)、更灵活的表示(适应不同类型的位置关系)、以及与其他结构先验的结合(如层次结构、语义结构)。
相对位置编码的演进告诉我们:在深度学习中,有时候更简单的假设比更多的参数更有效。理解数据的本质结构,比盲目增加模型容量更能带来真正的进步。
参考文献
-
Shaw, P., Uszkoreit, J., & Vaswani, A. (2018). Self-Attention with Relative Position Representations. arXiv:1803.02155.
-
Raffel, C., et al. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Model. Journal of Machine Learning Research.
-
Press, O., Smith, N. A., & Lewis, M. (2022). Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation. ICLR 2022.
-
Huang, C. Z. A., et al. (2018). Music Transformer: Generating Music with Long-Term Structure. ICLR 2019.
-
Liu, Z., et al. (2021). Swin Transformer: Hierarchical Vision Transformer using Shifted Windows. ICCV 2021.
-
He, P., et al. (2021). DeBERTa: Decoding-enhanced BERT with Disentangled Attention. ICLR 2021.
-
Dai, Z., et al. (2019). Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context. ACL 2019.
-
Kazemnejad, A., et al. (2023). The Impact of Positional Encoding on Length Generalization in Transformers. arXiv:2305.19466.
-
Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
-
Su, J., et al. (2024). RoFormer: Enhanced Transformer with Rotary Position Embedding. Neurocomputing.