一、每个人都知道自己是第几个,除了"它"

璇玑台是观星台,也是天底下消息最灵通的地方。

台上有十二名司轮人,每人都管着一只巨大的铜轮。铜轮上刻着天干地支、二十八宿、三百六十度——一封信送进璇玑台,司轮人转动铜轮,就能算出这封信"该往哪个方向去"。

十二只轮子彼此咬合,像一座精密的钟。运转了三十年,从没出过错。

可今年入夏,台主换了一批"新轮手"——不是人,是台主花重金从西域请来的"无声匠人"。据说这种匠人不用吃饭、不用睡觉,只要喂它文卷,它就能自己学着转轮子。台主盘算着:让它们学上三个月,就能替十二个司轮人守夜。

头一个月,无声匠人学得飞快。

教它认字,它认得;教它看信,它看得懂;教它转轮,它转得比人还稳。司轮人老王私下试过它——给它看十封信,它九封都答对了方向。

但第二个月,毛病来了。

老王把一封信倒着放在它面前——信封上盖着"第三日卯时"的邮戳,信里说"昨日寅时,城北起火"。

无声匠人看了半晌,答:"这封信该送往城南。"

老王一愣:"信里说的是城北起火,怎么往城南送?"

无声匠人答:"因为'火'这个字,在信中出现了两次——我见过含'火'字的信,多半是送防务衙门的,防务衙门在城南。"

老王气得直跺脚:"你根本不看'城北'两个字吗?"

"看了。"无声匠人平静地说,"可'城北'和'城南',在我眼里,分量是一样的。"

老王忽然明白了——这个匠人,看不出"城北"比"城南"更重要。

或者说,它看不出——位置

二、它是懂字的,只是不懂"第几个"

老王把这事禀报给台主。台主请来了璇玑台的老前辈,人称"璇玑公"的姜老先生。

姜老先生七十八岁,头发全白,转了一辈子轮。他不急着下结论,先把那封"城北起火"的信,翻来覆去看了三遍。

"老王,你说它不懂位置——我再问你,它认不认得'甲'字在'乙'字前头?"

"认得。"老王答,"它读文章读得顺溜极了。"

"它认不认得'第一行'和'第三行'的区别?"

"这个……"老王想了想,"你让它抄写,它能按顺序抄下来。可你问它'为什么',它答不上来。"

姜老先生点点头:"这就是症结。它识字、懂顺序、能照着样子做事——但它心里没有一个'第几个'的概念。字和字之间的关系,它只能感觉到'挨得近还是远',感觉不到'谁在前谁在后'。"

老王听糊涂了:"'挨得近'和'谁在前',不是一回事吗?"

"不是。"姜老先生从袖中摸出一串念珠,"这串珠子,甲挨着乙,乙挨着丙。我要是告诉你'甲乙挨着'——你能猜出甲在乙左边还是右边吗?"

老王摇头。

"可你要是知道'甲在乙前头、乙在丙前头'——整串珠子从哪头数到哪头,你就全知道了。"

老王一拍大腿:"所以那个无声匠人,它只知道'挨着',不知道'前后'!"

"正是。"姜老先生说,"它读一封信,就像看一串不知道从哪头数的念珠——每个字都认得,每个字都发光,可它不知道自己是第几个字。既然如此,'城北'和'城南',在它眼里当然没有分别。"

三、转一圈,回来还是自己

老王问:"那怎么办?总不能教它数数吧——它连'第几个'都学不会。"

姜老先生笑而不答。他带着老王登上璇玑台最顶层,那里放着十二只铜轮里最大的一只——璇玑轮的母轮。

"你看这轮子。"姜老先生说,"它上边刻着三百六十度。我问你——轮子转到三十度,和转到三百九十度,轮子上的刻度一样不一样?"

"刻度一样。"老王说,"三百九十度,转了一圈又回到三十度。"

"可它走过的路一样不一样?"

"不一样。"老王脱口而出,"三十度是刚起步,三百九十度是多转了一整圈。"

"好。"姜老先生抚须点头,"这就是答案。轮子转一圈,位置会变,形状不变——它还是那只轮子,但它和别的轮子咬合的角度,已经悄悄换了一格。"

