面向 AI 的复数:旋转与频率的语言


文档摘要

面向 AI 的复数:旋转与频率的语言 本节摘要:-1 的平方根不是「想象」的——它是旋转、频率与半个信号处理的关键。打开傅里叶变换的论文,到处是 ;看 Transformer 位置编码,看到不同频率的 sin 与 cos——它们正是复指数的实部与虚部;读量子计算,一切在复向量空间里表达。复数看似抽象,一个建立在 -1 的平方根上的数系像是数学花招,但它不是花招——它是旋转与振荡的天然语言。每当某物旋转、振动、振荡,复数就是对的工具。不理解复数,就无法理解离散傅里叶变换(DFT)、FFT、现代语言模型的 RoPE(旋转位置编码),也无法理解原始 Transformer 论文里正弦位置编码为何用那些频率。

面向 AI 的复数:旋转与频率的语言

本节摘要:-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. 在直角与极坐标两种形式下做复数算术(加、乘、除、共轭)。
  2. 应用欧拉公式在复指数与三角函数间转换。
  3. 单位根从零实现离散傅里叶变换(DFT)。
  4. 解释复旋转如何支撑 Transformer 的 RoPE 与正弦位置编码。

一、问题与直觉

复数看似抽象,建立在 -1 的平方根上的数系像数学花招,但它不是花招——它是旋转与振荡的天然语言。每当某物旋转、振动、振荡,复数就是对的工具。没有复数,你无法理解 DFT、FFT,无法理解 RoPE 如何在现代语言模型里工作,无法理解原始 Transformer 的正弦位置编码为何用那些频率。

1.1 复数是什么

复数有两部分:实部与虚部。z = a + bi,其中 a 是实部、b 是虚部、i 是虚单位,定义为 i² = -1。就这样——你把数轴扩展成一个平面:实数坐一轴,虚数坐另一轴,每个复数是这个平面里的一点。

1.2 复数算术

  • 加法:实部加实部、虚部加虚部。(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²)

1.3 复平面

复平面把每个复数映成 2D 点:水平轴是实轴、垂直轴是虚轴。z=3+2i 对应点 (3,2);z=-1+0i 在实轴上 (-1,0);z=0+4i 在虚轴上 (0,4)。复数同时是一个点与从原点出发的向量——这种双重解读使复数在几何上有用。

1.4 极坐标形式

平面内任一点可用到原点距离与正实轴夹角描述:z = r·(cos θ + i·sin θ),其中 r = |z| = √(a²+b²)(模/幅值),θ = atan2(b,a)(相位/幅角)。直角形式(直角坐标 a+bi)便于加法,极坐标形式 (r,θ) 便于乘法。极坐标下乘法:模相乘、角相加:z₁·z₂ = (r₁·r₂)·e^(i(θ₁+θ₂))。这就是为何复数是旋转的完美工具——乘以一个模为 1 的复数就是纯旋转。

1.5 欧拉公式

复指数与三角的桥梁:e^(iθ) = cos θ + i·sin θ。这是本节最重要的公式。当 θ = π:e^(iπ) = cos π + i·sin π = -1,故 e^(iπ) + 1 = 0——五个基本常数(e、i、π、1、0)用一个方程连起。

1.6 欧拉公式对 ML 为何要紧

欧拉公式说 e^(iθ) 随 θ 变化描单位圆:θ=0 在 (1,0);θ=π/2 在 (0,1);θ=π 在 (-1,0);θ=3π/2 在 (0,-1);完整一圈 θ=2π。这意味着**复指数就是旋转**,而旋转在信号处理与 ML 里无处不在。

1.7 与 2D 旋转的联系

