光学卷积实现:基于马赫-曾德尔干涉仪(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 到矩阵乘法网络
一个 MZI 只管两个输入、两个输出。要处理 N×N 矩阵,你得把多个 MZI 级联成 三角阵列 或 矩形阵列。目前最成熟的两个架构:
- Reck 方案(三角形):N 个输入/输出,需要 N(N-1)/2 个 MZI。每个 MZI 消去一个下三角元素,最终把输入对角化。
- Clements 方案(矩形):同样 N(N-1)/2 个 MZI,但排列更紧凑,传输损耗更均衡。我个人喜欢 Clements,因为热串扰比 Reck 好一些。
看张图就清楚了——这是 Clements 方案的 4×4 网络拓扑:
你看, 每个菱形节点就是一个 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 成输出特征图。
我把这个过程用图示表达出来:
这里有个要点——卷积核里的权重可能是 任意实数,但单个 MZI 网络天生只能实现酉矩阵(模长不变)。怎么办呢?我见过两种工程做法:
- 双 MZI 方案:一路做实部映射,另一路做虚部(或符号)映射,最后用差分探测器恢复符号。
- 引入光学衰减器(VOAs):在每个 MZI 后加可调衰减,让光功率能按权重缩放。缺点是损耗大,信噪比会掉。
我个人偏向第一种。之前在某项目中试过第二种,调试时发现衰减器的精度很难做到 8 比特以上,后来换了双路 MZI 才稳定。
实际设计中的避坑指南
嗯,这里列几个我踩过的坑,供大家参考:
还有一个经常被忽略的事:I/O 对齐。光学芯片的输出是平行光,但探测器阵列一般是线性排列。如果你用 Clements 网络,输出端口按奇偶间隔排列,必须设计好波导扇出。我见过一个团队没注意这个,光从芯片出来要拐三道弯,插损直接多 3 dB。