Transformer 21. 从 LLaMA 到 Qwen:Rotary Position Embedding(RoPE)与 YaRN 一文读懂
摘要:RoPE(Rotary Position Embedding)把「位置」编码进注意力分数的方式,从「在词向量上加一根位置向量」改成「在每一层对 Q、K 做几何旋转」。本文先讲为什么要这样设计(相对位置、外推动机),再给出二维一对的公式与为何点积只依赖相对距离的推导;最后说明 YaRN 如何在做长文外推时重缩放注意力,并与 Decoder Only Transformer、LLaMA 架构、Qwen 1 / Qwen 1.5、Qwen 2 及社区读物中的叙述对齐。
关键词:RoPE;相对位置编码;旋转矩阵;YaRN;长度外推;Qwen;LLaMA
💡 理解要点:可以把经典 Transformer 的位置编码想成「给每个座位贴一张写着绝对排号的标签,并和台词本(词向量)叠在一起」。RoPE 则是「演员上台站定后,在聚光灯(注意力)照过来之前,把台词的方向(Query/Key)整体转一个与座位有关的角度」——这样两束光打在一起时,夹角里自然带着「隔了几个座位」的信息,而且每层都能重新转一次。
我们对于 Qwen 与长上下文的通俗梳理里,也常把 RoPE + YaRN 并列为处理超长序列的关键拼图之一。下文把这两块从「核心理念」到「公式怎么来的」串成一篇可独立阅读的技术笔记。
1. 动机:我们到底想把「位置」编进哪里?
自回归语言模型里,位置 m m m 的隐向量经线性层得到该头的 Query、Key(略去多头下标):
q m = W q x m , k n = W k x n . \mathbf{q}_m = W_q \mathbf{x}_m, \quad \mathbf{k}_n = W_k \mathbf{x}_n. qm=Wqxm,kn=Wkxn.
标准缩放点积注意力里,位置 m m m 看位置 n n n 的「亲密度」正比于 q m ⊤ k n \mathbf{q}_m^\top \mathbf{k}_n qm⊤kn。
理想性质(RoPE 论文 Su et al., 2021 的核心目标):
- 用相对位置刻画交互:希望 q m ⊤ k n \mathbf{q}_m^\top \mathbf{k}_n qm⊤kn 能写成某个只依赖 ( m − n ) (m-n) (m−n) 的函数形式(在合适意义下),而不是粗暴地只记「 m m m 是第几号、 n n n 是第几号」两个孤立的绝对数。
- 与「乘性」方式兼容:用正交变换(旋转)作用在 q , k \mathbf{q},\mathbf{k} q,k 上,保持范数与几何结构,训练往往更稳。
- 不改动 V、不增加大块位置嵌入表:位置信息只在 Q , K Q,K Q,K 进入点积之前注入,和现在 Decoder-only 堆栈(12、31)的工程习惯一致。
🔍 实际例子:在 LLaMA 架构 §2.3 里,进入第一层_decoder 的张量仍是「纯 Embedding 堆叠」; RoPE 发生在每层
QKᵀ之前,对当前层的Q、K行向量旋转。这与「Input = Emb + PE只做一次」的经典图画完全不同。
2. 二维一对:把复数旋转写成 2 × 2 2\times 2 2×2 块
设某个注意力头的维度 d k d_k dk 是偶数。把它切成 d k / 2 d_k/2 dk/2 对,第 i i i 对 ( i = 0 , … , d k / 2 − 1 ) (i=0,\ldots,d_k/2-1) (i=0,…,dk/2−1) 记二维向量
z = ( z 2 i z 2 i + 1 ) . \mathbf{z} = \begin{pmatrix} z_{2i} \\ z_{2i+1} \end{pmatrix}. z=(z2iz2i+1).
复数视角(推导口诀):把这一对看成复数 z = z 2 i + i z 2 i + 1 z = z_{2i} + \mathrm{i}\, z_{2i+1} z=z2i+iz2i+1。乘以单位模 e i θ e^{\mathrm{i}\theta} eiθ 就是逆时针旋转 θ \theta θ:
e i θ z = ( cos θ + i sin θ ) ( z 2 i + i z 2 i + 1 ) . e^{\mathrm{i}\theta} z = (\cos\theta + \mathrm{i}\sin\theta)(z_{2i} + \mathrm{i}z_{2i+1}). eiθz=(cosθ+isinθ)(z2i+iz2i+1).
拆实部、虚部,得到熟悉的平面旋转矩阵:
( cos θ − sin θ sin θ cos θ ) ( z 2 i z 2 i + 1 ) . \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} z_{2i} \\ z_{2i+1} \end{pmatrix}. (cosθsinθ−sinθcosθ)(z2iz2i+1).
💡 理解要点: RoPE 不是在「整个 d k d_k dk 维空间上」用一个巨大的随机旋转,而是很多个独立的 2D 小转盘并排转;每个转盘有自己的角速度(由下面 θ i \theta_i θi / ω i \omega_i ωi 决定)。
3. RoPE 的形式:位置 m m m 的旋转角
对位置 m m m、第 i i i 对,设
θ m , i = m ⋅ ω i , \theta_{m,i} = m \cdot \omega_i, θm,i=m⋅ωi,
其中 ω i \omega_i ωi 是预先给定的角频率(由底数 θ 0 \theta_0 θ0 与维下标生成,和原始 Transformer 正弦 PE 的「波长几何级数」是同一套直觉)。
把 q m \mathbf{q}_m qm、 k n \mathbf{k}_n kn 的第 i i i 对分别旋转 θ m , i \theta_{m,i} θm,i、 θ n , i \theta_{n,i} θn,i,记旋转后的向量为 q m ′ \mathbf{q}_m' qm′、 k n ′ \mathbf{k}_n' kn′(实现里常合并进 fused kernel,不显式造大矩阵)。
块对角大矩阵记法(便于理论推导):令 R m R^m Rm 为 d k × d k d_k\times d_k dk×dk 的块对角正交矩阵,每一块是 2 × 2 2\times 2 2×2 的 R ( θ m , 0 ) , R ( θ m , 1 ) , … R(\theta_{m,0}), R(\theta_{m,1}), \ldots R(θm,0),R(θm,1),…。则 RoPE 可以写成
q m ′ = R m q m , k n ′ = R n k n . \mathbf{q}_m' = R^m \mathbf{q}_m, \quad \mathbf{k}_n' = R^n \mathbf{k}_n. qm′=Rmqm,kn′=Rnkn.
只改数值,不改形状。
4. 推导核心:为什么点积「像」相对位置?
只看一对频率 ω \omega ω,二维情形记
q m = ( q a q b ) , k n = ( k a k b ) . \mathbf{q}_m = \begin{pmatrix} q_a \\ q_b \end{pmatrix}, \quad \mathbf{k}_n = \begin{pmatrix} k_a \\ k_b \end{pmatrix}. qm=(qaqb),kn=(kakb).
旋转后(略去撇号)
⟨ R ( m ω ) q m , R ( n ω ) k n ⟩ . \langle R(m\omega)\mathbf{q}_m,\, R(n\omega)\mathbf{k}_n \rangle. ⟨R(mω)qm,R(nω)kn⟩.
利用 R R R 是正交矩阵: R ( α ) ⊤ = R ( − α ) R(\alpha)^\top = R(-\alpha) R(α)⊤=R(−α),且 R ( α ) R ( β ) = R ( α + β ) R(\alpha)R(\beta)=R(\alpha+\beta) R(α)R(β)=R(α+β)。于是
R ( m ω ) q m ⋅ R ( n ω ) k n = q m ⊤ R ( m ω ) ⊤ R ( n ω ) k n = q m ⊤ R ( ( n − m ) ω ) k n . R(m\omega)\mathbf{q}_m \cdot R(n\omega)\mathbf{k}_n = \mathbf{q}_m^\top R(m\omega)^\top R(n\omega) \mathbf{k}_n = \mathbf{q}_m^\top R((n-m)\omega) \mathbf{k}_n. R(mω)qm⋅R(nω)kn=qm⊤R(mω)⊤R(nω)kn=qm⊤R((n−m)ω)kn.
结论(这一对维度上):
- 点积可以改写成「原始 q m , k n \mathbf{q}_m,\mathbf{k}_n qm,kn 之间夹上一个只依赖 相对位移 ( n − m ) (n-m) (n−m) 的旋转」。
- 把所有频率对求和,整体 q m ′ ⊤ k n ′ \mathbf{q}_m'^\top \mathbf{k}_n' qm′⊤kn′ 就是若干这样的项相加,因此注意力 logits 自然带上相对位置结构。
💡 理解要点:不必死记硬背「旋转后点积公式」。记住一句:同一对维度上,给 Q 转 m ω m\omega mω、给 K 转 n ω n\omega nω,等价于给某一边「多转」了 ( n − m ) ω (n-m)\omega (n−m)ω 的相位差——这和物理里「干涉看相位差」是同一类几何直觉。
5. 与「正弦位置编码 + 加在输入上」的对比
| 维度 | 经典正弦 / 可学习 PE(Embedding 上相加) | RoPE |
|---|---|---|
| 注入时机 | 多在第一层之前一次 | 每层、QK 点积前 |
| 作用对象 | 隐向量本身 | 仅 Q 与 K(V 不旋转) |
| 相对/绝对 | 绝对位置向量为主;相对性需靠结构间接体现 | 设计上让 logits 相对化(上节推导) |
| 工程影响 | 与 FlashAttention 等兼容但需遵守各自实现假设 | 主流开源栈(LLaMA、Qwen)事实标准 |
表中左列与右列的对照,在 12 §2.3.3、31 §2.3.3 已有「流程级」版本;本节补的是为什么是旋转、为什么相对距离会出现。
6. 外推:训练长度之外的 RoPE 与「为什么要 YaRN」
RoPE 在超过预训练长度时仍可直接算,但往往出现注意力分布失常、困惑度上升等问题——直观上,旋转太快了或 effective 波长与训练时分布不匹配,模型在「没练过的相位区域」上泛化变差。
工程上常见的减压阀包括(不限于):
- 调 RoPE 底数 θ 0 \theta_0 θ0(例如 Qwen2 报告将 base 从 10 4 10^4 104 量级调到 10 6 10^6 106 以服务更长上下文,见 32 §5.2)。
- NTK-aware 式的频率插值 / 缩放(Qwen1 报告在推理期组合里常提及,与 RoPE jointly 使用,见 31 §7)。
- YaRN 一类:对注意力权重或 logits 再做多一项与目标长度相关的缩放,缓解外推失真。
🔍 实际例子:Qwen2 Technical Report 写明:宣称 超过 32K 的 Instruct 型号会集成 YaRN;并与 DCA 等机制并列 32 §5.3–5.4。可以理解为:32K 训练 + RoPE 超参先把「模型见过长依赖」搞定;要到 ≈128K,再叠 YaRN / DCA 这类「专门修补外推」的补丁。
7. YaRN 在说什么(概念层)
YaRN(Yet another RoPE extensioN;Peng et al., 2023,文中常写作 YaRN)面向的问题是:
在不重新训练或只轻微微调的前提下,把「在长度 L train L_{\text{train}} Ltrain 上表现良好的 RoPE 模型」推到更长的 L test L_{\text{test}} Ltest。
手段不是再发明一种全新的位置向量,而是基于观察:单纯拉长序列时,注意力 logits 的尺度与熵分布会漂移。YaRN 通过**与长度相关的重缩放(rescaling)**去校正注意力权重,使远距离 token 的贡献更「像训练分布里那样合理」。
💡 理解要点:把 RoPE 想成给每个频率「调色相」;YaRN 则是在 softmax 之前或之后,给不同距离、不同头的注意力再乘/再加一套与上下文长度有关的「音量旋钮」——让远场既不至于全哑,也不至于全炸。
具体实现(各框架细节略有出入:是否同时改 logits 与 NTK 插值系数等)应以所读 checkpoint 的 config.json 与对应推理引擎(Transformers / vLLM)为准;32 §5.3 中的表述是 rescaling attention weights for better length extrapolation,可与论文原文对照。
8. 实现备忘:为什么说「乘性」与 NLL 训练是自洽的?
训练目标通常为下一词负对数似然;注意力里是 softmax ( Q ′ K ′ ⊤ / d k ) (Q'K'^\top/\sqrt{d_k}) (Q′K′⊤/dk)。RoPE 只改 Q ′ , K ′ Q',K' Q′,K′,保持 ∥ R m q ∥ = ∥ q ∥ \|R^m\mathbf{q}\|=\|\mathbf{q}\| ∥Rmq∥=∥q∥(逐对 2D 旋转范数不变),对「表示范数爆炸/收缩」比任意线性位置映射更温和——这也是行业偏爱 RoPE 的原因之一。
Qwen 系还在 QKV 线性层保留 bias 以辅助外推(31 §3.2.1):RoPE 约束了几何关系,bias 给 logits 留了一层与内容解耦的平移自由度;读代码时可以把二者当成「旋转 + 平移」的配合,而不必对立。
9. 小结:读论文与读代码时建议抓的三条线
- 数据流:Embedding 不带绝对位置向量;每层 Attn 里
Linear → RoPE(Q、K)→QKᵀ→ mask → softmax →V。 - 数学骨:二维一对、 R ( m ω ) R(m\omega) R(mω) 与 R ( n ω ) R(n\omega) R(nω) 夹到点积里变成 R ( ( n − m ) ω ) R((n-m)\omega) R((n−m)ω) → 相对位置进 logits。
- 长文:训练把窗口拉长(如 Qwen2 末段 32K)+ 调 RoPE base;更长再考虑 YaRN / DCA 等 rescaling 与分块结构 32 §5。
10. 参考文献与链接
| 类型 | 链接 / 文献 |
|---|---|
| RoPE 原文 | Su, J. et al., RoFormer: Enhanced Transformer with Rotary Position Embedding, arXiv:2104.09864 |
| YaRN | Peng, B. et al., YaRN: Efficient Context Window Extension of Large Language Models, arXiv:2309.00071 |
| Qwen1 报告 | arXiv:2309.16609 |
| Qwen2 报告(RoPE base、YARN、DCA) | arXiv:2407.10671 |
| Decoder Only Transformer | https://blog.csdn.net/zyctimes/article/details/158771582?spm=1001.2014.3001.5501 |
| LLaMA 架构(与 RoPE 流程) | https://blog.csdn.net/zyctimes/article/details/158923114?spm=1001.2014.3001.5501 |
| Qwen 1 / Qwen 1.5(RoPE / 长文推理) | https://blog.csdn.net/zyctimes/article/details/159692526 |
| Qwen 2(RoPE base、YaRN) | https://blog.csdn.net/zyctimes/article/details/159762115?spm=1001.2014.3001.5501 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)