跳到主要内容

去噪扩散与流匹配:两个成品的正面对决

1. 这一章讲什么

三件事: 第 12 章那串离散的噪声档位怎么变成一条连续的时间轴, 以及那个让整件事成立的小动作(预测噪声,不预测信号); 这套做法到底换来了什么(书给的答案是一个可以量的比例); 以及它的两个成品在同一个流体任务上正面对打的结果。

它在全书链条里的位置:这是第二把刀最后一级台阶,也是第 01 章那盆冷水的解药。 第 11 到 12 章一直在往上爬,这一章到顶—— 而顶上站着的那两个名字,正是今天外面人人都在说的去噪扩散和流匹配。

2. 顶层全景

第 12 章留下的 这一章的两个成品

六档 σ:[4.0 … 0.01]
「档位序列怎么定不清楚」


把档位拉成一条连续的时间轴
t=T 纯噪声 ←────────→ t=0 干净样本

├──► 去噪扩散:每一步问「你身上叠的是哪一份噪声」
│ 训练 = 四行;损失 = 一行平方误差
│ 推理 = 串行调用网络上百到上千次 ← 贵在这里

└──► 流匹配:每一步问「此刻该往哪个方向走多快」
路径由我们规定,规定成直线
推理 = 十几到几十步 ← 快在这里

同一个任务上对打
┌──────────────────────────┐
│ 同一个 118 万参数的 U-Net │
│ 同样 50,000 次训练迭代 │
│ 训练耗时 30:40 对 30:44 │
└──────────────────────────┘
20 步流匹配 ≈ 200 步去噪,快 10 倍

这张图在讲什么: 上半是这一章的推导线——一次「把离散拉成连续」的动作, 生出两个不同的问法;下半是这一章的实验线——两个成品在同一条起跑线上跑。

3. 从退火到扩散:把档位拉成一条时间轴

结论先行:这一步不是发明新东西,是把第 12 章那六个档位取极限。

第 12 章的退火是:σ 从 4.0 一档一档降到 0.01。 书说,那就取极端情况——从纯噪声出发,把退火的那些步骤当成一个连续的时间维1

于是有了一根新的时间轴:

时刻那里是什么
t = T纯噪声,什么信息都没有
t = 0干净的样本,零噪声

⚠️ 这根轴和物理时间毫无关系。 它是人造的、只在生成过程里存在的一根轴。 书后面把它叫作扩散时间,而这本书里另有一个真正的物理时间—— 两者完全正交,这个坑第 15 章会专门再讲一次。

沿着这根轴往「噪声更多」的方向走,叫前向过程; 往「噪声更少」的方向走,叫反向过程。 前向过程不用学:每一步就是「把当前的东西按比例缩一点,再撒一把定量的高斯噪声」。 每一步撒多少,由一串事先算好的系数决定,这串系数叫噪声调度1

书在这里点了一句关系:第 12 章那个朗之万动力学,代表的正是反向过程1所以这一章不是另起炉灶,是给上一章那个采样过程配上了一根有头有尾的轴。

4. 一步跳到任意时刻

结论先行:前向过程有一个便宜到不真实的性质,而整套训练都靠它。

性质来自高斯的一条基本事实:多份高斯噪声叠加,结果还是一份高斯噪声。

后果是:你不必真的一步一步加 500 次噪声,才能得到第 500 步的样子。 给定干净样本和目标时刻,一个式子直接算出来2:

第 t 步的样子 = √ᾱ × 干净样本 + √(1−ᾱ) × 一份噪声。 那个 ᾱ 是前 t 步「保留系数」的连乘积,可以对选定的总步数事先全部算好、训练时查表。

这一条为什么是命门: 训练要在随机的时刻上做, 如果每次都得从头逐步加噪,训练成本会随时刻线性上升,根本训不动。 有了这个跳跃式,不管抽到第几步,代价都一样。

5. 那个让整件事成立的小动作:预测噪声

结论先行:整套推导最后落到一行平方误差,靠的是换了一个预测目标。

书完整推了一遍变分下界(把那个算不出来的边缘似然换成一个可以优化的下界), 展开重排之后得到三项,其中只有中间那一项是要紧的3这一段的数学我们不重复,因为它的结论比过程有用得多。

结论是这样来的: 我们处理的是「信号 + 噪声」这个组合,而网络可以去猜其中任何一半。 书的观察是4:

与其预测均值(也就是信号本身),预测叠在上面的那份噪声更容易; 而把它减掉,同样得到信号。

再去掉一个系数(书说人们发现那个 β² 的加权其实不是最优的, 去掉它会提高反向链末端、噪声很小那些样本的权重),损失就塌缩成了一行4:

「你身上叠的是哪一份噪声?」猜错多少,平方一下,就是损失。

书对这一行的评价很重,值得原样传达5:

这个极其简单的平方误差损失,才是这套方法能突破的真正原因—— 因为它算起来非常简单、非常稳定。

它还给了一个对照:对抗生成那一套需要在两个网络的脆弱平衡里训练, 而这里只需要一个完全监督的损失。代价是算力开销更大。 (「完全监督」的意思是:每一步都有一个明确的标准答案可比—— 而这里那个标准答案就是你自己刚抽的那份噪声,所以它一分钱都不用另外花。)

这行损失顺带治好了第 12 章那个毛病: 那里的目标是「负的噪声 ÷ σ²」, 量级是 1/σ,于是一个什么都不学的网络损失就有 2/σ²(σ=0.1 时是 200),日志读不出好坏; 这里猜的是噪声本身,大小就是 1,损失也就落在个位数以内 —— 同一个二维高斯混合上,书这次的日志是从 0.1529 掉到 0.0592(第 8 节),一眼看得出在降。 同一件事换个写法,损失曲线就变得可读了。

6. 训练四行,推理上百步

训练算法书给了完整伪代码,拆成人话只有四行6:

反复做:
① 从数据里抽一个干净样本
② 从 1 到 T 里均匀抽一个时刻 t
③ 抽一份高斯噪声
④ 按第 4 节那个跳跃式,把样本和噪声按 t 对应的比例混起来
⑤ 让网络看着这个混合物和 t,去猜第 ③ 步那份噪声;按平方误差走一步

推理算法则相反,而且它就是这套方法全部的代价所在6:

从一份纯噪声出发
for t = T, …, 1:
让网络猜「现在身上叠的是哪份噪声」
按系数把它减掉一部分
如果还没到最后一步,再撒一点新噪声进去
返回结果

⚠️ 注意倒数第二行:去噪过程里每一步都会重新加一点噪声。 这一条到第 13 节会变成流匹配和它的关键差别,先记着。

代价一句话:必须串行调用网络 T 次。 书给的参照:原始那批论文用 T = 1000 才拿到很高质量的样本; 实践中可以降大约一个数量级,但那也意味着仍要调用网络约 100 次7

和什么比才知道贵: 前十章那些确定性的网络,一次前向就出结果。 书自己算了这笔账:哪怕只用 10 步,也比确定性版本慢 10 倍8

7. 它到底换来了什么

结论先行:这一节是整个第二把刀存在的理由,书把它讲得毫不含糊。

书的原话7:

虽然这明显比前面几章那种一次前向就给出均值的确定性网络更贵, 但根本性的、强大的改变在于:它能学习并可靠地再现分布。 也就是说,如果你的数据里、对某一个流场输入有 20% 的解往左旋、80% 往右旋, 训练好的网络会以正确的概率再现这些解—— 反复用不同的初始噪声跑推理,你会看到 0.2 的概率往左旋、0.8 的概率往右旋。

书还补了一句必须一起传达的话,否则读者会以为网络变得随机了:

网络本身当然仍是确定性的:推理算法第一行那个初始噪声固定住,它总是产生同样的输出。

这句话的分量:变的不是网络,是输入。 同一个网络、同一份条件,换一份初始噪声,就走到另一支解上。 第 01 章那条抛物线要的「两支都拿到、而且按比例拿到」,到这里才被完整地做出来。

为什么「按比例」比「两支都有」更值钱: 如果只是随便给出两支中的一支,你没法回答「哪一支更可能」; 而按比例再现,意味着你手上的一百个样本本身就是一份统计。

8. 另起一处的走查:同一个高斯混合上的去噪

另起一处的走查(和主走查那个翼型不是同一个任务): 靶子还是第 11、12 两章那个二维高斯混合——峰 A 中心 (0,0) 标准差 1、 峰 B 中心 (3,2) 标准差 0.5。 ① 前向加噪:总步数 T = 1000。书报告的观察是——大约 200 步之后, 两个峰开始消失,视觉上变成一个以零为中心的单高斯9; ② 网络:三层的全连接网络,中间宽度 128,额外接收当前时刻; ③ 训练:10,000 个样本、100 轮,损失从 0.1529 掉到 0.0592 附近10; ④ 结果:书说它准确地抓住了分布里的两个峰,而且训练过程非常简单、非常稳定11

这一处走查的用处是把「时间轴」这件事变成可见的: 200 步是这个具体靶子上「信息被抹平」的位置,而总步数是 1000。 也就是说,后面 800 步全在纯噪声里打转—— 这正是「步数可以大幅减少」这个念头的来源。

9. 书自己列的三条待办

书在这一章末尾把欠的账列成三条,而且列了两遍12这三条是接下来三章的目录,值得抄下来:

待办谁来还
更快的推理,主要是少调几次网络本章后半的流匹配
怎么对外部参数和观测做条件化第 15 章(那里的做法反直觉)
在物理仿真的语境下,把 PDE 形式的先验知识带回来第 14 章

