1. 光学硕博的“必修课”从标题看行业风向的转变“太关键了建议所有光学硕博都去学一遍之后将成为常态”——这个标题第一次看到的时候我正坐在实验室里调一台光谱仪的耦合光路手里还攥着刚打印出来的仿真报告。说实话这种带三个感叹号的标题平时我是不太点开的但“光学硕博”和“将成为常态”这两个词凑在一起让我停下了手里的活。因为我自己就是从光学工程专业一路读过来的太清楚这个领域正在发生什么了。这个标题背后指向的其实是一个正在光学圈子里快速蔓延的趋势计算光学与数据驱动方法的深度融合。说得再直白一点就是传统光学设计、成像、测量那一套基于物理模型和解析公式的方法正在被“物理模型数据驱动”的混合范式所补充甚至部分替代。这不是说几何光学、物理光学那些经典理论不重要了而是说光靠它们已经不够用了。你设计一个超构表面参数空间动辄几十维传统优化方法跑一个星期可能连局部最优都找不到你做一个散射介质成像解析解根本不存在但用神经网络去拟合逆散射算子效果出奇地好。这就是为什么标题说“建议所有光学硕博都去学一遍”——因为不管你做什么方向计算和数据的思维都在变成基础设施一样的存在。我写这篇东西不是要贩卖焦虑也不是要鼓吹“传统光学已死”这种博眼球的论调。恰恰相反我想从一个一线搬砖人的角度把这件事拆开揉碎了讲清楚这个趋势到底指什么它为什么现在爆发光学硕博具体该学什么、怎么学有哪些坑是别人不会告诉你的以及最重要的——它对你手头正在做的课题到底意味着什么如果你是在读的光学、光电、物理光学方向的硕士或博士或者刚入行的工程师这篇文章就是写给你的。我会尽量说人话把那些看起来高大上的概念还原成实验室里能操作的东西。2. 为什么是现在计算光学成为常态的底层逻辑2.1 传统光学设计的瓶颈到底卡在哪里要理解为什么“计算数据”会成为常态得先看清楚传统方法的天花板在哪。我拿自己最熟悉的成像系统设计举例。经典的光学设计流程是确定指标视场、F数、波段、MTF要求→ 选初始结构从专利库或者经验公式来→ 设置评价函数→ 优化→ 公差分析。这套流程在 Zemax 或 CodeV 里跑了几十年成熟得不能再成熟。但它有几个硬伤。第一个硬伤是高维非凸优化。现代光学系统动不动就十几二十个面每个面有曲率、厚度、圆锥系数、非球面系数再加上材料折射率和阿贝数变量轻松上百。评价函数是高度非线性的局部极小值多如牛毛。你从不同的初始结构出发优化出来的结果可能天差地别。更麻烦的是有些指标之间是相互矛盾的比如大视场和低畸变、大孔径和高分辨率你只能在权衡中找平衡点。传统优化算法阻尼最小二乘法、遗传算法在高维空间里效率极低很多时候靠的是设计师的直觉和经验去“引导”优化方向。第二个硬伤是对复杂介质的无能为力。一旦光路里出现散射介质生物组织、大气湍流、毛玻璃或者系统本身是计算成像架构编码孔径、单像素成像、无透镜成像传统几何光学的描述就失效了。你没法用光线追迹去模拟一个散射过程因为散射本质上是波前的随机相位调制需要用波动光学或者统计光学来描述。而逆问题——从探测到的强度图反推原始场景——通常是不适定的解析解根本不存在。第三个硬伤是设计-制造-测试的割裂。传统流程里设计阶段假设制造是理想的公差分析只是加一些扰动看性能下降多少。但实际制造出来的非球面有面形误差镀膜有应力装配有偏心这些误差的耦合效应很难用解析模型准确预测。结果就是设计性能很好实测一塌糊涂然后反复迭代周期拉得很长。2.2 数据驱动方法带来的三个根本性改变计算光学和数据驱动方法的介入恰好在这三个硬伤上给出了新的解法。我把它归纳为三个根本性改变。改变一从“解方程”到“学映射”。传统方法试图求解一个物理方程的正问题或逆问题而数据驱动方法直接学习输入到输出的映射关系。比如散射成像你不需要知道散射介质的精确相位分布只需要大量“已知输入-探测输出”的配对数据让神经网络去拟合从散斑到原图的逆映射。这个映射可能极其复杂但神经网络有足够的容量去逼近它。这就绕开了“必须精确建模”这个前提对于很多复杂系统来说这是唯一可行的路径。改变二从“单点优化”到“全局搜索”。神经网络训练本质上是在高维参数空间里做梯度下降虽然也是局部搜索但它的参数空间是网络的权重空间而不是光学结构参数空间。你可以把光学结构参数作为网络输入的一部分训练一个“从指标到结构”的逆设计网络。一旦训练好给定新的指标前向推理一次就能给出候选结构速度比传统优化快几个数量级。这相当于把优化过程“离线化”了在线只需要做推理。改变三从“分离设计”到“端到端联合优化”。这是最让我兴奋的一点。你可以把光学系统和后端图像处理算法放在一个可微分的框架里联合优化。光学参数和网络权重一起更新最终得到的系统是“光学算法”整体最优的而不是光学单独最优、算法再去补救。比如设计一个编码孔径相机你可以把编码图案作为可学习参数和重建网络一起训练让编码图案主动去保留对重建最有用的信息。这种思路在传统框架里是不可想象的。2.3 光学硕博的“常态”到底指什么标题里说“之后将成为常态”我理解这个“常态”有三层含义。第一层是工具层面的常态Python、PyTorch、JAX 这些工具会像 Zemax 一样成为日常标配。你不需要成为深度学习专家但至少要能读懂论文里的网络结构能跑通开源的代码能把自己的物理模型写成可微分的形式。第二层是思维层面的常态遇到问题先想“这个问题能不能用数据驱动的方法来解”而不是只想着怎么推公式。第三层是协作层面的常态光学背景的人需要和计算机、数学背景的人合作甚至自己就得跨界。我认识的好几个光学博士现在都在自学机器学习不是赶时髦是课题真的需要。注意这里说的“常态”不是指传统光学理论不重要了。恰恰相反物理先验在数据驱动方法里极其关键。一个不懂光学的人硬套神经网络做出来的东西往往没有物理意义泛化能力极差。你的光学背景是你的护城河计算和数据是给你的护城河加装的武器。3. 核心技能拆解光学硕博到底该学什么3.1 编程基础从MATLAB到Python的平滑过渡很多光学实验室的祖传代码是MATLAB写的这没问题MATLAB在数值计算和可视化上依然很强。但如果你想进入计算光学和数据驱动的领域Python是绕不开的。原因很简单主流的深度学习框架PyTorch、TensorFlow、JAX都是Python优先的开源的计算成像代码库也基本都是Python。我建议的过渡路径是这样的。第一步把MATLAB里的矩阵操作思维迁移到NumPy。NumPy的广播机制比MATLAB更灵活但一开始容易踩坑。比如MATLAB里A.*B是逐元素乘NumPy里A*B也是逐元素乘但AB才是矩阵乘。这个差异一定要搞清楚不然调试的时候会怀疑人生。第二步学会用Matplotlib做可视化。光学里经常要看光场分布、PSF、MTF曲线Matplotlib的imshow、plot、contour足够应付大部分场景。第三步掌握PyTorch的基本用法。不需要一上来就学复杂的网络架构先理解Tensor、自动求导、优化器这三个核心概念。你可以从一个小任务开始用PyTorch拟合一个简单的光学传递函数或者实现一个最速下降法的光学优化。我自己的经验是从MATLAB转到Python大概需要两到三周的密集练习。关键是不要只看教程一定要动手写。找一个你熟悉的物理问题比如高斯光束的传播用Python从头实现一遍从解析解到数值解再到可视化。这个过程走完基本就顺手了。3.2 可微分光学把物理模型写成可求导的形式这是计算光学里最核心也最容易被忽视的技能。什么叫可微分光学简单说就是把光学系统的前向模型写成可求导的形式这样就能用梯度下降来优化光学参数。传统的光线追迹是分段解析的折射、反射、传播每一步都有明确的公式但这些公式能不能求导能只是需要你手动推导或者用自动微分工具。举个例子球面折射的公式是 Snell 定律的矢量形式给定入射光线方向和法线方向可以算出折射光线方向。这个计算过程涉及点积、叉积、开方全都是可导操作。如果你用 PyTorch 实现这个折射过程只要把光线方向、法线方向、折射率都设为requires_gradTrue的 TensorPyTorch 的自动微分就能帮你算出梯度。这意味着你可以把整个光学系统当成一个可微分的计算图用反向传播来优化面型参数。我试过用 PyTorch 实现一个简单的三片式透镜系统把曲率和厚度作为可学习参数用 MTF 作为损失函数跑梯度下降。结果收敛得很快而且能跳出一些传统优化容易陷入的局部极小值。当然这个例子很简单实际系统要复杂得多但思路是一样的。关键是要理解光学系统的每一个物理过程只要能写成可导的数学运算就能嵌入到自动微分框架里。提示不是所有光学过程都容易写成可微分形式。比如全内反射的临界角附近梯度会爆炸衍射的严格计算涉及傅里叶变换虽然可导但计算量大。遇到这种情况可以考虑用近似模型或者代理模型来替代或者用无梯度优化方法作为补充。3.3 逆问题思维从“正着算”到“反着推”光学硕博受的训练大多是正问题思维给定系统参数和输入计算输出。但计算光学里大量问题是逆问题给定输出反推输入或系统参数。逆问题通常是不适定的意思是解不唯一或者对噪声极其敏感。传统方法用正则化Tikhonov、TV正则来约束解空间数据驱动方法则用网络结构或者学习到的先验来约束。我建议从最简单的逆问题开始练手图像去卷积。给定一张模糊图像和已知的 PSF反推清晰图像。传统方法是维纳滤波或者 Richardson-Lucy 迭代数据驱动方法是训练一个 CNN 或者 U-Net 来做去卷积。你可以把两种方法都实现一遍对比它们在噪声水平不同时的表现。你会发现当噪声很低时传统方法可能更好但当噪声高或者 PSF 不准确时数据驱动方法往往更鲁棒。这个对比会让你对逆问题的本质有深刻的理解。再进一步可以尝试相位恢复给定强度图反推相位。这是光学里经典的逆问题传统方法有 Gerchberg-Saxton 算法数据驱动方法有 PhaseNet 之类的网络。你可以用仿真数据训练一个网络然后测试它在不同条件下的泛化能力。这个过程会让你明白数据驱动方法不是魔法它的性能高度依赖于训练数据的分布和网络的归纳偏置。3.4 仿真数据生成没有数据就自己造计算光学的一个现实问题是真实实验数据很难获取标注成本极高。比如散射成像你需要知道散射介质的精确相位分布才能生成配对数据但实际测量几乎不可能。所以大部分研究用的是仿真数据。仿真数据的质量直接决定了模型的性能。生成仿真数据的关键是物理模型的保真度。你不能用一个过于简化的模型去生成训练数据否则训练出来的网络在真实数据上会崩掉。但模型太复杂又会导致计算量爆炸。这里需要权衡。我的经验是先从简化的物理模型开始验证方法的可行性然后逐步增加模型的复杂度比如加入噪声、像差、散射、非线性响应等。每一步都做消融实验看性能下降多少这样你就能知道哪些因素是关键的。另外仿真数据的一个常见问题是域偏移训练数据在仿真域测试数据在真实域两者分布不一致。解决方法有几种一是域随机化在仿真时随机化各种参数让网络见过足够多的变化二是域适应用少量真实数据微调网络三是物理引导把已知的物理约束嵌入网络结构减少对数据分布的依赖。4. 实操路径从零到一搭建计算光学项目4.1 环境配置与工具链选择工欲善其事必先利其器。我把自己常用的工具链列一下供你参考。操作系统用 Ubuntu 或者 Windows 加 WSL2 都行看实验室的服务器环境。Python 版本建议 3.9 以上太老的版本有些库不支持。包管理用 conda 或者 venv我个人偏好 conda因为可以方便地管理不同项目的环境。核心库包括NumPy数值计算、SciPy科学计算、Matplotlib可视化、PyTorch深度学习、scikit-image图像处理。光学专用的库有LightPipes波动光学仿真、PyOptics光学系统建模、Diffractio衍射计算。这些库不一定都用得上但知道它们存在需要的时候能快速找到。GPU 是必须的。计算光学里的网络训练和可微分仿真都很吃算力。如果实验室没有 GPU 服务器可以考虑用云端的 GPU 实例按小时计费成本可控。我自己的经验是一块 RTX 3060 12GB 就能跑大部分中小规模的实验显存越大越好因为光学仿真的中间变量很占显存。注意不要一上来就追求最新的框架和最大的模型。先把一个简单的任务跑通比如用全连接网络拟合一个标量衍射模型确认整个流程没问题再逐步增加复杂度。很多新手卡在环境配置上就是因为想一步到位结果各种版本冲突。4.2 第一个项目可微分衍射传播我建议的第一个练手项目是实现可微分的角谱传播。角谱法是最常用的衍射计算方法核心是把光场做傅里叶变换乘以传递函数再做逆傅里叶变换。这个过程在 PyTorch 里很容易实现因为torch.fft支持自动微分。具体步骤定义输入光场可以是高斯光束或者更复杂的分布定义传播距离和波长计算角谱传递函数做 FFT、乘传递函数、IFFT得到传播后的光场。然后把传播距离设为可学习参数定义一个损失函数比如目标面上的光场分布与期望分布的 MSE用梯度下降优化传播距离。你会发现PyTorch 能自动算出损失对传播距离的梯度优化过程非常平滑。这个项目虽然简单但涵盖了计算光学的核心要素物理模型的可微分实现、自动微分、基于梯度的优化。做完这个你就可以把它扩展到更复杂的系统比如多级衍射光学元件DOE的设计、全息图的计算等。4.3 第二个项目基于神经网络的图像去卷积有了可微分仿真的基础下一步可以尝试数据驱动的方法。图像去卷积是一个很好的切入点因为问题定义清晰数据容易生成评价指标明确。数据生成找一批清晰图像比如 BSDS500 或者 DIV2K 数据集用已知的 PSF 做卷积加入不同水平的高斯噪声或泊松噪声得到模糊图像。配对数据就是模糊图像清晰图像。网络选择可以从简单的 CNN 开始比如 5 层卷积加 ReLU或者用 U-Net 做编码-解码。损失函数用 MSE 或者 L1后者对异常值更鲁棒。训练时用 Adam 优化器学习率从 1e-3 开始根据验证集损失调整。评价指标PSNR 和 SSIM 是标配但要注意它们和人类视觉感知的相关性有限。有条件的话可以做一些视觉对比看重建图像有没有伪影、过度平滑等问题。这个项目做完你会对数据驱动方法的整个流程有完整的认识数据生成、网络设计、训练、评估、调参。更重要的是你会亲身体会到数据驱动方法的优势和局限。比如当测试时的 PSF 和训练时的 PSF 不一致时性能会下降多少这就是域偏移问题在实际应用中非常常见。4.4 第三个项目端到端计算成像系统设计前两个项目是基础第三个项目才是真正体现计算光学威力的地方。我以编码孔径相机为例讲一下端到端设计的流程。编码孔径相机的核心思想是用一块编码掩模替代传统透镜让场景经过编码后到达传感器然后通过算法重建原始场景。传统设计方法是先设计掩模图案再设计重建算法两者分离。端到端设计则是把掩模图案作为可学习参数和重建网络一起优化。实现步骤首先建立前向模型描述场景经过掩模编码、衍射传播、传感器积分的过程。这个模型需要可微分掩模图案是其中的可学习参数。然后定义重建网络输入是传感器图像输出是重建场景。损失函数是重建场景和真实场景的差异。训练时前向模型和重建网络一起更新掩模图案逐渐优化成对重建最有利的形状。这个项目的挑战在于计算量大因为每次前向传播都要做衍射计算。解决方法是用低分辨率或者简化模型做预训练再逐步提高分辨率。另外掩模图案的物理约束比如二值化、最小特征尺寸需要在优化过程中考虑可以用重参数化技巧或者后处理来满足。我试过用这个思路设计一个小型编码孔径系统优化出来的掩模图案和传统随机掩模很不一样重建质量有明显提升。这个经历让我深刻体会到光学和算法联合设计能挖掘出单独设计无法达到的性能上限。5. 常见问题与避坑指南5.1 物理模型和神经网络“打架”怎么办这是最常见的问题。你辛辛苦苦搭了一个物理模型又设计了一个网络结果训练不收敛或者收敛了但结果没有物理意义。原因通常是物理模型和网络的“接口”没对齐。比如物理模型的输出量纲和网络的输入量纲不一致或者物理模型的梯度尺度太大导致网络权重更新不稳定。解决方法先做单元测试。把物理模型单独拿出来用已知输入验证输出是否正确。然后把网络单独拿出来用仿真数据验证能否拟合。最后把两者接起来用小学习率、梯度裁剪、批归一化等技巧稳定训练。如果还是不行检查物理模型的数值范围做适当的归一化。我踩过的坑是衍射传播的相位因子范围是 0 到 2π但网络输入的动态范围是 0 到 1直接接起来梯度会爆炸。后来加了一个归一化层问题就解决了。5.2 仿真数据训练的网络在真实数据上失效这是域偏移问题前面提过。具体表现是仿真数据上 PSNR 30dB真实数据上 PSNR 15dB图像全是伪影。原因可能是仿真模型太理想没有考虑真实系统的像差、噪声、非线性响应等。解决方法一是提高仿真模型的保真度加入各种非理想因素二是用域随机化在仿真时随机化参数让网络见过足够多的变化三是用少量真实数据做微调哪怕只有几十对数据也能显著提升性能四是设计对域偏移鲁棒的网络结构比如用物理引导的网络把已知的物理约束嵌入网络减少对数据分布的依赖。5.3 计算资源不够怎么办计算光学确实吃资源但也不是没有省资源的办法。第一降低数据维度。如果做二维图像可以先从低分辨率开始比如 64x64验证方法可行后再提高分辨率。第二用混合精度训练PyTorch 的amp模块可以自动做混合精度显存占用减少近一半速度也有提升。第三用梯度累积模拟大 batch size适合显存小但想用大 batch 的情况。第四用云 GPU按需付费比买卡划算。第五优化代码比如用torch.compile加速用 DataLoader 的多进程加载数据避免 GPU 等数据。5.4 论文复现不出来怎么办这是学术圈的常见问题。你看到一篇论文方法很漂亮结果很好但自己复现就是不行。原因可能有很多论文没写清楚超参数、代码没开源、数据集不一样、评价指标有差异等。我的建议是第一先复现最简单的 baseline确认自己的流程没问题。第二仔细读论文的实验设置包括数据预处理、训练细节、评价指标。第三如果论文有开源代码先跑通开源代码再尝试修改。第四如果实在复现不出来可以联系作者大部分作者是愿意分享细节的。第五不要死磕一篇论文如果复现成本太高换一篇更清晰的。我自己的经验是复现论文的过程本身就是很好的学习即使最后结果有差距你也能学到很多论文里没写的细节。5.5 常见问题速查表问题现象可能原因排查思路解决方法训练损失不下降学习率太大或太小打印梯度范数观察损失曲线调整学习率加梯度裁剪验证损失上升过拟合对比训练和验证损失加正则化数据增强早停重建图像有网格伪影网络结构问题检查上采样方式用亚像素卷积替代转置卷积物理模型输出异常数值不稳定检查中间变量范围归一化加小量防止除零GPU 显存不足batch size 太大监控显存占用减小 batch用梯度累积真实数据性能差域偏移对比仿真和真实数据分布域随机化微调物理引导6. 个人体会与后续扩展方向我在这个方向上摸索了大概两年多踩过的坑比走通的路多得多。最大的体会是不要为了用深度学习而用深度学习。有些问题传统方法已经解决得很好硬套网络反而画蛇添足。比如简单的线性去卷积维纳滤波又快又好没必要上 CNN。数据驱动方法的优势在于处理传统方法搞不定的复杂问题比如强散射、高度非线性的逆问题、高维参数空间的优化。判断标准很简单如果传统方法的效果已经满足需求就别折腾如果传统方法效果差或者根本没法用再考虑数据驱动。另一个体会是物理先验是你的朋友不是敌人。我见过一些纯计算机背景的人做计算光学网络结构很花哨但结果没有物理意义泛化能力极差。原因就是他们忽略了光学系统的基本约束。相反如果你把物理模型嵌入网络比如用展开网络、物理引导的网络结构往往能用更少的参数、更少的训练数据达到更好的效果。你的光学背景是别人没有的优势千万别丢掉。后续可以扩展的方向很多。一个是多模态融合把不同成像模态强度、相位、偏振、光谱的数据融合起来用数据驱动方法做联合重建。另一个是在线学习与自适应让系统在实际运行中不断学习适应环境变化。还有一个是可解释性理解网络到底学到了什么物理规律这不仅是学术问题也关系到实际应用中的可靠性。最后分享一个小技巧如果你刚开始接触这个方向不要一上来就啃最难的论文。找一篇综述把领域的地图先画出来知道有哪些子问题、哪些主流方法、哪些开放挑战。然后选一个最小的子问题用最简单的数据和方法跑通建立信心。再逐步扩展。这个过程可能慢但每一步都扎实。我见过太多人想一口吃成胖子结果卡在环境配置就放弃了。慢慢来比较快。