复数 (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 旋转,旋转矩阵只是用矩阵记号写的复数乘法。

1.8 相量与旋转信号

复指数 e^(iωt) 是一个以角频率 ω 绕单位圆旋转的点。t 增大时点描圆。这旋转点的实部是 cos(ωt),虚部是 sin(ωt)——正弦信号是旋转复数的影子:e^(iωt) = cos(ωt) + i·sin(ωt),实部是余弦波,虚部是正弦波。这就是相量(Phasor)表示:不追踪扭动的正弦波,而追踪平滑旋转的箭头。相移变角度偏移,幅度变化变模变化,信号相加变向量相加。

1.9 单位根

第 N 次单位根是单位圆上等距的 N 个点:ω_k = e^(2πi·k/N),k=0,1,...,N-1。N=4 时根是 1、i、-1、-i(四个罗盘点);N=8 时加上四个对角。单位根是离散傅里叶变换的基础——DFT 把信号分解到这 N 个等距频率的分量上。

1.10 与 DFT 的联系

信号 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 个旋转相量,告诉你每个的幅度与相位。

1.11 i 不是「想象」的

「虚数」一词是历史意外(Descartes 贬义地用了它),但 i 并不比负数(人们最初也排斥)更虚。负数回答「3 减 5 得多少」,虚单位回答「平方得 -1 的是什么」。更有用地:i 是 90 度旋转算子——实数乘一次 i 转 90 度到虚轴,再乘一次 i()又转 90 度,现在指向负实方向,所以 i² = -1。这不神秘,是两个四分之一转拼成的半转。这就是复数在工程无处不在的原因:任何旋转的东西——电磁波、量子态、信号振荡、位置编码——都自然由复数描述。

1.12 复指数 vs 三角函数

欧拉公式前,工程师把信号写成 A·cos(ωt+φ)(幅度 A、频率 ω、相位 φ),能用但算术痛苦——加两个不同相位的余弦需要三角恒等式。用复指数,同一信号是 A·e^(i(ωt+φ)),加两信号就是加两复数,乘(调制)就是乘模加角,相移变角度加,频移变乘相量。整个信号处理领域转向复指数记号是因为数学更干净——「真实信号」总是复表示的实部,虚部作为簿记随行,让所有代数自然成立。

1.13 与 Transformer 的联系

正弦位置编码(原始 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

2.1 复数类

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)

2.2 极坐标与欧拉公式

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)。

2.3 旋转

点 (x,y) 转 θ 角就是一次复数乘法:Complex(3,4) * euler(math.pi/4)——模不变,只改角。

2.4 DFT

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] 是信号样本乘单位根之和。

2.5 逆 DFT

逆 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 给完美重建(机器精度内),无信息丢失。

2.6 单位根

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/

五、练习

  1. (Easy) 手算复数:算 (2+3i)·(4−i),再用代码验证;算 (5+2i)/(1−3i),把两个结果画在复平面,验证乘法旋转并缩放了第一个数。
  2. (Medium) 旋转序列:从点 (1,0) 开始,乘 e^(iπ/6) 十二次,验证十二次后回到 (1,0),打印每步坐标确认描出正十二边形。
  3. (Medium) 已知信号的 DFT:造 sin(2π·3·t) + 0.5·sin(2π·7·t) 以 32 点采样的信号,跑你的 DFT,验证幅度谱在频率 3 与 7 处有峰,且 7 处峰高是 3 处的一半。
  4. (Hard) 单位根可视化:算 8 次单位根,验证其和为零,验证任一根乘本原根 e^(2πi/8) 得下一个根。
  5. (Hard) 旋转矩阵等价性:对 10 个随机角与 10 个随机点,验证复数乘法与 2×2 旋转矩阵乘向量给同结果,打印最大数值差。

本节要点回顾

  1. 复数 a+bi 有实部 a、虚部 b,i²=-1;它把数轴扩展成复平面(实轴 + 虚轴)。
  2. 直角形式便于加法、极坐标 (r,θ) 便于乘法:乘法 = 模相乘 + 角相加。
  3. 欧拉公式 e^(iθ) = cos θ + i·sin θ 连接复指数与三角,是本节最重要的公式,e^(iπ)+1=0
  4. 复数乘法就是 2D 旋转:乘模为 1 的复数是纯旋转,旋转矩阵只是矩阵记号写的复数乘法。
  5. i 是 90 度旋转算子,乘两次 i 得半转(i²=-1),不神秘。
  6. 相量表示:正弦信号是旋转复数的影子(实部余弦、虚部正弦),相移变角度、幅度变模。
  7. 单位根 e^(2πi·k/N) 是单位圆上等距 N 点,构成频域正交基,是 DFT 的基础。
  8. DFT 用单位根把信号拆成 N 个复正弦分量,逆 DFT 翻符号 + 除 N 给完美重建。
  9. Transformer 正弦位置编码 的 sin/cos 对是不同频率复指数的实虚部,给每个位置频率指纹。
  10. RoPE 显式用复旋转把相对位置变成旋转角,使注意力对相对位置敏感。

下一节,我们把「每个信号都是正弦波之和」落到实处——傅里叶变换:DFT 从零实现、O(N log N) 的 Cooley-Tukey FFT、卷积定理、谱分析,以及它与 CNN 卷积、Transformer 位置编码、频谱图的联系。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U