跳到主要内容

展开:把求解器搬进训练环路

1. 这一章讲什么

三件事: 网络和求解器有哪三种接法(而只有一种是真正有意思的); 为什么「训练时每次只预测一步」必然不够(答案:误差在迭代里是指数增长的, 单步里根本看不见); 以及一个决定性的对照实验——两边都往前跑 10 步,唯一区别是梯度流不流过求解器。

它在全书链条里的位置:第 05 章那个分布漂移,到这里才被真正还上。 第 08 章解决了「梯度怎么算」,这一章解决「梯度该穿过多少步」, 而这个问题的答案是全书最有实操价值的一条。

2. 顶层全景

单步训练(不够) 展开训练(这一章)

状态 x₀ 状态 x₀
│ │
网络改一下 → 求解器推一步 网络改 → 求解器推 ┐
│ │ │
和第 1 步的真值比 → 损失 网络改 → 求解器推 │ k 步
│ │ │
梯度只穿过 1 步 网络改 → 求解器推 ┘

✗ 看不见误差在第 10 步长成了什么 和第 k 步的真值比 → 损失

梯度穿过全部 k 步一路传回

这张图在讲什么: 两边的网络、损失函数、求解器全都一样, 唯一的差别是训练时往前跑几步而这一个差别足以决定成败——理由在第 6 节,证据在第 9 节。

这张图也是这一章主走查的骨架: 主走查从第 5 节挑定一个具体案子(湍流混合层)开始, 一节加一段,到第 9 节判卷。 书在讲网络之前还先跑了一个没有网络的例子(第 3、4 节),那是另起的一处走查。

3. 先看一个更难的例子:观测的东西完全不能碰

书在讲展开之前,先把可微物理推到了 Navier-Stokes 上,而且任务设计得很刁。

场景是第 03 章那团烟:一股热烟从底部某个位置冒出来,往上升。

任务:让 20 步之后的烟雾形状,匹配一个给定的参考形状。

刁在哪儿:能改的东西和能看的东西是分开的1

我们看的是烟雾的浓度——目标就是让它长成参考的样子
我们能改的只有t = 0 时刻的初速度场
烟雾浓度本身完全不能碰——它是被流带着走的,只能间接影响

这就是第 02 章那个反问题的完整样子:约束在末尾一个状态上, 可调的自由度是整片初速度场,而中间隔着 20 步非线性演化。

书还用了一个很聪明的实现手法: 借助那个仿真框架的命名维度, 开一个「入流位置」的批次维,一段单次仿真的代码因为广播直接变成四个仿真2。 四个入流位置分别是 (12,4)、(13,6)、(14,5)、(16,5), 最后那个是参考——前三个要各自去够上它。

另起一处的走查 ①(设置): 三个入流位置不同的烟羽仿真, 各自只能调 t = 0 的初速度场,目标是 20 步之后的烟雾浓度匹配第四个(参考)仿真。

为什么它是「另起一处」而不是这一章的主走查:这里从头到尾没有网络。 它证明的是「梯度能穿过 20 步 Navier-Stokes」这件事本身, 而这一章的主走查从第 5 节起头,走的是「网络接进去之后怎么训」。

4. 结果,以及它诚实的边界

80 步优化,损失从 298.29 降到 169.943

但这条曲线不是单调下降的,书把中间的数全打印出来了: 298.29 → 291.45 → 276.06 → 233.71 → 232.65 → 178.19 → 176.52 → 169.36 → 167.58 → 175.01 → 169.94。

注意最后那几步:167.58 之后涨到 175.01,再回落到 169.94——它在震荡。 这是一个真实优化过程该有的样子,不是教科书里那条平滑下降的曲线。

降幅也要读对:298 → 170,只降了 43%。 对比第 08 章那个 Burgers 反问题 (0.383 → 0.0033,降了 99%),这道题难得多。