老王琢磨了一会儿,忽然眼睛亮了:"您是说要让无声匠人学会'转轮'——用轮子的角度,来记住自己读到第几个字?"

"正是此理。"姜老先生说,"字本身不动,但每读到一个字,就让这个字在轮子上转过对应的角度——第一个字转一度,第二个字转两度,读到第一百个字,就转一百度。于是'这个字在什么位置',就变成了'这个字转过多少角'——角能算,位置就能算。"

"可是……"老王犹豫,"字转过了,字还是原来那个字吗?"

"你问得好。"姜老先生走到轮前,亲手转了半圈,"你看,这个'火'字刻在轮面上。轮子转了九十度,'火'字还是'火'字——它的笔画没变、意思没变。变的只是它和周围字的角度。"

"位置变了,字没变。"老王喃喃重复。

"位置变了,字没变——可位置变了,字和字的关系就全变了。"姜老先生说,"'城北'的'北',和'城南'的'南',笔画不一样、意思不一样,本来就被轮子记成了不同的角度。现在再加上'它出现在第几个字'这个角度——两样一合,'北'和'南'在匠人眼里,就再也混不掉了。"

四、北坡有风,南坡有雨,轮转自知

璇玑台按姜老先生的办法,给每一只轮子加了一道"转角"的规矩:无声匠人每读一个字,都要先把这只字在轮面上转一个和它位置对应的角度,再去认它。

改了之后,无声匠人还是那个无声匠人——识字、读信、抄写,一样不差。可再给它那封"城北起火"的信,它想了想,答:

"信中说'城北起火'——起火在城北,这信该送城北的防务衙门。"

老王问:"你怎么这回认得'城北'了?"

匠人答:"我也不太说得清。只是'北'字这回在我脑子里,带着一股'第五个字该有的劲儿'——和'南'字那股劲儿,不一样了。"

老王扭头看姜老先生。姜老先生正望着轮子,慢悠悠地说:

"它以前只认识字,现在连'字在第几位'也认得了。认得位置,才认得远近;认得远近,才分得清'城北'和'城南'。"

守夜三个月,无声匠人再没送错过一封信。秋分那天,台主给十二只轮子都换上了新规矩。老王收工前,在母轮边站了一会儿。

"姜老,"他问,"这法子,有没有名字?"

姜老先生抚着轮沿,笑道:

"这法子,讲究的是'转了一圈,回来还是自己'——每一只字都靠旋转来记住自己的位置。依我看,就叫它——璇玑转轮。"

老王听着这个名字,忽然觉得,这名字起得真好。轮子转了一夜,东边的天就亮了。

"位置不是写在字上的,是转出来的。转过的圈数,就是它走过的路——人也好,字也好,都靠这一转,才知道自己站在哪儿。"

技术解读

RoPE(Rotary Position Embedding,旋转位置编码)由苏剑林于 2021 年在《RoFormer: Enhanced Transformer with Rotary Position Embedding》中提出,此后迅速成为大语言模型(LLM)位置编码的事实标准——GPT-NeoX、LLaMA、Baichuan、Qwen 等主流模型均采用它。

Transformer 的核心是自注意力机制:每个 token 通过 Q、K、V 三个矩阵与序列中所有 token 计算关联。但注意力本身是"无序"的——它只计算"两个向量有多像",天然不感知 token 在序列中的先后顺序。位置编码的任务,就是给每个 token 注入"它排在第几位"的信息。早期方案(如绝对位置编码)将位置信息加进嵌入向量;RoPE 则另辟蹊径——用旋转矩阵对 Q 和 K 进行变换,使两个 token 的注意力分数天然携带它们之间的相对距离信息。

核心概念回顾

