深度学习光学计算:从可微仿真到光电混合推理

发布时间:2026/10/17 7:30:02

深度学习光学计算:从可微仿真到光电混合推理 从决定写这个系列第一篇开始我脑子里转了很多遍到底应该用什么姿态来聊“机器学习在光学和声学的应用”。按照标题这应该是一篇面向研究入门者和从业者的综述但我实在不想写成一堆论文摘要的排列组合。我更愿意把深度光学计算这半年多来自己跑仿真、搭光路、踩坑的过程摊开来讲清楚这个领域真正在解决什么问题光学Inference又是怎么一回事。如果你正好在考虑要不要进入这个方向或者手头有一个光学系统想用机器学习来优化这篇文章应该能给你一个干净的地图。1. 深度光学计算到底在解哪道题1.1 传统光学设计模式正向设计的手工修图时代先说说我们以前是怎么设计光学系统的。无论是望远镜、显微镜还是相机镜头最经典的流程是根据使用需求确定光学元件的材料、曲率、间距然后用光线追迹或者波动光学仿真软件去模拟成像效果看像差和分辨率是否达标。不达标就手动调整参数再仿真再调整。这套模式走了几百年本质上一个“正向设计 手动迭代”的循环设计师脑中要先有一个大概的结构形式然后在这个结构约束下局部打磨参数。这种模式的瓶颈很明显自由度太高时人脑根本做不了全局搜索。一片超表面上有几十万纳米柱每个柱子的长宽高、转角都可以独立变化靠人去手工调参是完全不可能的。再比如一套衍射光学元件表面相位分布理论上可以是任意函数但这个“任意”给设计者带来的不是自由而是不知道从哪里下手的茫然。过去很多光学设计的真正突破靠的是灵感加长时间尝试而不是系统化优化。深度学习带来的关键转机是物理过程本身可以被当作一个可微分的计算模块梯度信息可以直接从系统输出的损失函数一路回传到每一个光学参数的头上。过去调参靠物理直觉现在靠数据驱动和梯度下降且设计空间不设初始形态限制。这就是“深度光学计算”的基本含义——把光学器件从“被设计的硬件”变成“可被学习的参数”。1.2 可微物理建模的三个精度层级要把光学过程嵌入深度学习框架得先解决“如何计算梯度”的问题。这里没有普适答案得看系统仿真的精度需求我习惯把可微建模分成三个层级几何光线层级用光线追迹的近似公式来描述系统速度和精度折中。适合大部分常规成像系统例如镜头组优化、传感器与镜头距离校准。但这个层级丢失了衍射、干涉这些波动效应对微型光学器件基本上不适用。标量衍射层级用Huygens-Fresnel原理或角谱法描述光场的复振幅传播核心计算是傅里叶变换。这是当前深度光学研究最常用的层级速度和精度都在一个舒服的平衡点超表面、衍射光学元件、空间光调制器大多在这个层级建模。矢量电磁层级严格求解Maxwell方程比如FDTD、有限元之类的仿真方法。精度高但计算量极大通常用于小尺寸元件的参数验证很少直接放进训练循环。我发现很多刚入门的同学容易踩的坑是拿着FDTD级别的精度目标去搭训练框架结果一步迭代要跑好几个小时项目直接卡死。我的习惯是先用标量衍射层级把系统逻辑跑通最后要做器件验证时再取结构参数丢进矢量仿真复核一次这个工作流友好得多。1.3 光学计算和机器学习结合的三种典型范式深度光学计算这顶大帽子下实际可以拆成三股比较清晰的流派衍射神经网络光在多层衍射表面之间传播每个表面的相位分布就是一个可学习的参数层全光链路用来完成分类或其他推理任务。这种思路的鼻祖是2018年前后的“衍射深度神经网络”工作很多人把它当成深度光学计算的标志性节点。超表面逆向设计把超表面结构参数映射成相位、透过率响应并用深度学习做端到端设计优化。目标不再是做一个通用的分类器而是实现对特定波前、偏振、光谱的响应控制。端到端计算成像把前端光学硬件与后端的重建网络放在同一个训练框架里让前端光学的点扩散函数、畸变函数主动去适配后端算法最终系统级成像质量最优。这是最“务实”的一支因为对硬件改动幅度小工程上落地更容易。这三种范式并不冲突很多实际工作是混合着用的。但理解它们的差异有助于你定位自己的课题方向到底偏算法、偏器件还是偏系统集成。2. 光学Inference的完整链路编码、传播、读出与后处理2.1 Inference在光学语境下的精确含义很多做软件机器学习的同学刚接触光学计算时对“Inference”这个词有点迷糊。在常规ML里推理就是网络训练完成后拿输入数据做一次前向计算。光学Inference本质上也是如此只不过这次前向计算不是在GPU张量运算里完成的而是真实光线通过真实光学元件完成的物理传播。换句话说训练时我们用可微仿真器让光学参数学会某种变换推理时把仿真器换成硬件实体让光自己完成对应的线性代数操作。因为光在均匀媒介中的传播可以看作线性算子自由空间衍射近似就是一个卷积或傅里叶变换所以光学硬件可以天然完成卷积、相关运算、傅里叶变换这类计算密集操作而且这个过程是并行的、光速的不消耗片上能源来搬运数据。这个特性让光学推理在低功耗和低时延场景里有很强的吸引力。但这里有一个必须澄清的边界纯粹的光学介质很难实现非线性激活函数。我们训练过的神经网络分割成两块线性部分交给光学硬件非线性部分仍要回到电学域或光电探测后用数字电路处理。因此在工程上最常见的系统是“光电混合推理”光做高并行度的线性变换电做非线性与后续任务头。2.2 一条典型的系统级推理链路我在模拟项目X中搭建的光学推理系统大致由四个模块构成这个骨架对大多数光计算场景都适用输入编码器把要处理的数据比如一张图像加载到光场上。常用方案是空间光调制器调整光的振幅或相位或者用数字微镜阵列把灰度图转成二值反射图案。编码这一步的实际时延不高但空间带宽积会限制可编码数据的维度这个得靠器件选型解决。传播变换模块光在自由空间或介质中经历衍射、散射、折射对应的复振幅变化就是我们要学习的“权重层”。如果是多层衍射系统每层表面相位分布是学习参数光在层间作角谱传播。光电读出在输出平面上用相机或光电二极管阵列记录光强。注意探测器只能记录强度相位信息会丢失所以系统训练时会在输出端加一个“取模平方”的物理约束。数字后处理从检出强度映射到最终结果通常是极小的全连接层或阈值分类逻辑。对于图像分类任务这一步把1024个读出通道压缩成10类概率分布。这条链路如果放在端到端框架里训练前向仿真要做完整的物理传播反向传播则要穿过衍射传递函数、取模运算和读出噪声模型。取模平方的梯度在振幅为零时会出现奇异点初期训练如果发现梯度爆炸或NaN多半是这里处置不当技巧是给振幅加一个小常数保护项。2.3 全光学、光电混合与纯数字仿真三种部署形态我把光学推理系统分成三种部署形态它们对应不同阶段和不同应用场景部署形态光学硬件参与度非线性处理位置典型场景纯数字仿真验证无全部软件模拟数字网络内科研预研、算法验证光电混合推理光学做线性变换探测器之后边缘计算、计算成像全光学推理全部线性与固定非线性器件内部或额外光学非线性超高速专用信号处理很多实验室宣传“全光分类器”仔细看其实输出端依然接了电脑来分析光斑位置或强度分布所以“全光学”是个理想化的描述真正纯光的系统多用于特定专用任务比如波形识别、模式分解。我的建议是不要为了追求“全光学”这个卖点强行去掉电学读出系统性能才是第一评判标准混合架构往往是当前技术条件下最稳的答案。3. 最小可复现用几十行代码搭一个可微衍射推理网络3.1 角谱法为什么我默认选它做物理前向到了真正动手环节我强烈建议新入门的同学先别碰真实光路第一站是用PyTorch搭一个可微衍射网络在仿真里把梯度、损失和调参玩明白。这里最常用的物理模型是角谱法Angular Spectrum Method。角谱法的核心思想是把光场在平面上分解成一系列平面波分量每个分量对应一个空间频率。平面波在自由空间传播一段距离z后只是叠加一个相位因子所以传播过程可以拆成傅里叶变换到频域、乘传递函数、反向傅里叶变换回空间域。整个过程都是标准的FFT操作GPU处理起来非常顺手梯度也能干净地回传。相比直接做Fresnel衍射积分角谱法在近场和远场都适用只要采样满足奈奎斯特条件不会出现近似失效的边界断层。衍射光学元件、空间光调制器到传感器之间几厘米到几十厘米的传播距离都用它。传递函数的形式是H(fx, fy) exp(j * 2 * pi * z * sqrt(1/lambda^2 - fx^2 - fy^2))其中lambda是波长z是传播距离fx、fy是空间频率坐标。注意空间频率的单位要统一我见过不少报错是因为波长单位用了纳米、距离用了米量纲打架。3.2 把传播过程封装成可训练模块下面是一段可以跑通的最简实现它定义了衍射传播层和一个可学习的相位调制层import torch import torch.nn as nn import torch.fft class PropagateLayer(nn.Module): def __init__(self, z, wavelength, dx, input_size): super().__init__() self.z z self.wavelength wavelength self.dx dx self.input_size input_size fx torch.fft.fftfreq(input_size, ddx) fy torch.fft.fftfreq(input_size, ddx) FX, FY torch.meshgrid(fx, fy, indexingij) k2 FX**2 FY**2 # 注意频率坐标对应角谱中 k2*pi*f所以平方项里要带 1/lambda^2 mask 1 - (self.wavelength**2) * k2 mask torch.clamp(mask, min0) transfer torch.exp(1j * 2 * torch.pi * z / self.wavelength * torch.sqrt(mask)) self.transfer nn.Parameter(transfer, requires_gradFalse) def forward(self, u): U torch.fft.fft2(u) U U * self.transfer return torch.fft.ifft2(U) class PhaseLayer(nn.Module): def __init__(self, input_size): super().__init__() # 相位参数限制在 [-pi, pi] self.phase nn.Parameter(torch.rand(input_size, input_size) * 2 * torch.pi - torch.pi) def forward(self, u): return u * torch.exp(1j * self.phase) def intensity(u): return u.abs() ** 2组合起来就是一个“相位调制 - 衍射传播 - 强度读出”的前向系统。你用MNIST图片作为输入相位层参数作为可训练权重在读出平面用一个小全连接层分类整个系统就是最朴素的衍射神经网络。第一次线上训练时你会发现损失很快降到很低是因为相位层确实能学会把不同类别的光能量聚焦到不同区域的读出单元上这种“能量路由”的行为在仿真里非常直观。3.3 三个绕不开的仿真参数坑把这个最小Demo跑通之后我总结过三个容易让人卡壳的参数细节提前写出来省得你走弯路采样间隔与传播距离的约束角谱法要求传播距离不能太小否则传递函数在频域边缘会出现急剧变化同时网格的采样范围必须覆盖目标光斑的扩展范围。文献里常用经验准则是dx * N 尽量大于几倍的目标光斑尺寸否则边缘处光会卷绕回对面形成伪像。padding不是可选项直接用FFT模拟有限孔径传播时光场衍射到边缘会折返“缠绕”到另一侧造成严重的周期性伪影。我在所有仿真层里都会默认添加宽边零填充通常padding到原尺寸的2倍代价是多算一点FFT但效果稳定很多。相位参数的连续性相位天然是周期性的如果直接把相位梯度作为优化变量可能在边界处出现断层导致光学上不可制造。建议在参数化时用角度回归或者正弦余弦编码把相位映射到单位圆上训练会更稳。4. 理想与现实的裂缝精度、能耗与误差溯源4.1 仿真里能到95%精度光路上一掉就是20%我自己做的某光学计算Demo在纯仿真环境里对测试集的分类精度可以到95%左右系统看起来已经很完美了。但把设计好的相位分布加工成实际元件放到光路里一测精度直接掉到75%-80%附近。这个落差不是特例而是深度光学计算领域“见怪不怪”的常态。原因在于物理仿真永远无法完整建模真实器件的所有效应。第一个大头是元件制造误差。相位层在仿真中是连续光滑分布但真实加工出来的衍射元件有量化台阶超表面纳米柱的尺寸也有公差。相位高度差0.1个波长就可能带来明显的波前偏差。更麻烦的是这些误差在级联系统里会累积放大——第一层的误差经过第二层衍射以后不一定只是简单叠加还会和后续层的相位产生复杂干涉。第二个大问题来自照明光源。仿真里默认平面波相干光入射但实验中的激光器有不同的模态成分、波前像差和功率波动。空间光调制器本身有像素填充率问题液晶相位调制是非线性的灰阶到相位的映射关系在不同批次之间还有漂移。这些都像暗处的变量你在仿真里没建模它们可不会因为你没建模就自动消失。4.2 域随机化把误差主动放进训练里怎么缩小仿真和现实的差距我在实践中觉得最实用的一招是“域随机化”思路简单粗暴训练时不要只用理想参数而是把可能出现的误差源作为随机扰动加进去。比如相位层对应制造误差可能正负5%那就在每次前向计算的时候给相位加一个均值为0、标准差5%的随机扰动。探测器噪声也建个模型按高斯或泊松分布叠加在读出强度上。照明光源的强度波动同样在输入编码时加一个全局或空间变化的随机因子。这样训练出来的光学系统不是过度拟合某个理想参数点而是在一个误差范围内都能保持性能。简单说仿真训练学到的是“鲁棒解”而不是“精确解”。我在模拟项目X里做过对照实验没有域随机化的系统在仿真里精度更好但一上真实光路立刻崩盘做了域随机化的系统仿真精度稍微低一点点可硬件的实际效果高出十个百分点以上。如果你准备把自己的算法demo做成可用硬件域随机化应该是默认配置。4.3 能耗账本别只算光学那一段光学计算宣传里常见一句话“光传播不耗能所以算力几乎是免费的。”这句话对一半错一半。光在自由空间传播确实不需要额外耗电但你要生成带信息的光场需要电——空间光调制器、激光器、探测器都要供电这套光电转换链路的总能耗如果算进去光学那点传播优势往往就被吃掉了。真正能发挥光学并行优势的场景是数据量极大且线性运算占主导的任务比如射频波束成形、卷积运算前端、全息重建。光学部分把最费算力的线性变换用物理方式完成了后端电学网络只需处理很小的非线性残差这时候总能耗可能只有纯数字方案的十分之一甚至更低。而如果任务本身以非线性为主、数据又小光学计算没准比直接跑GPU还贵。这个基本判断能力比挑选漂亮模型重要得多。5. 同一个方法论声学那边的另一种表情5.1 从光学到声学方程的相似与被放大的差异既然这个系列题目是“机器学习在光学和声学的应用”那么第一篇必须把声学的对应位置放清楚。光学和声学都是波动现象波动方程在频域下长得非常像所以光学里的相位调控、衍射传播、逆向设计等方法论原则上都能搬到声学里来。但是物理量的尺度差异把这两个领域拉开了。声波波长在宏观世界以厘米到米计而可见光波长是纳米到微米级别。波长差了好几个数量级带来的结果是什么呢光学超表面的结构尺寸在亚波长量级需要微纳加工工艺才能制造但声学超表面的结构尺寸可以做到毫米到厘米级用3D打印就能加工实验门槛反而更低。声学里的“光学”实验台往往是一根PVC管或一块刻着沟槽的塑料板。另一个显著差异是传播媒介。光可以在真空中跑声波必须依赖空气、水或固体传播。媒介本身的吸收、色散、温湿度敏感性都会直接影响实验复现性。我做过一个声学超表面的相位测量室温变化两三度共振频率漂移明显到肉眼看图都能发现。所以说声学是“更容易动手的波动计算实验室”但也是“更容易被环境干扰的实验系统”。5.2 声学里的深度学习入口这个系列后续篇章会展开讲声学部分这里先给一个全景式的索引方便你把光学部分理解迁移过去可微声学传播模型与角谱法对应声场传播可以用瑞利积分或分波展开模拟在PyTorch里同样可以封成可微模块。应用方向包括房间声学模拟、超声相控阵聚焦与声场塑形。声学超表面逆向设计目标是让特定结构对声波实现预定相位或振幅响应实现超常折射、声聚焦、隔声等功能。设计手段就是深度光学里的逆向设计plus可微仿真器。声学信号处理的物理约束语音增强、声源分离这类任务通常被认为是纯信号处理但最近很多工作开始把波传播物理过程作为网络的正则化或前向模型显著提升了在真实环境中的泛化性。对于从光学转型到声学的研究者来说最大的心智障碍不是公式而是尺度和媒介的变化让你觉得“这不光学”。但方法论框架是完全一致的可微物理前向、端到端梯度反传、域随机化增强鲁棒性。掌握了这套框架你在光学和声学之间来回切换的成本其实很低。6. 给新人的三个实践建议从仿真到光路的稳妥路线6.1 先在仿真里把物理直觉养出来我的第一个建议是至少要在纯仿真环境里完整跑通一个可微光学系统之后再碰光路。原因不只是省钱省时间更是因为仿真能提供完全干净的梯度信息让你准确理解“变更相位分布的某个区域到底对输出光斑产生了什么影响”。这种物理直觉一旦建立后面在实验台上调试时你就知道该去调哪个旋钮而不是像无头苍蝇一样来回拨弄。具体做法可以这样选一个小尺寸的MNIST分类任务用前面给的代码框架训练一个单层衍射网络然后改成两层观察精度变化再分别加入波前像差、探测器噪声、相位量化逐个看它们对性能的敏感度。这套流程走下来你对深度光学计算的理解深度会远超刷几十篇论文。6.2 光路搭建时先求稳、再求好当你决定上实验台我强烈建议先把光路搭得“土但稳”。固定好激光器、扩束器、空间光调制器和探测器之前不要着急追求全系统高精度。先把各个模块单独测试一遍确认空间光调制器的灰阶-相位响应曲线是平滑的确认相机能拍到干净无饱和的光斑然后才把它们拼起来。第一个完整系统的目标不应是精度而是稳定性。哪怕系统只能区分两三类图案但只要它能在半小时内不漂移、结果可重复你后面所有调试就有坚实基础。如果一上来就追求100类的分辨率光路稍微振动一下你就会怀疑所有环节出了问题排查范围一下子爆了。6.3 把数字后处理和光学前端看成一个整体最后一个建议是心态层面的不要做“光学的人”或“算法的人”要做“系统的人”。深度光学计算之所以成立就是因为光学前端的可学习参数与后端数字网络的权重可以在同一个损失函数下联合优化。如果你只优化后端网络而把前端光学当成固定的坏成像系统那跟传统的“硬件先设计、算法再补”没有本质区别。我自己吃过这个亏。早期做某个成像增强项目前端点扩散函数做得稀烂我拼命加强后端去卷积网络的容量系统峰值信噪比提升非常有限。后来把前端孔径的相位分布也加入训练让光学主动让出一部分频率响应给后端网络同样的算力下效果立刻上了一个台阶。记住物理硬件和软件算法是一枚硬币的两面懂得这个道理你才能真正吃透深度光学计算的核心价值。
延伸阅读