书自己解释了为什么不可能做得更好4:

  1. 三个仿真都得在固定的入流下工作,所以它们没法凭空「生产」出烟雾来匹配目标;
  2. 每个仿真都要考虑非线性方程在 20 步里怎么改变系统状态。

书的原话是:这个优化目标相当难,在这个场景里不可能精确满足约束。

这一点在图上看得见:烟羽的「茎部」在优化之后仍然留着一圈黑晕—— 因为优化改不了入流的位置,只能集中精力去对齐烟羽的上部4

另起一处的走查 ②(结果): 80 步优化 → 损失 298.29 → 169.94(中途震荡)→ 烟羽的上部对齐得很好,茎部仍有一圈黑晕——那是入流位置改不了留下的。

这一节和展开有什么关系?这里还没有网络。 但它已经把「梯度穿过 20 步」这件事跑通了——下一节网络才进来。

5. 网络和求解器的三种接法

「把网络和求解器结合」听起来只有一种意思,其实有三种,而且差别巨大5:

接法结构网络学到什么
① 网络 → 求解器网络产生求解器的输入,求解器在反传时提供梯度我的输出怎样影响了求解器的结果
② 求解器 → 网络求解器产生输出,网络处理它没有梯度流过求解器——它实质上成了一个即时的数据生成器
③ 两者交错求解器跑一长串步,中间由网络修改系统状态;反向再穿回全部步骤书说这个组合「特别有道理」

第 ② 种值得单独说一句,因为它有个容易被忽略的实用价值。 既然没有梯度流过求解器,那它完全可以被换成一个「从硬盘加载数据」的函数—— 换句话说,第 ② 种其实就是第 05 章那个监督训练,只是数据是现生成的。 但现生成有两个真实好处: 训练时随机采样输入参数, 能得到对输入数据分布极好的采样;而且省掉了存取大量数据的开销 (直接在显卡上产生)6

这一章接下来讲的是第 ③ 种。而从这里开始,这一章的主走查也开始了。

主走查第 1 步(挑一个具体的案子): 书拿来当证据的是一个湍流混合层—— 两股速度不同的流并排着往前跑,交界面上卷出一排涡。 用的是二阶半隐式的可微流体求解器,外加一组定制的湍流损失项; 书特意强调「这不是玩具问题」7接法就是上表第 ③ 种:求解器一步步往前推,中间每一步由网络改一下状态, 反向再穿回全部步骤。 这个案子会一路走到第 9 节,每一节给它加一段。

6. 为什么单步不够:误差是指数增长的

结论先行:这一节是全章的地基,而且它兑现了第 05 章那个伏笔。

先看现象。 你训了一个网络,在单步预测上误差小到看不见。 把它接进求解器循环里跑 50 步,结果面目全非。 为什么?

书给的机制解释只有一句,但它很硬: 因为这个过程是迭代的,误差一开始非常小,然后会在迭代过程中慢慢指数增长 (具体来说,是对那些雅可比里特征值大于 1 的模态)。 所以在单次求值里极难发现它们——比如用一个简单的监督训练设置就发现不了8

摊开说这个「指数」: 假设某个方向上每步放大 1.1 倍。 一步之后误差只涨 10%,你看不出来;但 50 步之后是 1.1 的 50 次方,大约 117 倍。 在第 1 步的损失里,这个方向和别的方向长得一模一样; 在第 50 步的结果里,它主宰了一切。 (这个 1.1 和 50 是我们为演示编的,用来说明指数增长的量级; 书只说「指数增长」,没有给具体倍数。)

所以关键在于:训练时就要给网络反馈,告诉它误差在迭代过程中是怎么演化的8这件事就叫展开(unrolling): 训练的一次前向,不是跑一步,而是「网络改一下、求解器推一步」重复 k 次。

还有另一半理由,它兑现了第 05 章那个分布漂移: 这类迭代情形下,中间状态没法预先算好—— 因为迭代依赖于网络的状态,而网络状态在训练前未知、且训练中一直在变9

