跳到主要内容

通读笔记 —— Physics-based Deep Learning(PBDL v0.3 GenAI Edition)

这份笔记是备料,不是正文。 给后面写大纲/写正文的人用。 出处一律用页码锚:text/xx-pNNN-NNN.txt:行号(这本书没有可用书签,只能用页码锚)。

书的身份

  • 书名 Physics-based Deep Learning,v0.3「Generative AI Edition」,2025。
  • 作者 8 人:N. Thuerey(通讯/主导)、B. Holzschuh、P. Holl、G. Kohl、M. Lino、 Q. Liu、P. Schnell、F. Trost。维护方是 慕尼黑工业大学(TUM)Physics-based Simulation Group。 (text/01-p1-20.txt:3:413)
  • 这本书在线免费:http://physicsbaseddeeplearning.org ,每章配可执行的 Jupyter notebook, 书里到处是「[run in colab]」链接。BibTeX 里 publisher={WWW}year={2021} —— 也就是说 2021 年首版、2025 年出到 v0.3(text/01-p1-20.txt:440)。
  • v0.3 新增的是生成式建模那一整块(去噪 / 流匹配 / 自回归 / 物理约束 / 扩散图网络), 外加一节专讲物理仿真用的网络架构(text/01-p1-20.txt:381)。 这是理解全书结构的钥匙:第 V 部分是新长出来的,篇幅几乎占了全书三分之一。

全书骨架(原书自己的分部)

原书 49 章,归入 9 个 Part。页码来自目录(text/01-p1-20.txt:8:369):

Part名字
IIntroduction1–35–46
IINeural Surrogates and Operators4–747–74
IIIPhysical Losses8–1275–110
IVDifferentiable Physics13–20111–180
VProbabilistic Learning21–33181–338
VIReinforcement Learning34–35339–362
VIIImproved Gradients36–42363–424
VIIIFast Forward Topics43–46425–442
IXEnd Matter47–49443–450

Part V 一个人占 158 页,是 Part II+III 加起来的两倍还多。 这是 v0.3 的重心。


第 1–2 章:抛物线玩具例(全书的引子,也是全书主线的缩影)

这是全书最重要的一段,因为整本书的三条路线在这 15 页里全部亮过相了。 (text/01-p1-20.txt:462 起,到 text/02-p21-40.txt:301 止)

问题设定极简:已知 𝒫: y → y²(y ∈ [0,1]),求 f 使得 𝒫(f(x)) = x。 也就是求抛物线的反函数。答案是 ±√x —— 一个 x 对应两个 y,两个「模态」

三种做法,三种结果:

做法怎么做结果出处
① 监督学习先用求解器预生成数据(每个 x 随机取 +√x 或 −√x),再拟合完全错:红线压在 y≈0 上,那是两个模态的平均值。loss 卡在 0.1002 不动text/01-p1-20.txt:516:583:605
② 可微物理(DP)不预生成数据,把 P(y)=y² 直接写进损失:|𝒫(y_pred) − x_true|²对了一半:准确落在其中一个模态上。loss 掉到 0.000002text/02-p21-40.txt:14:56:62
③ 流匹配(概率式)整个分布:给 y 加不同强度的噪声,训一个网络预测「往哪个方向走」,推理时反复迭代把噪声推向解两个模态全抓到,但有点糊text/02-p21-40.txt:102:262

三个关键数字对照(书里给的真实训练输出): 监督 loss 0.100203 / DP loss 0.000002 —— 差了五万倍。 (text/01-p1-20.txt:587text/02-p21-40.txt:60)

① 为什么监督会错(这是全书的起点)

书说得很直白:训练过程在 x 轴两侧的数据点之间做了平均, 所以找不到任何一个满意的解(text/01-p1-20.txt:605)。 监督学习的损失是 |f(x) − y*|²,当同一个 x 有两个合法的 y*, 最小化平方误差的唯一出路就是输出它们的平均

② 为什么 DP 能躲开平均

书给的解释:DP 拿网络当前的预测去过一遍离散模型,而不是拿预生成的解去比。 这让它「找到网络预测附近最好的那个模态」,从而阻止了解流形上多个模态的平均 (text/02-p21-40.txt:76)。

但 DP 只能拿一个模态,因为网络是个确定性函数,一个输入只输出一个数 (text/02-p21-40.txt:79)。拿上面那个还是下面那个,由权重的随机初始化决定 —— 书让读者多跑几遍亲眼看这个效果。这是个伏笔:它逼出了 Part V。

③ 这不是人造问题(书自己给的辩护)

书举了烛火上方的烟:一开始笔直上升,然后因为极微小的扰动开始朝随机一侧摆动 (分岔 / bifurcation)。完美对称的初始条件下,近似误差怎么累积决定了它往左还是往右。 把两个模态平均,得到的是一股不存在于物理世界的笔直的流 (text/02-p21-40.txt:277:285)。

这是全书的「原罪场景」:很多 PDE 的解流形里都有多个模态,而且往往不知道有几个、在哪儿。 在这种情况下用监督学习「非常危险」——我们可能在不知情的情况下拿到了这些模态的平均。 (text/02-p21-40.txt:273)


第 3 章 Overview:全书的坐标系

3.1 动机:AI 会不会取代传统仿真?

书的回答是**「这种担心没有根据」(this concern is unfounded,text/02-p21-40.txt:333)。 但它先把对手的论据摆结实:已有工作显示 NN 代理模型在翼型绕流这类真实工业场景上 达到了所需精度,同时运行时比传统求解器快好几个数量级**(orders of magnitude,引 [CT22], text/02-p21-40.txt:329)。

它的正面主张是:下一代仿真系统必须打通两个世界 —— 经典数值方法 + AI (text/02-p21-40.txt:333)。理由:

  • 几十年来发展出的高度专门化的离散格式,离散方式看似微不足道的改动, 就能决定某个关键现象在解里出不出得来(text/02-p21-40.txt:341)——扔掉太浪费;
  • DL 强,但强烈受益于物理模型形式的领域知识(text/02-p21-40.txt:337)。

3.1.2 「黑箱」那一段(值得引,是这本书的性格)

书拿 1950 年前后的数值方法类比:当年数值不稳定性被 H. Goldstine 说成 「未来持续的焦虑之源」(引 [Gol90]),而现在我们对这些不稳定性已经很有把握了。 结论:神经网络「不过是一套新的数值工具」,只是目前是我们手上处理非线性问题最强的一套 (text/02-p21-40.txt:352:361)。

3.2 分类:这是全书的目录逻辑,必须讲清

书按**「物理模型和神经网络耦合得多紧」**把 PBDL 分成三档 (text/02-p21-40.txt:398):

名字物理进到哪一层对应 Part
1Supervised数据由物理系统产生,之后再无交互Part II
2Loss-terms物理动力学编码进损失函数;软约束;别名「physics-informed」Part III
3Hybrid完整仿真与网络输出交错组合,要求求解器完全可微Part IV

正交的另一个轴:forward(预测状态或时间演化)vs inverse(从观测反推参数或状态) (text/02-p21-40.txt:391)。

这两个轴构成全书的坐标系,后面每一章都能落到格子里。

3.2.1 命名(这一段很要紧,是「同一件事的四个名字」)

书自己承认 differentiable physics 在别处有一堆别名(text/02-p21-40.txt:414):

  • 等价于伴随方法(adjoint method) + 深度学习;
  • 等价于把反向传播 / 反向模式微分用到数值仿真上;
  • 名字取自深度学习的**可微编程(differentiable programming)**范式,类比「可微渲染」。

而**「用网络去纠正求解器」这个目标本身是个老问题**,在不同学科里各自被发明过一遍: 流体与湍流叫 closure problem,材料学叫 homogenization / coarse-graining, 气候与天气仿真叫 parametrization(text/02-p21-40.txt:422)。

书的评论:这个目标在不同领域被反复重新发明,说明底层问题很重要。

3.3 边界:书自己划的(直接可用于书卡 notCovered)

书说焦点在(text/02-p21-40.txt:435):

  • 稠密的场式仿真(dense field-based),不含拉格朗日方法;
  • 只讲和深度学习的结合(别的 ML 技术不讲);
  • 实验数据只作展望(即用真实观测替换合成数据,不在本书范围)。

另外明说不覆盖(text/02-p21-40.txt:375):

  • 没有深度学习和数值仿真的入门介绍(推荐去读别的书);
  • 不是这个领域的研究综述

3.5 记号约定(读全书的前提,必须在拆解里交代)

  • * 上标 = 理想化的、未知的、连续的;不带 * 的 = 离散的、可实现的对应物 (text/01-p1-20.txt:483)。
  • model 一词在这本书里专指物理模型方程(通常是 PDE),不指训练出来的网络; 网络一律叫「NN」或「network」(text/02-p21-40.txt:468)。这和主流 ML 用法相反,是个坑。
  • 𝒫* : 𝒰 → 𝒱 是连续 PDE 算子;Ω ⊂ ℝᵈ 是空间域,Γ 是边界。
  • 训练集 / 验证集(同分布)/ 测试集(不同分布,OOD)。书特别强调测试集要 「out of distribution」才看得出泛化,而且没有金标准(text/02-p21-40.txt:488)。
  • 本书只做回归,不做分类(text/02-p21-40.txt:501)。

3.5.3 两个贯穿全书的方程(必须在拆解里从零讲明白)

Burgers 方程(1D 版最常用):∂u/∂t + u∇u = ν∇·∇u

  • 平流项(advection,运动/输运)和扩散项(diffusion,热力学第二定律导致的耗散);
  • 不含额外约束(不像 Navier-Stokes 有质量守恒),所以会形成激波(shock);
  • 书选它当起点正因为「简单但非线性且不平凡」(text/02-p21-40.txt:549:634)。

Navier-Stokes 方程:在动量守恒之外多了质量守恒 ∇·u = 0(散度为零)。

  • 好处:防止激波形成;坏处:给数值方法引入了一个硬约束(text/02-p21-40.txt:569);
  • 变体:加 Boussinesq 近似处理浮力(用一个标记场 v 指示高温区, 在 y 方向加 ξv 的力),这样不用显式算密度就能模拟热烟上升(text/02-p21-40.txt:583)。

3.6 / 3.7 两个前向仿真的实操(phiflow)

3.6 Burgers 1D(text/02-p21-40.txt:618 起):

  • 具体数:N=128 格、周期边界、域 [−1,1]、STEPS=32、DT=1/32、NU=0.01/(N·π); 初始状态 −sin(πx);
  • 每步两个算子:diffuse.explicit(中心差分显式扩散)+ advect.semi_lagrangian(一阶稳定的输运);
  • 可见结果:中心形成激波 —— 左边正速度往右冲、中心右边负速度往左冲,撞在一起 (text/03-p41-60.txt:28)。
  • 书给了一个真实输出可当走查:t=1.0 时前五个速度值 [0.0057, 0.0172, 0.0286, 0.0401, 0.0515] (text/02-p21-40.txt:732)。

3.7 Navier-Stokes 2D 浮力烟雾(text/03-p41-60.txt:74 起):

  • 40×32 格,物理域 100×80,DT=1.5,NU=0.01; 入流是个半径 10 的球,位置 (30,15),乘 0.2;
  • 速度用 staggered grid(交错网格,采样在格子面心),烟雾密度用 centered grid(格心);
  • step() 一步做五件事:平流烟雾 → 加浮力 → 平流速度 → 扩散 → 压力投影使其无散 (text/03-p41-60.txt:146);
  • 压力投影 make_incompressible 通常是整个序列里最贵的一步, 它解一个泊松方程然后用压力梯度更新速度(text/03-p41-60.txt:171);
  • **真实数字可当走查:**最大速度逐帧 0.463 → 0.897 → 1.410 → 2.041 → 2.928 → 3.839 → 4.527 → 4.868 → 5.131 → 5.484(text/03-p41-60.txt:238)。 烟羽因入流偏左(x=30 于 0–80 域),撞到顶壁后往右弯(text/03-p41-60.txt:257)。

3.8 优化与收敛(deep-dive 章,是 Part VII 的地基)

书自己标了「Deep-dive Chapter」,说想快点上手可以跳过,但强烈建议在读 Scale-Invariance and Inversion 之前读(text/03-p41-60.txt:315)。 这是最重要的一处伏笔:第 3.8 节埋的,第 36 章才揭晓。

这一节的写法很特别:从最经典的牛顿法出发,一路推导出深度学习的优化器, 而不是反过来(text/03-p41-60.txt:306)。链条是:

Newton法 (Δ = −J^T/H)
├→ 加自适应步长 λ → 可证明收敛,但需要 Hessian H,H 实践中拿不到
├→ Broyden法:H₀=1,用有限差分迭代更新 H(很粗)
├→ BFGS:不假设 J=0,并扣掉沿当前步已有的部分 → 目前经典非线性优化最常用
├→ Gauss-Newton:限定 L 为 L² 损失 ⟹ H ≈ J^T J ⟹ Δ_GN ≈ −1/J
│ └→ 关键:这是「J 的近似逆」,给出各参数近似相等的步长
├→ Adam:再退一步,H ≈ √diag(J^T J);只留对角 ⟹ 求逆变平凡
│ └→ √diag(J²) ≈ diag(J) ⟹ Δ ≈ sign(−J),即「各维度走固定大小的一步」
└→ 梯度下降:H = 1 ⟹ Δ = −λJ^T

