光学卷积实现:基于马赫-曾德尔干涉仪(MZI)的矩阵乘法方案

说到光学卷积加速,MZI 是实现矩阵乘法最成熟的方案之一。我自己第一次接触这玩意儿是在读博时,导师扔给我一篇 Reck 的,说“把这个网络用硅光工艺搭出来”。当时看那个光路图,满脑子都是问号——两根波导绕来绕去就能做矩阵乘法?后来才明白,MZI 本质就是个 可编程 2×2 光学门,跟数字电路里的乘法器差不多,只是它是用光来算。

说白了,你把矩阵元映射到 MZI 的相位调谐上,让光波在干涉中完成乘加。这个思路的关键在于:只要你能在一个 2×2 单元里控制两个复数权值,就能通过级联构建任意大小的酉矩阵或实矩阵。我们下面一步步拆开看。

MZI 的基本结构与传输矩阵

标准 MZI 由两个定向耦合器(DC)和两个波导上的移相器组成。我习惯把结构分成三段来记:
输入耦合 → 相位调制 → 输出耦合。

组件作用典型参数
输入 DC(50:50)将输入光分成功率相等两束耦合比 0.5
内部移相器 θ调整两臂相对相位,决定干涉结果0~2π 可调
外部移相器 φ添加全局相位偏移通常作输出相位补偿
输出 DC(50:50)合束干涉,生成输出耦合比 0.5

它的传输矩阵长这样(忽略损耗):

M = [ e^(jφ) * sin(θ/2),   e^(jφ) * cos(θ/2) ]
    [ cos(θ/2),           -sin(θ/2)           ]

注意看:右上角和左下角是互补的,左上角还带一个独立的相位 φ。这意味着单个 MZI 只能实现 酉矩阵 的某种分解,而不是任意复矩阵。我在项目中踩过这个坑——一开始以为调 θ 就能得到任意矩阵元,后来用数值验证发现幅值和相位会互相牵制。

核心洞察: 单 MZI 的传输矩阵是 2×2 酉矩阵的子集。想表达任意实矩阵,要么用两路 MZI 做虚部补偿,要么在结构里增加衰减器。

从单个 MZI 到矩阵乘法网络

一个 MZI 只管两个输入、两个输出。要处理 N×N 矩阵,你得把多个 MZI 级联成 三角阵列 或 矩形阵列。目前最成熟的两个架构:

  • Reck 方案(三角形):N 个输入/输出,需要 N(N-1)/2 个 MZI。每个 MZI 消去一个下三角元素,最终把输入对角化。
  • Clements 方案(矩形):同样 N(N-1)/2 个 MZI,但排列更紧凑,传输损耗更均衡。我个人喜欢 Clements,因为热串扰比 Reck 好一些。

看张图就清楚了——这是 Clements 方案的 4×4 网络拓扑:

4×4 Clements MZI 矩阵乘法网络 IN1 IN2 IN3 IN4 OUT1 OUT2 OUT3 OUT4 MZI MZI MZI MZI MZI MZI MZI MZI MZI MZI MZI MZI 两层 MZI 之间 通过交叉波导 实现路径交换

你看, 每个菱形节点就是一个 MZI。输入从左侧进来,经过三层 MZI 处理后,从右侧输出。Clements 方案最大的好处是 物理布局规整,便于流片时分段调谐。我曾经在 8×8 的 Reck 芯片上测到过同一个 MZI 在不同 BPE(热调谐器)处的串扰,后来换 Clements 才好很多。

将卷积核映射到矩阵乘法

现在硬件网络有了,卷积核怎么塞进去?常规做法是把卷积操作写成 批处理矩阵乘法。假设输入图像大小为 H×W,卷积核大小为 K×K,步长为 S,则:

  • 从输入中提取所有 patch(大小为 K×K×C),展成列向量,拼成一个 im2col 矩阵,维度为 (K²C) × Nₒ。
  • 将卷积核展成一个 权重矩阵,维度为 M × (K²C),其中 M 是输出通道数。
  • 二者相乘得到 M × Nₒ 的矩阵,再 reshape 成输出特征图。

我把这个过程用图示表达出来:

将卷积操作映射为光学矩阵乘法 输入图像 im2col 矩阵 (K²C) × Nₒ 每列一个 patch MZI 矩阵乘法 权重矩阵 M × (K²C) 输出 注意:光学 MZI 网络只能实现线性酉变换(或带衰减的实矩阵) 实际卷积核通常不是酉阵,需要结合两路 MZI(同相/正交)或额外衰减器 或者退一步:用 MZI 网络实现卷积核的 SVD 分解中酉矩阵部分

这里有个要点——卷积核里的权重可能是 任意实数,但单个 MZI 网络天生只能实现酉矩阵(模长不变)。怎么办呢?我见过两种工程做法:

  1. 双 MZI 方案:一路做实部映射,另一路做虚部(或符号)映射,最后用差分探测器恢复符号。
  2. 引入光学衰减器(VOAs):在每个 MZI 后加可调衰减,让光功率能按权重缩放。缺点是损耗大,信噪比会掉。

我个人偏向第一种。之前在某项目中试过第二种,调试时发现衰减器的精度很难做到 8 比特以上,后来换了双路 MZI 才稳定。

实际设计中的避坑指南

嗯,这里列几个我踩过的坑,供大家参考:

相位漂移:MZI 内部移相器通常靠热光效应(加热波导)实现,但热惯性会导致响应速度慢,而且环境温度一变,相位就跑。解决方法是加 闭环反馈——在输出端分一小部分光做监控,实时 PID 调谐。
损耗累积:一个 MZI 的光路损耗大约 0.5~1 dB,8×8 网络用 28 个 MZI,总损耗可能到 20 dB。我建议在输入前用 EDFA 预放,或者采用 低损耗 LNOI(铌酸锂)工艺 代替纯硅波导。
矩阵维度适配:卷积核矩阵往往不是方阵(输出通道数 ≠ 输入通道数×核尺寸)。你可以把 MZI 网络做成可切分的:比如做一个 16×16 的 Clements 网络,每次只使用部分通道,未用端口接监视器或终止器。

还有一个经常被忽略的事:I/O 对齐。光学芯片的输出是平行光,但探测器阵列一般是线性排列。如果你用 Clements 网络,输出端口按奇偶间隔排列,必须设计好波导扇出。我见过一个团队没注意这个,光从芯片出来要拐三道弯,插损直接多 3 dB。