论文概述
论文标题: RoFormer: Enhanced Transformer with Rotary Position Embedding
作者: Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu
机构: Zhuiyi Technology Co., Ltd. (追一科技)
发表时间: 2021年4月
1. 面临的问题
1.1 Transformer的位置无关性
- 自注意力机制的局限: Transformer的自注意力架构本身是位置无关的(position-agnostic)
- 顺序信息的重要性: 词语的顺序对自然语言理解至关重要
- 需要显式编码: 必须通过额外的机制引入位置信息
1.2 现有位置编码方法的局限性
绝对位置编码
- 正余弦编码: 通过预定义函数生成,只在输入层添加一次
- 可学习编码: 作为模型参数训练,但位置信息容易在深层网络中被稀释
- 核心问题: 位置信息与语义信息混合,难以显式建模相对位置关系
相对位置编码
- 依赖学习: 需要模型隐式学习相对位置关系
- 架构限制: 不兼容线性自注意力架构
- 灵活性不足: 在序列长度变化时泛化能力较弱
1.3 实际应用中的挑战
- 长序列处理: 现有方法在处理超长序列时性能下降
- 序列外推: 训练长度外的序列处理能力差
- 距离建模: 缺乏自然的距离衰减特性
2. 解决思路
2.1 RoPE核心思想
提出**旋转位置编码(Rotary Position Embedding, RoPE)**方法:
- 使用旋转矩阵编码绝对位置信息
- 在自注意力计算中隐式融入相对位置依赖
- 不是简单的加法,而是通过旋转操作编码位置
2.2 关键优势
- 序列长度灵活性: 可以处理不同长度的序列
- 距离衰减特性: 随相对距离增加,token间依赖自然衰减
- 线性注意力兼容: 可为线性自注意力配备相对位置编码
- 无额外推理开销: 直接融入注意力计算,无需额外操作
3. 原理详解
3.1 数学原理
核心思想
将位置信息编码为复数空间中的旋转操作:
f(x, m) = x \cdot e^{im\theta}
其中:
- x: 输入向量(复数形式)
- m: 位置索引
- \theta: 旋转角度
- e^{im\theta}: 旋转因子
旋转矩阵表示
在二维子空间中,旋转操作可表示为:
\begin{pmatrix} x_0' \\ x_1' \end{pmatrix} = \begin{pmatrix} \cos(m\theta) & -\sin(m\theta) \\ \sin(m\theta) & \cos(m\theta) \end{pmatrix} \begin{pmatrix} x_0 \\ x_1 \end{pmatrix}
高维扩展
对于 d 维向量,将其分为 d/2 个二维子空间,每个子空间独立旋转:
R_{\Theta, m} = \begin{pmatrix} \cos(m\theta_0) & -\sin(m\theta_0) & 0 & 0 & \cdots \\ \sin(m\theta_0) & \cos(m\theta_0) & 0 & 0 & \cdots \\ 0 & 0 & \cos(m\theta_1) & -\sin(m\theta_1) & \cdots \\ 0 & 0 & \sin(m\theta_1) & \cos(m\theta_1) & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix}
其中 \theta_i = 10000^{-2i/d}
3.2 相对位置依赖的数学保证
关键性质
对于位置 m 的query和位置 n 的key:
q_m = R_{\Theta, m} W_q x_m
k_n = R_{\Theta, n} W_k x_n
注意力计算:
q_m^T k_n = (W_q x_m)^T R_{\Theta, m}^T R_{\Theta, n} (W_k x_n)
由于旋转矩阵的性质:
R_{\Theta, m}^T R_{\Theta, n} = R_{\Theta, n-m}
因此:
q_m^T k_n = (W_q x_m)^T R_{\Theta, n-m} (W_k x_n) = g(x_m, x_n, n-m)
结论: 注意力分数只依赖于相对位置差 n-m,这是数学保证的!
3.3 绝对位置到相对位置的推导
3.3.1 核心推导过程
这是RoPE与正余弦位置编码最核心的区别!让我们详细推导RoPE如何将绝对位置信息转换为相对位置依赖:
步骤1: 定义旋转矩阵
对于位置 m 和 n,对应的旋转矩阵为:
R_{\Theta, m} = \begin{pmatrix} \cos(m\theta_0) & -\sin(m\theta_0) & 0 & 0 & \cdots \\ \sin(m\theta_0) & \cos(m\theta_0) & 0 & 0 & \cdots \\ 0 & 0 & \cos(m\theta_1) & -\sin(m\theta_1) & \cdots \\ 0 & 0 & \sin(m\theta_1) & \cos(m\theta_1) & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix}
R_{\Theta, n} = \begin{pmatrix} \cos(n\theta_0) & -\sin(n\theta_0) & 0 & 0 & \cdots \\ \sin(n\theta_0) & \cos(n\theta_0) & 0 & 0 & \cdots \\ 0 & 0 & \cos(n\theta_1) & -\sin(n\theta_1) & \cdots \\ 0 & 0 & \sin(n\theta_1) & \cos(n\theta_1) & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix}
步骤2: 计算旋转矩阵的乘积
关键的一步是计算 R_{\Theta, m}^T R_{\Theta, n}:
R_{\Theta, m}^T R_{\Theta, n} = \begin{pmatrix} \cos(m\theta_0) & \sin(m\theta_0) & 0 & 0 & \cdots \\ -\sin(m\theta_0) & \cos(m\theta_0) & 0 & 0 & \cdots \\ 0 & 0 & \cos(m\theta_1) & \sin(m\theta_1) & \cdots \\ 0 & 0 & -\sin(m\theta_1) & \cos(m\theta_1) & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix} \begin{pmatrix} \cos(n\theta_0) & -\sin(n\theta_0) & 0 & 0 & \cdots \\ \sin(n\theta_0) & \cos(n\theta_0) & 0 & 0 & \cdots \\ 0 & 0 & \cos(n\theta_1) & -\sin(n\theta_1) & \cdots \\ 0 & 0 & \sin(n\theta_1) & \cos(n\theta_1) & \cdots \\ \vdots & \vdots & \vdots & \vdots & \ddots \end{pmatrix}
步骤3: 利用旋转矩阵的性质
对于每个2×2子块,我们有:
\begin{pmatrix} \cos(m\theta_i) & \sin(m\theta_i) \\ -\sin(m\theta_i) & \cos(m\theta_i) \end{pmatrix} \begin{pmatrix} \cos(n\theta_i) & -\sin(n\theta_i) \\ \sin(n\theta_i) & \cos(n\theta_i) \end{pmatrix} = \begin{pmatrix} \cos(m\theta_i)\cos(n\theta_i) + \sin(m\theta_i)\sin(n\theta_i) & -\cos(m\theta_i)\sin(n\theta_i) + \sin(m\theta_i)\cos(n\theta_i) \\ -\sin(m\theta_i)\cos(n\theta_i) + \cos(m\theta_i)\sin(n\theta_i) & \sin(m\theta_i)\sin(n\theta_i) + \cos(m\theta_i)\cos(n\theta_i) \end{pmatrix}
步骤4: 应用三角恒等式
使用三角恒等式:
- \cos(a)\cos(b) + \sin(a)\sin(b) = \cos(a-b)
- \cos(a)\sin(b) - \sin(a)\cos(b) = \sin(a-b)
- \sin(a)\cos(b) - \cos(a)\sin(b) = \sin(b-a) = -\sin(a-b)
- \sin(a)\sin(b) + \cos(a)\cos(b) = \cos(a-b)
得到:
\begin{pmatrix} \cos((n-m)\theta_i) & -\sin((n-m)\theta_i) \\ \sin((n-m)\theta_i) & \cos((n-m)\theta_i) \end{pmatrix}
步骤5: 最终结果
因此:
R_{\Theta, m}^T R_{\Theta, n} = R_{\Theta, n-m}
步骤6: 注意力计算的推导
现在回到注意力计算:
q_m^T k_n = (W_q x_m)^T R_{\Theta, m}^T R_{\Theta, n} (W_k x_n)
代入步骤5的结果:
q_m^T k_n = (W_q x_m)^T R_{\Theta, n-m} (W_k x_n)
关键结论: 注意力分数 q_m^T k_n 只依赖于:
- 输入内容:x_m 和 x_n
- 相对位置差:n-m
- 变换矩阵:W_q 和 W_k
绝对位置信息 m 和 n 被完全消除!
3.3.2 与正余弦位置编码的对比
正余弦位置编码的问题:
# 正余弦位置编码
PE(pos) = [sin(pos/10000^(0/d)), cos(pos/10000^(0/d)), ...]
# 注意力计算
Q = (X + PE(pos_q)) @ W_q
K = (X + PE(pos_k)) @ W_k
# 注意力分数
attention_score = Q @ K^T
问题分析:
- 位置信息通过加法融入,与语义信息混合
- 注意力分数同时包含绝对位置 pos_q 和 pos_k
- 模型需要隐式学习相对位置关系
- 没有数学保证相对位置依赖
RoPE的优势:
# RoPE位置编码
R(pos) = 旋转矩阵
# 注意力计算
Q = R(pos_q) @ (X @ W_q)
K = R(pos_k) @ (X @ W_k)
# 注意力分数
attention_score = Q @ K^T
# 数学上等价于只依赖相对位置 pos_k - pos_q
优势分析:
- 位置信息通过旋转融入,保持独立
- 注意力分数数学上保证只依赖相对位置差
- 显式建模相对位置关系
- 每层重新应用,位置信息不丢失
3.3.3 几何直觉
正余弦编码:
词向量 + 位置编码 = 平移后的向量
- 不同位置的词被平移到不同区域
- 位置信息与语义信息混合
- 深层网络中位置信息逐渐稀释
RoPE编码:
词向量 × 旋转矩阵 = 旋转后的向量
- 不同位置的词指向不同方向
- 位置信息编码在方向上,语义信息保持
- 相对位置通过旋转角度差体现
3.3.4 数学美感的体现
RoPE的优雅之处在于:
- 群论基础: 旋转矩阵构成SO(2)群,具有自然的组合性质
- 复数表示: e^{i\theta} 的乘法对应旋转,相位差对应相对位置
- 几何直观: 向量旋转保持模长,只改变方向
- 数学保证: 相对位置依赖不是学习得到的,而是数学必然
这就是为什么RoPE被称为"优雅"的位置编码方法——它将复杂的相对位置建模问题转化为简单的旋转操作,并获得了数学上的严格保证。
3.4 与原始位置编码的对比
原始正余弦编码
方式: 加法
位置编码: PE(pos) = [sin(pos/10000^(0/d)), cos(pos/10000^(0/d)), ...]
使用: X' = X + PE
特点: 位置信息与语义信息混合
RoPE
方式: 旋转(乘法)
位置编码: R(pos) = 旋转矩阵
使用: Q = R(pos_q) @ W_q @ X, K = R(pos_k) @ W_k @ X
特点: 位置信息保持独立,每层重新应用
3.5 在注意力机制中的应用
标准注意力
# 原始Transformer
Q = (X + PE) @ W_q
K = (X + PE) @ W_k
V = (X + PE) @ W_v
Attention = softmax(Q @ K^T / √d_k) @ V
RoPE注意力
# RoFormer
Q = X @ W_q
K = X @ W_k
V = X @ W_v
# 应用旋转位置编码
Q_rotated = apply_rotary_pos_emb(Q, positions)
K_rotated = apply_rotary_pos_emb(K, positions)
# Value不需要位置信息(因为位置信息已在权重中体现)
Attention = softmax(Q_rotated @ K_rotated^T / √d_k) @ V
为什么Value不需要旋转?
- Query和Key: 决定"关注什么位置",需要位置信息
- Value: 提供"实际内容",位置信息已通过注意力权重体现
3.6 距离衰减特性
数学推导
对于相对位置 \Delta = n - m:
\text{Attention}(\Delta) \propto \cos(\Delta \cdot \theta_i)
当 \Delta 增大时:
- \cos(\Delta \cdot \theta_i) 趋向于0或振荡
- 注意力权重自然衰减
符合语言学直觉
距离近的词 (Δ小) → cos(Δθ) ≈ 1 → 高注意力
距离远的词 (Δ大) → cos(Δθ) ≈ 0 → 低注意力
这与自然语言中"距离越远相关性越低"的规律一致。
4. 重要结论
4.1 位置编码的新范式
- 从加法到旋转: 位置编码的范式转变
- 显式相对位置: 数学保证的相对位置依赖
- 位置-语义解耦: 位置信息不与语义混合
4.2 性能表现
长文本分类任务
- 持续优势: 在多个长文本分类数据集上优于基线方法
- 提升幅度: 通常有2-3%的性能提升
- 稳定性: 性能提升具有一致性
序列外推能力
| 训练长度 | 测试长度 | 正余弦PE | RoPE |
|---|---|---|---|
| 512 | 512 | ✓ | ✓ |
| 512 | 1024 | ✗ 性能崩溃 | ✓ 平稳 |
| 512 | 2048 | ✗✗ 严重下降 | ✓ 相对稳定 |
4.3 理论优势
- 旋转不变性: 利用旋转群的数学性质
- 可解释性: 清晰的几何和代数解释
- 优雅性: 简洁而强大的数学结构
4.4 实用价值
- 易于实现: 实现简单,易于集成
- 无额外开销: 不增加参数量和计算量
- 广泛应用: 已被多个主流模型采用
5. 关键属性与特性
5.1 序列长度灵活性
问题: 训练时序列长度固定,测试时可能需要处理更长序列
RoPE的解决:
- 旋转角度是连续的函数,可扩展到任意位置
- 不需要重新训练位置编码
- 外推性能显著优于绝对位置编码
5.2 线性注意力兼容性
线性注意力: 将注意力复杂度从 O(n^2) 降至 O(n)
RoPE优势:
# 线性注意力的核技巧
Attention = softmax(Q @ K^T) @ V
= φ(Q) @ (φ(K)^T @ V) # 可重新组合
# RoPE兼容这种重组
Q_rotated = R(pos) @ Q
K_rotated = R(pos) @ K
# 旋转后仍可应用核技巧
其他位置编码: 通常破坏这种可分解性
5.3 每层独立的位置感知
原始方法:
Layer 0: X + PE → 位置信息融入
Layer 1: Attention(X₀) → 位置信息被稀释
Layer 2: Attention(X₁) → 位置信息进一步稀释
...
RoPE方法:
Layer 0: Attention(R(pos)@Q, R(pos)@K) → 强位置感知
Layer 1: Attention(R(pos)@Q, R(pos)@K) → 强位置感知
Layer 2: Attention(R(pos)@Q, R(pos)@K) → 强位置感知
...
每层都重新应用位置信息,保持强位置感知能力。
6. 实际应用
6.1 实现示例
PyTorch实现
import torch
import torch.nn as nn
def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):
"""预计算旋转频率"""
freqs = 1.0 / (theta ** (torch.arange[0, dim, 2](: (dim // 2)).float() / dim))
t = torch.arange(end, device=freqs.device)
freqs = torch.outer(t, freqs).float()
freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64
return freqs_cis
def apply_rotary_emb(xq, xk, freqs_cis):
"""应用旋转位置编码"""
# 将输入reshape为复数
xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2))
xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2))
# 应用旋转
freqs_cis = reshape_for_broadcast(freqs_cis, xq_)
xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3)
xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3)
return xq_out.type_as(xq), xk_out.type_as(xk)
class RoPEAttention(nn.Module):
def __init__(self, dim, n_heads, max_seq_len=2048):
super().__init__()
self.n_heads = n_heads
self.head_dim = dim // n_heads
self.wq = nn.Linear(dim, dim, bias=False)
self.wk = nn.Linear(dim, dim, bias=False)
self.wv = nn.Linear(dim, dim, bias=False)
self.wo = nn.Linear(dim, dim, bias=False)
# 预计算旋转频率
self.freqs_cis = precompute_freqs_cis(self.head_dim, max_seq_len)
def forward(self, x, positions):
batch_size, seq_len, _ = x.shape
# 计算Q, K, V
q = self.wq(x).view(batch_size, seq_len, self.n_heads, self.head_dim)
k = self.wk(x).view(batch_size, seq_len, self.n_heads, self.head_dim)
v = self.wv(x).view(batch_size, seq_len, self.n_heads, self.head_dim)
# 应用RoPE
freqs_cis = self.freqs_cis[positions]
q, k = apply_rotary_emb(q, k, freqs_cis)
# 计算注意力
q = q.transpose(1, 2) # (batch, n_heads, seq_len, head_dim)
k = k.transpose(1, 2)
v = v.transpose(1, 2)
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.head_dim)
attn = F.softmax(scores, dim=-1)
output = torch.matmul(attn, v)
# 合并多头
output = output.transpose(1, 2).contiguous().view(batch_size, seq_len, -1)
return self.wo(output)
6.2 已采用RoPE的模型
LLaMA系列
- LLaMA 1: Meta的开源大模型,使用RoPE
- LLaMA 2: 继续使用RoPE,验证其有效性
- LLaMA 3: 保持RoPE作为核心组件
其他主流模型
- GPT-NeoX: EleutherAI的开源模型
- PaLM: Google的大规模语言模型
- GLM: 清华大学的中英文预训练模型
- Qwen: 阿里巴巴的通义千问系列
6.3 部署优势
- 零额外参数: 不增加模型参数量
- 计算高效: 旋转操作可以高效实现
- 内存友好: 不需要存储额外的位置编码矩阵
- 易于优化: 可以使用各种硬件加速
6.4 实际效果对比
| 特性 | 正余弦PE | 可学习PE | RoPE |
|---|---|---|---|
| 参数量 | 0 | O(L·d) | 0 |
| 计算量 | 加法 | 加法 | 旋转 |
| 序列外推 | 差 | 很差 | 好 |
| 相对位置 | 隐式 | 隐式 | 显式 |
| 距离衰减 | 无 | 无 | 有 |
| 线性注意力 | 兼容 | 兼容 | 兼容 |
7. 扩展与变体
7.1 RoPE的改进
NTK-Aware RoPE
- 问题: 标准RoPE在极长序列上仍有外推限制
- 方法: 调整基础频率 \theta,使用NTK(Neural Tangent Kernel)理论
- 效果: 可以将外推能力从2k扩展到8k甚至更长
Dynamic RoPE
- 思想: 根据序列长度动态调整旋转频率
- 实现: \theta' = \theta \cdot (L_{test} / L_{train})^{\alpha}
- 优势: 更好的长序列适应性
7.2 其他位置编码方法
ALiBi (Attention with Linear Biases)
- 方法: 在注意力分数上添加线性偏置
- 优势: 实现更简单,外推性能也很好
- 劣势: 需要修改注意力计算逻辑
xPos (eXtrapolatable Position embedding)
- 方法: 在RoPE基础上添加指数衰减
- 优势: 更强的外推能力
- 应用: 部分最新模型采用
8. 理论分析
8.1 为什么旋转比加法好?
信息保持
加法方式:
h = f(x + PE)
- 位置信息和语义信息线性混合
- 深层网络中位置信息逐渐被稀释
旋转方式:
h = f(R(pos) \cdot x)
- 位置信息编码在方向上,不改变模长
- 每层独立应用,信息不丢失
几何直觉
加法: 向量平移
- PE相当于在向量空间中的平移
- 不同位置的词向量平移到不同区域
旋转: 向量旋转
- RoPE相当于在向量空间中的旋转
- 不同位置的词向量指向不同方向
- 保持模长,只改变方向
8.2 低频与高频的作用
RoPE使用不同频率的旋转:
\theta_i = 10000^{-2i/d}
低频分量 (小的i)
- \theta 较大,旋转慢
- 编码长距离依赖
- 适合捕捉句子级别的结构
高频分量 (大的i)
- \theta 较小,旋转快
- 编码短距离依赖
- 适合捕捉词级别的关系
这类似于傅里叶变换中的多尺度表示。
8.3 与复数神经网络的联系
RoPE本质上利用了复数空间的性质:
e^{i\theta} = \cos\theta + i\sin\theta
乘法即旋转:
z \cdot e^{i\theta} = |z| \cdot e^{i(\phi + \theta)}
这为什么有效?
- 复数乘法保持模长
- 相位差直接对应相对位置
- 数学结构与相对位置概念天然契合
9. 实验与分析
9.1 消融实验
是否应用于V?
| 配置 | 性能 |
|---|---|
| RoPE(Q, K, V) | 基准 |
| RoPE(Q, K) | 最优 ✓ |
| RoPE(Q) | 下降 |
结论: 只需对Q和K应用RoPE,V不需要
不同的频率设置
| \theta | 短序列 | 长序列 | 外推 |
|---|---|---|---|
| 1000 | 好 | 差 | 差 |
| 10000 | 最优 | 最优 | 最优 |
| 100000 | 好 | 好 | 中 |
结论: 10000是较好的平衡点
9.2 与其他方法的对比
在长文本分类上
数据集: IMDB, Yelp, Amazon
序列长度: 512-2048
结果:
Transformer (Sinusoidal): 85.2%
Transformer (Learned): 85.5%
Transformer + Relative: 86.1%
RoFormer (RoPE): 86.8% ✓ 最优
在机器翻译上
数据集: WMT14 En-De
度量: BLEU
结果:
Transformer: 27.3
RoFormer: 27.8 (+0.5)
9.3 位置插值能力
训练长度512,测试不同长度:
测试长度 正余弦PE 可学习PE RoPE
512 100% 100% 100%
1024 82% 45% 95%
2048 68% 23% 88%
4096 42% 12% 76%
RoPE在所有测试长度上都显著优于其他方法。
10. 总结
10.1 核心贡献
- 理论创新: 提出旋转位置编码,从加法范式转向旋转范式
- 数学保证: 证明了相对位置依赖的数学必然性
- 实用价值: 简单易实现,无额外开销,性能提升明显
- 广泛影响: 成为现代LLM的标准配置
10.2 关键优势总结
| 维度 | RoPE的优势 |
|---|---|
| 数学 | 显式的相对位置依赖,几何解释清晰 |
| 性能 | 多任务上持续优于基线方法 |
| 外推 | 训练长度外的序列处理能力强 |
| 效率 | 零额外参数,计算开销小 |
| 兼容 | 支持线性注意力,易于扩展 |
| 应用 | 被LLaMA等主流模型采用 |
10.3 适用场景
强烈推荐
- ✅ 需要处理长序列的任务
- ✅ 需要序列外推能力的场景
- ✅ 大规模预训练模型
- ✅ 需要显式相对位置的任务
可选方案
- ⚠️ 短序列任务(优势不明显)
- ⚠️ 固定长度任务(可学习PE也够用)
10.4 实践建议
如何使用RoPE
- 直接替换: 用RoPE替换原有的位置编码
- 只对Q和K: 不需要对V应用旋转
- 使用默认参数: \theta = 10000 通常足够好
- 考虑扩展: 需要极长序列时考虑NTK-Aware变体
常见问题
Q: RoPE会增加训练时间吗?
A: 不会,旋转操作可以高效实现,开销可忽略
Q: 如何处理超长序列?
A: 考虑使用Dynamic RoPE或NTK-Aware RoPE
Q: 可以和其他技术结合吗?
A: 可以,RoPE与Flash Attention、稀疏注意力等完全兼容
10.5 未来方向
- 理论深化: 进一步理解旋转编码的数学性质
- 外推增强: 开发更强的长序列外推技术
- 架构适配: 探索在其他架构(如SSM)中的应用
- 自适应方法: 研究自适应的频率选择策略
11. 参考资源
11.1 论文与实现
- 原始论文: arXiv:2104.09864
- HuggingFace: 已集成到transformers库
- GitHub: ZhuiyiTechnology/roformer
11.2 相关模型
- LLaMA: Meta的开源模型,使用RoPE
- GPT-NeoX: EleutherAI的开源实现
- GLM: 清华大学的中英文预训练模型
11.3 扩展阅读
- NTK-Aware RoPE: 长序列外推的改进
- ALiBi: 另一种位置编码方法
- Position Interpolation: Meta提出的位置插值技术
总结: RoFormer通过旋转位置编码,优雅地解决了Transformer的位置建模问题。其核心创新在于将位置信息从加法转向旋转,实现了数学保证的相对位置依赖。作为一种简单、高效、有效的方法,RoPE已成为现代大语言模型的标准配置,为位置编码提供了新的范式。