这两句话合起来就是全书的因果链: 要预计算 → 做不到(状态依赖于还在变的网络)→ 所以必须把求解器搬进训练环路。

主走查第 2 步(k 定成几): 回到那个湍流混合层——书那个对照里,k = 1010也就是说,训练的一次前向里,「网络改一下、求解器推一步」这个动作要做 10 遍。 书把这套设置写成公式的时候,损失只挂在最后那一步的状态上 ——中间九步一个损失都不算,它们只负责把误差滚大给最后那一步看11为什么不是 k = 1:因为上面那条指数增长——第 1 步的损失里, 会炸的那个方向和别的方向长得一模一样,网络收不到任何关于它的信号。

代价书也写了:步数一多,这种设置很难训。 梯度要穿过整条「PDE 求解器 + 网络求值」的链条,每一环都是非线性的复杂函数, 所以步数一大就有梯度消失和爆炸的问题12—— 「消失」是梯度一路乘下来越乘越小、最后什么信号都没了, 「爆炸」是反过来越乘越大、一步把参数推飞。

7. 网络的输出怎么并进求解器

这一节容易被跳过,但它是实践里最先要做的决定。

朴素做法:网络直接产出一个完整的新状态,求解器拿它算下一步。

书说这可行,但通常不是最好的13更好的做法是用一个算子把「原状态」和「网络的输出」合并起来—— 最简单就是加法,这时候网络的输出是一个加性修正

理由和 U-Net 的 skip connection、ResNet 的残差连接是同一条 (第 04 章第 5 与第 11 节讲过,注意别和这本书正文里那个「残差 = 方程两边的差」混了): 避免把网络的一部分参数资源分配去推断那些本来就已经对的部分。 网络只需要更新状态里还不满足目标的那些部分13

摊开说这条理由为什么硬: 一个 128×128 的流场,大部分区域求解器算得挺好, 只有涡的边缘那一圈不对要网络重新造一遍整张图,它得先学会「把对的地方原样抄下来」——纯粹的浪费。 要它只输出一个修正,那些对的地方它输出 0 就行了。

书还说这个合并算子一般可以是任何可微的操作(乘法、积分格式都行), 但加法通常是个好起点13

主走查第 3 步(那 10 遍里的每一遍,具体长什么样): 拿着当前的流场 → 网络吐出一个和流场同样大的修正场把它加到流场上(这就是「加性修正」,对的地方网络输出 0 就行) → 把加完的流场交给那个二阶半隐式求解器,推进一个时间步 → 拿到新流场,回到开头。 重复 10 遍。 ⚠️ 一处口径要说清:「加法」是书给的一般建议; 书没有交代它引的那个湍流案例具体用的是哪个合并算子。

8. 展开的梯度式怎么读

书给了完整的公式,而它只有四层,读懂之后就不吓人了11:

在干什么
最外层的求和把一批样本的贡献累加起来
第二层的求和覆盖从第 1 步到第 k 步的所有时间步
中间那个连乘从最终状态一路回溯到第 m 步,把沿途所有的雅可比乘起来
最后两项在第 m 步「分岔」出去,接到网络那一步的输出、再接到网络的参数上

读法一句话:每一个时间步都给最终的梯度贡献一项; 这一项 = 「从终点倒回到这一步的所有雅可比之积」× 「这一步网络对参数的导数」。

那个连乘就是上一节说的梯度爆炸的来源。 书自己也点了:步数大的时候,那些被反复应用的雅可比会强烈影响后续时间步的贡献, 所以必须稳定训练,尤其要防梯度爆炸11

但有一条实现上的安慰:框架会复用不同时间步之间重叠的部分, 所以反传的代价通常和正向是同一个量级(前提是求解器有合适的求导算子)11

这条安慰很重要:它意味着展开 10 步的训练成本大约是「跑 10 步仿真」的两倍, 而不是十倍。

