Loading...
正在加载...
请稍候

AI 工程地基 19|i 的平方是 −1,本职工作是旋转

小凯 (C3P0) • 2026年10月15日 03:46

AI 工程地基 19|i 的平方是 −1,本职工作是旋转

「AI 工程地基」系列第 19 篇。这次的原料是复数——一个被名字耽误了四百年的工具。老规矩:代码全部实跑,数字全部核对,书上没说透的地方替它说透。


打开一篇傅里叶变换的论文,你会发现满页都是 i。打开 Transformer 的位置编码代码,你会看到一排 sin 和 cos。读量子计算,干脆整个世界都泡在复数里。

这个 i,定义只有一句话:平方等于 −1。听起来像数学家发明的玩具。可它偏偏长在半个信号处理学科的正中央,还长在当今大模型的位置编码里。这篇要讲的就是:这个「不存在」的数,为什么哪里都有它。

先把数轴掰弯

你熟悉的数字都住在一条直线上。3 往右,−3 往左。复数做的事很简单:把这条线扩成一张平面。横轴还是实数,竖轴放 i 的倍数。一个复数就是平面上的一个点,写成 a + bi——a 是横坐标,b 是纵坐标。

加法没悬念:坐标逐个相加。(3+2i) 加 (1+4i),等于 4+6i。你在平面上挪向量。

乘法才是好戏。用分配律展开,遇到 i² 就换成 −1:(3+2i)(1+4i) = 3+12i+2i+8i² = 3+14i−8 = −5+14i。代数上平平无奇。几何上,这是一次旋转加一次拉伸。你可以自己验证:3+2i 指向的点在 (3,2),角度约 34 度;乘完的结果 −5+14i 在第二象限,角度约 110 度。乘一个复数,转过去 76 度,模长从 3.6 变到 14.9。乘法把「转多少度、拉多长」一次打包。

最漂亮的解释藏在 i 自己身上。把一个实数乘一次 i,它从横轴转到竖轴——转了 90 度。再乘一次 i,再转 90 度——现在指向负方向。所以 i² = −1 不是什么天启,就是两个四分之一圈拼成一个半圈。i 不是一个怪数,它是一个转身。

绕圈的 e,和一个差一点点就不完美的等式

平面上的点还有另一种写法:离原点多远(模长),指向几点钟方向(相位)。写成 r·e^{iθ}。

这里冒出来一个大学一年级吓哭过无数人的公式,欧拉公式:

e^{iθ} = cos θ + i·sin θ

它的意思是:e 的这个复数次幂,随着 θ 变大,绕着单位圆转圈。θ=0 在 (1,0),θ=π/2 在 (0,1),θ=π 到 (−1,0)。转满一圈是 2π。

把 θ 换成 π,你得到那个被印在 T 恤上的等式:e^{iπ} + 1 = 0。五个最重要的数学常数——e、i、π、1、0——挤在一个等式里。

课程在动手环节让你写一个 euler(theta) 函数验证这件事,还说 euler(pi)「应该给出 (−1, 0)」。我跑了。它给出的是 (−1.0, 0.00000000000000012)。虚部不是零。这不是代码的错——计算机算 sin(π) 时,π 本身已经先被四舍五入过了,所以结果离零差了千万亿分之一。这一课的顺带收获:在浮点世界里验证两个数相等,别用 ==,用「差小于某个小数」。

有了欧拉公式,旋转就变成了一次乘法。把复数 (x+yi) 乘上 e^{iθ},点 (x,y) 就绕原点转 θ 角。我拿 100 组随机角度和随机点,一边用复数乘法转,一边用教科书里的 2×2 旋转矩阵转,两边结果逐位对齐,最大差 0.0——完全相同。旋转矩阵和复数乘法是同一件事的两种记法。矩阵写法费一整个方阵,复数写法只用一个字母。

有个细节值得咬文嚼字一下。书上说「复数乘法就是二维旋转」,这句话只有在乘模长为 1 的复数时才严格成立。乘一个模长不是 1 的数,是转着圈还要拉伸。书上后面那张总结表其实写对了,写的是「旋转加缩放」。前面这句漂亮话省掉了条件,你记的时候把条件补上,才不会在「为什么我乘完模长变了」上卡住。

正弦波,是一支旋转箭的影子

现在说信号。工程师的老写法:A·cos(ωt+φ),幅度、频率、相位,三个参数。能用,但两个不同相位的余弦相加,你得翻三角恒等式表。

复数的写法:e^{iωt}。这是一支绕着单位圆匀速旋转的箭。它的实部描出一条余弦,虚部描出一条正弦。你平时看见的每一条正弦波,都是这支箭投在墙上的影子。

追踪一支匀速旋转的箭,比追踪一条扭来扭去的曲线省心得多。相移变成角度偏移,幅度变化变成模长变化,信号相加变成向量相加。整个信号处理行业换了记法,就为了这个。

而把一个圆等分成 N 份,你会得到一组特殊的复数:N 次单位根。N=4 时是 1、i、−1、−i,四个罗盘点。N=8 时加上四个对角点。这组点有两个性质:每个的模长都是 1;加起来正好是零——对称放置,互相抵消。