书自己写下的那个问题,就是下半章的题目8:

怎么在不损害后验精度的前提下,把推理过程变快?

10. 流匹配:把随机项去掉,剩下的就是速度

结论先行:从去噪到流匹配的那一步,是删掉一项。

回到第 12 章那个朗之万更新式:沿箭头走一步 + 加一点随机。 书说:把随机那一项忽略掉,剩下的那一项本身就是一个速度—— 箭头本来就可以读作「此刻该往哪个方向、走多快」13

于是问题被换了个问法:

网络回答什么
去噪「你身上叠的是哪一份噪声?」
流匹配「此刻这一点该往哪个方向、以多快的速度移动?」

这个「速度」不是随便叫的,它有一个要满足的条件: 一个光滑的速度场,如果满足连续性方程,就说它生成了一条概率路径13(连续性方程在第 02 章出现过:它说的是「东西不会凭空多也不会凭空少」。)

理想的训练目标写出来很干净:让网络给的速度贴近真值速度。 卡住的地方和第 12 章一模一样:真值速度我们不知道。

破解的手法书叫「一个技巧」:引入一个条件变量,先算「给定终点时的速度」。 这个条件版是可解的、能真正拿来训练的14读法:不问「所有样本合起来该往哪走」,只问「如果我知道这条路的终点在哪,该往哪走」—— 后者一目了然,而把所有终点上的答案平均起来,恰好就是前者。

11. 关键的自由度:规定路径是直线

结论先行:这一节是流匹配全部的卖点,而它靠的是一次「我们说了算」。

上一节那个条件变量带来一个自由:从起点到终点的路,我们可以自己规定。 书的问法和答案15:

我们在指定这个映射上有很大的自由。那怎么最好地利用这个自由? 结果是:「最简单的可能性」——瞄准直的、不相交的路径——是个极好的选择。

为什么直线值钱,书说得非常直白16:

瞄准朝目标的线性速度,意味着我们会得到一条直线路径。 「线性」在这里意味着:从任何起点,一个欧拉步就能算出终点! 这和「为了跟着一条弯曲的去噪路径可能要走几百步」形成巨大反差。

「欧拉步」在这里就是最朴素的一步积分:拿当前速度乘以时间长度,加到当前位置上。 路是直的,一步就到;路是弯的,一步就飞出去,只能小步小步挪。

书紧接着自己泼了冷水,这一句必须一起传达16:

事实是我们并不总能得到完美的直线路径,所以单步可能是次优的 ——那时候还得对训好的网络再多训一段去修它,这个动作叫微调。 尽管如此,流匹配用的迭代次数通常比去噪大幅减少。 而推理时间与步数直接成正比,所以这带来相应的加速。

书在同一句里还提了另一条补救的路,名字叫蒸馏: 拿一个走很多步、效果好的网络当老师,去教一个只走很少步的学生网络, 让学生一步就跳到老师走很多步才到的地方16

还有一个小零件不能漏:在终点处需要留一点最小的噪声。 理由和第 12 章加噪是同一个:样本是离散的,不留一点抖动就保持不了一个连续的分布15

回头看第 11 章那条观察:归一化流的中间层可以长得很任意,因为没人管中间。 流匹配把这个空白变成了手柄——既然中间没人管,那就自己规定一条最省事的路。

12. 澄清一个像是倒退的地方

读到这里会有一个合理的疑问:这不就是退回第 11 章那个「变换分布」了吗?

书自己提了这个疑问,并且回答了17:

乍看之下我们好像大退了一步——又回到变换分布了,而前面讲归一化流时 我们论证过那是个坏主意。但有了分数匹配和去噪的方法论, 我们到达的是一种根本不同、而且更强大的变换分布的方式。

具体不同在哪,书列了两条:

归一化流流匹配
必须保持密度(每层可逆、要算雅可比行列式)摆脱了这个约束
神经 ODE 版训练要从头到尾反传整条链可以单步训练

「单步训练」的意思:随机抽一个时刻,只在那一个时刻上算一次损失,更新一次。 不需要把整条路径走完。这就是第 11 章那个死穴被拆掉的地方。

13. 一个容易漏的机制差别

书特意点了一处从公式上看不出来的差别18:

去噪在去噪步骤的过程中会反复重新加入噪声。 流匹配则相反:只用初始噪声,之后沿着学到的向量场规定的轨迹走。 因此推理时,流匹配的步骤过程中不再加入任何噪声。

这一条的实际后果: 去噪的每一步都带一点新的随机,所以它的轨迹是抖的; 流匹配的随机性全部集中在第一步那份初始噪声上,之后完全确定。 同一份初始噪声,流匹配跑一百次得到同一个结果。

14. 主走查:翼型 RANS 上的同台对决