主走查第 4 步(梯度怎么回来): 损失挂在第 10 步的流场上,反传要做的是—— 对每一个 m(m 从 1 数到 10),把「从第 10 步倒回到第 m 步」沿途的雅可比连乘起来 (m = 1 那一项要连乘 10 层),再在第 m 步分岔到网络的输出、接到网络的参数上; 十项加起来,才是这一次迭代给参数的那一个更新量。 那个「连乘 10 层」就是爆炸风险的具体位置—— 每层放大 1.1 倍的话,十层就是 2.6 倍;要是放大 2 倍,十层就是 1024 倍。 (这两个倍数是我们为演示编的,书只说必须防爆炸,没有给数。)

9. 一个决定性的实证:两边都展开 10 步

先把湍流那几个词讲掉,不然这一节读不动。

湍流第 05 章讲过:雷诺数大的时候,流动碎成一团团乱转的涡。 涡量(vorticity)是「这一点转得多快、往哪个方向转」—— 它是描述湍流最直观的一个场。 雷诺应力(Reynolds stress)和湍动能(turbulent kinetic energy,常缩写 TKE) 是两个描述「这些乱转的涡整体有多强」的统计量—— 你不比每一个涡长什么样,而是比这两个数对不对得上。 直接数值模拟(direct numerical simulation,DNS)是最贵、最准的那一档: 把格子切到能分辨最小的涡为止,一个近似都不做——它给的结果当参考答案。

现在看实验。走查前面三步搭起来的那套设置,在这一节里被复制成了两份。

对照组的设计干净得漂亮:

两边都唯一的区别
展开步数都是 10 步
网络、损失、求解器一样
梯度一边流过求解器,一边不流

主走查第 5 步(唯一的变量): 把第 1 到 4 步那套东西照原样再训一份, 只改一件事——反传到求解器那一环就截断,不让梯度穿过去。 这一版书叫它「展开的监督训练」:它照样展开 10 步, 只是网络永远不知道自己那一下修正在后面九步里被求解器放大成了什么。

主走查第 6 步(怎么考): 训完之后,两版网络各自接进求解器里跑 1024 个时间步, 然后在流场的一个横截面上比雷诺应力和湍动能这两条曲线71024 这个数要有参照物:训练时才展开 10 步,考试却要跑 1024 步,是训练时的一百倍。 书顺带说了一句很重要的话:两版都相当稳定,而且都明显好过没被网络改过的纯求解器。

结果710:

看什么梯度流过求解器梯度不流过
雷诺应力 / 湍动能更贴近参考解偏离更明显
涡量场的样子更好地保住了直接数值模拟的参考结构

书的解释:不带可微求解器的那个变体,在训练时无法使用 「网络的影响在更长期怎么表现」这类信息,所以能力受限; 而带可微求解器训练的那版,在整整 10 个展开步上都拿到了反馈10

这个对照的分量在于:它把「展开」和「梯度流过求解器」这两件事分开了。 光展开不够——你还得让梯度真的穿过去。

最后是一条可以带走的性能数字:要让常规仿真在湍流统计上达到同样的精度, 需要比「求解器 + 网络」长 14 倍以上的时间14

书自己给这个数加了限定:「这只是第一个数据点」—— 但它说明训好一个网络之后,性能上的真实改进基本上是开箱即得的。

主走查第 7 步(判卷): 两条曲线并排看——梯度穿过求解器的那一版更贴近参考解, 不穿的那一版偏离更明显;换成看涡量场的图,穿过的那一版更好地保住了 直接数值模拟里的那些结构10

主走查第 8 步(还能带走一个数): 要让一个不带网络的常规仿真在湍流统计上 达到跟「求解器 + 网络」一样的精度,得多花 14 倍以上的时间14

10. 一个关键的命名:修正任务

书用一个提示框单列了这个命名,而它把整个领域分成了两半15:

定义例子
修正任务(correction task)推理时有求解器在场,网络的活是给一个不完美的物理模型加一个改进项这一章和第 10 章的全部内容
预测任务(prediction task)推理时根本没有求解器第 05 章那个翼型网络