更多相关文章

2026/10/17 7:30:02

Git 与 GitLab、Jenkins 自动化部署实战指南

git使用 [rootserver1 ~]# yum install -y git [rootserver1 ~]# mkdir demo [rootserver1 ~]# cd demo/ [rootserver1 demo]# git init hint: Using master as the name for the initial branch. This default branch name hint: will change to "main" in Git 3.0.…

2026/10/17 7:25:02

AI辅助学术写作:9款工具提升开题报告效率与质量

学术写作效率提升方案:9款人工智能工具与开题报告模板修改技巧解析每年到开题季,总能看到一批同学抱着电脑在图书馆熬到凌晨,对着屏幕上的开题报告删删改改。选题方向换来换去,文献综述写得像读书笔记流水账,研究内容拆…

2026/10/17 7:25:02

rm报错Device or resource busy?三步排查Docker目录删除占用问题

1. 为什么rm会提示“设备或资源忙”先说结论:rm在删除Docker相关目录时提示Device or resource busy,本质上是目标目录正在被某个进程或内核对象使用,而删除操作需要一个目录完全“空闲”的状态才能完成。这个报错我在实际运维中遇到过不下十…

2026/10/17 10:05:13

软件设计方案模板实战:python-docx生成骨架与评审避坑指南

简介:软件设计方案模板范文是一份面向软件开发人员、项目经理及文档撰写人员的标准模板,适合在规划系统架构、编写概要或详细设计、评审方案时参考。文档以水务运行厂端子系统软件为例,完整演示了从引言、设计概述、总体方案确认、系统详细设…