主走查第 1 步(任务为什么选它): 翼型周围的 RANS 仿真。 选它的理由很实在:这类求解器在较大的雷诺数下,会从一个稳态的解 转变成振荡的解——这个转变正是要交给这两个方法学的东西19好处是可以可靠地生成任意多的真值数据,所以「分布学得多好」能被量出来。

先把这句话里的物理讲清楚,不然后面每个数字都读不懂: 雷诺数小的时候,气流绕过翼型之后是稳定的,拍下来一直是同一张图; 雷诺数大到一定程度,尾流开始来回摆动,每一时刻拍到的都不一样。 「同一个输入对应一整族解」这件事,在这里是物理上真实发生的,不是人造的。

主走查第 2 步(数据): 125 个训练 case,每个场的大小 32 × 3220

主走查第 3 步(两边用同一个网络): 同一个 U-Net,1,185,218 个参数21参照物:第 10 章那个混合求解器的网络只有 47,330 个参数,这个大二十五倍; 第 05 章那个翼型监督网络是 585,027 个,这个大两倍。

主走查第 4 步(去噪那边的训练一步): 抽一个 case → 抽一个扩散时刻 → 抽一份噪声 → 按调度混起来 → 让网络猜那份噪声。 噪声调度那串系数用的是余弦形式(拿余弦函数决定每一步该加多少噪声), 偏移量 s 的选法是让 β 的标准差 小于一张典型 RGB 图像 1/256 的颜色步长22

主走查第 5 步(流匹配那边的训练一步): 抽一个 case → 抽一个随机时刻直接算出这一点朝终点的直线速度 → 让网络猜这个速度。 书自己说这比去噪那边还简单:根本不需要噪声调度23

主走查第 6 步(训练,两边完全公平): 10,000 轮 × 每轮 5 个批 = 50,000 次迭代,批大小 25 (批大小就是每次更新参数时一起看多少个样本),AdamW,学习率 1e-4。 去噪 30 分 40 秒,流匹配 30 分 44 秒21两边训练耗时几乎一模一样——差别全在推理那一头。 ⚠️ 两边最终的训练损失(0.00100 对 0.00430)不能直接比,因为它们的目标不是同一件事。

主走查第 7 步(推理:同一个 case 各采 100 个样本): 流匹配分别用 1、5、20、100 步;去噪用 200 步。 拿这 100 个样本算逐点的均值场和标准差场,和真值比24

主走查第 8 步(结果一:均值容易): 书的结论是—— 所有方法的均值都相对容易对上,对应的场变化不大, 连 1 步的流匹配也基本能对(带一点噪声)24

主走查第 9 步(结果二:标准差才是分水岭): 1 步的流匹配在这里彻底失败;而 20 步的版本已经做得很好。 20 步只用了去噪 200 步的十分之一,书说它「实际上快 10 倍,而这里精度是可比的」24

主走查第 10 步(六个雷诺数上的定量,以及耗时): 测试集有 6 个不同的雷诺数,中间 4 个落在训练参数的内插区,首尾两个是外推; 定量时每个 case 采 500 个样本25跑完 6 个 case 的耗时:流匹配 1 步 1 秒 / 5 步 6 秒 / 20 步 25 秒 / 100 步 2 分 9 秒; 去噪 200 步 3 分 40 秒26结论:那个单个 case 不是运气——1 步不行,5 步和 20 步已经很好,大体和 200 步的去噪打平。

15. 外推区的诚实观察

书在这里给了一处很坦白的观察,而且它的方向和直觉相反27:

  • 首尾那两个外推的点也处理得相当好;
  • 低雷诺数那一侧,网络高估了方差—— 原因是训练数据里其实没有真正静止的情形;
  • 而看起来更难的高雷诺数那一侧,处理得非常好。

读法: 外推失败与否,不取决于「离训练区多远」, 取决于「外推的方向上有没有一种训练时没见过的定性行为」。 低雷诺数那一侧多出来的是「完全不摆动」这个新行为,所以那边错了; 高雷诺数那一侧只是摆得更厉害,是同一种行为的延续,所以那边没事。

16. 一处记号的坑:这一章的 x 和 y 是反的

⚠️ 书用一个专门的框警告了这件事,而它极容易读岔28:

这一章偏离了「从观测反推输入」那个视角。为简单起见, 去噪和流匹配在这里被用在了一个正问题上: 不是给定观测 y 去恢复 x,而是有初始条件 x、要算出解 y。 所以 x 和 y 的角色和前一章是反的。

为什么它值得单列:第 11 章花了整整三节立「后验」这个目标(给观测反推输入), 而这一章的实验做的是相反方向的事。 如果不知道这一点,你会以为「翼型形状」是要被反推的那个东西——它不是,它是输入。

我们的处理:这一章正文里一律说「输入」和「解」,不用 x、y 这两个记号。

17. 主走查合起来看