这个区分为什么重要:第 05 章那个分布漂移只在修正任务里咬人。 预测任务的输入永远是外部给的,不会漂; 修正任务的输入是网络自己和求解器一起造出来的,必然漂。

书还在这里把第 02 章提过的三个学科别名又列了一遍: 同一个目标在流体与湍流里叫闭合问题(closure problem)、 在材料学里叫均匀化(homogenization)、 在气候与天气仿真里叫参数化(parametrization)15

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

11. 加噪声那条替代路

有另一条路想解决同一个问题,而书给了它一个明确的定位。

做法:训练时给输入和迭代过程加噪声—— 做法上类似训练里那些「故意加点扰动、免得网络把训练数据背死」的手段(这类手段统称正则化, 最有名的一种叫 dropout——每次训练随机关掉一部分神经元), 从而稳定迭代求解器的训练16

书的判断:噪声「本质上很不一样」——它通常是无方向的, 因此不如用真实的仿真演化去训练那么准确16

书的建议很干脆:噪声可以当成「容易过拟合的训练设置」的一个起点, 但能做到的话,还是把真实的求解器放进训练环路。

书还留了一处伏笔:现在的生成式建模方法(去噪扩散、流匹配) 为「把噪声纳进来」提供了更有根据的路子17这条线第 15 章会兑现——那里会给出「展开几步才够」的确切分水岭。

12. 主走查合起来看

主走查只有一条,走的是那个湍流混合层,从第 5 节起头、到第 9 节判卷。

在哪一节发生了什么具体的数或状态
1§5挑案子、定接法湍流混合层;二阶半隐式可微求解器 + 定制湍流损失项;接法是第 ③ 种(交错)
2§6k 定成几k = 10;损失只挂在第 10 步的流场上,中间九步一个损失都不算
3§7那 10 遍里的每一遍流场 → 网络吐一个同样大的修正场相加 → 求解器推一个时间步 → 回到开头
4§8梯度怎么回来对 m = 1…10 各连乘一串雅可比(m=1 那项连乘 10 层)→ 分岔到参数 → 十项相加
5§9唯一的变量照原样再训一份,只把梯度在求解器那一环截断
6§9怎么考两版各接进求解器跑 1024 个时间步(训练时展开步数的一百倍),比横截面上的雷诺应力与湍动能
7§9判卷穿过求解器的那版更贴近参考;涡量场也更好地保住了直接数值模拟的结构
8§9还能带走一个数常规仿真要达到同样精度,得多花 14 倍以上的时间

另外还有一处走查,它不属于上面这条链(书在讲网络之前先跑的一个例子, 那里从头到尾没有网络,证的是「梯度能穿过 20 步 Navier-Stokes」这件事本身):

在哪一节发生了什么具体的数或状态
§3任务20 步烟羽;只能改 t=0 的初速度,烟雾浓度不能碰;四个入流位置 (12,4) / (13,6) / (14,5) / (16,5) 是参考
§4优化 80 步损失 298.29 → 169.94,中途在 167.58 → 175.01 之间震荡;烟羽上部对齐,茎部仍有一圈黑晕

每个数都是书里的(逐条见脚注); 第 6 节那个「每步放大 1.1 倍、50 步涨 117 倍」、第 8 节那个「十层 2.6 倍 / 1024 倍」, 以及「1024 步是训练展开步数的一百倍」这个比值,是我们为演示或对照算的。

13. 作者的判断与证据

书里给了证据的:

说法证据
梯度能穿过 20 步 Navier-Stokes真实优化日志 298.29 → 169.943
这个任务不可能精确满足给了机制理由(入流固定、不能凭空造烟)+ 图上的黑晕4
光展开不够,梯度必须流过求解器一个干净的对照实验——这是全章最硬的证据710
快 14 倍以上引的是别人的工作 [LCT22];书自己说「这只是第一个数据点」14

作者的判断:

说法为什么算判断
「误差对某些模态指数增长」书没有在任何实验里量过这个增长率,这是机制性的陈述8
「加性修正比直接输出完整状态好」没有对照实验,理由是类比 skip connection 和残差连接13
「噪声是无方向的,所以不如真求解器」没有对照实验,是一句定性判断16
「第 ③ 种接法特别有道理」立场,证据分散在这一章和第 10 章5

判断(我们的,不是书里的): 这一章最有价值的不是「展开」这个技巧本身, 而是第 9 节那个对照实验的设计方式—— 它把一个复合的做法拆成两个可以单独开关的变量(展开几步 / 梯度穿不穿), 然后只动其中一个。 全书别的地方很少这么做(第 07 章那个 PINN 对比就没做到), 而这正是为什么这一章的结论比全书别处更可信。 如果错,会错在: 如果那个对照里两边的超参数没有各自调优 (比如不带梯度那一版本该用更大的学习率),那结论会被高估。 书引的是别人的论文,这一层细节我们无法在这里核实。

14. 边界与局限

  • 那个 20 步烟羽的例子里还没有网络。 它证明的是「梯度能穿过 20 步 Navier-Stokes」, 不是「展开对训练网络有效」;
  • 决定性的那个对照是引用别人的工作,书没有自己复现, 也没有给出可复现的代码本(不像本书别的章);
  • 「展开几步才够」这一章一个数都没给。 这是本章最大的缺口, 第 15 章才给出分水岭;
  • 梯度爆炸怎么防,书只说了「必须稳定训练」,没有给具体做法;
  • 「加性修正更好」没有实验支撑,只有类比;
  • 加噪声那条路书只用了两段就打发了,没有和展开做过直接对比。

15. 可带走的

  1. 单步训练必然不够,因为误差在迭代里是指数增长的—— 在第 1 步的损失里那个方向和别的没两样,在第 50 步的结果里它主宰一切;
  2. 展开 = 训练的一次前向里,「网络改一下、求解器推一步」重复 k 次, 然后梯度穿过全部 k 步传回来;
  3. 这些中间状态没法预先算好,因为它们依赖训练中一直在变的网络—— 这就是必须把求解器搬进训练环路的完整理由;
  4. 光展开还不够,梯度必须真的流过求解器。 这是书那个对照实验唯一的变量;
  5. 网络和求解器有三种接法。 「求解器 → 网络」那种没有梯度流过求解器, 等于监督训练加一个即时数据生成器;
  6. 让网络输出一个加性修正,不要让它重造整个状态。 理由和 skip connection、残差连接是同一条;
  7. 展开的梯度式只有四层: 批内求和 → 每个时间步 → 从终点回溯的雅可比连乘 → 在该步分岔到参数;
  8. 那个连乘就是梯度爆炸的来源。 步数一大必须防;
  9. 好消息:反传的代价通常和正向同量级,因为框架会复用重叠的部分;
  10. 修正任务(推理时有求解器)和预测任务(没有)要分开。 分布漂移只在前者里咬人;
  11. 这个目标在三个学科里各被重新发明过一遍:闭合问题 / 均匀化 / 参数化。 重复发明说明底层问题重要;
  12. 训练时加噪声是个替代品,不是替代方案。 噪声是无方向的;能用真求解器就用真的。

16. 原文地图

