在光波小镇上,住着一位名叫阿光的匠人。他的工坊不靠齿轮,也不靠电线,而是用无数透明的“水管”把消息送来送去。更奇妙的是,水管里的“水”会像湖面一样波动:两股水波在蓄水池相遇,高浪叠高浪就变成巨浪,一浪起一浪落就互相抵消成平湖。阿光发现,只要控制每根管子的粗细(通道)和开闸的时刻(相位),就能让水波在流动的过程中自动完成“几股水按比例混合”的运算。这个原理,正是光子矩阵乘法的核心:光波在传播路径上天然地完成干涉、叠加,从而一次实现矩阵与向量的乘法。本文就从这间水波工坊出发,看看光如何用波动本性替我们算矩阵,以及它和电子计算到底谁更适合未来AI。
理解光计算原理,能让你站在架构层面看懂下一代AI加速器的底层逻辑,为设计高性能推理系统提供全新的“物理直觉”。
可视化演示
展示光计算物理原理、光子矩阵乘法实现及光电子计算对比,交互切换理解光计算核心技术。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+modeData.principle.caption+'
光波本质
阿光每天开工前,都要先检查水波的三件套:水面抬多高、波纹密不密、波峰什么时候到。水面抬多高,决定这股水有多“猛”;波纹的疏密,对应水流的“颜色”;波峰早到晚到,则决定了多股水汇在一起是会互相帮衬还是互相拆台。光波也一样,它表面上看是连续的波动,实际上可以精确拆成几个关键的“旋钮”,而这些旋钮正是光计算的输入原材料。
在物理上,光波用复数振幅描述最方便。一个沿 \(x\) 方向传播的平面光波可以写成:
回到工坊,阿光手里的三件套就是振幅、频率和相位。后续所有光计算,本质上都是操控这三个旋钮,让它们在传播路上自己“算起来”。
- 振幅 \(A\)波峰到平衡位置的距离,决定光的强弱;探测器实际读到的是振幅的平方,也就是光强 \(I \propto A^2\)。
- 波数 \(k\)表示波在空间上变化得多快,与波长成反比,\(k = 2\pi / \lambda\)。
- 角频率 \(\omega\)表示波在时间上抖动的快慢,与频率成正比,\(\omega = 2\pi f\)。
- 初始相位 \(\varphi_0\)决定波在起点是“先起浪还是先落浪”,相位不同,两束光相遇后的叠加结果就完全不同。
干涉计算
水波工坊最迷人的地方是蓄水池:两股水同时汇入,如果浪尖碰上浪尖,池子会掀起更高的浪;如果浪尖碰上浪底,池面反而变得平静。这就是干涉。阿光在每根进水管上装了可调的阀门(相当于权重),再让它们汇入同一个池子,于是蓄水池水位天然就变成了“按比例加权后的总和”。这个动作,恰好就是矩阵乘法中的乘加运算。
把多个输入光场分别乘上复数权重再相加,等价于矩阵乘向量。假设输入是两个光场 \(x_1, x_2\),经过一个 \(2\times 2\) 的分束与移相网络后,输出 \(y_1, y_2\) 可以写成:
阿光看着蓄水池里翻涌的水波,忍不住感慨:电子计算要循环很多次才能做完的矩阵乘,在他这里只是一次“开闸放水”的功夫。所有乘加在光传播的一瞬间同步完成。
- 输入光场向量\(x_1, x_2\) 是两路输入光的复振幅,代表两个参与运算的数据。
- 权重矩阵矩阵元 \(w_{ij}\) 由分束器透射率和移相器相位决定,表示第 \(j\) 个输入对第 \(i\) 个输出的贡献。
- 乘加展开第一个输出等于第一行权重与输入逐项相乘再求和,这就是干涉叠加的数学本质。
- 输出强度探测器读到的是 \(|y_i|^2\),所以输出端会看到两个亮度不同的光点,它们就是矩阵乘法的结果。
衍射计算
阿光的工坊后院有一排竹篱笆,水波穿过缝隙后,会在后方扩散出一圈圈波纹。他渐渐发现,竹篱的缝隙形状决定了后方的波纹图案:缝隙越密集,图案越“分得开”;缝隙越宽,图案越“聚得拢”。这就是衍射,它像一台天然的“分拣机”,把波中不同频率的成分拆开来摆好。按照惠更斯原理,每个缝隙都可以看作新的子波源,所有子波在远处叠加,便形成了衍射图案。
更神奇的是,远场衍射图案恰好是入射光场的傅里叶变换。一束波在空间上的分布,经过衍射后,变成了它在“频率维度”上的分布。这为光计算提供了一件利器:把信号变换到频域去做卷积。
阿光把竹篱笆称为“免费的傅里叶计算器”。图像卷积、信号滤波这类AI里的高频操作,只要让光通过一片精心设计的衍射层,就能在飞秒级时间内直接算完,连“乘法循环”的步骤都省了。
\displaystyleE_{\text{out}}(f) = \int_{-\infty}^{\infty} E_{\text{in}}(x)\, e^{-i 2\pi f x}\, dx- 入射光场\(E_{\text{in}}(x)\) 是光在空间各点的复振幅分布,也就是待变换的“数据波形”。
- 复指数核\(e^{-i 2\pi f x}\) 相当于一个以频率 \(f\) 旋转的“筛子”,只让对应频率成分通过。
- 积分累加对每个位置 \(x\) 的贡献做无穷求和,等价于把所有子波源的贡献叠加到频率 \(f\) 上。
- 输出频谱\(E_{\text{out}}(f)\) 告诉我们信号中有多少频率 \(f\) 的成分,卷积在频域变成点乘。
非线性效应
水波工坊里,阿光偶尔会往水里加一点糖浆。加了糖浆的水变稠,波纹传播的速度也会悄悄改变。而且水越“强”(振幅越大),糖浆对它的影响越明显。普通的线性光学只能做“按比例混合”,而一旦材料性质随光强改变,光就能控制光,实现开关、调制和放大。这个现象在光学里称为Kerr效应。
Kerr效应的核心是:强光会改变材料的折射率,而折射率又反过来影响光的传播。有效折射率可以写成:
有了这个“由光控光”的本领,阿光就能做出全光开关:一束弱光路过,被强光改变相位,从而被引导到不同出口。这有点类似神经网络里的激活函数——当输入强度超过某个阈值,输出才“打开”。非线性效应,正是让光计算从单纯的线性矩阵乘法走向完整神经网络的关键一步。
\displaystylen = n_0 + n_2 I- 固有折射率 \(n_0\)材料在没有强光时的基础折射率,决定光速的基准快慢。
- 非线性增量 \(n_2 I\)Kerr系数乘以光强,表示强光导致折射率多出的那一部分。
- 整体效果总折射率 \(n\) 随光强变化,光的相位也随之被调制,于是可以用一束强光控制另一束光的相位。
光学范式
阿光发现,电子工坊总喜欢让所有零件排队干活:一个数据算完,再算下一个。而他的水波工坊不一样,只要把整张“水管网”铺好,几十根管道可以同时送水,所有蓄水池同时见底。这就是光计算的范式革命:不是把单个乘法做得更快,而是把成千上万个乘法同时做完。
光计算中有两种天然并行维度:空间并行和波长并行。在矩阵乘法中,矩阵的一行对应一条光学路径,所有行的运算同时发生;不同波长的光互不干扰,各自携带一路数据,相当于在同一个空间里叠加了很多层“隐形水路”。总吞吐量可以简单表示为:
阿光看着他的整张水网,明白了“范式”二字的重量:与其纠结单个晶体管的时钟频率,不如像水波一样,让成千上万条路径在空间里同时激荡。光的并行性和丰富的波长资源,为矩阵运算提供了真正“一次成型”的架构想象力。
\displaystyleC_{\text{opt}} = N \times B- 并行通道数 \(N\)可以是空间上并行的光波导数量,也可以是同时传输的波长数量。
- 单通道带宽 \(B\)每路光信号可承载的信息速率,光频段极高,所以单通道带宽远超电信号。
- 总吞吐量二者相乘得到系统整体算力,只要增加波长数量或光路数量,总吞吐量近似线性增长。
光电子对比
阿光偶尔会被请去电子小镇“交流经验”。他发现电子工坊里,数据像传送带上的包裹,一个接一个地经过乘法器,一旦传送带速度受限,整个工坊的产量就卡住了。而他的水波工坊虽然有天然并行优势,却也面临一个难题:水波会漫出沟渠、会被杂质搅浑,精度上总比电子零件差一些。两种工坊各有长短,最好的方案往往是合作。
衡量一种计算方式的能效,常用功耗延迟积(PDP)来刻画。它把“耗多少电”和“等多久”放在一起看:
水波工坊和电子工坊的最终设计图,其实是一张“混合图纸”:光负责传输和大规模矩阵乘,电子负责精准控制和高精度存储。阿光把这句话记在本子上:光电子混合不是妥协,而是让每一股水流都去它最擅长的地方。
\displaystylePDP = P \times \tau- 功耗 \(P\)完成一次运算需要消耗的能量,电子在导线中流动会产生焦耳热,而光子传播几乎不发热。
- 延迟 \(\tau\)一次运算从输入到输出所需的时间,光以高速传播,延迟可以压缩到皮秒级。
- 乘积意义功耗和延迟相乘得到单次计算的综合代价,光计算在两项上都表现出明显优势。
AI 应用场景
大模型推理的光学矩阵引擎
阶段:模型推理加速
解决的问题:大模型的线性层要反复做矩阵乘,传统GPU受限于串行乘加和内存墙,速度慢且功耗高。光子矩阵乘法把权重矩阵编码进光学阵列,输入数据变成光脉冲,一次流过即完成整层线性变换,大幅降低延迟和功耗。
具体案例:在Transformer推理中,QKV投影和FFN层全是矩阵乘法。光学引擎可以把一个2048×2048的权重矩阵刻进MZI干涉网格,输入向量调制为光强,输出端直接读出计算结果,省去逐行循环。
光学神经网络做图像分类
阶段:模型训练与推理
解决的问题:卷积在图像任务中计算量巨大,电子实现需要大量乘加操作。衍射光学元件可以天然实现傅里叶变换,把卷积变成频域点乘;再配合非线性光学层,就能搭建一个全光神经网络。
具体案例:研究者用多层衍射光学网络对手写数字分类,光通过第一层完成卷积,第二层完成非线性激活,最后一层聚焦到类别的光斑上。整个推理过程没有一块电子芯片参与。
数据中心的光电混合互连
阶段:分布式训练通信
解决的问题:大规模集群训练时,GPU之间通信的功耗和延迟是主要瓶颈。光互连能耗更低、带宽更高,利用波长复用在单根光纤里同时传多路信号,让梯度同步变得像“水面同时涨落”一样快。
具体案例:超大规模AI集群采用共封装光学(CPO),把光引擎直接封装在交换芯片旁,减少光-电-光转换次数,使万卡训练的通信时间缩短一半以上。
Python 演示
import numpy as np def mzi_2x2(phi, theta): # 2x2 马赫-曾德尔干涉仪,对应一对分束器与移相器 bs1 = np.array([[1, 1], [1, -1]]) / np.sqrt(2) phase = np.diag([np.exp(1j * phi), np.exp(1j * theta)]) bs2 = np.array([[1, 1], [1, -1]]) / np.sqrt(2) return bs2 @ phase @ bs1 def simulate_photonic_matmul(matrix, vector): # 模拟光束按权重叠加的干涉过程 n, m = matrix.shape output = np.zeros(m, dtype=complex) for j in range(m): field = 0.0 + 0.0j for i in range(n): weight = matrix[i, j] field += weight * vector[i] output[j] = field power = np.abs(output) ** 2 return power, output def normalize_rows(matrix): row_norms = np.linalg.norm(matrix, axis=1, keepdims=True) return matrix / row_norms if __name__ == "__main__": np.random.seed(42) target = np.array([[2.0, 1.0], [1.0, -1.0]]) M = normalize_rows(target) x = np.array([1.0, 0.5]) expected = M @ x power, field = simulate_photonic_matmul(M, x) calibrated = np.sqrt(power) * np.sign(field.real) U = mzi_2x2(0.5, 0.2) print("MZI 单元矩阵:\n", U) print("目标矩阵乘输出:", expected) print("光子模拟输出: ", calibrated) print("归一化误差:", np.linalg.norm(calibrated - expected))
def mzi_2x2(phi, theta):定义马赫-曾德尔干涉仪,它是光计算中最基本的可编程分束单元。return bs2 @ phase @ bs1三个光学环节依次作用:分束、移相、再合束,对应矩阵的连续乘法。def simulate_photonic_matmul(matrix, vector):模拟矩阵乘法的干涉叠加过程,每个输出端口收集所有输入光场。field += weight * vector[i]把第 \(i\) 路输入乘以权重后累加,这就是光学干涉的数学等价。power = np.abs(output) ** 2探测器只能读光的强度,因此计算复振幅模长的平方。calibrated = np.sqrt(power) * np.sign(field.real)用相位符号恢复正负号,模拟相干探测对负权重的重建。if __name__ == "__main__":主程序入口,验证光子模拟矩阵乘法与理想结果的误差。
常见误区
误区我一直以为光子计算比电子快,是因为光速每秒三十万公里,而电子很慢。所以只要换成光子,任何计算都能快几万倍。
正解电子在导体中的漂移速度虽然慢,但电路里传输的是电磁场信号,实际速度也可以接近光速。光计算真正的优势不在于“光速快”,而在于并行性和高带宽:光可以在空间和波长上同时承载大量数据,一次传播同时完成无数条乘加路径,而电子计算通常要串行循环。
为何常见:人的直觉容易把“速度”等同于“快”,忽略了计算体系结构中并行度才是更关键的因素。
误区我觉得两束光加起来,亮度高就说明干涉增强,亮度低就说明干涉减弱,所以直接用光强相加也能模拟干涉。
正解干涉发生在复振幅层面,而探测器只看到强度。两束光同相时,振幅相加导致强度大于各自强度之和;反相时振幅相减,甚至完全抵消。如果直接用强度相加,会丢掉相位信息,根本无法解释“亮加亮等于暗”的相消干涉现象。光子矩阵乘法靠的正是复振幅的相干叠加。
为何常见:日常经验里我们习惯用亮度感知光,很少意识到光还有相位这个“隐藏变量”。
误区光计算这么厉害,迟早把CPU和GPU全部淘汰,未来所有计算机都变成全光机器。
正解光子在存储、高精度数字运算和非线性逻辑上仍处于劣势。光学矩阵乘法擅长做大规模的线性运算,但精细的数值控制、条件分支、数据缓存仍是电子的主场。目前最务实的路线是光电混合:光负责传输和矩阵乘,电子负责控制和存储。
为何常见:新技术出现时,人们容易陷入“二元替换”的思维,忽略了计算机体系结构历来是多种技术互补演化。
误区光在空气中传播没有阻力,所以光计算系统应该是零损耗、零噪声的,精度一定比电子高。
正解光会散射、被材料吸收,波导弯曲会产生辐射损耗,分束器和探测器也会引入噪声。更重要的是,光学器件的制造误差会让权重矩阵偏离设计值,导致计算精度受限。这也是为什么光子矩阵乘法目前更适合对精度要求不高的推理任务。
为何常见:我们日常看到光在透明介质里传播,几乎感觉不到损耗,容易忽略工程实现中的各种非理想效应。
面试题
Q1. 在光计算中,探测器最终读到的是光波的哪个量?
- A.振幅平方即强度← 正确答案
- B.光波的振荡频率
- C.光波的波长大小
- D.光波的偏振方向
答案:A。干涉计算的结果最终以光强形式呈现,而光强正比于振幅的平方。频率、波长、偏振虽然都携带信息,但普通光电探测器读出的是强度,因此答案是A。
Q2. 两束同频光波相遇,相位差为π时会发生什么?
- A.相消干涉亮度降低← 正确答案
- B.相长干涉亮度增加
- C.两束光波波长变长
- D.两束光波频率加倍
答案:A。相位差为π意味着浪尖对浪底,彼此抵消,这就是相消干涉,亮度降低。波长和频率不会因为叠加而改变,因此只有A正确。
Q3. 光计算中干涉为什么能做矩阵乘法?
- A.线性叠加等价于加权求和← 正确答案
- B.光照可以长期保存数据
- C.光子具有质量会受力
- D.光速有限便于时钟同步
答案:A。干涉的本质是复振幅叠加,多个输入分别乘以权重再相加,恰好对应矩阵乘法的乘加规则。光不能长期保存数据,光子无静止质量,光速有限反而让同步更困难,所以B、C、D都不成立。
Q4. 夫琅禾费远场衍射的图案,与入射光场是什么关系?
- A.近似傅里叶变换关系← 正确答案
- B.完全等于原始波形
- C.与光的波长无关
- D.正是光强直接平方
答案:A。远场衍射的复振幅分布近似为入射光场的傅里叶变换。它不是原始波形,也不是强度平方,而且衍射图案与波长密切相关,因此答案是A。
Q5. 光的衍射计算特别适合加速哪类算法?
- A.卷积与频域滤波操作← 正确答案
- B.冒泡排序等比较操作
- C.数据库事务回滚操作
- D.密码学哈希摘要操作
答案:A。衍射天然实现傅里叶变换,而卷积在频域等价于点乘,因此卷积和滤波运算最受益。排序、事务、哈希都依赖非线性逻辑和存储,光学衍射难以直接加速。
Q6. Kerr效应的核心现象是什么?
- A.光强改变材料折射率← 正确答案
- B.光速随传播距离改变
- C.光频率随温度升高
- D.光波长随偏振旋转
答案:A。Kerr效应就是折射率随光强变化,即 \(n = n_0 + n_2 I\)。这使强光可以控制弱光的相位,从而实现全光开关。光速不会因距离改变,频率和波长的变化也不是Kerr效应的核心。
Q7. 光学矩阵乘法与电子矩阵计算的本质区别是什么?
- A.光传播一次完成乘加← 正确答案
- B.使用更长的数值位宽
- C.必须用浮点数计算
- D.结果只能为实数标量
答案:A。光计算把矩阵的行映射为并行光路,一次传播同时完成所有乘加,这是本质区别。光学精度通常不高,也不需要浮点,结果可以是复数振幅,因此B、C、D都不对。
Q8. 光子计算相比电子计算的主要优势有哪些?
- A.天然并行完成矩阵运算← 正确答案
- B.功耗更低传输损耗更小← 正确答案
- C.数字计算精度通常更高
- D.延迟更低且带宽更大← 正确答案
答案:ABD。光传播天然并行、无焦耳热、带宽高,所以A、B、D正确。光子计算的数值精度目前往往低于精心设计的电子数字计算,因此C是错误选项。
Q9. 下列哪些是光子计算目前面临的挑战?
- A.光学精度和噪声限制← 正确答案
- B.光电器件转换开销← 正确答案
- C.超低功耗且无损耗
- D.混合集成封装难度← 正确答案
答案:ABD。制造误差、散射噪声、光-电-光转换和封装集成都是真实瓶颈。“超低功耗且无损耗”是理想状态而非现实挑战,因此C不选。
Q10. 关于非线性光学的说法,正确的有哪些?
- A.大光强可改变折射率← 正确答案
- B.全光开关与波长转换← 正确答案
- C.专用于线性叠加运算
- D.可实现非线性激活← 正确答案
答案:ABD。强光改变折射率对应Kerr效应,可用于全光开关和波长转换,也为光神经网络提供了非线性激活。非线性光学恰恰不是用于线性叠加,而是突破线性限制,所以C错误。