发生了什么具体的数
1任务翼型 RANS,大雷诺数下从稳态解转成振荡解
2数据125 个训练 case,场 32 × 32
3网络同一个 U-Net,1,185,218 个参数(比第 10 章那个大二十五倍)
4去噪的训练一步抽 case → 抽时刻 → 抽噪声 → 按余弦 β 调度混 → 猜噪声
5流匹配的训练一步抽 case → 抽时刻 → 算朝终点的直线速度 → 猜速度(不要调度)
6训练50,000 次迭代;30 分 40 秒 对 30 分 44 秒
7推理各采 100 个样本;流匹配 1 / 5 / 20 / 100 步,去噪 200 步
8均值场都对,连 1 步流匹配也基本对(带点噪声)
9标准差场1 步彻底失败;20 步已经很好,和 200 步去噪可比 → 快 10 倍
10六个雷诺数耗时FM 1 秒 / 6 秒 / 25 秒 / 2 分 9 秒;去噪 200 步 3 分 40 秒
11外推低雷诺数一侧高估方差(训练里没有静止的情形);高雷诺数一侧很好

每个数都是书里那次运行的真实输出(逐条见脚注); 「大二十五倍」这个比值是我们算的。

18. 作者的判断与证据

书里给了证据的:

说法证据
20 步流匹配 ≈ 200 步去噪,快 10 倍六个雷诺数上的标准差对照,外加两组耗时2426
均值容易、标准差难1 步流匹配的均值基本对、标准差彻底失败24
两种训练成本几乎一样30 分 40 秒 对 30 分 44 秒,同一个网络、同样迭代数21
高雷诺数外推处理得好、低雷诺数高估方差六个点的定量图,外加书自己的归因27

作者的判断:

说法为什么算判断
「这个极其简单的平方误差损失才是突破的真正原因」一句归因,没有消融5
「直的、不相交的路径是个极好的选择」这一章没有做「换一种路径形状」的对照15
「去噪、流匹配和其他变体比推导上看起来相似得多」转述领域后来的认识,书没有给出处29
低雷诺数高估方差是因为「训练数据里没见过静态的情形」合理的归因,但书没有补一批静态数据去验27

判断(我们的,不是书里的): 这一章最该被带走的数不是「快 10 倍」, 是「1 步流匹配的均值对、标准差全错」这一对结果。 它给了一条可以拿去用的检查法:当你怀疑一个概率模型只是学了个均值时, 别看均值,直接看它给出的标准差场。 均值是所有方法都能拿到的及格线, 标准差才是「它到底有没有学到分布」的分水岭。 如果错,会错在: 如果你的任务里真值的方差本来就很小、或者空间上很均匀, 那么标准差这个指标区分不出好坏,得换别的量(第 16 章会给一个)。 判据是:真值的标准差场,在空间上有没有明显的结构? 没有,这个检查法就失效。

19. 边界与局限

  • 对决只跑了一个任务。 翼型 RANS、32×32、125 个训练 case—— 书没有在别的物理任务上重复这场对决;
  • 训练损失不可比,书说了;但书也没有给一个可比的训练期指标, 两边的训练质量只能靠最终采样结果反推;
  • 步数只试了 1、5、20、100 和 200 这五档。 2 步、3 步在哪儿断,书没有给;
  • 流匹配的积分方法用的是最朴素的欧拉步,书自己说更好的积分器值得试,但没有试26;
  • 「路径规定成直线」没有对照。 换成别的形状会差多少,全书没有实验;
  • 去噪那边的余弦调度也没有对照,和线性调度比会怎样书没做;
  • 这一章完全没有物理约束。 网络学的只是数据里的统计, 仿真器一次都没有进入训练或推理——这正是第 14 章要补的洞;
  • 1,185,218 这个规模在流体问题里不算大。 更大的网络会不会让 1 步流匹配也行,书没试。

20. 可带走的

  1. 扩散时间轴是把第 12 章那串离散档位取极限得到的: 一头纯噪声、一头干净样本; 它和物理时间毫无关系;
  2. 前向加噪不用学,而且可以一步跳到任意时刻——因为多份高斯叠加还是高斯;
  3. 让整件事成立的小动作是换预测目标:预测噪声,不预测信号。 减掉噪声一样得到信号,而损失塌缩成一行平方误差;
  4. 训练四行:抽样本、抽时刻、抽噪声、按比例混,然后猜那份噪声;
  5. 代价全在推理:必须串行调用网络上百次。 哪怕只用 10 步也比确定性网络慢 10 倍;
  6. 换来的是可以量的东西: 数据里两成往左旋、八成往右旋, 网络会按这个比例把两种都生成出来;
  7. 网络本身仍然是确定性的。 变的是那份初始噪声,不是网络;
  8. 流匹配 = 去掉朗之万更新里的随机项。 剩下那一项本身就是速度, 于是问题从「猜噪声」变成「学一个速度场」;
  9. 它的全部卖点是「路径由我们规定」,而最好的规定是直线—— 直线意味着理论上一个欧拉步就到;现实中不完美,但迭代次数大幅减少;
  10. 推理时间和步数直接成正比,所以少走几步就是真的快;
  11. 一处机制差别:去噪每一步都重新加噪,流匹配只用初始噪声、之后不再加;
  12. 同一个网络、同样迭代数,两者训练耗时几乎一样(30:40 对 30:44)。 差别在推理:20 步对 200 步;
  13. 均值容易,标准差才是分水岭。 1 步流匹配的均值基本对,标准差彻底失败;
  14. 外推的成败取决于方向上有没有新的定性行为,不取决于离训练区多远。

