图 1:四代位置编码一条线,外推三招在末端接力。
这是一篇知识延伸文章:同批的面试真题解析讲了 RoPE 自身的旋转机制,本文换一个主轴——把位置编码放进演进坐标系里看,回答两个更大的问题:这条技术线沿什么脉络走到 RoPE?模型训练长度不够用时,又有哪些主流的外推方案?RoPE 的公式推导不再重复,需要的话去看那篇真题解析。
第一站:正弦绝对位置——位置信息的开山做法。
2017 年的 Transformer 原论文用一组不同频率的正弦、余弦曲线为每个位置算出一个固定向量,直接加到词向量上。优点是不用学、参数为零、天然能表示任意长度;局限是位置信息混在输入里,经过层层变换后相对位置语义被稀释。同期更工程化的做法是「可学习嵌入」:给每个位置一张查表向量,随模型一起训练。BERT 一代的模型多用这种,简单有效,但最大长度在初始化时写死——表只有 512 行,第 513 个位置无向量可查,外推能力为零。
第二站:相对位置——注意力该关心的是距离。
绝对位置方案的共同短板是:模型真正需要的往往不是「这是第 17 个词」,而是「这个词离我 3 个位置」。相对位置编码直接改注意力分数的计算,把相对距离注入进去。早期的 XLNET 式、T5 式做法是在注意力矩阵上加可学习的相对位置偏置;2021 年的 ALiBi 走得更极端——不加任何可训练参数,直接按 q、k 的相对距离给注意力分数加一个线性惩罚项,距离越远扣得越多。ALiBi 的外推表现相当好:训练用 1024 长度,推理跑 2048 也稳。这证明了一件事:位置编码的形式越贴近「距离惩罚」这个本质,外推越顺。
第三站:RoPE——用旋转把相对位置做进内积。
2021 年的 RoFormer 论文提出的 RoPE 把 q、k 按位置旋转,使内积天然只含相对距离,还附带远程衰减的归纳偏置,且不增加可训练参数。机制细节此处不展开。它迅速成为主流开源大模型的默认选择——原因很现实:效果硬、实现轻、和后续各种长度扩展手段兼容性好。
把四代摆在一起,演进逻辑很清楚:注入位置从「加到输入」移到「改注意力内部」,表达从「绝对编号」转向「相对距离」,参数从「查表学习」转向「固定函数」。每一步都在削掉上一个方案的妥协。
图 2:四代方案对比矩阵,右边是外推三招的分工。
第四站:长度外推——RoPE 之后的新战场。
RoPE 本身外推性不错,但「不错」不等于「无限」:训练只见过 4K 位置的模型,直接喂 32K,超出部分旋转到了没训练过的角度,注意力分布被打乱,性能明显下滑。这就是长度外推问题,主流解法三招:
位置插值(PI)最直白:既然 4K 以内的位置模型都认识,就把 32K 的序列按比例压缩——位置 31000 除以 8 当成 3875 处理。所有位置都落在训练范围内,代价是近距离分辨力被稀释,通常要少量微调找回精度。
NTK 缩放更精细:不做均匀压缩,而是调整 RoPE 的旋转基频,高频分量(管近距离)少动、低频分量(管远距离)多压。近距离分辨力保住了,很多场景下不用微调就能直接扩。
2023 年的 YaRN 再进一步:按频段分段处理,不同频率区间用不同缩放策略,长短距离分开照顾,并用更少的训练量把扩展后的效果稳住。可以把它理解成「PI 和 NTK 的精细化组合版」。
选型口诀。
新模型默认 RoPE,基本不用犹豫;上线后上下文不够用,先位置插值加少量微调,最快最稳;想免微调硬扩,上 NTK 缩放;追求扩展后的长文本质量,用 YaRN 思路做分段缩放。如果是 ALiBi 路线的模型,线性偏置天然外推,但要接受它在中短距离上的表达力折衷。
位置编码这条线还没走完——注意力机制每演化一次,位置注入的方式就跟着变一次。你所在的团队用的是哪种方案?扩上下文时踩过位置编码的坑吗?评论区交流。