面向 AI 的复数:旋转与频率的语言 本节摘要:-1 的平方根不是「想象」的——它是旋转、频率与半个信号处理的关键。打开傅里叶变换的论文,到处是 ;看 Transformer 位置编码,看到不同频率的 sin 与 cos——它们正是复指数的实部与虚部;读量子计算,一切在复向量空间里表达。复数看似抽象,一个建立在 -1 的平方根上的数系像是数学花招,但它不是花招——它是旋转与振荡的天然语言。每当某物旋转、振动、振荡,复数就是对的工具。不理解复数,就无法理解离散傅里叶变换(DFT)、FFT、现代语言模型的 RoPE(旋转位置编码),也无法理解原始 Transformer 论文里正弦位置编码为何用那些频率。
本节摘要:-1 的平方根不是「想象」的——它是旋转、频率与半个信号处理的关键。打开傅里叶变换的论文,到处是
i;看 Transformer 位置编码,看到不同频率的 sin 与 cos——它们正是复指数的实部与虚部;读量子计算,一切在复向量空间里表达。复数看似抽象,一个建立在 -1 的平方根上的数系像是数学花招,但它不是花招——它是旋转与振荡的天然语言。每当某物旋转、振动、振荡,复数就是对的工具。不理解复数,就无法理解离散傅里叶变换(DFT)、FFT、现代语言模型的 RoPE(旋转位置编码),也无法理解原始 Transformer 论文里正弦位置编码为何用那些频率。本节从复数算术(加、乘、除、共轭,直角与极坐标两种形式)与复平面出发;给出欧拉公式e^(iθ) = cos θ + i·sin θ(连接复指数与三角);证明复数乘法就是 2D 旋转;讲清单位根(N 个等分单位圆的点)是 DFT 的基础;最后连上 Transformer:正弦位置编码的 sin/cos 对是不同频率复指数的实虚部,RoPE 显式用复旋转矩阵把相对位置变成旋转角。
对应原课程:Phase 01 · Lesson 19 ·
complex-numbers(原英文phases/01-math-foundations/19-complex-numbers/docs/en.md)。前置:第 1~4 节(线性代数、微积分)。
阅读完本节,你应当能够:
复数看似抽象,建立在 -1 的平方根上的数系像数学花招,但它不是花招——它是旋转与振荡的天然语言。每当某物旋转、振动、振荡,复数就是对的工具。没有复数,你无法理解 DFT、FFT,无法理解 RoPE 如何在现代语言模型里工作,无法理解原始 Transformer 的正弦位置编码为何用那些频率。
复数有两部分:实部与虚部。z = a + bi,其中 a 是实部、b 是虚部、i 是虚单位,定义为 i² = -1。就这样——你把数轴扩展成一个平面:实数坐一轴,虚数坐另一轴,每个复数是这个平面里的一点。
(a+bi)+(c+di) = (a+c)+(b+d)i。i² = -1。(a+bi)(c+di) = (ac−bd)+(ad+bc)i。a+bi 的共轭是 a−bi。复数与其共轭之积恒实:(a+bi)(a−bi) = a²+b²。(a+bi)/(c+di) = (a+bi)(c−di)/(c²+d²)。复平面把每个复数映成 2D 点:水平轴是实轴、垂直轴是虚轴。z=3+2i 对应点 (3,2);z=-1+0i 在实轴上 (-1,0);z=0+4i 在虚轴上 (0,4)。复数同时是一个点与从原点出发的向量——这种双重解读使复数在几何上有用。
平面内任一点可用到原点距离与正实轴夹角描述:z = r·(cos θ + i·sin θ),其中 r = |z| = √(a²+b²)(模/幅值),θ = atan2(b,a)(相位/幅角)。直角形式(直角坐标 a+bi)便于加法,极坐标形式 (r,θ) 便于乘法。极坐标下乘法:模相乘、角相加:z₁·z₂ = (r₁·r₂)·e^(i(θ₁+θ₂))。这就是为何复数是旋转的完美工具——乘以一个模为 1 的复数就是纯旋转。
复指数与三角的桥梁:e^(iθ) = cos θ + i·sin θ。这是本节最重要的公式。当 θ = π:e^(iπ) = cos π + i·sin π = -1,故 e^(iπ) + 1 = 0——五个基本常数(e、i、π、1、0)用一个方程连起。
欧拉公式说 e^(iθ) 随 θ 变化描单位圆:θ=0 在 (1,0);θ=π/2 在 (0,1);θ=π 在 (-1,0);θ=3π/2 在 (0,-1);完整一圈 θ=2π。这意味着**复指数就是旋转**,而旋转在信号处理与 ML 里无处不在。
复数 (x+yi) 乘 e^(iθ) 把点 (x,y) 绕原点转 θ 角:
复数乘法旋转:(x+yi)·(cos θ + i·sin θ) = (x·cos θ − y·sin θ) + (x·sin θ + y·cos θ)·i 矩阵乘法旋转:[cos θ -sin θ][x] = [x·cos θ − y·sin θ] [sin θ cos θ][y] [x·sin θ + y·cos θ]
两者结果相同——复数乘法就是 2D 旋转,旋转矩阵只是用矩阵记号写的复数乘法。
复指数 e^(iωt) 是一个以角频率 ω 绕单位圆旋转的点。t 增大时点描圆。这旋转点的实部是 cos(ωt),虚部是 sin(ωt)——正弦信号是旋转复数的影子:e^(iωt) = cos(ωt) + i·sin(ωt),实部是余弦波,虚部是正弦波。这就是相量(Phasor)表示:不追踪扭动的正弦波,而追踪平滑旋转的箭头。相移变角度偏移,幅度变化变模变化,信号相加变向量相加。
第 N 次单位根是单位圆上等距的 N 个点:ω_k = e^(2πi·k/N),k=0,1,...,N-1。N=4 时根是 1、i、-1、-i(四个罗盘点);N=8 时加上四个对角。单位根是离散傅里叶变换的基础——DFT 把信号分解到这 N 个等距频率的分量上。
信号 x[0], x[1], ..., x[N-1] 的离散傅里叶变换是:X[k] = Σ_{n=0}^{N-1} x[n]·e^(-2πi·k·n/N)。每个 X[k] 量信号与第 k 个单位根(频率 k 的复正弦)的相关程度——DFT 把信号拆成 N 个旋转相量,告诉你每个的幅度与相位。
「虚数」一词是历史意外(Descartes 贬义地用了它),但 i 并不比负数(人们最初也排斥)更虚。负数回答「3 减 5 得多少」,虚单位回答「平方得 -1 的是什么」。更有用地:i 是 90 度旋转算子——实数乘一次 i 转 90 度到虚轴,再乘一次 i(i²)又转 90 度,现在指向负实方向,所以 i² = -1。这不神秘,是两个四分之一转拼成的半转。这就是复数在工程无处不在的原因:任何旋转的东西——电磁波、量子态、信号振荡、位置编码——都自然由复数描述。
欧拉公式前,工程师把信号写成 A·cos(ωt+φ)(幅度 A、频率 ω、相位 φ),能用但算术痛苦——加两个不同相位的余弦需要三角恒等式。用复指数,同一信号是 A·e^(i(ωt+φ)),加两信号就是加两复数,乘(调制)就是乘模加角,相移变角度加,频移变乘相量。整个信号处理领域转向复指数记号是因为数学更干净——「真实信号」总是复表示的实部,虚部作为簿记随行,让所有代数自然成立。
正弦位置编码(原始 Transformer):PE(pos, 2i) = sin(pos/10000^(2i/d)),PE(pos, 2i+1) = cos(pos/10000^(2i/d))。sin 与 cos 对是不同频率复指数的实部与虚部。每个频率提供不同「分辨率」编码位置:低频变化慢(粗略位置),高频变化快(精细位置),合起来给每个位置唯一的频率指纹。
RoPE(旋转位置编码) 走得更远:它显式用复旋转矩阵乘 query 与 key 向量,两 token 的相对位置变成旋转角,注意力用这些旋转向量计算,使模型通过复乘法对相对位置敏感。
| 运算 | 代数形式 | 几何含义 |
|---|---|---|
| 加法 | (a+c)+(b+d)i | 平面向量加 |
| 乘法 | (ac−bd)+(ad+bc)i | 旋转 + 缩放 |
| 共轭 | a−bi | 关于实轴反射 |
| 模 | √(a²+b²) | 到原点距离 |
| 相位 | atan2(b,a) | 与正实轴夹角 |
| 除法 | 乘共轭 | 反向旋转 + 重缩放 |
| 幂 | rⁿ·e^(inθ) | 转 n 次、缩 rⁿ |
完整源码见 phases/01-math-foundations/19-complex-numbers/code/complex_numbers.py。
class Complex: def __init__(self, real, imag=0.0): self.real = real; self.imag = imag def __add__(self, o): return Complex(self.real + o.real, self.imag + o.imag) def __mul__(self, o): return Complex(self.real*o.real - self.imag*o.imag, self.real*o.imag + self.imag*o.real) def __truediv__(self, o): d = o.real**2 + o.imag**2 return Complex((self.real*o.real + self.imag*o.imag)/d, (self.imag*o.real - self.real*o.imag)/d) def magnitude(self): return math.sqrt(self.real**2 + self.imag**2) def phase(self): return math.atan2(self.imag, self.real) def conjugate(self): return Complex(self.real, -self.imag)
def to_polar(z): return z.magnitude(), z.phase() def from_polar(r, theta): return Complex(r*math.cos(theta), r*math.sin(theta)) def euler(theta): return Complex(math.cos(theta), math.sin(theta)) # e^(iθ)
验证:euler(theta).magnitude() 恒为 1.0;euler(0) 给 (1,0);euler(π) 给 (-1,0)。
点 (x,y) 转 θ 角就是一次复数乘法:Complex(3,4) * euler(math.pi/4)——模不变,只改角。
def dft(signal): N = len(signal); result = [] for k in range(N): total = Complex(0, 0) for n in range(N): angle = -2 * math.pi * k * n / N total = total + Complex(signal[n], 0) * euler(angle) # 单位根 result.append(total) return result
这是 O(N²) DFT,每个 X[k] 是信号样本乘单位根之和。
逆 DFT 从频谱重建原信号。与正向 DFT 的唯一差别:指数符号翻转,再除以 N:
def idft(spectrum): N = len(spectrum); result = [] for n in range(N): total = Complex(0, 0) for k in range(N): angle = 2 * math.pi * k * n / N total = total + spectrum[k] * euler(angle) result.append(Complex(total.real/N, total.imag/N)) return result
DFT 后 IDFT 给完美重建(机器精度内),无信息丢失。
def roots_of_unity(N): return [euler(2 * math.pi * k / N) for k in range(N)]
验证两性质:每个根模恰为 1;N 个根之和为零(对称相消)——这让 DFT 可逆,单位根构成频域的正交基。
Python 原生支持复数,字面量 j 表示虚单位:
z = 3 + 2j; w = 1 + 4j print(z + w, z * w, abs(z)) import cmath print(cmath.phase(z), cmath.exp(1j * cmath.pi)) # e^(iπ) ≈ -1
数组用 numpy 原生处理复数:
z = np.array([1+2j, 3+4j, 5+6j]) print(np.abs(z), np.angle(z), np.conj(z), np.real(z), np.imag(z)) signal = np.sin(2 * np.pi * 5 * np.linspace(0, 1, 128)) spectrum = np.fft.fft(signal) # numpy 的 FFT(C 后端,极快) freqs = np.fft.fftfreq(128, d=1/128)
运行 code/complex_numbers.py 生成 outputs/skill-complex-arithmetic.md——一份复数算术与 ML 中复数出现处的技能参考。源码见 phases/01-math-foundations/19-complex-numbers/code/。
(2+3i)·(4−i),再用代码验证;算 (5+2i)/(1−3i),把两个结果画在复平面,验证乘法旋转并缩放了第一个数。e^(iπ/6) 十二次,验证十二次后回到 (1,0),打印每步坐标确认描出正十二边形。sin(2π·3·t) + 0.5·sin(2π·7·t) 以 32 点采样的信号,跑你的 DFT,验证幅度谱在频率 3 与 7 处有峰,且 7 处峰高是 3 处的一半。e^(2πi/8) 得下一个根。a+bi 有实部 a、虚部 b,i²=-1;它把数轴扩展成复平面(实轴 + 虚轴)。(r,θ) 便于乘法:乘法 = 模相乘 + 角相加。e^(iθ) = cos θ + i·sin θ 连接复指数与三角,是本节最重要的公式,e^(iπ)+1=0。i 是 90 度旋转算子,乘两次 i 得半转(i²=-1),不神秘。e^(2πi·k/N) 是单位圆上等距 N 点,构成频域正交基,是 DFT 的基础。下一节,我们把「每个信号都是正弦波之和」落到实处——傅里叶变换:DFT 从零实现、O(N log N) 的 Cooley-Tukey FFT、卷积定理、谱分析,以及它与 CNN 卷积、Transformer 位置编码、频谱图的联系。