21. 原文地图

主题原书章原文位置
把退火拉成连续时间轴、前向与反向24 Denoisingtext/12-p221-240.txt:553(搜「treat the annealing steps as a continuous time dimension」) · text/12-p221-240.txt:562(搜「represents the」)
一步跳到任意时刻24 同上text/12-p221-240.txt:571(搜「analytic form for every step」)
变分下界与那三项24.1text/12-p221-240.txt:610(搜「is key」)
预测噪声而不是预测信号24.1 同上text/12-p221-240.txt:620(搜「predicting the noise」) · text/12-p221-240.txt:637(搜「provides a sub-optimal」)
「极其简单的 L2 才是突破的真正原因」24.2 Full Denoising Algorithmtext/12-p221-240.txt:647(搜「break-through success」)
训练与推理伪代码24.2 同上text/12-p221-240.txt:663(搜「repeat until converged」) · text/12-p221-240.txt:689(搜「for 」)
T=1000、降一个数量级也要 100 次24.2 同上text/12-p221-240.txt:698(搜「sequentially evaluate」)
20% 左旋 / 80% 右旋那一段24.2 同上text/12-p221-240.txt:704(搜「20% solutions that spin left」)
三条待办24.2、24.3text/12-p221-240.txt:713(搜「Faster inference speed」) · text/13-p241-260.txt:156(搜「Faster inference speed」)
加噪 200 步后两峰消失24.3 Training with DDPMtext/12-p221-240.txt:831(搜「start to disappear after ca」)
高斯混合上的训练日志24.3 同上text/13-p241-260.txt:17(搜「Loss: 0.1529」) · text/13-p241-260.txt:29(搜「Loss: 0.0592」)
「10 步也慢 10 倍」24.3 同上text/13-p241-260.txt:163(搜「neural function evaluations」)
分数就可以读作速度25.1 Learning Flows with Velocitiestext/13-p241-260.txt:182(搜「readily be interpreted as a velocity」)
条件版目标才可解25.1 同上text/13-p241-260.txt:217(搜「This version is tractable」)
「最简单的可能性:直的、不相交的路径」25.2 Mappings and Conditioningtext/13-p241-260.txt:225(搜「simplest possibility」) · text/13-p241-260.txt:227(搜「minimal amount of noise」)
「一个欧拉步就能算出来」25.2 同上text/13-p241-260.txt:246(搜「single Euler step」)
澄清「不是退回归一化流」25.2 同上text/13-p241-260.txt:238(搜「huge step back」)
流匹配的训练更简单、日志25.3 Implementing Flow Matchingtext/13-p241-260.txt:294(搜「even simpler than for the denoising task」) · text/13-p241-260.txt:383(搜「Loss: 2.8302」)
默认 100 步、比去噪少一个数量级25.3.2text/13-p241-260.txt:419(搜「order of magnitude less」)
「比推导上看起来相似得多」25.4 Summarytext/13-p241-260.txt:536(搜「more similar than one would think」)
为什么选 RANS 翼型26 Denoising and Flow Matching Side-by-Sidetext/13-p241-260.txt:549(搜「transition from steady solutions to oscillating ones」)
⚠️ 记号的坑:做的是正问题26 同上的 Note 框text/13-p241-260.txt:556(搜「deviate」)
125 个训练 case26.3text/13-p241-260.txt:642(搜「Loading data」)
余弦 β 调度与那个偏移量26.4 Denoising with Diffusion Modelstext/13-p241-260.txt:707(搜「cosine」)
网络参数量与去噪训练耗时26.6text/13-p241-260.txt:815(搜「1185218 trainable parameters」) · text/13-p241-260.txt:830(搜「30:40」)
流匹配训练耗时26.7text/14-p261-280.txt:37(搜「30:44」)
去噪反复加噪、流匹配不加26.8 Test Evaluationtext/14-p261-280.txt:103(搜「key difference between denoising and flow matching」)
均值容易、标准差难、快 10 倍26.8 同上text/14-p261-280.txt:232(搜「the mean is relatively easy to get right」) · text/14-p261-280.txt:235(搜「completely fails here」)
六个雷诺数、内插与外推26.9 Quantified Resultstext/14-p261-280.txt:243(搜「six different Reynolds numbers」)
各档推理耗时26.9 同上text/14-p261-280.txt:274(搜「4.35it/s」) · text/14-p261-280.txt:282(搜「36.68s/it」)
外推区的观察26.9 同上text/14-p261-280.txt:296(搜「was not an outlier」)