2026/10/17 10:05:13

AI Agent社交网络实战:从系统架构到落地避坑全解析

1. 项目缘起:AI Agent社交网络到底要做成什么今年我花了大半年时间做了一个有点“非主流”的产品:AI Agent社交网络,代号从MoltBook一路迭代到InStreet。简单说,它不是一个让真人互刷时间线的社区,而是让AI Agent以独立…

2026/10/17 10:05:13

Linux内核伙伴系统分配器:从物理页面管理到连续内存分配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 10:05:13

Vue自定义指令实现input数字输入及小数位数控制

做前端这几年,业务表单里凡是涉及金额、数量、库存、手机号这类输入框,几乎都会碰到一个很缠人的需求:input 只能填数字,不能有乱七八糟的符号,最好还能控制小数点后保留几位。标题里的“Vue 自定义指令 - input 只能输…

2026/10/17 10:05:13

用Pygame实现幸运大转盘:扇形绘制、旋转动画与命中判定

写这玩意儿的时候,我第一反应就是:一个转盘看似简单,但真正把“转起来”的动画、停在准确位置的判定、字体的中文显示这些细节串起来,能踩的坑比想象中多得多。这篇就带着你从头到尾走一遍,用pygame做一个能点击、能旋…

2026/10/17 10:00:13

三台电机顺起逆停的ST实现:CoDeSys顺序控制核心案例

“三台电机顺起逆停”,在CoDeSys里用ST怎么写?这是我经常被问到的问题,尤其是一些刚接触PLC编程、之前一直画梯形图的朋友。顺起、逆停、定时器、按钮边沿、故障联锁,这些元素单独拿出来都不难,但组合在一起&#xff0…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