这一节的落点(全书最锋利的一句话之一):

梯度下降没有任何形式的求逆,J^T 的形状虽然对得上 x,但它「活在错误的空间 1/x 里, 而不是 x 本身」。这个缺求逆的问题在涉及物理的问题上尤其严重,是本章的核心带走点。 (text/03-p41-60.txt:609)

具体推导要点:

  • 牛顿法二次收敛,但前置因子 K/(2H) > 1 就发散(text/03-p41-60.txt:393);
  • 加自适应步长后可证收敛,证明只需要对 H 的 Lipschitz 连续性,不需要对 J 或 L (text/03-p41-60.txt:483);最后落在 L(x+λΔ) = L(x) − λϵ + λ²ϵ/2 + λ³ℒϵ²/6, 第一项是负的线性项,小 λ 时它主导(text/03-p41-60.txt:480);
  • Adam = 一阶更新 + Hessian 的对角 Gauss-Newton 近似做归一化 + 动量做稳定 (text/03-p41-60.txt:600);
  • Adam 用逐分量开方而不是完整求逆,书点明这近似等于沿所有维度走固定大小的一步;
  • GD 收敛需要 λ ≤ 1/ℒ,但深度学习里 ℒ 根本不知道,所以这个保证「实践中帮不上忙」 (text/03-p41-60.txt:631)。

第 4 章 Supervised Training(Part II 开篇)

  • surrogate model / emulator / neural operator 是同一件事的三个名字 (text/03-p41-60.txt:648)。
  • 书的立场:纯数据驱动的监督训练是一切深度学习项目的中心起点; 即使目标是高级的物理学习方法,跑通一个监督训练永远是第一步 (text/03-p41-60.txt:650text/03-p41-60.txt:295)。 注意这和第 1 章「监督会平均掉模态」并不矛盾 —— 书的意思是它是基线,不是终点。
  • 用仿真造训练数据的好处:没有真实设备的测量噪声、不需要人工标注 (text/03-p41-60.txt:669); 代价:模型得有足够表达力、数值误差得足够小,否则再好的网络也没戏 (text/03-p41-60.txt:674)。
  • **一个具体的内存警告(可作走查素材):**一个 128 特征的 CNN 层, 作用在 128² ≈ 16k 个格子的输入上,会产生 128³ 超过两百万个中间值, 这些全都得暂存并交给下一层(text/03-p41-60.txt:687)。

第 5 章 Neural Network Architectures(v0.3 新增,是架构选型的判据)

这一章的中心问题只有一个:数据里的依赖是「局部的」还是「全局的」? 书原话:关于数据里依赖是局部还是全局的知识,是应该被利用起来的重要知识 (text/04-p61-80.txt:72)。

5.1 先按「样本的空间排列」把选项砍掉一半

四种排列(text/04-p61-80.txt:18):

  1. 没有空间排列(例:单个探头随时间的温度压力演化);
  2. 规则网格(structured);
  3. 不规则排列(unstructured);
  4. 不规则且没有连接关系(粒子 / 点云;湍流的粒子表示里邻居关系变得很快)。

情况 1 只有全连接(MLP)可用。 书把 PINN 归到这一类,并直接给了一句很硬的判断:

「PINN 经过多年研究仍然解决不了真实世界的问题,这指向了这条路线的根本性问题。」 (text/04-p61-80.txt:35) 这是全书对 PINN 最重的一句评价,写拆解时必须原样传达,不要软化。

5.3 局部 vs 全局:感受野(receptive field)

书把这个概念直接对上了 PDE 的老分类:双曲型 = 局部的、波状的行为; 椭圆型 = 全局行为(text/04-p61-80.txt:49)。

书给的选型总表(text/04-p61-80.txt:61):

GridUnstructuredPointsNon-spatial
LocalCNN, ResNetGNNCConv
GlobalMLP
– HierarchyU-Net, DilationMulti-scale GNNMulti-scale CConv
– SpectralFNOSpectral GNN(–)
– SequenceTransformerGraph TransformerPoint Trafo.

选错的两种后果(书写得很清楚,可直接用作走查):

  • 数据主要是局部影响,却选了全局感受野的架构 → 网络会**「浪费」资源去捕捉全局效应**, 最坏情况下用平滑掉的全局模态去近似局部效应;
  • 反过来,用有限感受野去近似全局影响 → 这是个无解的任务,必然引入大误差。 (text/04-p61-80.txt:76)

5.5 层级:U-Net vs 空洞卷积

先讲了一个漂亮的桥:卷积核就是数值方法里的「模板(stencil)」。 一维归一化拉普拉斯算子 ∇² 的经典模板是 [1, −2, 1], 它可以直接映射成一个 kernel size=3、单输入单输出通道的一维卷积,权重就设成这三个系数 (text/04-p61-80.txt:112)。这是全书把数值方法和神经网络对接得最直白的一处,拆解里必须讲。

两条通向全局感受野的路(text/04-p61-80.txt:117):

U-Net(池化层级)Dilation(空洞卷积)
怎么做逐级下采样到更粗的网格,后半程再上采样卷积采样点拉开距离:看 5×5 邻域但只取其中 3×3 个点
采样点数对数级减少,粗层上的卷积极其高效保持不变
关键部件skip connection(把前半程的层用特征拼接直连到后半程)—— 书说这是「crucial」,因为最深的瓶颈层存不下最细一层的所有细节
代价实现麻烦一点(要加池化层)实现极简(把卷积调用换成空洞卷积就行)
性能快得多;它相当于预先算好了一份压缩的内存表示:大步长跳着访存,内存访问不理想

书的裁决:U-Net 多花的实现力气,在网络要真正部署时会显著回本 (text/04-p61-80.txt:149)。 图网络那边不存在「要不要空洞」这个问题 —— 图上的内存访问本来就不规则, 而且在一般图上算 stride 太贵,所以有全局依赖就上多尺度 GNN(text/04-p61-80.txt:151)。

5.6 FNO 的规模问题(书里少见的、给出量化否定的一段)

  • FNO 用傅里叶变换把空间数据搬到频域,拿一个全连接层去改最大的 M 个频率;
  • 二维输入 → M² 个模态 → 全连接层需要 M⁴ 个参数;
  • 三维 → M³ 个模态 → M⁶ 个参数;
  • 对比:常规卷积核尺寸 K,2D 要 K² 权重、总复杂度 O(K⁴);3D 只涨到 O(K⁵);
  • 更糟的是 M 必须随空间域尺寸增长,所以通常 M > K,于是 M⁶ ≫ K⁵。

书的结论:FNO 在 3D(或更高维)上需要不可行的参数量,不推荐 (text/04-p61-80.txt:175:183)。 但也给了它应有的优点:频域基函数天然是全局支撑的,所以哪怕只用一部分频率, FNO 也能处理和修改输入信号的所有部分(text/04-p61-80.txt:167)。 另附一句谨慎:函数空间通常是被截断的,所以「能超出训练分辨率」这个承诺常常存疑 (text/04-p61-80.txt:159)。

5.7 注意力 / Transformer(书的态度是「有希望但未定」)

书讲得很完整,可直接当拆解的骨架(text/04-p61-80.txt:194):

  • 两步走:先用编码器-解码器把输入编成 token(主要作用是减少输入数量, 比如拿图像块而不是单个像素);再由注意力给一组 token 算出加权;
  • 自注意力:每个输入对所有其他输入算权重 —— 这就是处理全局依赖的机制;
  • 三个矩阵:query Q、key K、value V;N 个 token 时,外积 QKᵀ 产生一个 N×N 矩阵, 过 Softmax,再乘 V(V 装的是输入 token 的线性投影)得到注意力输出向量;
  • 一个 Transformer block = 注意力算完当残差加回输入 → 层归一化稳定 → 过一个两层前馈网络(FFN);这个 block 重复多次,最后解码回原空间;
  • 代价:自注意力对 token 数 N 是二次的,这天然限制了输入的尺寸和分辨率;
  • 书的一句祛魅:注意力算法算的那个 N×N 矩阵,「离直接上一个全连接层其实不远」 (全连接层同样带一个 N×N 权重矩阵)(text/04-p61-80.txt:217);
  • 线性注意力:改成先算 (KᵀV) 再乘 Q,两边事先各加一个非线性(比如指数), 从而避开 N×N,对 N 线性,代价是注意力向量更近似;
  • 书对 Transformer 的关键批评:注意力在 token 空间里通常还是「稠密」的, 也就是说对已知空间结构的问题,它把这个信息丢掉了, 这必然要用更多权重或更低精度去补(text/04-p61-80.txt:224)。

5.8 一条实践建议(容易被漏掉)

数据的空间结构看似决定了选择,但把数据搬到另一种结构上可能更划算 —— 比如把非结构点云投影到(变形的)规则网格上,精度和性能都可能提高 (text/04-p61-80.txt:233)。另外提到「现代化的 U-Net」: 经典 U-Net + Transformer 的部件(注意力和归一化),实现在第 29 章。


第 6 章 翼型 RANS 监督训练(Part II 的实操,是全书第一个真正的例子)

任务:给定翼型形状 + 雷诺数 + 攻角,直接预测时间平均的速度场(2 分量)和压力场, 完全绕开数值求解器(text/04-p61-80.txt:257)。 传统做法是解 RANS(Reynolds-Averaged Navier-Stokes)方程, 书说这至今仍是工业界 Navier-Stokes 求解器最广泛的应用之一(text/04-p61-80.txt:261)。

具体规模(全是真实数字,适合走查):

出处
输入[f_x, f_y, mask],各 128²text/04-p61-80.txt:280
输出[p, u_x, u_y],各 128²,共约 49k 个输出值text/04-p61-80.txt:280:500
训练 / 验证320 / 80 个样本(验证用同样的翼型形状、不同工况)text/04-p61-80.txt:307
网络U-Net(DfpNet),EXPO=4 → 585,027 个可训练参数text/04-p61-80.txt:525
训练200 epoch,L1 损失,Adam,lr=2e-4,5 分 40 秒text/04-p61-80.txt:537:589
结果训练 loss 0.01113 / 验证 loss 0.01996(验证 loss 从 0.2 降到 0.02)text/04-p61-80.txt:589:594
测试(全新翼型,OOD)平均相对误差 0.0263 ≈ 2.5%text/04-p61-80.txt:675:677

这一章埋了三个后面要用的判断:

  1. 归一化不是可选项。 三个物理场里,压力大致按速度的平方缩放(伯努利), 直接求和会让某一个分量主导,网络就把资源花在大的那个上 (text/04-p61-80.txt:283)。后文测试时又强调一次: 压力因为对来流速度是三次方缩放、还有局部尖峰,是最难推断的量 (text/04-p61-80.txt:640)。 ⚠️ 书内自相矛盾:6.2 说「approximately squared scaling」(平方), 6.7 说「cubic scaling」(三次方)。写拆解时按平方讲(伯努利定律 p ∝ ½ρv²), 并注明书里另一处写了三次方。
  2. 这个 U-Net 不用池化,而是用 stride 卷积 + 转置卷积(解码端核尺寸要对称,即奇数) (text/04-p61-80.txt:372)。
  3. 参数量必须时刻盯着 —— 书在打印语句里写了「crucial! always keep in view」, 并说参数量必须和训练数据量匹配、也要随网络深度缩放,但三者具体怎么配是问题相关的 (text/04-p61-80.txt:527)。

误差长什么样(这是「诚实写边界」的好素材): 输出里缺了高压尖峰和较大 y 速度的口袋,主因是网络太小、资源不够重建细节; L2 有平均化倾向,偏爱大结构(周围环境)而不是局部尖峰(text/04-p61-80.txt:680)。


第 7 章 监督方法的讨论(这一章是全书的「工程手册」,信息密度极高)

7.1.1 黄金法则(书自己标为「golden rules」,可整段带走)

(text/05-p81-100.txt:20)

  1. 永远从「1 个样本的过拟合测试」开始;
  2. 检查网络有多少可训练参数、数据有没有正确归一化;
  3. 确保网络能收敛;
  4. 然后慢慢增加训练数据量(以及网络参数和深度);
  5. 调超参(尤其是学习率);
  6. 最后才引入可微求解器、扩散训练这类部件。

书给的理由很硬:如果网络在单个样本上都不能快速收敛并给出很好的表现, 那就是代码或数据里有根本性的问题,没有理由去搞更复杂的设置 —— 复杂设置只会让这些根本问题更难被找到(text/05-p81-100.txt:14)。

7.1.4 「魔法在哪儿?」—— 全书最重要的祛魅段落

有人问「这不就是在插值数据吗?」书的回答:

「是啊,就是插值!而这正是神经网络应该做的事。某种意义上,也没别的可做了。 这就是所有深度学习方法的全部内容。」(text/05-p81-100.txt:60)