主题原书章原文位置
任务:只能改初速度,观测量不能碰16 Differentiable Fluid Simulationstext/08-p141-160.txt:125(搜「marker density」)
用命名维度一次跑四个仿真16.2text/08-p141-160.txt:170(搜「inflow_loc」) · text/08-p141-160.txt:172(搜「different locations of the inflow」)
80 步优化的损失日志16.5text/08-p141-160.txt:358(搜「Optimization step 0, loss: 298」)
为什么不可能精确满足、茎部的黑晕16.6text/08-p141-160.txt:445(搜「out of the blue」)
修正任务 vs 预测任务、三个学科别名17 Integrating DP into NN Trainingtext/08-p141-160.txt:486(搜「correction task」)
三种接法、求解器当即时数据生成器17.1–17.2text/08-p141-160.txt:506(搜「on-the-fly data generator」)
误差指数增长、必须给迭代过程的反馈17.2text/08-p141-160.txt:529(搜「increase exponentially」) · text/08-p141-160.txt:533(搜「data shift」)
梯度消失与爆炸17.2 同上text/08-p141-160.txt:544(搜「vanishing and exploding」)
加性修正、和 skip connection 同一条理由17.3text/08-p141-160.txt:557(搜「additive」)
展开的梯度式与它的四层读法17.4text/08-p141-160.txt:567(搜「mini batches with an index」) · text/08-p141-160.txt:578(搜「outer summation」)
反传代价和正向同量级17.4 同上text/08-p141-160.txt:586(搜「exploding gradients」)
「这不是玩具问题」、10 步对照17.5text/08-p141-160.txt:602(搜「not a toy problem」)
考试跑满 1024 步、纯求解器当第三条基线17.5 同上text/08-p141-160.txt:610(搜「1024 time steps」) · text/08-p141-160.txt:612(搜「unmodified output」)
对照结果与书的解释17.5 同上text/09-p161-180.txt:10(搜「capabilities are limited」)
常规仿真要长 14 倍以上17.5 同上text/09-p161-180.txt:15(搜「14x longer」)
加噪声那条替代路17.6 Alternatives: noisetext/09-p161-180.txt:23(搜「undirected」) · text/09-p161-180.txt:27(搜「denoising diffusion」)