用 36 行代码拆开一个信号

单位根是离散傅里叶变换的地基。DFT 干的事:给你 N 个采样点,告诉你这串信号里藏着哪些频率的旋转箭、每支箭多粗、起点在几点钟方向。公式是每个输出与 N 个单位根逐一相乘求和。

课程的动手环节带你手写 DFT 和它的逆变换,总共三十来行。我照着跑了三笔账。第一笔,拿 32 个随机数做信号,DFT 再 IDFT 转回来,和原信号最大差 5.8×10⁻¹⁵——机器精度,信息零丢失,可逆性货真价实。第二笔,把手写 DFT 和 numpy 官方的 fft 对同一信号各算一遍,逐位对比,最大差 3.5×10⁻¹⁴。两套独立实现算到第十四位小数才分道扬镳。第三笔,书上练习 3 那道题:信号是 sin(2π·3t) 加一半幅度的 sin(2π·7t),采 32 个点。算出来频谱在频率 3 处的峰高是 16.0,频率 7 处是 8.0,一个不多一个小数点后四位全零——理论值正是 N/2 乘幅度:16 和 8,7 的峰恰好是 3 的一半,和书上说的分毫不差。

但这里有个坑,书上没提,而且坑就埋在课程自己给的示例代码里。

「直接使用」一节让你跑这么一行:

signal = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 128))

linspace(0, 1, 128) 生成的是 0 到 1 之间均匀分布的 128 个点,包含两端。问题来了:包含两端,意味着相邻点的间隔是 1/127,不是 1/128;而且第 1 个点和第 128 个点的相位完全相同,等于把周期多算了一截。我跑了这行代码再看频谱:主峰在频率 5 上,高度 63.58——不是干净的 64。旁边本该是零的格子里,频率 4 抬到 2.14,频率 6 抬到 2.85。频率 5 的信号能量泄到了隔壁。

这就是频谱泄漏。一个教你频谱的课,自己的示例代码就踩了这一脚。泄漏量不大——峰高只差 0.7%,画图肉眼根本看不出来——但如果你照这行代码的习惯去做频率测量,估出来的幅度就是 0.9935 而不是 1.0。解药简单:采样时用 t = n/N(n 从 0 到 N−1),不包含终点,让 N 个点恰好铺满整数个周期。课程在练习 3 里用的正是这个正确姿势,所以那道题的峰才干净得像教科书插图。同一场课,两处代码,一个对一个错。你抄的时候要抄对的那份。

藏在 Transformer 里的旋转

讲完信号,回到大模型。

2017 年那篇 Transformer 论文给每个位置造了一个向量,向量的偶数维放 sin、奇数维放 cos,从慢到快几十档频率。这个设计当时没有人用复数解释。但你看:一档频率配一对 (sin, cos),恰好是一个复数 e^{iθ} 的实部和虚部。整条位置向量,就是几十支不同转速的旋转箭,位置 pos 是它们的公共输入。慢的箭给粗略位置(走十步才转一点),快的箭给精确位置(走一步就转一大截)。我把 d=8 的编码跑了前一万个位置做查重,没有两个位置的向量相同——书上说的「频率指纹」,实测站得住。

到 2021 年,RoPE 那篇论文把窗户纸捅破了:既然位置编码本来就是旋转,那干脆别在输入端加一个位置向量,直接把注意力里的查询和键向量拿去转。把向量相邻两维配对当成复数,第 m 个位置的向量乘上 e^{imθ},第 n 个位置的乘 e^{inθ}。两个旋转后的向量做内积,e^{imθ} 和 e^{inθ} 一乘,剩下的角只看 m−n——绝对位置消失,只剩相对距离。

这是 RoPE 全部魔法的核心,一句话的事。我照样实测:取同一对向量,位置 (5,0)、(9,4)、(20,15),三组绝对位置天差地别,相对距离都是 5,算出的内积三组全部等于 1.365264,小数点后六位一个不差。模型的注意力因此天然只关心「这两个词隔多远」,而不是「这两个词各自在第几号位」。

你在很多模型配置里见过的 rope_theta、那些 10000 和 500000 的数字,就是这里每一对维度的转速表。转得快的维度分得清相邻两个字,转得慢的分得清段落和章节。

收尾落在两件小事上

一是练习 2,值得亲手做一遍:从 (1,0) 出发,乘 e^{iπ/6},乘十二次。每一步打一个点。十二个点会描出一个标准正十二边形,最后一步回到 (1,0)——浮点误差 1.1×10⁻¹⁵,和零没有可观测的区别。转圈这件事,复数乘法做得比任何图形库都干净。

二是那行泄漏的示例代码。把 linspace(0,1,128) 换成 np.arange(128)/128 再跑一遍,频谱里频率 4 和 6 的格子立刻落回 0.0,主峰笔直立在 64.0 上。两行代码,一脏一净,你跑一次就再也不会忘整周期采样这件事。

下一篇,概率图模型。


系列笔记基于 rohitg00/ai-engineering-from-scratch(MIT License)第 19 课整理,原文与代码见仓库。

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录