后续几条判断值得逐条搬进拆解(text/05-p81-100.txt:64:80):

  • 因为炒作,不熟悉 DL 的人常以为它像人脑一样能从数据里抽取根本的、普遍的原理 —— 书直接说 「这不是当前技术水平下发生的事」;
  • 神经网络之所以好,恰恰是因为它们能非常准确地贴合训练时收到的信号; 但与其他学到的表示相比,它们其实很不擅长外推;
  • **具体到可以直接验证的程度:**如果你总是拿 [0…1] 范围的输入训练, 别指望它在 [27…39] 的输入上还能用;
  • 经验法则:确保你训练用的输入,跟推理时要用的输入尽可能相似。

这一段直接逼出了 Part IV:

如果想让网络和某个仿真环境配合工作,就必须把这个仿真器包进训练过程。 否则网络会专门去适应那些预计算好的数据 —— 而那和「网络与求解器合在一起时产生的数据」 是不一样的,网络会遭受 distribution shift(分布漂移)。 (text/05-p81-100.txt:81) 这是全书最重要的伏笔之一:第 7 章埋,第 17、18、20 章才兑现。

7.2 监督训练的账(书自己列的)

✅ 训练很快 / 稳定简单 / 极好的起点 ❌ 需要大量数据(加载会成瓶颈)/ 精度与泛化可能次优 / 与外部「过程」(比如嵌进求解器)的交互很困难(text/05-p81-100.txt:89)


第 8 章 Physical Loss Terms(Part III 开篇)

问题意识一句话:监督设置里,物理模型和数值方法只被当成「外部」工具用来生产数据 —— 这很可惜(text/05-p81-100.txt:113)。

残差(residual)是这一部分的核心概念

给定 PDE:u_t = ℱ(u_x, u_xx, …),定义残差 R = u_t − ℱ(…), 正确的解应该让 R = 0(text/05-p81-100.txt:128)。

于是训练目标变成两项加权和(text/05-p81-100.txt:139): arg min_θ Σ_i [ α₀·(f(x_i;θ) − y*_i) + α₁·R(x_i) ]

书对这两项各自单独用会怎样,讲得极清楚(必须搬):

  • 只优化第一项(监督):网络能很好地近似训练样本,但可能把多个模态平均掉, 在采样点之间的区域表现很差;
  • 只优化第二项(残差):网络可能在局部满足 PDE,但很难找到全局成立的解。 原因是解里有零空间(null spaces) —— 不同的解都满足残差, 于是不同的局部点收敛到不同的解,合起来非常糟。 (text/05-p81-100.txt:144)

关键限定(书反复强调,是这一整部分的边界):

和监督样本一样,没有任何保证 R 在训练中真的会到零。非线性优化只会尽量减小, 大的非零残差可能一直留着。所以这样表述的物理约束只是软约束(soft constraints), 不保证被满足。(text/05-p81-100.txt:152)

两个变体(v1 / v2)—— 这是 Part III 的分岔口

v1:显式表示上的残差导数v2:从神经网络表示求导
解怎么表示先选好离散化(网格 / 图 / 点集),网络在网格上产生解没有显式表示;全连接网络接收空间坐标 x(和 t),吐出该处的解
导数怎么来在计算网格上离散化(有限差分等),要用 DL 框架的算子写,以便反传自动微分:∂u/∂x = ∂f/∂x,高阶导就多查几次
别名——PINN(physics-informed neural network),Raissi 等 [RPK19] 推广;属于 Neural field 家族(同族的还有 NeRF、学到的符号距离函数)
适合的架构规则网格用 CNN,三角网格用图网络,粒子用点卷积MLP(因为没有显式空间采样点)
优点能直接处理相当大的解空间(不局限于学单个解)输入维度低(3D+时间才 4 个值);求导方便
出处text/05-p81-100.txt:163;由 Tompson 等 [TSSP17] 早期提出text/05-p81-100.txt:200

书自己说:v1 基本上是可微物理训练的一个子集(text/05-p81-100.txt:196) —— 这是第 8 章埋、第 13 章揭晓的伏笔。

v2 的适用边界(书划得很死):因为优化和学习问题的病态性(ill-posedness) 以及重建的高成本,PINN 的解流形不该太复杂; 捕捉时间依赖或者宽范围的解通常非常困难,比如前面那个翼型例子就做不了 (text/05-p81-100.txt:239)。


第 9 章 学 Helmholtz-Hodge 分解(v1 的实操)

这一章是全书「不用监督数据也能训」的样板,极其重要。

背景:Navier-Stokes 是怎么解的(算子分裂)

(text/05-p81-100.txt:260)

  1. 自平流步:解 ∂u/∂t + u·∇u = 0 —— 高效,复杂度对离散点数线性;
  2. 压力投影步(Chorin projection):要解泊松问题 ∇²p = ∇·ũ, 这是个椭圆型 PDE,一般情况下不好解;解出的标量压力场 p, 其梯度恰好捕捉了速度场里有散度的部分;减掉 ∇p 就得到 ∇·u = 0 的无散场。

Helmholtz(-Hodge)分解 = 向量微积分基本定理:把一个向量场拆成 无散部分(solenoidal)和无旋部分(irrotational,即压力梯度) (text/05-p81-100.txt:187:253)。

训练怎么设计的(这是最漂亮的一处)

  • 网络接收散度,输出压力:p = f(∇·ũ; θ);
  • 修正后的速度 ũ̃ = ũ − ∇p;
  • 损失 = 修正后速度散度的 L2,目标是 0 —— 所以根本不需要预计算 (u, p) 数据对;
  • 书特别澄清:这可以叫无监督训练,但这个标签有误导性, 因为所谓「无监督」的训练目标其实是当场算出来的(text/05-p81-100.txt:270);
  • 把散度(而不是速度)喂给网络的理由:已知散度就足以唯一确定压力场, 这样简化了推断任务(text/05-p81-100.txt:277)。

具体数字(整章可当一条主走查)

步骤出处
网格32×32,周期边界text/05-p81-100.txt:302
训练数据100 个随机的、有散度的流场(PhiFlow 频域合成),batch 10text/05-p81-100.txt:305
输入的初始散度 L2195.28,单格最大 1.897text/05-p81-100.txt:326
网络U-Net,4 级,filters=24,periodic=True → 83,521 个参数text/05-p81-100.txt:369:499
未训练时的损失390.22text/05-p81-100.txt:562
训练15 epoch,Adam lr=5e-3,16 秒text/05-p81-100.txt:574:586
最终损失0.679 —— 掉了两个数量级以上text/05-p81-100.txt:588
OOD 测试(噪声 scale 翻倍)原始散度 2059.14 → 网络 11.51 → 求解器 0.000text/05-p81-100.txt:648

两条诚实的观察(拆解里必须保留):

  1. 网络学到的压力场和求解器的压力场「明显不一样」,量级常常差 10 倍。 原因:这个泊松问题有一个零空间 —— 一个常数偏移。 取导数之后偏移不起作用,所以所有偏移都是完全合法的解; 而我们的可微损失对绝对值没有任何约束,网络就自由使用了随机初始化时碰巧产生的偏移。 (PhiFlow 的求解器则被约束成零均值)(text/05-p81-100.txt:664)
  2. 零样本泛化到障碍物:网络训练时只见过合成的随机噪声流场,一个障碍物都没见过, 但接到带障碍物的浮力烟羽仿真里,50 步之后和纯求解器的结果**「非常相似」** (text/06-p101-120.txt:86)。 书把这归功于用于训练的可微离散算子。 处理边界的做法:在调用网络前后各调用一次 apply_boundary_conditions() —— 前一次让网络看见固体障碍,后一次保证即便网络在边界处有小错也仍满足边界条件 (text/06-p101-120.txt:8)。

第 11 章 用 PINN 做 Burgers 反问题(v2 的实操,也是全书的反面教材)

**任务:**已知 t=0.5 时的一串观测,加上两侧 Dirichlet 边界 u=0, 反推 t ∈ [0,1] 上满足 Burgers 方程的解(text/06-p101-120.txt:117)。

**设置:**8 个全连接层、每层 20 个单元、tanh 激活,共 3021 个参数 (text/06-p101-120.txt:171)。 损失 = 边界项(100 点)+ 内部残差项(1000 点)。 残差用 phiflow 的 gradients 一路求:u_t、u_x、u_xx,组合成 u_t + u*u_x − (0.01/π)*u_xx(text/06-p101-120.txt:276)。

结果(全是可用的真实数字):

出处
迭代数10,000 次text/06-p101-120.txt:382
运行时间101 秒text/06-p101-120.txt:409
loss0.100 → 0.029(step 0 → 10000)text/06-p101-120.txt:396
重模拟 16 步的平均绝对误差0.01136text/06-p101-120.txt:546

书对结果的评价(不留情面):

  • 收敛「通常非常慢」:迭代本身快,但这个设置需要大量迭代 (text/06-p101-120.txt:373);
  • t=1/2 处两侧还行,但中心 x=0 处的激波没被很好地表示(text/06-p101-120.txt:440);
  • t=0 处的初始状态精度「其实不太好」 —— 而这恰恰是问题里最有趣、最难的部分, 因为给了第一个状态,其余基本由模型方程和边界条件推出来 (text/06-p101-120.txt:442);
  • x=±1/2 的极值差得很远,x=±1 的边界条件没被满足(解不在零上) (text/06-p101-120.txt:462);
  • 那个 0.01136 的误差,书说**「相对于仿真的取值范围来说是显著的」** (text/06-p101-120.txt:550)。 ⚠️ 书内自相矛盾:正文说「will compute a mean absolute error of ca. 1.5·10⁻²」, 但代码实际输出是 0.01136(≈1.14·10⁻²)。写拆解时以代码输出为准并说明。

第 12 章 物理损失的讨论(Part III 的结账)

12.1 泛化?—— 一个很锋利的观察

PINN 训练里,我们测试和约束解的位置,就是我们最终关心的那些位置。 于是从经典 ML 的角度看,训练集、验证集、测试集之间没有真正的区别 (text/06-p101-120.txt:601)。 这更像经典优化,而不是机器学习 —— 反问题本来就出自那里。

对比很关键:v1(用规定的离散化)其实有泛化这个性质,能推广到新输入; 而 PINN 只是在一个已知给定的时空区域里重建了单个解。 想要另一个解,就得从头开始重新训练。(text/06-p101-120.txt:608)

12.2 总结(书自己的账)

✅ 用上了物理模型 / 导数可以方便地由反向传播算出 ❌ 收敛有问题 / 物理约束只是软约束 / 与经典数值方法基本不兼容 / 导数有没有用取决于学到的表示(text/06-p101-120.txt:623)

书还多给了两条代价(text/06-p101-120.txt:592):

  • 每算一次导数都要过一遍完整的网络反传,高阶导数上会非常贵;
  • 学到的表示没法用共轭梯度这类经典迭代求解器去细化, 这意味着过去几十年发展的许多强力技术在这里用不上。

书的原话:相比 Part II 的神经代理/算子,「我们在某种意义上退了一步」。 把这些数值方法带回来,是下面几节的中心目标。(text/06-p101-120.txt:617:631)


Part IV:可微物理(第 13–20 章)—— 全书的第一个落点

第 13 章 可微物理导论

一句话定义:「可微物理(DP)」= 物理系统的可微数值仿真。 中心目标是用已有的数值求解器去增强和改进 AI 系统, 做法是给求解器装上「对输入求梯度」的能力(text/07-p121-140.txt:9)。