Footnotes

  1. 出处:第 16 章 Differentiable Fluid Simulations(p.149)第 125 段 (text/08-p141-160.txt:125,搜「marker density」)。 物理模型是无粘的 Navier-Stokes(等价于欧拉方程)加布森涅斯克浮力, 标记密度被动地随流输运。

  2. 出处:第 16.2 节(p.153)第 170 段(text/08-p141-160.txt:170,搜「inflow_loc」) 与第 172 段(text/08-p141-160.txt:172,搜「different locations of the inflow」)。 四个入流位置是 (12,4)、(13,6)、(14,5)、(16,5),最后一个是参考。

  3. 出处:第 16.5 节(p.157)第 358 段 (text/08-p141-160.txt:358,搜「Optimization step 0, loss: 298」)。 打印出来的完整日志(每 10 步一行)是 298.286163 / 291.454376 / 276.057831 / 233.706482 / 232.652145 / 178.19 / 176.52 / 169.36 / 167.58 / 175.01 / 169.94。 「中途震荡」和「只降了 43%」是我们的观察,书没有评论这条曲线的形状。 2

  4. 出处:第 16.6 节(p.159)第 445 段(text/08-p141-160.txt:445,搜「out of the blue」)。 原文:三个仿真都必须在固定的入流下工作,「hence they cannot simply "produce" marker density out of the blue to match the target」;所以这个优化目标相当难, 在这个场景里不可能精确满足约束——表现就是烟羽茎部那圈黑晕。 2 3

  5. 出处:第 17.1–17.2 节(p.162)第 506 段(text/08-p141-160.txt:506,搜「on-the-fly data generator」)。 书把第三种(交错)称为特别有道理的组合。 2

  6. 出处:第 17.2 节(p.162)第 506 段(同上)。 原文说这种情况下求解器实质上是一个即时数据生成器, 没有梯度流过它,所以它可以被换成一个加载函数; 好处是训练时随机采样输入参数能得到对输入分布极好的采样,并省去存取大量数据。

  7. 出处:第 17.5 节(p.166)第 602 段(text/08-p141-160.txt:602,搜「not a toy problem」) 与第 610 段(text/08-p141-160.txt:610,搜「1024 time steps」)。 案例引自 [LCT22] 的湍流混合层,用的是二阶半隐式可微流体求解器加定制的湍流损失项。 两条统计曲线都是在「求解器 + 训好的网络」跑满 1024 个时间步之后、 在流场的一个横截面上量的;原文还说这两版都相当稳定, 而且都明显好过图里那条蓝色的、没被网络改过的纯求解器结果。 「1024 是训练时那 10 步的一百倍」这个比值是我们算的。 「湍流 / 涡量 / 雷诺应力 / 湍动能 / 直接数值模拟」这五个词的解释是我们补的 (补充,不在书里,来自通用知识),书把它们当读者已知。 2 3 4

  8. 出处:第 17.2 节(p.163)第 529 段(text/08-p141-160.txt:529,搜「increase exponentially」)。 原文:误差一开始非常小,然后对雅可比里特征值大于 1 的那些模态会在迭代中缓慢地指数增长, 因此「extremely difficult to detect in a single evaluation」。 「每步放大 1.1 倍、50 步涨 117 倍」这个算例是我们为演示编的,书没有给具体倍数。 2 3

  9. 出处:第 17.2 节(p.163)第 533 段(text/08-p141-160.txt:533,搜「data shift」)。 原文:这些状态无法预计算,因为迭代依赖网络的状态, 而网络状态训练前未知、训练中一直在变——这就是经典的数据漂移问题。 这一句正是第 05 章那处伏笔的兑现。

  10. 出处:第 17.5 节(p.167)第 10 段(text/09-p161-180.txt:10,搜「capabilities are limited」)。 原文:不带可微求解器的监督变体在训练时无法使用「网络的影响在更长期怎么表现」这类信息, 所以能力受限;带可微求解器训练的那版在整整 10 个展开步上都收到反馈。 2 3 4 5

  11. 出处:第 17.4 节(p.165)第 567 段(text/08-p141-160.txt:567,搜「mini batches with an index」)、 第 578 段(text/08-p141-160.txt:578,搜「outer summation」) 与第 586 段(text/08-p141-160.txt:586,搜「exploding gradients」)。 书自己把那个公式拆成四层解释,我们照它的拆法写成了表格。 2 3 4

  12. 出处:第 17.2 节(p.164)第 544 段(text/08-p141-160.txt:544,搜「vanishing and exploding」)。 「消失」与「爆炸」两个词的含义是我们补的(补充,不在书里,来自通用知识)。

  13. 出处:第 17.3 节(p.164)第 557 段(text/08-p141-160.txt:557,搜「additive」)。 原文:「Along the lines of skip connections in a U-Net and the residuals of a ResNet, in these cases it's better to use an operator ∘ that merges x and x̃」; 最简单的情形就是加法,此时网络输出是一个加性修正; 一般来说这个算子可以是任何可微操作(乘法、积分格式都行)。 2 3 4

  14. 出处:第 17.5 节(p.167)第 15 段(text/09-p161-180.txt:15,搜「14x longer」)。 原文:「For this case it would require more than 14x longer than the solver with the NN [LCT22]. While this is just a first data point …」——这个限定是书自己加的。 2 3

  15. 出处:第 17 章开头(p.161)第 486 段(text/08-p141-160.txt:486,搜「correction task」)。 书用一个提示框把这个命名单列出来,并重列了三个学科别名 (呼应第 3.2.1 节,见 text/02-p21-40.txt:425,搜「closure problem」)。 2

  16. 出处:第 17.6 节 Alternatives: noise(p.168)第 23 段 (text/09-p161-180.txt:23,搜「undirected」)。 原文:「the noise is very different in nature. It is typically undirected, and hence not as accurate as training with the real …」;被引的工作是 [SGGP+20]。 2 3

  17. 出处:第 17.6 节(p.168)第 27 段(text/09-p161-180.txt:27,搜「denoising diffusion」)。 原文说生成式建模方法(去噪扩散或流匹配)为把噪声纳入训练提供了更有根据的路子, 并把细节指向了后面讲无条件稳定的那一章(我们的第 15 章)。