现代 NLP 的位置编码范式
上一篇我们回到 Swin 补上了它的二维 RPE 方案用紧凑偏置表实现了高效的二维相对位置编码。至此从 Shaw 的加法型、Transformer-XL 的四项重构式、再到 T5 的偏置型Swin 的二维扩展每种方案都在尝试不同的方法来实现 RPE。最终在 NLP 这个 RPE 的原产地酝酿出了一种新的范式有没有一种位置编码既不修改注意力公式也不引入额外参数却能让 QK 点积本身就感知到相对位置2021 年的论文RoFormer: Enhanced Transformer with Rotary Position Embedding 给出了答案。它不仅解决了这个问题还直接奠定了现代大模型中位置编码的事实标准今天几乎所有主流开源大模型LLaMA、Mistral、Qwen、GLM……都在使用它。这套方案就是旋转位置编码 RoPERotary Position Embedding。1. RoPE 的核心思路#我们再再再看一遍标准的自注意力这里 中的每个元素 衡量的就是 token 和 的内容相关性。一直以来的问题都是这个点积本身不知道任何位置信息。比如同一个词出现在位置 1 和位置 100只要内容相同点积结果就完全相同。而之前提到过的 RPE 方案都是在补救这个问题它们的共同特点是位置信息是通过种种逻辑后加到注意力分数上的Q、K本身的语义仍然不变。RoPE 的想法刚好相反不在注意力公式上做任何加法而是让 Q 和 K 的向量表示本身就携带位置信息。具体怎么做的就是旋转。假设现在有一个 2 维向量 我们让它绕原点旋转一个角度 这就是一个标准的二维旋转矩阵 现在我们定义一个函数用这个矩阵对二维向量进行旋转那就是在这个基础上我们再加入位置参数看看如果我们对位置 的 Q 旋转 对位置 的 K 旋转 它们的点积会是什么根据正交矩阵的转置等于逆和三角函数性质我们得到最终结果如下你会发现点积结果只依赖于 即相对位置。这一段推导下来说明的是什么如果我们用一个和位置相关的旋转函数对两个位置的 和 进行旋转那么二者的点积结果也就是注意力分数就会受到它们之间的相对位置影响。这便是 RoPE 的核心思路。2. RoPE 的具体逻辑#2.1 高维空间推广问题#二维旋转给了我们启发但实际中向量维度 通常几百上千。现在一个很自然的想法就是直接对整个高维向量做一次整体旋转。但这里会带来一个严重问题整体旋转造成大规模的信息耦合导致优化困难。首先训练后无论是词向量还是经过线性变换后的 和 本质上都已经处于一个训练好的高维特征空间中。虽然我们很难精确说“第几维一定表示什么语义”。但模型已经通过大量训练学会了不同维度间的语义关系、结构。如果此时用一个矩阵直接对整个高维向量进行一次全局旋转那么新的每个维度都是由所有原始维度大规模混合得到破坏了原有的语义结构。例如你可能会问通过反向传播我们训练出来的语义空间本身不就是适应旋转操作的语义空间吗这句话本身是完全没有问题的但是这时一个维度会依赖大量其它维度、局部修改会影响整体结构、特征分工会变得困难、梯度传播会更加复杂。因此这种全局耦合会让优化会变得非常困难。因此问题就变成了如何最小入侵式地把位置信息注入到语义空间中RoPE 的答案是不对整个高维向量做一次整体旋转而是把高维向量拆成多个二维子空间每两个维度组成一组在各自的小平面内独立旋转。例如对于一个向量RoPE 会拆成然后分别进行二维旋转于是整个变换过程可以写成这样每个二维旋转块只会影响自己对应的两个维度。例如 只会在自身内部发生变化具体展开就是这样现在 特征只会在两个维度间进行局部混合不会像之前一样发生全局混合。这样原本的大尺度语义结构仍然保留特征之间的稳定关系就不会被整体破坏优化也更容易进行。值得一提的是为了合理应用 RoPE 和其他相关技术我们会刻意设计模型输入维度为偶数如果出现了奇数情况那么最后一维不旋转。除此之外旋转本身还有一个极其重要的性质旋转矩阵是正交矩阵应用只会改变向量方向而不会改变长度。这相比之前的直接修改特征值或额外叠加位置特征RoPE 更接近在原有语义结构上施加一种轻量级的几何变化。到这里我们先初步解决了高维向量的旋转带来的优化问题下面才是旋转在语义逻辑中的真实应用。2.2 不同频率的旋转#