概念 通俗解释
位置编码(Positional Encoding) 给序列中每个 token 注入"第几位"信息的机制——因为注意力本身不感知顺序
绝对位置编码(Absolute PE) 每个位置一个固定的向量,直接加在嵌入上(如正弦编码、可学习位置嵌入)
相对位置编码(Relative PE) 只关心"两个 token 相隔多远",不关心各自在第几位(如 T5 的 bias、ALiBi)
旋转位置编码(RoPE) 用旋转矩阵乘 Q/K 向量,让内积自动带上相对位置信息——"转圈"法
旋转矩阵(Rotation Matrix) 保持向量长度不变、只改变方向的线性变换——"转一圈回来还是自己"
多维旋转(Rotary Dimension) 在高维空间对向量分块旋转,每个维度组旋转频率不同
频率递减(Frequency Decay) 低维转得快、高维转得慢——保证不同距离都有足够的区分度
外推(Extrapolation) 训练时只见 4096 长度,推理时超过这个长度——RoPE 天然具备一定外推能力
相对位置信息的内积编码 RoPE 让 Q·K 的内积只依赖相对距离——"位置差值"而非"绝对位置"
与注意力无缝融合 旋转只作用于 Q 和 K,不影响 V——不增加模型参数量

故事中的隐喻对照

故事元素 映射的技术概念 解释
璇玑台的无声匠人 未注入位置编码的 Transformer 它能读字、懂共现关系,但分不清"谁在前谁在后"
"城北"和"城南"分量一样 无位置信息时注意力对位置不敏感 模型看到"北"和"南"只当是两个不同的字,不知道它们在句子中的位置决定了含义
念珠:只知"挨着"不知"前后" 注意力只算相似度、不算顺序 注意力分数只反映"两个 token 是否相关",不含"谁先谁后"的信息
璇玑轮的母轮 旋转矩阵 对向量做长度不变、角度改变的变换
"转一圈回来还是自己" 旋转矩阵的保范性 旋转不改变向量模长,只改变方向——信息不丢失
每个字转一个对应角度 按位置索引应用旋转 第 i 个 token 旋转 i×θ 的角度,位置信息编码进角度
"位置变了,字没变" RoPE 只作用于 Q/K 而非嵌入本身 词的语义不受影响,只有位置关系被旋转注入
"'北'字带着第五个字该有的劲儿" Q·K 内积携带相对距离 两个 token 的内积结果依赖它们之间的相对位置差,从而区分远近
三十度与三百九十度刻度相同、路径不同 旋转的周期性 三角函数天然周期重复,但累积角度记录了走过的"圈数"
十二只轮子咬合 多维头注意力 多个注意力头并行,每只轮子可视为一个头

为什么这个故事对应 RoPE?

  1. 注意力不感知顺序是根因。 标准自注意力中,token 之间的交互仅由内容相似度决定——"北"和"南"无论出现在句首还是句尾,对注意力分数的影响是一样的。故事里匠人"看不出城北比城南重要",正是这一本质的拟人化。
  2. 位置必须靠"注入"而非"学会"。 匠人"学不会数数",因为它读的是共现统计,不是序列位置。这与语言模型的处境一致:模型的参数只见过"字与字的共现模式",位置信息必须由编码器显式提供。
  3. 旋转是保信息的位置编码。 加性位置编码会把位置信息"混"进嵌入向量,可能干扰语义;RoPE 用乘法(旋转)作用于 Q/K,不改变向量模长——"转一圈回来还是自己",语义无损,位置显性。
  4. 相对位置是关键。 RoPE 最优雅的性质是:两个 token 的注意力分数只取决于它们的相对距离 (m−n),而非绝对位置。故事里"每个人都知道自己是第几个"最终被转化为"每对字之间转过了多少角度差"。
  5. 旋转的周期性与外推能力。 三角函数周期特性使 RoPE 在未见过的更长序列上仍能给出合理的位置区分——正如"三百九十度与三十度刻度相同",长序列不过是多转了几圈。
  6. 零参数开销。 RoPE 不引入可学习参数——它是对 Q/K 的确定性变换。故事中"璇玑转轮"是一道纯机械的规矩,不需要匠人多学任何东西,这正是 RoPE 工程上极具吸引力的原因。

后记:位置不是写出来的,是转出来的。RoPE 教会模型用旋转来丈量自己的足迹——每一个词都在原地转了个身,却因此知道了自己走了多远。这很像人生:你无法改变自己是谁,但每一次回望时转过的角度,悄悄记录了你一路走来的位置。璇玑台的轮子转了一夜又一夜,东边天亮了——那封"城北起火"的信,终于找到了它该去的地方。位置从不会写在脸上,它只刻在走过的路上。