前提条件(书说得很硬)

  • 先要有一个连续的模型公式 —— 没有这个就完了(「if this is missing we're in trouble」, text/07-p121-140.txt:26);
  • 离散化后,一个时间步被拆成一串算子的复合: u(t+Δt) = 𝒫_m ∘ … ∘ 𝒫₂ ∘ 𝒫₁(u(t), ν);
  • 要求:每个算子 𝒫ᵢ 都要能提供对其输入的梯度 ∂𝒫ᵢ/∂u(text/07-p121-140.txt:39)。

雅可比矩阵与「为什么不用现成的向量矩阵算子」

  • ∂𝒫ᵢ/∂u 是一个雅可比矩阵(不是单个数),因为 u 是向量值函数;
  • 实践中靠反向模式微分,只算「雅可比转置乘一个向量」—— 不构造完整矩阵, 否则内存开销巨大、训练变慢(text/07-p121-140.txt:62);
  • 书自问自答一个关键问题:

    「大多数物理求解器都能拆成一串向量和矩阵操作,所有主流 DL 框架都支持这些, 那为什么不直接用这些算子来实现求解器?」 答:理论上可以,但 TF/PyTorch 里每个向量矩阵操作是单独计算的, 内部还要为反传存下当前正向求值的状态。而对一个典型的仿真来说, 我们并不关心求解器产生的每一个中间结果,我们关心的是 u(t) → u(t+Δt) 这种有意义的更新。 (text/07-p121-140.txt:93)

  • 所以正确做法:把求解过程拆成一串「有意义但整块的(meaningful but monolithic)算子」。 好处有三:省掉不必要的中间结果、能为每个算子挑最好的数值方法、 能复用伴随法领域几十年的技术(比如多重网格求解器求矩阵逆的 O(n) 运行时) (text/07-p121-140.txt:101)。
  • **代价(书自己写的反面):**这要求你对手上的问题和数值方法有一定理解; 而且现成的求解器往往不自带梯度计算。 书的原话很有性格:如果我们连自己的模型都不真懂,那大概本来就该回去多学一学…… (text/07-p121-140.txt:107)

一条完整的走查:一维一阶迎风格式的平流

这是全书把梯度算给你看的唯一一处,极适合当拆解的主走查。 (text/07-p121-140.txt:186)

模型:被动标量密度 d 在速度场 u 中的平流,∂d/∂t + u·∇d = 0。 反问题:找一个速度场 u,把初始密度 d⁰ 变形成目标 d_target;损失 L = |d(t_e) − d_target|²。

一阶迎风(upwinding)更新式:

d_i(t+Δt) = d_i − Δt[ u⁺_i(d_{i+1} − d_i) + u⁻_i(d_i − d_{i−1}) ]
u⁺_i = min(u_i/Δx, 0) u⁻_i = max(u_i/Δx, 0)

迎风的含义:根据流动方向选用单边差分模板 —— u_i 为负时用 u⁺_i 往速度的反方向看 (即「相对运动而言的后方」),此时 u⁻_i 为零;u_i 为正时反过来。

于是对 u_i 求导:∂𝒫/∂u_i = (Δt/Δx)·d_i − (Δt/Δx)·d_{i+1}。

书给的直觉:速度 u_i 的变化,取决于密度的空间导数。 因为是一阶迎风,只涉及两个邻居;高阶方法会依赖 d 的更多项。 (text/07-p121-140.txt:213)

时间演化怎么办:每一步平流都当成独立的、模块化的操作, 靠雅可比的线性性质逐步回溯,不需要把递归式展开成一个巨大表达式 (text/07-p121-140.txt:236)。 每个时间步都给 Δu 贡献一项,把所有步的贡献累加。

书的收尾:这个过程和普通的神经网络训练极其相似 —— 从嵌套函数调用里算雅可比-向量积,正是深度学习框架在训练网络时做的事 (只不过那边的自由度是权重 θ,这边是速度场 u)。 所以我们在实践中要做的,只是给 𝒫 提供一个自定义的雅可比-向量积函数。 (text/07-p121-140.txt:267)

13.5 隐式梯度(这一节是全书最有洞察力的一段之一)

问题:泊松方程 ∇²a = b。流体里 a 是压力 p,右端 b 是速度散度。 完整的无散化是 uₙ = u − ∇((∇²)⁻¹ ∇·u)。 外面的梯度和里面的散度都是线性算子,好求导;难的是矩阵逆 (∇²)⁻¹

实践中这个逆是用迭代求解器(比如共轭梯度 CG)近似的,记作 𝒮。 **天真的做法:**把 𝒮 拆成 𝒮(x) = 𝒮ₙ(𝒮ₙ₋₁(…𝒮₁(x))),对每一步反传。

书说:这当然做得到,但这不是个好主意 —— 会引入数值问题,而且非常慢; DL 框架默认会为每个可微算子存下内部状态,于是我们会在内存里攒下海量的中间状态, 而这些状态对我们原本的 PDE 毫无意义 —— 它们只是 CG 求解器的中间状态。 (text/07-p121-140.txt:294)

正确做法(漂亮的一步): p = (∇²)⁻¹b 的梯度 ∂p/∂b 就是 ((∇²)⁻¹)ᵀ。而 ∇² 是对称矩阵,所以 ((∇²)⁻¹)ᵀ = (∇²)⁻¹ —— 和正向那个逆矩阵一模一样。 于是反向传播时直接再调用一次同一个迭代求解器就行:∂p/∂b = 𝒮(∂L/∂p)。 既不用拆开它,也不用存中间状态,反向的性能和精度与正向完全一样 (text/07-p121-140.txt:299)。

本节的核心带走点(书自己加粗的意思): 不要盲目地对正向计算做反向传播,要想清楚正向那些解析方程里, 哪些步骤该去算梯度。像上面这种情况,我们常常能找到更好的梯度解析表达式, 然后再去数值近似它。(text/07-p121-140.txt:311)

两个附注(书用 Note 框标出):

  • 这本质上是**隐函数定理(Implicit Function Theorem)**给出的隐式导数;
  • 可以把迭代求解器的每一步当作虚拟的「时间」,对这些步反传 —— 这就让网络能和迭代求解器交互,比如学 CG 求解器的初始猜测(引 [UBH+20]) (text/07-p121-140.txt:315)。

第 14 章 Burgers 反问题的 DP 版(PINN vs DP 的正面对决)

注意一个容易漏的点:这一章里根本没有神经网络。 DP 选定了离散化之后,未知量就只剩初始状态,而初始状态就是一堆浮点变量, 所以整个问题退化成纯粹的基于梯度的优化(text/07-p121-140.txt:344)。

**设置:**和第 11 章 PINN 完全同一个任务(N=128、32 步、t=0.5 处有观测)。 损失 = 第 16 步与参考解的 L2。

结果(直接对照第 11 章):

PINN(第 11 章)DP(第 14 章)
迭代 / 步数10,000 次迭代50 步梯度下降(LR=5)
运行时间101 秒132 秒(书说「comparable runtime」)
loss 起点 → 终点0.100 → 0.0290.383 → 0.0033
全序列 MAE(对同一 ground truth)0.192980.06382
出处text/06-p101-120.txt:396text/07-p121-140.txt:539:590text/08-p141-160.txt:1

书的裁决:PINN 的误差比 DP 重建大了三倍多。(text/08-p141-160.txt:1) 原因:DP 为整个解、包括它所有的离散点和时间步提供梯度,而不是局部的更新。 (text/07-p121-140.txt:601)

可视化上的观察(适合写进拆解):

  • PINN 恢复出了解的整体形状,时间约束至少部分满足了, 但没能很好地捕捉 ground truth 的幅度(text/07-p121-140.txt:693);
  • DP 版本明显更接近,因为梯度在整个序列上流得更好, 而且正向和反向都能利用基于网格的离散化; 但仍然缺了 ground truth 里某些更「锐利」的特征(text/07-p121-140.txt:696)。

**一条工程箴言:**像这样简单的直接重建问题,永远是测试一个 DP 求解器的好起点。 可以在牵扯网络之前独立测好。如果直接优化都不收敛,那多半还有根本性的问题, 把网络牵进来毫无意义。(text/08-p141-160.txt:5)


第 15 章 PI vs DP 的正式对账(这一章是 Part III + IV 的总结算)

15.1 与已有数值方法的兼容性

  • PINN 实现很简单(正面),但它和解 PDE 通常用的那些「典型」离散化与求解思路差得很远; 导数由网络算出,因而依赖于一个足够准确的解表示才能给出好的优化方向;
  • DP 天生依赖一个被拴进学习过程的数值求解器,所以需要离散化, 但也因此能用上已有的、可能很强大的数值技术 —— 解和导数可以用已知且可控的精度求值,而且求得很快(text/08-p141-160.txt:30)。

15.2 「无离散化」是个假象(这一段最值得引)

PINN 看起来「不需要离散化」,但这只是第一眼的优势。 如今研究者们正在试着把离散化「重新整合」回 PINN 训练里。 一般来说,PINN 最终不可避免要在计算机里给出解,因此必须离散化问题。 它们是在训练过程中构造这个离散化的 —— 而这个构造过程听凭底层非线性优化摆布, 从外部很难控制。 (text/08-p141-160.txt:47)

具体表现:PINN 的解在「把信息往时间上游传播」这件事上有显著困难 (text/08-p141-160.txt:54)。

15.3 效率

  • PINN 做的是局部的采样与修正,权重更新因此也是局部的; 空间和时间上边界条件的满足会相应地很慢,实践中导致很长的训练 (text/08-p141-160.txt:59);
  • PINN 想采样解上的一个点,就得完整过一遍整个网络的全部数值; 网络实质上要编码整个高维解,它的大小同时也决定了求导的效率(text/08-p141-160.txt:68);
  • DP 给定插值格式或一组基函数后,只需要计算网格上一个很局部的邻域就能采样 (text/08-p141-160.txt:64)。

15.4 但 DP 也有它自己的贵(书很诚实)

因为 DP 能覆盖大得多的解流形,这些流形的结构通常也更难学。 比如训练时展开的迭代数越多(往未来看得越远),信号就越难学。 后果:每次网络迭代不但更费算力,而且往往需要更长时间才收敛书的辩护:这看着又贵又慢,但通常是因为要学的信号本身更复杂。 (text/08-p141-160.txt:75)

15.5 结论表(书自己列的)

方法ProCon
PI(物理信息 / PINN)靠反向传播得到解析导数;实现简单网络求值贵、求导极贵;与已有数值方法不兼容;对离散化没有控制权
DP(可微物理)复用已有数值方法;仿真与求导求值都高效实现更复杂;需要理解问题以便选合适的离散化

书的最终裁决:「截至撰写本书之时,PINN 方法在性能以及与已有数值方法的兼容性上 有明确的局限。」所以后面全书聚焦 DP 变体。(text/08-p141-160.txt:102)


第 16 章 可微流体仿真(把 DP 推到 Navier-Stokes)

任务设计得很刁:观测量是烟雾标记密度 s,但它完全不能被改动; 唯一能改的是 t=0 时的初速度 u₀。 目标是让 20 步之后的密度状态匹配一个参考(text/08-p141-160.txt:117)。 物理模型:无粘 Navier-Stokes(等价于欧拉方程) + Boussinesq 浮力 + 被动输运的标记密度。

巧妙的实现:用 phiflow 的命名维度开一个 inflow_loc 批次维, 一次跑四个入流位置不同的仿真:(12,4)、(13,6)、(14,5)、(16,5)—— 第四个是参考 (text/08-p141-160.txt:177)。同一段单次仿真的代码,因为广播,直接变成四个仿真。

**结果:**80 步优化(LR=1e-3),loss 298.29 → 169.94 (中间:291.45 / 276.06 / 233.71 / 232.65 / 178.19 / 176.52 / 169.36 / 167.58 / 175.01) (text/08-p141-160.txt:358)。 ⚠️ 注意 loss 在第 59 步到 79 步之间是震荡的(167.58 → 175.01 → 169.94),没有单调下降。

书的诚实收尾(边界):三个仿真都得在入流固定的前提下工作, 所以它们不能凭空「生产」标记密度去匹配目标; 而且每个仿真都要考虑非线性方程在 20 步里怎么改变系统状态。 所以这个优化目标相当难,在这个场景里不可能精确满足约束。 表现是:烟羽的「茎部」在优化后仍然有一圈黑晕; 优化改不了入流位置,只能集中精力去对齐烟羽的上部(text/08-p141-160.txt:444)。


第 17 章 把 DP 整合进网络训练(这一章是 Part IV 的理论核心)

17.0 一个关键的命名(书用 Hint 框标出)

凡是「不完美的物理模型 + 一个改进项」这类问题,我们统称为 correction task(纠正任务); 与之相对的是 prediction task(预测任务)—— 推理时根本没有求解器参与的那种。 (text/08-p141-160.txt:480) 这一段又把 closure / homogenization / parametrization 三个学科别名列了一遍 (呼应第 3.2.1 节)。

17.1–17.2 三种组合方式

顺序结构书的评价
① NN → 𝒫(前面几章的默认)网络产生求解器的输入,求解器在反传时提供梯度网络得到的信息是「我的输出怎样影响了求解器的结果」
② 𝒫 → NN求解器产生输出,由网络处理求解器实质上成了一个即时数据生成器没有梯度流过 𝒫,所以它可以被换成一个「加载函数」。好处:训练时随机采样输入参数,能得到对输入数据分布极好的采样;还能省去存取大量数据(直接在 GPU 上产生)。相关方向是 Active Learning。(text/08-p141-160.txt:506)
③ 展开(unrolling):𝒫 与 NN 交错正向算一长串求解器步,中间由网络修改系统状态;反向再穿回全部步骤书说这是「特别有道理」的组合。

17.2 为什么必须展开(这一段是对第 7 章伏笔的兑现)

因为过程是迭代的,误差一开始非常小,然后(对雅可比里特征值大于 1 的模态) 会在迭代过程中慢慢指数增长。所以在单次求值里极难发现它们 —— 比如用一个简单的监督训练设置就发现不了。 关键在于:训练时就要给网络反馈,告诉它误差在迭代过程中是怎么演化的。 (text/08-p141-160.txt:528)

另一半理由:这类迭代情形下,状态无法预计算, 因为迭代依赖于网络的状态,而网络状态在训练前未知、且训练中一直在变这就是经典的 data shift(数据漂移)问题。(text/08-p141-160.txt:531)

代价:步数多的 DP 设置很难训 —— 梯度要穿过整条 PDE 求解器与网络求值的链条, 每一环都是非线性的复杂函数,所以步数一大就有梯度消失和爆炸的问题 (text/08-p141-160.txt:542)。

17.3 网络输出怎么并进求解器(容易被忽略但很实际)

  • **朴素做法:**网络产出完整状态 x̃ = f(x; θ),求解器拿它算下一步;
  • 更好的做法:用一个算子 ∘ 把 x 和 x̃ 合并:x(t+(j+1)Δt) = 𝒫(x(t+jΔt) ∘ x̃(t+jΔt)); 最简单就是加法,此时 x̃ 是一个加性修正;
  • 理由和 U-Net 的 skip connection、ResNet 的残差是同一条: 避免把网络参数 θ 的一部分资源分配去推断那些本来就已经对的部分, 网络只需要更新 x 里还不满足学习目标的部分(text/08-p141-160.txt:553)。
  • 一般来说 ∘ 可以是任何可微算子(乘法、积分格式都行),加法通常是好的起点

17.4 展开的梯度公式(书给了完整的式子)

∂L/∂θ = Σ_i Σ_{m=1..k} [ (∂L/∂x_{i,k}) · (Π_{n=k..m+1} ∂x_{i,n}/∂x_{i,n−1})
· (∂x_{i,m}/∂x̃_{i,m−1}) · (∂x̃_{i,m−1}/∂θ) ]

读法(书自己的拆解,text/08-p141-160.txt:577):

  1. 第一个 Σ_i 累加一个 mini-batch 的所有条目;
  2. 外层 Σ_m 覆盖从 1 到 k 的所有时间步;
  3. 对每个 m,从最终状态 k 一路回溯到 m,把沿途所有雅可比乘起来(那个 Π);
  4. 在每个 m 处「分岔」出去,得到网络输出 x̃ 及其权重 θ 在第 m 步的变化。

书的警告:m 大的时候,𝒫 和 f 被反复应用的雅可比会强烈影响后续时间步的贡献, 所以必须稳定训练,尤其要防梯度爆炸。(text/08-p141-160.txt:585) 实现上的安慰:框架会复用不同 m 之间重叠的部分, 反传的代价通常和正向是同一个量级(前提是 𝒫 有合适的求导算子)。

17.5 「展开的监督训练」够不够?(一个决定性的实证)

书拿 List 等 [LCT22] 的湍流混合层做对照 —— 用的是二阶半隐式可微流体求解器 + 定制湍流损失项,书强调「这不是玩具问题」 (text/08-p141-160.txt:600)。

对照的两组:都展开 10 步,区别只在梯度流不流过求解器:

展开 + 可微求解器(DP)展开但不带求解器梯度(纯监督)
雷诺应力 / 湍动能(TKE)更贴近参考解偏离更明显
涡量场的视觉对比结构更好地保住了直接数值模拟(DNS)的参考结构

书的解释:不带 DP 的监督变体,在训练时无法使用「网络的影响在更长期怎么表现」这类信息, 所以能力受限。带可微求解器训练的那版,在整整 10 个展开步上都拿到反馈。 (text/09-p161-180.txt:9)

**一个可带走的性能数字:**要让常规仿真在湍流统计上达到同样的精度, 需要比「求解器 + 网络」长 14 倍以上的时间(text/09-p161-180.txt:13)。

17.6 加噪声这条替代路(书给的定位)

有工作提议在训练时给输入和迭代加噪声(引 [SGGP+20]),类似 dropout 这样的正则化, 能防止对训练状态过拟合,从而稳定迭代求解器的训练。 但书说噪声「本质上很不一样」:它通常是无方向的,因此不如用真实的仿真演化去训练那么准确。 噪声可以作为容易过拟合的训练设置的起点,但能做到的话,还是把真实求解器放进训练环路。 另外:现在生成式建模(去噪扩散 / 流匹配)为「把噪声纳进来」提供了更有根据的路子, 细节留到第 30 章 Unconditional Stability(text/09-p161-180.txt:18)。 ⚠️ 这是一个明确的伏笔:第 17.6 节埋,第 30 章兑现。


第 18 章 用神经算子降低数值误差(「solver-in-the-loop」,全书最重要的实操)

复现的是 Um 等 [UBH+20] 的《Solver-in-the-loop》(text/09-p161-180.txt:96)。

问题设定(概念很干净)

同一个 PDE 𝒫*,两套离散化:

  • 参考版 𝒫_r:高保真、精确,解 r ∈ ℛ;
  • 源版 𝒫_s:低保真,解 s ∈ 𝒮 —— 这才是网络将来要与之交互的求解器
  • 有一个映射算子 𝒯 把参考解搬到源流形上(比如下采样)。

核心:序列越长(n 越大),源状态 s^{t+n} 越会偏离参考 r^{t+n}。 目标是训一个修正算子 𝒞(s|θ),输出一个同维度的加性修正场,使得 e(𝒫_s(𝒞(𝒯r^t)), 𝒯r^{t+1}) < e(𝒫_s(𝒯r^t), 𝒯r^{t+1})(text/09-p161-180.txt:79)。

一个「容易看漏」的要点(书自己这么说的):

修正是作用在被修改过的状态上的,即 𝒞(s̃|θ)。这些状态是在训练过程中演化出来的, 它们事先并不存在。(text/09-p161-180.txt:87)

为什么非 DP 不可(书写在开头):

监督训练或 PINN 训练做不到这种交互哪怕监督网络的推断误差很小,它也会随时间累积,导致数据分布偏离预计算数据的分布。 这种分布漂移会带来次优结果,甚至让求解器炸掉。(text/09-p161-180.txt:61)

具体设置(数字全可用)

出处
场景卡门涡街(矩形域里一个球形障碍物的尾流)text/09-p161-180.txt:147
参考数据空间和时间离散度都细 4 倍的高保真解,已下采样进数据集text/09-p161-180.txt:144
源分辨率64×32 格,物理尺寸 200×100text/09-p161-180.txt:409:424
网络输入3 通道:x/y 速度 + 雷诺数当常数通道text/09-p161-180.txt:210
网络ResNet,layers=[32,32,32] → 47,330 个参数text/09-p161-180.txt:224:266
初始化Xavier uniform,gain 缩到 0.1 —— 为了避免开头值过大,这样才能直接开启多步展开;否则需要课程学习先热身text/09-p161-180.txt:216
MSTEPS4(每次训练迭代展开的仿真步数)—— 书称之为最重要也最有趣的参数text/09-p161-180.txt:353:357
训练数据10 个仿真中的 0–5 号,每个 496 个样本;batch 3text/09-p161-180.txt:372:393
训练5 epoch × 4960 步,3 小时 11 分text/09-p161-180.txt:534:621
loss15.63 → 0.231text/09-p161-180.txt:605:621
测试6–9 号仿真(训练时没见过的雷诺数),Re=73.24,rollout 100 步text/09-p161-180.txt:646:738:764
相对 L2 误差低保真求解器 0.1086 → 混合求解器 0.0312(约 3.5 倍改善)text/09-p161-180.txt:809

⚠️ 书内不一致:正文说「typically 5-6x lower」(text/09-p161-180.txt:761), 而同一次运行的实际输出是 0.1086 / 0.0312 ≈ 3.5 倍。写拆解时以实际数字为准并说明。

最有价值的观察

  1. 误差随时间的走势:低保真求解器的相对误差线性上升; 混合求解器上升慢得多;网络更大、训练更成功时几乎能压住任何上升 (text/09-p161-180.txt:811);
  2. 为什么保底求解器很重要:

    没有基础求解器的话,这活儿会难得多 —— 那时网络得干全部的工作。 而现在它可以依赖耦合求解器的预测,通常一个小修正就够了。 (text/09-p161-180.txt:814)

  3. 误差长什么样:纯源版仿真系统性地低估了本该形成的涡(误差图上亮色更大); 学过的版本误差分布均匀得多、幅度也小得多(text/09-p161-180.txt:872);
  4. **顺序的细节:**因为是「先求解器、后网络」,第一步是不穿过求解器的; 但后面 3 步里,第一次网络调用会收到「它推断的修正有没有把后续 3 个状态推向正确方向」 的反馈(text/09-p161-180.txt:624);
  5. 书自己给的度量学的警告:

    AI 驱动的混合求解器带来的改进,用 MAE 或 L2 这类简单的向量范数很难可靠地测出来。 要改进就得用领域专用的度量,这个案例里是基于涡量和湍流性质的流体度量。 (text/09-p161-180.txt:877)

  6. 书给的「自己动手验证」的实验(极好的走查素材): 把 msteps 设成 1,就等于关掉了可微物理训练(不再有梯度流过求解器), 这就变回了监督训练,相对误差会大幅上升(text/09-p161-180.txt:885)。

第 19 章 用网络解反问题(长程流体控制,难度最高的一个例子)

任务:算一个高维控制函数,在整个不可压流体仿真过程中施加力, 让一个被动输运的标记密度到达期望的目标状态(text/09-p161-180.txt:912)。

  • 约束极其间接:只有序列末尾的单个状态;
  • 自由度极大:控制力函数是个时空函数,自由度和流场本身一样多。

为什么难(书讲得很清楚):

控制的长程性质是这个反问题难的原因之一:对物理系统状态的任何改动, 都可能在很久以后导致巨大的变化,所以控制器必须预判系统被影响之后会怎么走。 这意味着网络还得学会底层物理是怎么演化和变化的 —— 而这正是 DP 训练的梯度进来引路的地方。(text/09-p161-180.txt:917)

两个网络的分工(这是这一章的关键设计):

网络全名干什么
OP预测器(predictor)长期规划:给定当前 d 和目标 d*,算出 CFE 该瞄准的中间状态 d_OP
CFE执行器(actor)加性地作用在速度场上,施加力

序列是 (𝒫 CFE)ⁿ(u₀, d₀, d_OP)(text/09-p161-180.txt:936)。 三个函数全是非线性的,这正是 DP 梯度不可或缺的原因。 书还点出:这个视角说明强化学习也是一个可能选项 —— 第 35 章会做对比。

三阶段训练(这是书里唯一一个多阶段流程,值得画图):

① OP_n 监督预训练(n ∈ {2,4,8,16},按 2 的幂次层级划分时间区间)
数据:另造的「moving-squares」数据集(需要中间帧才能预训练)
损失:L_sup = |OP(d_ti, d_tj) − d*_(ti+tj)/2| —— 不需要仿真序列
每个 n 训 1000 步
② CFE 用可微物理预训练:单步求解器
—— 注意:这里根本没搭仿真,CFE 只在状态对之间推断力
③ 端到端联合训练:StaggeredSequence 方案,16 步求解器
同时训 CFE + OP2 + OP4 + OP8 + OP16,lr=5e-4,1000 步

(text/10-p181-200.txt:113:162:186)

**数据:**64×64 域,16 步,dt=1.0,1000 个样本(100 测试 / 100 验证 / 800 训练); 形状库里有 10 种不同形状,随机摆在域里当起点和终点(text/10-p181-200.txt:25:109)。

结果:相对 MAE = 0.0545,即超过 94% 的标记密度落到了正确的位置 (text/10-p181-200.txt:328:313)。

书自己的赞叹(值得引):

看着挺简单,其实对神经网络是个棘手的任务:它得在 16 个时间积分步里 引导一整个二维 Navier-Stokes 仿真。施加的力只要稍有偏差或不协调, 流体就会开始打旋、混沌地运动。而网络学会了把运动维持在一起, 并把标记密度引导到目标位置。(text/10-p181-200.txt:309)


第 20 章 可微物理的讨论(Part IV 结账)

三条正面主张

  1. 整合(20.1):能得到混合方法,仿真本身和训练过程都用上我们手头最好的数值方法;
  2. 通过交互降低数据漂移(20.2) —— 这是全书对「为什么 DP 有效」最完整的一句解释:

    可微仿真让训练中的模型能够「探索并体验」物理环境, 在求解器的迭代过程中收到有方向的反馈。这解决了机器学习经典的数据漂移问题: 训练过程不再依赖一个事先指定的分布,而是通过即时展开生成新的轨迹, 并从中计算训练信号。这可以看作一种「后验(a-posteriori)」方法, 让训练出的网络对没见过的输入显著更有韧性。 (text/10-p181-200.txt:359) 书还加了一句很重的话:「实际上很难用别的方法打败一个好的展开设置」, 细节见第 30 章(又一处伏笔)。

  3. 泛化(20.3):混合方法让 PDE 求解器去处理数据分布上的大尺度变化, 从而让学到的模型专注于离散化没能捕捉的局部结构

    物理模型泛化得非常好,而学到的模型常常专精于训练时见过的数据分布。 (text/10-p181-200.txt:371)

DP 的账(书自己列的,text/10-p181-200.txt:382)

✅ 用上了物理模型和数值离散方法 / 所选方法的效率与精度直接转移到训练上 / 可以做到物理模型和网络极紧的耦合 / 韧性和泛化都更好不是所有仿真器都兼容(必须能提供梯度)/ 需要比前面几种方法更重的机械装置(框架支持)

展望:最后那条负面正在快速改善 —— OpenFOAM 这类流行开源框架以及许多商业仿真器 都在做与网络的紧密集成(text/10-p181-200.txt:390)。 ⚠️ 书里把 OpenFOAM 拼成了「OpenFoma」,是笔误。

一句定性(区别于 Part III 的软约束):

通过可微物理训练,可以把完整的数值仿真整合进网络训练。 这实际上提供了硬约束(hard constraints),因为耦合进来的求解器能像经典求解器那样 投影并强制满足约束。(text/10-p181-200.txt:393) 这是 Part III(软约束)与 Part IV(硬约束)最本质的分界,拆解里必须点明。


Part V:概率学习(第 21–33 章)—— v0.3 新长出来的一大块,占全书三分之一

这一部分的写法极有特色:它不是直接给出扩散模型的最终算法,而是 「一步一步走出来」—— 书自己说「其实看看它是从哪儿来的非常有意思」, 而且这条路径「顺便引入了机器学习里几个极有意思的概念, 也为讨论过去几年的开创性论文提供了一条漂亮的红线」(text/10-p181-200.txt:519)。

演进链条(这是全书第二好的一条主线,拆解里必须原样保留):

① 归一化流(Normalizing Flow / RealNVP)
问题:架构必须可逆;层数固定
② 神经 ODE / 连续归一化流(CNF, FFJORD)
解决:任意架构 + 连续时间
新问题:训练要解完整 ODE,网络求值次数巨大,扩展不到高维
③ 分数匹配(Score Matching)
关键转向:学 ∇ₓ log p(x)(梯度)而不是概率密度 ⟹ 不必操心归一化
配套:朗之万动力学采样
新问题:σ 太小没梯度、太大毁细节
④ 退火朗之万动力学(Annealed Langevin)
解决:从大 σ 到小 σ 逐级退火
新问题:噪声尺度序列怎么定不清楚;算不出似然
⑤ 去噪扩散(DDPM)
把退火步骤变成连续的「扩散时间」;预测噪声 ε 而不是均值
⟹ 极简的 L2 损失
新问题:推理要串行调用网络 T 次(原论文 T=1000)
⑥ 流匹配(Flow Matching)
学「速度」而不是噪声;规定直线路径 ⟹ 积分步数骤降
⟹ 比 DDPM 快一个数量级
⑦ 加物理约束(Part V 的落点)
⑦a 物理引导的流匹配(控制网络)
⑦b SMDP:把扩散时间和物理时间合并

第 21 章 概率学习导论

为什么要走向概率

书的开场:前面一直把 f(x)=y 当成确定性的,一个输入唯一一个解。 这「当然是一个巨大的简化」:实践中解可能有歧义,模型也可能搞混, 而且这两种效应还会叠加(text/10-p181-200.txt:410)。

两种不确定性(书用 Note 框列出,拆解里必须解释清楚)

类型中文指什么
Aleatoric数据里的不确定性比如测量噪声
Epistemic模型里的不确定性比如训练出来的神经网络

书立刻加了一句警告:「这个区分看着界限分明,但两种效应会叠加、而且可能很难分清。」 比如面对离散化误差时,不确定的结果可能是数据里的未知歧义造成的, 也可能是次优的离散表示造成的 —— 实践中这些方面可能极难拆开 (text/10-p181-200.txt:432)。

误差从哪儿来(书列的四个源头)

测量与观测 → 测量误差;模型方程 → 只覆盖系统的一部分,剩下的成为不确定性; 数值仿真 → 不可避免地引入离散化误差;机器学习 → 训练出的模型引入的误差。 这些合起来叫预测不确定性(predictive uncertainty),量化它是**不确定性量化(UQ)**领域的事 (text/10-p181-200.txt:421)。

21.3 基于仿真的推断(SBI)—— 这一节是 Part V 的问题定义

核心量:

  • 先验 p(x):输入的分布;
  • 潜变量 z ∼ p(z|x):系统里我们不知道的那部分(不可观测的随机变量、 中间仿真步、或者仿真器的控制流);
  • 似然函数 p(y|x):条件概率。注意它不依赖 z,所以实际要算的是 边缘似然 p(y|x) = ∫p(y,z|x)dz,即对所有可能的 z 积分;
  • 后验 p(x|y):我们真正要的东西;
  • 证据 p(y):分母,起归一化作用。

为什么难(书讲得很实在): 边缘似然的积分常常不可解(intractable) —— z 可能很难采样, 有些情况下我们根本没法以合理的方式控制它。 已有的算法(比如近似贝叶斯计算 ABC)都非常昂贵、都需要大量专家知识才能搭起来, 而且都受维数灾难之苦(text/10-p181-200.txt:484)。

深度学习的切入点(书用 Note 框标出):

我们可以用它训练一个条件密度估计器 q_θ(x|y) 去逼近后验 p(x|y), 这个估计器支持采样,而且只用 y ∼ p(y|x) 的仿真就能训出来。 (text/10-p181-200.txt:501)

学到的 SBI 方法的账(书自己列的,text/10-p181-200.txt:512): ✅ 推理快(训好之后)/ 受维数灾难影响较小 / 能表示任意的先验 ❌ 需要昂贵的前期训练 / 缺少严格的理论保证

一个被明确「劝退」的历史方案(值得引)

贝叶斯神经网络(BNN):给网络参数规定一个先验分布, 每个权重和偏置都假设是有各自均值和方差的高斯,训练时调这些均值方差; 推理时「采样」出一个网络来用。

书的裁决:「纸面上是个很好的想法,但这个方法在学习复杂分布上出了问题, 而且需要仔细调涉及的超参数。所以如今强烈建议改用流匹配(至少也要用扩散模型)。」 想看细节的话,BNN 加代码例子在 PBDL v0.3 的 arXiv 版里 ——⚠️ 书这里写的是「v0.3 of PBDL: arxiv.org/abs/2109.05237v3」, 但本书自己就是 v0.3,所以这个引用指的应该是更早的版本(arXiv v3)。写拆解时注意。 (text/10-p181-200.txt:529)


第 22 章 学一个概率分布

22.1 训练目标从哪儿来(推导极干净,适合当拆解的一处走查)

KL 散度衡量两个分布的距离:KL(p‖q) = ∫p(x)·log(p(x)/q(x))dx。 性质:恒 ≥ 0,且当且仅当两个分布相同时等于 0

把它展开:

KL(p‖q_θ) = E_{x∼p}[log p(x)] − E_{x∼p}[log q_θ(x)]
↑ 不依赖 θ,可以扔掉

于是训练目标简化成只最小化第二项:E_{x∼p}[−log q_θ(x)] —— 也就是从 p 里采样,然后最小化 q_θ(x) 的负对数似然(text/10-p181-200.txt:562)。

**条件版(后验)也一样简单:**用贝叶斯定理换一下,得到 E_{x∼p(x), y∼p(y|x)}[−log q_θ(x|y)]

书的强调:这只需要「从先验采样 x」和「抽观测 y ∼ p(y|x)」两件事, 而这两件事我们都知道怎么做!(text/10-p181-200.txt:601)

唯一的条件:q_θ 必须是一个真正的概率密度(∫q_θ(x)dx = 1)。 怎么保证这一点,就是下一节的主题。

**一个漂亮的桥:**高斯密度下的负对数似然训练,实际上等价于最小化 L2 误差 —— 这把 Part V 和前面的监督训练接上了(text/10-p181-200.txt:605)。

22.3 归一化流

核心:用一串可逆且可微的映射当网络的层。 单个可逆映射 g,逆 f = g⁻¹,则 p_Y(y) = p_Z(f(y))·|det ∂f/∂y|。 那个雅可比行列式的模,给出的是 f 造成的 y 的缩放。 p_Z 通常取标准高斯,所以求值很容易。

多层时:p_Y(y) = p_Z(f(Z))·∏|det ∂fᵢ/∂yᵢ|。 **采样很方便:**从 p_Z 抽一个随机向量 z,y = g(z) 就是目标分布的一个样本。

代码示例:RealNVP(仿射耦合)

  • 每个 block 把输入劈成两半 x1、x2;用一个全连接网络 f 从 x1 算出 shift 和 log_scale; y2 = x2·exp(log_scale) + shift;下一层 flip 一次(交换两半);
  • 6 个 block,hidden_dim=256;数据是两个二维高斯的混合 (均值 [0,0] std [1,1] 和均值 [3,2] std [0.5,0.5]);
  • 50000 个样本,50 epoch,Adam lr=2e-4;loss 2.64 → 1.92 (text/11-p201-220.txt:9:197)。

一个很有意思的观察(书自己指出的):

网络到达目标的「路线」并不直观:先验分布被以某种相当任意的方式扭曲, 但这些扭曲一步一步地靠近目标分布。因为对中间分布没有任何约束, 它们强烈依赖于随机初始化,网络只接收关于最终分布的梯度。 所以只要最终状态对得上,中间态可以保持它们任意的形状。 (text/11-p201-220.txt:371)

22.6 神经 ODE:把归一化流变成连续的

归一化流的两个大限制(text/11-p201-220.txt:379):

  1. 架构必须可逆 —— 而深度学习里最高效的那些架构都不可逆;
  2. 层数是固定的

神经 ODE [CRBD19] 的解法:把映射 gᵢ 换成一个学到的速度预测器 g_θ: ∂z(t)/∂t = g_θ(z(t), t)。 于是那串 gᵢ 步骤被替换成对速度做积分,也就是一次简单的 ODE 求解。 引入连续时间轴:t=0 是标准高斯,t=1 是目标分布

概率随时间的变化也很方便:∂log p(z(t))/∂t = −Tr(∂g_θ/∂z(t))(取迹)。

书特别点明这和前面 Part IV 的关系:

对一次 ODE 求解,反向传播路径的梯度有解析形式。 这是可微物理求解器(这里是 ODE 求解)的一个漂亮例子。 (text/11-p201-220.txt:397)

一个「看似微不足道其实关键」的变化:

现在我们只有一个函数 g_θ(·, t),在 t ∈ [0,1] 的不同点上被反复求值。 乍看是个微不足道的改动,但这是通往更强大的概率模型(比如扩散模型)的关键一步。 事实证明,「能复用一个学到的函数」而不是「手工搭出许多带大量可训练参数的层」 是很重要的。(text/11-p201-220.txt:404)

实现:FFJORD 架构(Free-form Jacobian of Reversible Dynamics)+ torchdiffeqodeint(dopri5,atol/rtol=1e-5)。 5000 个样本(书说因为训练更慢所以用的样本更少),50 epoch; loss 4.86 → 1.95(text/11-p201-220.txt:576:599)。 可视化结论:连续时间的版本把高斯变到目标分布,过程比离散层的版本平滑得多 (text/11-p201-220.txt:697)。

22.7 归一化流的死穴(这是通向 Part V 后半段的动机)

为了训练连续归一化流,我们需要把整个 ODE 从 t=1 一路解到 t=0, 把目标分布的样本运回高斯分布,才能高精度地求它们的似然。 这需要大量的网络求值,计算上非常昂贵。 因此神经 ODE 很难扩展到高维数据和大网络。 (text/11-p201-220.txt:705)


第 23 章 分数匹配(Score Matching)

什么是「分数(score)」

分数 = 对数似然函数的梯度:∇ₓ log p(x)。 用网络学它就记作 s_θ(x)。

好处一句话:再也不用操心归一化了。 积分的时候需要有正确的常数偏移, 但对 x 处的「局部」梯度而言,唯一重要的是这一点的导数 (text/11-p201-220.txt:718)。

为什么分数比似然容易学(书讲得极清楚):

  • 要估计单个样本的似然,需要大量来自目标分布的独立样本来做比较;
  • 难点在于:提议密度 q_θ 必须满足 ∫q_θ(x)dx = 1; 要把单个样本 x 的密度弄对,它得在「整体积分仍为 1」的意义上被归一化;
  • 归一化流靠模型和网络的构造方式总是满足这一点,但它扩展不了;
  • 而分数只依赖局部信息 —— 因为它考虑的是对数似然的梯度, 它的值只依赖似然的局部值。这让神经网络学起来容易得多。 (text/11-p201-220.txt:870:884)

23.2 怎么学(去噪分数匹配)

直接用 L2 学 ∇ₓ log p(x) 的话,这个 L2 叫 Fisher 散度但这需要拿到真值梯度 ∇ₓ log p(x),而在有意义的场景里我们拿不到。

ML 里定下来的技巧(引 [Vin11]):给数据集加一点高斯噪声扰动。

这把它从一堆逐点的样本,变成了一个我们能求梯度的连续函数。 (text/11-p201-220.txt:892)

x̃ = x + σz,z ∼ 𝒩(0, I)。条件密度 p_σ(x̃|x) 有解析形式, 而它的分数出奇地简单:

∇_x̃ log p_σ(x̃|x) = −(x̃ − x)/σ²

(text/12-p221-240.txt:12) 于是训练目标就是让网络预测 −noise/σ²。 一行代码。

σ 的两难(书的原话): 「直觉上,我们需要噪声来算梯度,但它又不能太大以致扭曲了目标分布。」 lim_{σ→0} KL(p_σ‖p) = 0(text/11-p201-220.txt:898)。

**实现:**4 层 MLP(hidden 128,SiLU 激活),10000 个样本,σ=0.1,100 epoch。 ⚠️ 注意:这个 loss 看起来完全不下降(192.9 → 197.8,上下震荡)。 原因是目标 −noise/σ² 的量级本来就是 1/0.01 = 100 级别, loss 的绝对值不代表训练失败 —— 书没解释这一点,拆解里应该点破。 (text/12-p221-240.txt:115) 质量检查靠可视化:学到的分数向量场和真值向量场并排比较 (text/12-p221-240.txt:125)。

23.3 朗之万动力学(怎么用分数产生样本)

来源:传统上用于有确定性力和随机力的分子系统。 更新式(text/12-p221-240.txt:197):

x_{i+1} ← x_i + ε·∇ₓ log p(x) + √(2ε)·z_i , z_i ∼ 𝒩(0, I)

在一组正则性条件下,当 K → ∞ 且 ε → 0 时,x_K 收敛到 p(x) 的一个样本。

书的实操很有教学价值:起点不是随机噪声,而是一个稠密的规则网格(35×35), 这样能看出域内各处的点会不会、以及怎样朝底层分布的密度移动 (text/12-p221-240.txt:206)。 step_size=0.01,501 步,记录第 0/100/200/300/400/500 步。 结果:规则排布的点正确地移向高密度区;右侧的偏红的点主要落进右边的高密度簇, 其他点(蓝绿红混着)落进中心那个较低的密度峰(text/12-p221-240.txt:306)。

23.4 退火朗之万动力学(解决 σ 两难的办法)

问题的完整表述(书这一段很值得整段搬):

这个方法需要相当大的噪声 σ,才能保证梯度真的把样本「领」向正确的目标。 σ 太小,我们就没有分数(梯度给不出方向);σ 太大,重叠的高斯会降低数据样本的质量 (把重要的细节淹没在噪声里)。 更大的 σ 会覆盖扰动数据空间里更大的区域,这样无论我们从哪儿出发都有梯度 —— 这一点在实践中很重要:我们不该为了给迭代找好的初始点而做一大堆假设, 那只是把「生成输出」的问题挪成了「生成合适的输入」的问题。 这就是为什么许多经典工作需要仔细指定先验分布来保证算法收敛。 (text/12-p221-240.txt:312)

解法:为什么非得只用一个 σ? 取多个噪声尺度 0 < σ₁ < σ₂ < … < σ_L,从最大的噪声开始,一路降到最小的, 并训练一个把噪声尺度 σⱼ 当额外输入的网络 s_θ(x, σⱼ)。 实操里用的是 sigmas = [4.0, 2.0, 1.0, 0.5, 0.2, 0.01],每级 150 步 (text/12-p221-240.txt:418:476)。 可视化结论:从很平滑变化的分数函数(等高线很宽)出发,走向目标分布的尖锐峰值。 退火成功地免掉了「手工规定扰动量」的需要。(text/12-p221-240.txt:527)

23.5 分数方法的结账(书自己列的)

已经拿到的(text/12-p221-240.txt:536):

  • 去噪分数匹配即使对图像这样的高维数据也管用;
  • 不需要在很多步之间反传梯度,所以比 CNF / 神经 ODE 可扩展得多;
  • 有办法从 p(x) 采样,不需要非平凡先验分布形式的假设

还没解决的:

  • 好的噪声尺度序列怎么定,至关重要,而且目前不清楚怎么得到;
  • 能采样,但不能直接算似然;
  • 那个「方便的」最大似然训练用不上了;
  • 性能问题:推理需要多次求值 s_θ(x, σⱼ),产生样本可能很贵。

第 24 章 去噪(DDPM)

从退火到扩散的一步

取极端情况:从纯噪声出发,把退火步骤当成一个连续的时间维。 t=T 是纯噪声,t=0 是零噪声。 因为多个高斯噪声叠加还是高斯,这给出一条马尔可夫链, 前向过程 q 用标准差函数 β 描述:

q(x_t | x_{t−1}) = 𝒩(√(1−β_t)·x_{t−1}, β_t·I)

前面讲的朗之万动力学则代表了反向过程,记作 p_θ (text/12-p221-240.txt:552)。

关键的解析形式:给定数据点 x₀,可以一步跳到任意 t:

q(x_t | x₀) = 𝒩(√ᾱ_t·x₀, (1−ᾱ_t)·I) , α_t = 1−β_t , ᾱ_t = ∏ α_s

24.1 从 ELBO 到「预测噪声」(书完整推了一遍)

精确的边缘似然涉及不可解的积分,但逐步累加的高斯噪声给出了一个变分下界。 用 Jensen 不等式得到 ELBO(证据下界),展开、重排成 KL 散度,得到三项:

  • L_T:不依赖 θ(扔掉);
  • L₁:容易训;
  • L_{t−1}:两个已知高斯之间的 KL —— 这是关键项,而且 α、β 都在我们掌握中。

然后是那个关键简化(全书最实用的一步):

我们处理的是加在均值上的噪声 ε(x + ε)。与其预测均值(信号 x 本身), 预测叠在上面的噪声 ε 更容易,而且减掉它同样能得到 x。 (text/12-p221-240.txt:618)

于是得到 x_t(x₀, ε) = √ᾱ_t·x₀ + √(1−ᾱ_t)·ε,预测 ε_θ(x_t, t) 而非 μ_θ。 再去掉一个 β² 因子(人们发现它给的缩放不是最优的,去掉它会提高反向链末端 小 β 样本的权重),得到:

L_DM(θ) = E_{t,x₀,ε} [ ‖ε − ε_θ(x_t(x₀,ε), t)‖² ]

书的评价:「这个极其简单的 L2 损失,才是这套方法能突破的真正原因, 因为它算起来非常简单、非常稳定。」 对比 GAN:GAN 需要在两个网络的脆弱平衡里训练,而 DDPM 只需要一个完全监督的损失。 代价是算力开销增大。(text/12-p221-240.txt:647)

24.2 两个算法(书给了完整伪代码,拆解可以直接讲)

训练(Algorithm 1):

重复直到收敛:
x₀ ∼ q(x₀) # 从数据里抽一个样本
t ∼ Uniform(1, …, T) # 均匀抽一个时间
ε ∼ 𝒩(0, I) # 抽一份噪声
x_t = √ᾱ_t·x₀ + √(1−ᾱ_t)·ε # 按权重把样本和噪声混起来
optimizer_step( ∇_θ ‖ε − ε_θ(x_t, t)‖² )

噪声调度 ᾱ_t 和相应系数可以为选定的 T 预计算,训练时只是一次查表。

推理(Algorithm 2):

x ∼ 𝒩(0, I)
for t = T, …, 1:
z = 𝒩(0,I) if t>1 else 0
x = (1/√α_t)·( x − ((1−α_t)/√(1−ᾱ_t))·ε_θ(x,t) ) + σ_t·z
return x

代价:必须串行求值网络 T 次。原始 DDPM 论文用 T=1000 才拿到很高质量的样本。 实践中 T 可以降低约一个数量级,但那也意味着要调用网络约 100 次 (text/12-p221-240.txt:698)。

DDPM 到底带来了什么(这一段是全书讲「概率模型有什么用」最好的一段)

虽然这明显比前面几章那种一次前向就给出均值的确定性网络更贵, 但根本性的、强大的改变在于:DDPM 网络能学习并可靠地再现分布。 也就是说,如果你的数据里对某个流场输入有 20% 的解往左旋、80% 往右旋, 训练好的 DDPM 网络会以正确的概率再现这些解 —— 反复用不同的初始噪声跑推理,你会看到 0.2 概率的左旋和 0.8 概率的右旋。 网络本身当然仍是确定性的:推理算法第 1 行的初始 x 固定,它总是产生同样的输出。 (text/12-p221-240.txt:702) ⚠️ 这段是拆解里必须一字不差传达其含义的:它回答了「为什么要概率模型」。

24.3 实操(高斯混合)

前向过程用标准 β 调度:beta_start = 0.0001×(1000/T),beta_end = 0.02×(1000/T)。 可视化观察:两个峰在加噪约 200 步后开始消失,视觉上形成一个以零为中心的单高斯 (text/12-p221-240.txt:831)。 网络:3 层 MLP(hidden 128),额外接收去噪时间 t;T=1000,10000 样本,100 epoch; loss 0.153 → 0.062(text/13-p241-260.txt:17)。

书自己列的三个待解决问题(text/13-p241-260.txt:155,和第 24.2 节重复了一遍):

  1. 更快的推理(主要是减少网络调用次数);
  2. 对外部参数和观测做条件化;
  3. 在物理仿真的语境下,把 PDE 形式的先验知识带回来⚠️ 这三条是明确的伏笔:1 由第 25 章兑现,2 由第 26/29 章兑现,3 由第 27 章兑现。

**书对代价的量化:这些神经函数求值(NFE)**当然贵, 很多实际情况可以用远少于 1000 的步数,但哪怕 10 步,网络也比「常规」的确定性版本慢 10 倍 (text/13-p241-260.txt:162)。


第 25 章 流匹配(Flow Matching)

从分数到速度的转换(书给的动机极清楚)

把朗之万时间演化里的随机项去掉,剩下的 dx/dt = ∇ₓ log p(x) 就是速度 —— 分数本身就可以读作速度(text/13-p241-260.txt:181)。

核心的 ODE:dx/dt = v_θ(x, t)。 一个光滑向量场 u 若满足连续性方程 ∂p/∂t = −∇·(p_t u_t), 就说它生成了概率路径 p_t

流匹配目标(不可解的那个): L_FM(θ) = E_{t∼U(0,1), x∼p_t}‖v_θ(x,t) − u_t(x)‖² —— 问题是我们既不知道 p_t(x) 也不知道 u_t(x)。

破解(引入潜变量 z 做条件): 条件版 L_CFM(φ) = E_{q(z,t), p_t(x|z)}‖v_φ(x,t) − u_t(x|z)‖² 这个版本是可解的、能真正拿来训练的(text/13-p241-260.txt:213)。

25.2 关键的自由度:规定直线路径

我们在指定从 p₀ 到 p₁ 的映射上有很大的自由。那怎么最好地利用这个自由? 结果是:「最简单的可能性」—— 瞄准直的、不相交的路径 —— 是个极好的选择。 (text/13-p241-260.txt:223)

具体:

p_t(x|x₁) = 𝒩( t·x₁ , (1 − (1−σ_min)t)·I )
u_t(x|x₁) = ( x₁ − (1−σ_min)x ) / ( 1 − (1−σ_min)t )

这个耦合把一个来自采样分布的点 x₀ ∼ 𝒩(0,I),沿着以 x₁ 结束的线性轨迹 t·x₁ 运到后验分布上,同时把标准差从 1 降到一个平滑常数 σ_min。 这个运输路径恰好和两个高斯分布之间的最优传输重合。

σ_min 是干什么的:在 t=1 处需要一点最小的噪声, 以确保尽管样本是离散的,我们保持一个连续的分布 (这和分数匹配里的扰动样本是一回事)(text/13-p241-260.txt:226)。

为什么快(这是流匹配的全部卖点)

瞄准朝目标的线性速度,意味着我们会得到从原样本到目标点的一条直线路径。 「线性」在这里意味着我们可以从任何起点用「单个欧拉步」就算出它! 这和「为了跟着一条弯曲的(无约束的)去噪路径可能要走几百步」形成巨大反差。 事实是我们并不总能得到完美的直线路径,所以单步可能是次优的 (或者需要进一步的微调 / 蒸馏)。尽管如此,流匹配通常用的迭代次数 比去噪大幅减少。而推理时间与步数直接成正比,所以这会带来相应的加速。 (text/13-p241-260.txt:244)

书还澄清了一个可能的误解:

乍看之下我们好像大退了一步 —— 又回到「变换分布」了,而前面讲归一化流时 我们论证过那是个坏主意。但有了分数匹配和去噪的方法论, 我们到达的是一种根本不同(而且更强大)的变换分布的方式: 比如我们摆脱了保持密度的约束,而且有了一个非常可解、非常方便的学习目标。 与神经 ODE 相比,我们可以用单步训练,而不必从头到尾反传整条链。 (text/13-p241-260.txt:238)

25.3 实操(和 DDPM 的代码对照,差别惊人地小)

流匹配的数据集类比去噪的更简单:不需要噪声调度,只要抽一个随机 t, 算出直线速度 u_t 就行(text/13-p241-260.txt:294)。核心三行:

x_t = (1 - (1 - sigma_min) * t) * x0 + t * x1
u_t = (x1 - x0)

网络:3 层 MLP(和 DDPM 那个一样);50 epoch;loss 2.83 → 2.04 (text/13-p241-260.txt:383)。 推理:torchdiffeq 的 odeint(dopri5),默认 100 步,书说实践中远少于此也行, 而且这已经比 DDPM 版本少一个数量级(text/13-p241-260.txt:418)。

25.4 一句诚实的收尾(值得引)

有意思的是,这些方法被提出之后,人们发现去噪、流匹配和其他变体 比从推导上看起来要相似得多。尽管如此,通过各自的视角去理解它们, 比从一个更通用的数学框架去理解要容易。 (text/13-p241-260.txt:534)


第 26 章 去噪 vs 流匹配,同台对比(Part V 最重要的定量实验)

**任务:**翼型周围的 RANS 仿真。 为什么选它:这类求解器(比如 OpenFOAM)在较大的雷诺数下, 会从稳态解转变成振荡解 —— 这个转变正是给扩散模型的任务 (text/13-p241-260.txt:548)。 好处:能可靠地生成任意多的真值数据,所以能量化「目标分布学得多好」。

⚠️ 书用 Note 框明确警告了一个记号切换:这一章偏离了 SBI 视角, 为简单起见把去噪和流匹配用在了一个「前向问题」上。 不是给定观测 y 去恢复 x,而是有初始条件 x 要算出解 y。 所以 x 和 y 的角色和前一章是反的。(text/13-p241-260.txt:556)

设置(两边完全公平)

出处
网络同一个 U-Net(AifNet),1,185,218 个参数text/13-p241-260.txt:815text/14-p261-280.txt:28
数据125 个训练 case,场大小 32×32text/13-p241-260.txt:642text/13-p241-260.txt:638
训练10000 epoch × 5 batch = 50000 次迭代,batch 25,AdamW,lr 1e-4text/13-p241-260.txt:816
训练时间DDPM 30 分 40 秒 / FM 30 分 44 秒(几乎一样)text/13-p241-260.txt:830text/14-p261-280.txt:37
最终训练 lossDDPM 0.00100 / FM 0.00430(⚠️ 不可直接比,两者的目标不同)同上
DDPM 噪声调度cosine-beta:β = cos((t/T + s)/(1+s)·π/2)²,偏移 s=0.008 —— s 的选法是让 β 的标准差小于典型 RGB 图像 1/256 的颜色步长text/13-p241-260.txt:707
测试6 个不同雷诺数,中间 4 个是训练参数的插值,首尾两个是外推text/14-p261-280.txt:242
采样每个 case 采 100(定量时 500)个样本,统计均值和标准差text/14-p261-280.txt:153

结果(这是全书对流匹配最有力的证据)

方法均值场标准差场6 个 case 的推理耗时
FM 1 步大致对(有点噪声)完全失败1 秒
FM 5 步已经很好6 秒
FM 20 步很好25 秒
FM 100 步很好2 分 9 秒
DDPM 200 步3 分 40 秒
(text/14-p261-280.txt:231:274:282)

书的结论:20 步的 FM 只用了 DDPM 十分之一的步数, 「实际上快 10 倍,而这里精度是可比的」。(text/14-p261-280.txt:235)

为什么均值容易、标准差难(书自己点破的): 均值相对容易 —— 对应的场变化不大,连 1 步的 FM 变体也基本能对(带点噪声)。 样本之间的标准差要难得多:1 步 FM 在这里彻底失败。

外推区的诚实观察:首尾两个点(外推)也处理得相当好; 网络在低 Re 的情况下高估了方差,因为训练数据里它们其实没见过静态的情形; 而可能更难的高 Re 那一侧处理得非常好(text/14-p261-280.txt:296)。

一个容易漏掉但很关键的机制差别(书特意点出)

去噪在去噪步骤的过程中会反复重新加入噪声。 流匹配则相反,只用初始噪声,然后沿着学到的向量场规定的轨迹走。 因此推理时,流匹配的步骤过程中不再加入任何噪声。 (text/14-p261-280.txt:103)


第 27 章 引入物理约束(Part V 的落点,也是全书的最终会合处)

问题:扩散模型缺什么

尽管扩散和流方法在生成建模上能力强大,网络、观测和样本之间 在训练时没有直接的反馈回路。这意味着没有直接的机制去纳入 PDE 先验这样的 基于物理的约束。后果是:光靠学习很难产生高度精确的样本 —— 而对科学应用,我们常常要确保误差能降到任何选定的阈值以下。 (text/14-p261-280.txt:323,即第 27 章开头)

这一章的中心目标一句话:把可微仿真弄回训练和推理的循环里。

27.1 训练时用还是推理时用?(书给了明确的裁决)

判断
训练时用物理先验希望是改进训练后的 p_θ 状态。但「几乎没有希望大幅改进学到的分布的精度」。 扩散和流匹配的训练过程本来就能给出很有能力的网络,它们的精度限制通常来自模型和训练数据的大小,在这个阶段很难从根本上改进模型能力。
推理时用物理先验书的推荐。 理由极好:

经典仿真通常提供「精度旋钮」:线性系统的迭代求解器给出迭代次数和残差阈值, 解不够准就把残差阈值调小。而神经网络通常没有这样的控制; 哪怕去噪或速度积分的迭代次数,在最终精度上也是有界的 —— 更多的步数通常降低噪声、也降低误差,但会在训练好的模型的能力所给定的 那个精度水平上「拍平(plateau)」。 而这正是物理求解器的梯度展现潜力的地方:它们提供了一个能引导和改进 扩散模型输出的外部过程。 (text/14-p261-280.txt:354,第 27.1 节)

最朴素的做法及其两个问题

**扩散后验采样(DPS,[CKM+23]):**在去噪步骤上,额外加一步沿 ∇ₓ‖𝒫(x) − y‖² 的梯度。 两个问题:

  1. x 通常是有噪的 —— 这个好办,用一个外推步解决;
  2. 梯度步会扭曲去噪过程的分布采样 —— 这个更难。

    沿 ∇ₓ𝒫 的梯度下降步类似于反问题的经典优化,可能强烈扭曲扩散模型的输出。 最坏的情况下,它们可能把后验分布的不同点全都拉向仿真器偏爱的那一个解。 (text/14-p261-280.txt:368)

27.2 物理引导的流匹配(引 [HT23])—— 正确的做法

核心设计:引入第二个「控制网络」,而不是直接把梯度加到样本上。

① 先正常预训练一个条件流网络 v_θ(x, y, t),不带任何控制信号
—— 目的是先确保「纯靠学习能达到的最好性能」拿到手
② 第二阶段引入控制网络 v_θ^C(v, c, t)
它接收「预训练的流 v」和「控制信号 c」作为输入
v_θ 的权重可以冻结 ⟹ 不必反传穿过 v_θ,省训练时间和算力
③ 推理时积分 dx/dt = v_θ^C(v, c, t)
只是每步先求 v_θ(x,y,t),再求 c

控制网络只有正常流网络约 10% 的权重量(text/14-p261-280.txt:398)。

三个技术要点:

  1. 1 步预测(解决「x_t 太噪」):

    x̂₁ = x_t + (1 − t)·v_θ(x_t, y, t)

    然后在 x̂₁ 上而不是在有噪的 x_t 上做控制和引导。

    书的直白解释:大多数仿真器真的很不喜欢很噪的输入, 在此之上还想算梯度显然是个很糟的主意。(text/14-p261-280.txt:414) 为什么流匹配在这里比扩散有优势:线性条件传输路径的流, 经验上被证明轨迹的曲率比去噪类网络更小 —— 这让它能用更少的步推理, 也给出更好的 x̂₁ 估计。(text/14-p261-280.txt:428)

  2. 两种控制信号:

    类型定义什么时候用
    梯度式c(x̂₁, y) := [ C(𝒫(x̂₁), y) ; ∇_x̂₁ C(𝒫(x̂₁), y) ] —— 既给当前离目标多远(C 的值),又给降低它的方向仿真器可微时
    学习式c(x̂₁, y) := Enc(𝒫(x̂₁), y) —— 一个可学的编码器网络判断仿真与观测的相似度;梯度反传在仿真器输出处被截断仿真器不可微时
    (text/14-p261-280.txt:442)
  3. 时间依赖(一个很实际的细节): 如果 x̂₁ 估计得差、代价 C 很高,梯度和控制信号会变得不可靠。 而 x̂₁ 的估计在流匹配过程的较晚时刻会更可靠实践中 t ≥ 0.8 是一个好阈值 —— 只在这个区间训练控制网络; t < 0.8 时直接输出预训练的流 v_θ(text/14-p261-280.txt:472)。

  4. 理论正确性(书特意强调的优点):

    在这个表述里,近似 x̂₁ 只影响控制信号,而控制信号是受控流网络的输入。 对确定性仿真器,这让控制信号成为 x_t 的一个函数。 受控流网络用的是和原味流匹配一样的损失。 这带来一个好性质:理论性质被保住了。 这与「基于似然的引导」形成对比 —— 后者在推理时用一个对 ∇_x_t log p(y|x_t) 的近似当引导项,而那不在原始流匹配理论的覆盖范围内。 (text/14-p261-280.txt:478)

27.2.3 天体物理的实例(全书最硬的一组外部数字)

任务:强引力透镜(strong gravitational lensing) —— 源星系的光被介于源与观测者之间的星系的引力势偏折,导致看到源的多重像。 传统计算方法建模单个透镜系统需要几分钟到几小时甚至几天 (text/14-p261-280.txt:487)。

方法平均 χ²建模时间
理论最好可能值(受观测噪声限制)1.17
FM + 可微仿真器1.4819 秒
纯 FM(和经典求解器持平)10 秒
AIES(最好的经典基线)1.74> 50 倍于 FM;比 FM+仿真慢约 35 倍
DPS(那个朴素做法)跟不上经典求解器的精度
(text/14-p261-280.txt:496)

这组数字回答了「为什么值得把物理弄回来」:比最好的经典求解器 既更准(1.48 vs 1.74,理论下限 1.17)又快约 35 倍。

账(书自己列的,text/14-p261-280.txt:517): ✅ 比纯学的扩散模型精度更高 / 给出对残差精度的控制 / 比传统反问题求解器运行时更短 ❌ 需要可微的物理过程 / 计算资源增加

27.3 SMDP:把扩散时间和物理时间合并(另一条路,引 [HVT23])

前面一直把扩散时间当成「纯虚拟的、与物理时间正交」的。 SMDP 反过来:把扩散过程当成物理系统的固有组成部分。

核心洞察(书自己说是这篇工作的中心发现):

用单步损失训练学到的修正项,等价于一个分数匹配目标; 而训练时递归地预测轨迹的更长一段,则关联到对应概率流的最大似然训练。 (text/14-p261-280.txt:534,第 27.3 节)

**结构:**概率流 = 近似的反向物理仿真器 𝒫̃⁻¹ + 修正函数 s_θ。 训练时让网络满足:

x_m ≈ x_{m+1} + Δt·[ 𝒫̃⁻¹(x_{m+1}) + s_θ(x_{m+1}, t_{m+1}) ]

s_θ 的职责:纠正近似误差、并消解随机强迫带来的不确定性。 训练用**滑动窗口(大小 S)**沿训练轨迹移动、重建当前窗口, 梯度在所有预测步上累积并反传

推理时积分一个 SDE(Euler-Maruyama 法):

dx = [ −𝒫̃⁻¹(x) + C·s_θ(x, t) ]dt + g(t)dW

设 C=1 并去掉噪声项,就得到概率流 ODE:一个唯一的、确定性的解。

SMDP 的实验(随机热方程)—— 一个非常有教学价值的权衡

设置:∂u/∂t = αΔu + g(t)ξ(ξ 是时空白噪声),α=1,32×32 分辨率, 从高斯随机场抽初始条件,t=0 到 t=0.2,g≡0.1,谱方法求解器(JAX 实现)。 反向物理步的实现很巧:𝒫̃⁻¹(x) ≈ −𝒫_h(x),即直接把正向步取负 (text/14-p261-280.txt:577)。 为什么不能直接用正向求解器反推 x₀:噪声带来的高频会被放大, 导致物理上不合理的解(text/14-p261-280.txt:582)。

两个指标打架(这是本节的核心结论):

重建 MSE谱误差(功率谱密度)
ODE 推理(确定性)最好 —— 解很平滑,没有必要的小尺度结构
SDE 推理(带噪声)略差很好,视觉上令人信服
「只有 s_θ」变体(去掉反向物理步)显著更大的谱误差

书的结论:这凸显了噪声在扩散模型推断过程里作为熵源的角色 —— 它对合成小尺度结构是必不可少的。 注意两个指标之间有天然的权衡,而 ODE 和 SDE 推理各在一个指标上最好, 用的却是同一组权重。(text/14-p261-280.txt:607)

27.4 全章总结(书给了一条极实用的经验法则)

经验法则:只有当解是一个「用解的均值表示不好」的分布时,才该用扩散建模。 如果均值可以接受,「常规」神经网络在训练和推理的复杂度上有明显优势。 但如果解确实是一个分布,扩散模型是处理复杂多样的解的强力工具。 考虑到它的能力,用扩散模型做深度学习引入的额外复杂度其实少得出人意料 —— 比如流匹配模型训练起来出奇地稳健,可以搭在确定性训练之上, 而且只引入不大的计算开销。 (text/14-p261-280.txt:622)

书还点明了 Part V 和 Part IV 的关系:

有意思的是,这种纳入方式基本上和第 13 章「可微物理导论」一致 —— 即物理求解器的梯度是核心量,而「展开(unrolling)」这样的概念扮演重要角色。 (text/14-p261-280.txt:617)