几何时空与位置编码
当我们谈论大语言模型时,往往只看到它生成文本的能力,却很少注意底层结构。实际上,每一次对话、推理的背后,都有一个高维、稠密的向量空间。这就是大模型的原生土壤。
一、稠密向量空间:语言的原生土壤
在这个空间里,词、短语、句子不再是字符序列,而是被编码成一个个稠密的实数向量。所谓“稠密”,是相对于早期独热编码的稀疏而言。稠密向量就像高维空间中的点,彼此之间有了距离和方向,几何结构承载了语义关系。比如“国王-男人+女人”会落到“女王”附近,“巴黎-法国”近似于“东京-日本”。语义不再是离散符号,而成了空间中的几何规律。
但语义并不是固定的。它会随上下文流动、折叠、拉伸。一个词在不同句子中会沿流形滑动,一段文本的意义也不是简单叠加,而是在高维空间中展开又折叠。这就是我们要深入探讨的:语义的几何与时空的折叠。
二、位置:被注意力遗忘的维度
这里有一个关键问题:Transformer 的注意力机制本身是位置无关的。如果只把词向量丢进去,它看到的只是一堆没有顺序的点。比如“猫追老鼠”和“老鼠追猫”,词向量完全相同,只是顺序不同,但在自注意力计算中,如果不加任何位置信息,它们会得到几乎相同的表示。可这两句话的意思截然相反。这说明,光有语义几何还不够,必须引入位置信息,才能让模型知道谁在前、谁在后,谁修饰谁,谁作用于谁。否则,语言就退化成了无序的词袋,丢失了时序和结构。
此刻的语义空间,是一片没有曲率的平原——所有词向量摊平在高维流形上,彼此之间只有距离,没有先后。要在其中引入顺序,就必须对这片平原施加某种折叠,让时间维度从几何结构中生长出来。
三、正弦位置编码:第一次折叠
为了解决这个问题,《Attention Is All You Need》中首次提出了一种巧妙的方法:正弦位置编码(APE)。它不再依赖词序本身,而是为每个位置生成一个固定的向量,直接加到词向量上。
这个位置向量的每个维度都由正弦或余弦函数构成,且不同维度拥有不同的频率。低维度变化快(高频),高维度变化慢(低频),就像给每个位置分配了一组独特的“波纹”。这样一来,模型不仅能区分绝对位置,还能通过波与波之间的相位差,捕捉到相对位置关系。它有一个优雅的数学性质:任意偏移 kkk 后的位置编码 PE(pos+k)PE(pos+k)PE(pos+k),都可以表示为 PE(pos)PE(pos)PE(pos) 的线性函数。这意味着模型理论上可以通过学习线性变换,从当前位置编码推导出邻近位置的编码。这一性质,正是我们后面要讲的旋转位置编码的数学伏笔。
正弦位置编码的公式并不复杂。对于位置 pospospos 和维度索引 iii(总维度 dmodeld_{model}dmodel),编码向量的第 2i2i2i 维和第 2i+12i+12i+1 维分别定义为:
PE(pos,2i)=sin(pos100002i/dmodel)
PE(pos, 2i) = \\sin\\left(\\frac{pos}{10000^{2i/d_{model}}}\\right)
PE(pos,2i)=sin(100002i/dmodelpos)
PE(pos,2i+1)=cos(pos100002i/dmodel)
PE(pos, 2i+1) = \\cos\\left(\\frac{pos}{10000^{2i/d_{model}}}\\right)
PE(pos,2i+1)=cos(100002i/dmodelpos)
底数 10000 控制不同维度的波长:低维度变化快,高维度变化慢。正弦和余弦的周期性让位置间的编码差呈现出有规律的相位移动,从而隐式捕捉相对位置关系。
实现起来同样简单:
import torch
import math
def sinusoidal_position_encoding(max_len, d_model):
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1).float()
div_term = torch.exp(torch.arange(0, d_model, 2).float() * –(math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
return pe
生成一个 (max_len, d_model) 的矩阵,每行对应一个位置编码。使用时直接加到词嵌入上,就完成了最基础的时空几何注入。
我们可以把正弦位置编码想象成一座巨大的古戈尔钟——当然,这里的“古戈尔”只是虚指,形容指针数量之多、周期跨度之大。在这座钟上,不是只有时针、分针、秒针,而是有成百上千根周期各不相同的指针——有的像秒针,转得飞快,代表低维度的编码;有的像分针、时针,越来越慢;还有的像月针、年针,几乎看不出移动,代表高维度的编码。低维度的指针用高频的正弦和余弦快速摆动,刻画出细密的局部节奏;高维度的指针则缓慢地描绘出宏大的全局周期。
于是,每个位置就像是所有这些不同频率指针在某一瞬间共同指向的一个唯一组合。相邻位置之间,高频指针已经转过了明显的角度,而低频指针几乎未动,这就形成了细腻的过渡。不同维度、不同频率的指针交织在一起,像一座多维度的钟表,既定位了绝对位置,也隐含着相对位置。位置不再是简单的数字,而成了在高低频折叠中展开的一串波纹。
这,便是对语义时空的第一次折叠:用固定频率的波纹,把原本没有方向的高维平原,弯折出位置的结构。
四、RoPE:折叠从静态走向动态
然而,正弦位置编码虽然巧妙,却终究是固定的。它像一座预先设定好所有指针速度的古戈尔钟,无论语言如何流动,位置编码的波纹都一成不变。它注入的是一种绝对位置的几何图案,相对位置关系只是这些图案之间间接的相位差。模型必须学会从固定的正弦波纹中解读出顺序,这未免有些被动。折叠在这里是死的——它铺展在那里,等模型去适应。
于是,研究者开始思考:能不能让位置信息更直接地作用于语义本身?不是简单地在词向量上“加”一个固定的位置向量,而是让位置以一种旋转的方式,将语义向量在高维空间中扭转到对应的时间角度上。这就是旋转位置编码——RoPE——的核心思想。RoPE不再预设固定的位置图案,而是根据位置对每个词向量施加旋转。这种旋转是正交的,不改变向量的长度,只改变其方向。更精妙的是,两个词向量旋转之后的内积,只依赖于它们之间的相对位置差。这意味着,注意力分数天然地蕴含了相对位置信息,无需再通过正弦波纹的相位差去间接推算。具体细节可参见本系列前文,此处不展开。
如果说 APE 是在语义空间里为每个位置插上一面固定的旗子,那么 RoPE 就是让每个词向量根据它在句子中的位置,自行旋转到时空流形上的对应角度。正弦编码中那条“可线性表示”的数学性质,在 RoPE 中被外化成了显式的旋转变换。折叠不再是一张铺平的地图,而成了动词——语义流形开始主动弯曲,每个词都在高维时空中扭转自己的姿态。语义的几何因此从静态的坐标标记,走向了动态的折叠与展开。
五、长度之外:折叠过度的撕裂
然而,当我们把模型推向更长的推理序列时,一个更深层的问题浮出水面:如果推理长度超过了训练时见过的最大长度,位置编码所构建的时空几何还会成立吗?
以 RoPE 为例,训练时模型只在固定长度的“钟表刻度”内学习旋转角度。一旦序列超出这个范围,位置对应的旋转角度会进入未经训练的区域,尤其那些高频旋转分量,几乎完全失去了可预测的规律。注意力分数开始变得极端,原本平滑的概率分布趋向尖锐或坍塌——熵值急剧下降,模型可能反复盯住少数几个位置,或者完全丧失长距离依赖能力。这就是所谓的分布熵崩塌。
这实际上意味着,模型在训练长度内学会的时空折叠方式,并不天然具备外推能力。超出训练范围,语义的几何坐标就像一张被拉伸过度的膜,局部出现褶皱与撕裂。折叠不再是平滑的曲率变化,而是变成了断裂。这不仅是位置编码的数学问题,更是 LLM 走向更长上下文、更复杂推理时,必须正面回答的几何稳定性问题。
六、线性内插:均匀压缩的代价
面对这种长度外推的困境,一种直观的解决方案是线性内插位置索引。具体来说,如果我们训练时最大长度为 LLL,推理时希望扩展到 L′L'L′,就把所有位置索引乘以一个缩放因子 L/L′L/L'L/L′。这样,原本超出训练范围的位置会被压缩回模型熟悉的区间内,从而避免旋转角度进入未训练的区域。
然而,这种简单粗暴的做法并非没有代价。线性内插相当于把整个时空流形均匀压缩,所有频率的指针都被同步放慢。原本代表低维度的高频“秒针”,转得不再那么快,相邻位置之间的角度差异被抹平。模型对局部顺序的分辨能力因此下降,就像把一把高精度的尺子缩成了一半,刻度之间的距离被压缩,细微差别变得难以辨认。这就是所谓的分辨率问题。
线性内插的本质,是用牺牲短距离的时空分辨率,来换取长距离上的稳定性。它缓解了熵崩塌,却让语义几何的局部结构变得模糊。折叠被整体拉平了——所有位置的曲率都被均匀摊薄,就像把一张揉皱的纸硬生生压平,虽然面积变大了,但纸上原本的褶皱纹理全都消失了。这提示我们:位置编码的外推,本质上是一个在全局覆盖与局部精度之间寻找平衡的几何问题。
七、频域之中:折叠的曲率
要理解线性内插为什么会导致分辨率问题,我们需要把位置编码放到频域中去观察。无论是正弦位置编码还是 RoPE,本质上都是为不同维度分配不同频率的波动。低维度对应高频,负责捕捉相邻 token 之间的细微变化;高维度对应低频,刻画更大范围的顺序结构。整个位置编码就像一张频谱图,从快到慢分布着众多频率成分。
线性内插的做法,相当于对这张频谱图进行整体均匀压缩:所有频率按相同比例降低。高频部分原本用来分辨相邻位置,一旦被压缩,相邻 token 之间的相位差急剧减小,模型自然难以区分局部顺序。这就是分辨率下降的频域解释。
更关键的是,模型在训练时只见过特定频率范围内的位置变化模式。外推时,高频分量被过度压缩,会塌缩到模型未曾学习的区域;低频分量虽相对稳定,但也面临边界外推的不确定性。熵崩塌和分辨率丢失,归根结底都是频域结构失衡的表现。
频域视角让我们看清一个事实:位置编码的外推并不是一个均匀的问题。不同频率需要不同的处理策略——高频需要保持足够的分辨率,低频则需要平滑外推。只有从频域重新审视语义时空的折叠方式,才能找到更精细的扩展方法。折叠的曲率不能在每一处都相同;有些地方需要更紧凑的折痕,有些地方则需要更舒展的弧面。
八、YaRN:分频而治的智慧
正是在这个频域思路上,YaRN 提出了更精细的解决策略。它的全称是“Yet another RoPE extensioN method”,核心思想不再对所有维度一视同仁,而是根据频率高低分组处理。
具体来说,YaRN 把 RoPE 中的旋转维度按照频率从高到低划分成若干段。对高频段,它几乎不做压缩,让相邻 token 之间的角度差保持原有的分辨率;对低频段,则施加更大的缩放,使其能够覆盖更远的长度范围。这就像在一座古戈尔钟上,只调慢那些原本就转动缓慢的年针和月针,而让秒针继续按原速飞转。这样既扩展了全局时间尺度,又没有牺牲短距离的精确刻度。折叠不再是整体摊薄,而是有选择地加深某些折痕、放松另一些曲率。
在具体实现上,YaRN 对 RoPE 的每个维度对 (2i,2i+1)(2i, 2i+1)(2i,2i+1) 引入一个缩放因子 γi\\gamma_iγi,使得旋转角度从原来的 pos⋅θipos \\cdot \\theta_ipos⋅θi 变为 pos⋅γi⋅θipos \\cdot \\gamma_i \\cdot \\theta_ipos⋅γi⋅θi,其中 θi=10000−2i/d\\theta_i = 10000^{-2i/d}θi=10000−2i/d。
对于每个维度对,先计算其对应的波长 λi=2π/θi\\lambda_i = 2\\pi / \\theta_iλi=2π/θi。设训练长度为 LLL,期望扩展长度为 L′=s⋅LL' = s \\cdot LL′=s⋅L,则 γi\\gamma_iγi 按频率高低分段确定:
γi={1,若 λi<LLλi,若 λi>sL(1−r)⋅Lλi+r⋅1,若 L≤λi≤sL
\\gamma_i =
\\begin{cases}
1, & \\text{若 } \\lambda_i < L \\\\
\\frac{L}{\\lambda_i}, & \\text{若 } \\lambda_i > sL \\\\
(1 – r) \\cdot \\frac{L}{\\lambda_i} + r \\cdot 1, & \\text{若 } L \\le \\lambda_i \\le sL
\\end{cases}
γi=⎩⎨⎧1,λiL,(1−r)⋅λiL+r⋅1,若 λi<L若 λi>sL若 L≤λi≤sL
其中 r=λi−LsL−Lr = \\frac{\\lambda_i – L}{sL – L}r=sL−Lλi−L 是一个线性插值系数,用于平滑过渡。这里给出的是概念简化版:原论文在中间过渡段使用了余弦 ramp 而非简单的线性插值,但核心思想一致——高频维度(波长短)保持原样,低频维度(波长长)按比例压缩,中间区域平滑过渡。这样既保住了局部分辨率,又扩展了有效范围。
此外,YaRN 还引入温度因子 τ\\tauτ 调整注意力 softmax,缓解长序列下的熵崩塌:
τ=1+0.1⋅ln(s)
\\tau = 1 + 0.1 \\cdot \\ln(s)
τ=1+0.1⋅ln(s)
推理时通常取 τ\\tauτ 的平方根作为注意力温度。这个温度调节让注意力分布在扩展长度后不至于过度尖锐。
通过这种分频而治的方式,YaRN 在分辨率与外推能力之间找到了一种动态平衡,也标志着位置编码从均匀几何压缩,真正走向了频率感知的自适应折叠。
九、Llama与Gemma:现代模型的实践
在现代大语言模型的演进中,这一思路得到了鲜明体现。Llama 系列自初代起沿用标准 RoPE,并使其成为开源界的默认配置。到了 Llama 3,一个关键调整是将 RoPE 的 base 从 10000 提高到 500000。这一改动直接改变了频率分布:低频端显著放慢、波长拉长以覆盖更远位置,而最高频维度几乎不动、保住相邻分辨率。这正是 NTK-aware 思想的体现,也与前文 YaRN 的分频策略一脉相承,在不显著增加训练成本的前提下提升了长上下文的稳定性,成为目前许多开源模型采用的大 base 策略。
Gemma 3 则采用了更复杂的混合方案:全局注意力层使用高达 1M 的 base,局部注意力层保持 10000 的 base,并结合交替的局部/全局注意力机制。这种设计在扩展上下文的同时,通过局部层维持了短距离分辨率。而此前的 Gemma 2 虽然 base 保持默认的 10000,但引入了 local/global 交替注意力和 logit soft-capping 来稳定长序列训练。这些实践表明,位置编码已不再是孤立的数学插件,而是与模型架构、训练策略深度耦合的时空折叠系统。每一种选择,都是在全局覆盖与局部分辨率之间做出的工程化权衡。
从正弦波纹的第一次折叠,到 RoPE 的动态旋转,再到 YaRN 的分频而治,我们看到的是一条清晰的脉络:位置编码的演进,本质上就是人类对语义时空中折叠方式的理解不断深化的过程。每一次外推困境,都在逼迫我们重新审视那张高维流形的曲率分布;每一种新方法,都是在寻找更合理的折痕——既不让短距离的精细结构被抹平,也不让长距离的连续性被撕裂。而这,正是大语言模型底层世界中,最迷人的几何学。
网硕互联帮助中心



评论前必须登录!
注册