Footnotes

  1. 出处:第 24 章开头(p.223)第 553 段 (text/12-p221-240.txt:553,搜「treat the annealing steps as a continuous time dimension」) 与第 562 段(text/12-p221-240.txt:562,搜「represents the」)。 原文明说前面那个朗之万动力学代表的是反向过程,而前向过程用 β 这个标准差函数描述。 2 3

  2. 出处:第 24 章(p.223)第 571 段 (text/12-p221-240.txt:571,搜「analytic form for every step」)。 训练时可以事先算好并查表这一点见第 675 段 (text/12-p221-240.txt:675,搜「precomputed for a chosen number of」)。

  3. 出处:第 24.1 节(p.224)第 610 段(text/12-p221-240.txt:610,搜「is key」)。 书完整推了从证据下界到三项分解的过程:第一项不依赖参数可以扔掉, 末项容易训,中间那一项是关键。

  4. 出处:第 24.1 节(p.224)第 620 段(text/12-p221-240.txt:620,搜「predicting the noise」) 与第 637 段(text/12-p221-240.txt:637,搜「provides a sub-optimal」)。 补充(不在书里,依据我们的 ai-book-reference 书架): 依据: shelf=ai-book-reference/nndl-2e#38-diffusion-and-flow.md 事实=预测原始信号、预测噪声、预测分数、预测速度这四种目标数学上等价,差别在数值性质与适配。 这条解释了为什么「换一个预测目标」不改变要学的东西,只改变好不好学。 2

  5. 出处:第 24.2 节(p.225)第 647 段(text/12-p221-240.txt:647,搜「break-through success」)。 原文还点了对抗生成那一套要在两个网络的脆弱平衡里训练,而这里只需要一个完全监督的损失。 2

  6. 出处:第 24.2 节(p.225–226)第 663 段(text/12-p221-240.txt:663,搜「repeat until converged」) 与第 689 段(text/12-p221-240.txt:689,搜「for 」)。 书把它们写成 Algorithm 1(训练)和 Algorithm 2(推理)两个框。 2

  7. 出处:第 24.2 节(p.226)第 698 段(text/12-p221-240.txt:698,搜「sequentially evaluate」) 与第 704 段(text/12-p221-240.txt:704,搜「20% solutions that spin left」)。 「20% 左旋 / 80% 右旋」是书自己举的例子,数字是它给的。 2

  8. 出处:第 24.3 节(p.234)第 163 段 (text/13-p241-260.txt:163,搜「neural function evaluations」)。 原文把这些调用叫作 neural function evaluations(NFE), 并在同一段末尾提出了那个问题:怎么在不损害后验精度的前提下让推理更快。 2

  9. 出处:第 24.3.1 节(p.230)第 831 段 (text/12-p221-240.txt:831,搜「start to disappear after ca」)。 前向过程的总步数是 1000(text/12-p221-240.txt:829,搜「num_timesteps=1000」)。

  10. 出处:第 24.3 节(p.232)第 17 段(text/13-p241-260.txt:17,搜「Loss: 0.1529」) 与第 29 段(text/13-p241-260.txt:29,搜「Loss: 0.0592」)。 书的日志中间用省略号跳过了第 11 到 89 轮。

  11. 出处:第 24.3 节(p.233)第 152 段 (text/13-p241-260.txt:152,搜「accurate capture the two peaks」)。

  12. 出处:第 24.2 节(p.226)第 713 段(text/12-p221-240.txt:713,搜「Faster inference speed」) 与第 24.3 节(p.233)第 156 段(text/13-p241-260.txt:156,搜「Faster inference speed」)。 书把同样三条列了两遍,措辞一致。

  13. 出处:第 25.1 节 Learning Flows with Velocities(p.235)第 182 段 (text/13-p241-260.txt:182,搜「readily be interpreted as a velocity」) 与第 198 段(text/13-p241-260.txt:198,搜「continuity equation」)。 2

  14. 出处:第 25.1 节(p.235–236)第 206 段(text/13-p241-260.txt:206,搜「apply a trick」) 与第 217 段(text/13-p241-260.txt:217,搜「This version is tractable」)。 「问『如果知道终点在哪该往哪走』」这个读法是我们补的 (补充,不在书里,来自通用知识);书给的是那个条件期望的式子。

  15. 出处:第 25.2 节 Mappings and Conditioning(p.236)第 225 段 (text/13-p241-260.txt:225,搜「simplest possibility」) 与第 227 段(text/13-p241-260.txt:227,搜「minimal amount of noise」)。 书还说这条运输路径恰好和两个高斯分布之间的最优传输重合。 2 3

  16. 出处:第 25.2 节(p.236)第 246 段(text/13-p241-260.txt:246,搜「single Euler step」) 与第 248 段(text/13-p241-260.txt:248,搜「perfectly straight」)。 「欧拉步就是拿当前速度乘时间长度加到位置上」这个解释是我们补的 (补充,不在书里,来自通用知识)。 2 3

  17. 出处:第 25.2 节(p.236)第 238 段(text/13-p241-260.txt:238,搜「huge step back」)。

  18. 出处:第 26.8 节 Test Evaluation(p.253)第 103 段 (text/14-p261-280.txt:103,搜「key difference between denoising and flow matching」)。 原文说这一点从前面的公式上并不明显。

  19. 出处:第 26 章开头(p.243)第 549 段 (text/13-p241-260.txt:549,搜「transition from steady solutions to oscillating ones」)。 「雷诺数小的时候尾流稳定、大了之后来回摆」这个解释是我们补的 (补充,不在书里,来自通用知识);第 05 章已经讲过雷诺数是什么。

  20. 出处:第 26.3 节(p.245)第 642 段(text/13-p241-260.txt:642,搜「Loading data」) 与第 638 段(text/13-p241-260.txt:638,搜「data_size=32」)。

  21. 出处:第 26.6 节(p.250)第 815 段(text/13-p241-260.txt:815,搜「1185218 trainable parameters」)、 第 830 段(text/13-p241-260.txt:830,搜「30:40」) 与第 26.7 节(p.251)第 37 段(text/14-p261-280.txt:37,搜「30:44」)。 两次运行的训练配置逐项相同:10,000 轮、每轮 5 批、批大小 25、AdamW、学习率 1e-4。 最终训练损失是 0.00100(去噪)和 0.00430(流匹配),但两者目标不同,不可直接比较。 2 3

  22. 出处:第 26.4 节(p.247)第 707 段(text/13-p241-260.txt:707,搜「cosine」)。 补充(不在书里,依据我们的 ai-book-reference 书架): 依据: shelf=ai-book-reference/deep-learning-crash-course#12-diffusion.md 事实=最初的 DDPM 论文用的是线性噪声调度,β 从 0.0001 线性爬到 0.02。 书这里换成了余弦形式,但没有说明为什么换、也没有和线性调度做对照。

  23. 出处:第 25.3 节(p.237)第 294 段 (text/13-p241-260.txt:294,搜「even simpler than for the denoising task」)。 原文:不需要噪声调度,只要选一个随机时刻、算出直线速度即可。

  24. 出处:第 26.8 节(p.254)第 232 段 (text/14-p261-280.txt:232,搜「the mean is relatively easy to get right」) 与第 235 段(text/14-p261-280.txt:235,搜「completely fails here」)。 原文那句结论是:20 步的流匹配只用了去噪版本十分之一的步数, 「实际上快 10 倍,而这里精度是可比的」。 2 3 4 5

  25. 出处:第 26.9 节 Quantified Results(p.255)第 243 段 (text/14-p261-280.txt:243,搜「six different Reynolds numbers」) 与第 268 段(text/14-p261-280.txt:268,搜「num_」)。 定量评估时每个 case 采 500 个样本;前面那次可视化用的是 100 个。

  26. 出处:第 26.9 节(p.255–256)第 274 段(text/14-p261-280.txt:274,搜「4.35it/s」) 与第 282 段(text/14-p261-280.txt:282,搜「36.68s/it」)。 进度条依次是 6 个 case 用 00:01 / 00:06 / 00:25 / 02:09(流匹配 1/5/20/100 步) 与 03:40(去噪 200 步)。 书在同一节说积分用的是最朴素的欧拉步,更高级的积分器「当然值得一试」 (text/14-p261-280.txt:100,搜「More advanced ODE integration」)。 2 3

  27. 出处:第 26.9 节(p.256)第 296 段(text/14-p261-280.txt:296,搜「was not an outlier」) 与第 298 段(text/14-p261-280.txt:298,搜「over-estimate the variance」)。 「外推成败取决于方向上有没有新的定性行为」这个读法是我们的归纳,不是书里的话。 2 3

  28. 出处:第 26 章开头的 Note 框(p.243)第 556 段 (text/13-p241-260.txt:556,搜「deviate」)。 原文原话是这一章「偏离了基于仿真的推断那个视角」,为简单起见把两种方法用在了正问题上。

  29. 出处:第 25.4 节 Summary(p.242)第 536 段 (text/13-p241-260.txt:536,搜「more similar than one would think」)。 原文接着说:尽管如此,通过各自的视角去理解它们,比从一个更通用的数学框架去理解要容易。