跳到主要内容

分数:只学「往哪个方向概率更大」

1. 这一章讲什么

三件事: 一个换掉「学什么」的主意——不学每一点有多可能,只学每一点上那个箭头; 这个箭头怎么从数据里学出来(答案出奇地简单,而且它的训练日志会骗你); 以及有了箭头之后怎么产生样本(沿箭头走一步、随机抖一下,反复)。

它在全书链条里的位置:这是第二把刀的第三级台阶,也是全书唯一一次「换目标」而不是「换架构」。 第 11 章走的两级——归一化流、神经 ODE——换的都是网络长什么样; 而它们共同的死穴出在训练目标上:非要「算得出可能性」不可。 这一章把那个要求整个扔掉。

2. 顶层全景

第 11 章的做法 这一章的做法

学「这一点有多可能」 学「这一点该往哪个方向走」
┌──────────────────┐ ┌──────────────────┐
│ 必须保证总和 = 1 │ │ 只看这一点附近 │
│ 所以每一层必须可逆 │ │ 总和是多少不关我事 │
│ 所以训练要整条回溯 │ │ 所以架构随便挑 │
└──────────────────┘ └──────────────────┘
│ │
▼ ▼
扩不到高维 怎么拿到真值箭头?

给样本加一点噪声,把孤立的点
摊成一个能求导的连续密度

目标简单到一行:−噪声 / σ²

┌──────────────┴──────────────┐
▼ ▼
怎么用箭头采样? σ 该取多大?
沿箭头走一步 + 随机抖一下 太小没箭头、太大糊
(朗之万动力学) → 从大到小退火

这张图在讲什么: 左边那一列是第 11 章留下的三连锁—— 「要算可能性」逼出「必须可逆」,「必须可逆」逼出「训练要整条回溯」。 这一章砍掉最上面那一环,下面两环自己就掉了。

3. 分数:那个箭头到底是什么

结论先行:这一章的全部主意,是把「高度」换成「坡度」。

先看要解决的那件具体的事。 第 11 章那个训练目标要求你回答: 「这个样本有多可能?」 而要把这个数答对,你得保证整张图上所有可能性加起来正好是 1 ——这就是归一化流必须每层可逆的原因,也是它扩不到高维的病根1

换个角度想:一张图上的每一点,除了「有多高」,还有一个别的信息——「往哪边走会更高」。

在每一点上,「概率往哪个方向变大、变得多快」的那个箭头,书管它叫分数(score)。 说得精确一点:它是对数似然函数的梯度。

「对数似然」在这里就是「这一点的可能性取对数」; 「梯度」就是「往哪个方向增长最快、增长率是多少」的那个箭头。 所以分数 = 可能性这张图的坡度场。

它值钱在哪?书说了一句最关键的话1:

有了它,我们再也不用操心归一化了。

理由摊开来讲很直白: 要算「有多高」,你得知道整张图的总量是多少——那是一个全局的量; 而要算「往哪边更高」,你只需要知道这一点附近的情况——那是一个局部的量。 书的原话是:分数只依赖局部信息,这让神经网络学起来容易得多2

书还把「为什么学高度那么难」讲了一遍,值得记住这条对照2:

学什么要付什么代价
高度(可能性)要把单个样本的密度弄对,它必须在「整张图积分仍为 1」的意义上被归一化
坡度(分数)只看这一点的导数,别处是多少与它无关

归一化流靠构造方式总能满足前者,但它扩不上去; 而对一般的、灵活的做法来说,保证「积分等于 1」极其困难。 这就是这一章存在的全部理由。

4. 怎么学:真值箭头拿不到,那就加噪声

结论先行:直接学的路是通的,但它需要一样我们没有的东西。

最直接的想法:拿真值箭头和网络给出的箭头做平方误差。 这个量在这里有个名字,叫 Fisher 散度3

卡住的地方是:真值箭头拿不到。 我们手上只有一堆样本点,而不是一张连续的可能性图—— 孤立的点上没有「坡度」这回事。

机器学习里定下来的破解办法只有一句话3:

给数据集加一点高斯噪声。 这把它从一堆逐点的样本,变成了一个我们能求梯度的连续函数。

为什么加噪能变出坡度: 一个孤立的点是一根无限细的针,针上没有坡; 给它加一点随机抖动,等于把这根针摊成一个小土包,土包就有坡了。 每个样本都摊一下,合起来就是一张连绵的地形——这张地形处处可以求坡度。

这个做法有个名字:去噪分数匹配。 噪声的大小用 σ 表示,这一节先把它固定住,后面第 8 节再回来算它的账。

然后是这一章最漂亮的一步。 因为加的是高斯噪声,加噪之后那张地形的坡度有解析形式,而书说它出奇地简单4:

坡度 = 负的那份噪声,除以 σ²。

读法:你刚才往这个样本上加了多少噪声,把它取负、再除以 σ², 那就是网络该学的目标——你自己造的噪声,就是标准答案。

所以训练一步是这样的:抽一个真样本 → 抽一份噪声加上去 → 让网络看着这个加了噪的点,去猜「负的噪声除以 σ²」。

5. 走查:同一个高斯混合,先把箭头学出来

主走查第 1 步(靶子): 和第 11 章完全同一个二维高斯混合—— 峰 A 中心 (0, 0)、标准差 1;峰 B 中心 (3, 2)、标准差 0.5。 书这一次多做了一件事:它给这个靶子写了一个解析的分数函数, 这样学出来的箭头可以和真值箭头并排比5

为什么书要沿用同一个靶子:因为换法要对比,靶子不能换。 第 11 章在它上面走了归一化流和神经 ODE,这一章走分数与朗之万, 第 13 章还要在它上面走去噪扩散。同一张地形,三种打法。

主走查第 2 步(网络): 四层的全连接网络,中间宽度 128,激活函数是 SiLU; 输入是一个二维的点,输出是一个二维的箭头6参照物:第 11 章那个归一化流有 6 个耦合层、每层内部宽度 256—— 这里的网络更小,而且不需要任何可逆结构。

主走查第 3 步(数据): 从靶子里抽 10,000 个点,σ 固定为 0.1; 每取一个样本就现场抽一份噪声加上去,把「加噪的点」和「那份噪声」一起交给训练6

主走查第 4 步(训练): 100 轮。 日志:第 10 轮 192.8589,第 100 轮 197.7943,中间一直在 191 到 199 之间上下震荡7

⚠️ 这个日志看起来像训练完全失败,而书没有解释它。我们点破——分三步,每一步都能自己按计算器核。

第一步,标准答案有多大。 加上去的那份噪声,每个分量的典型大小就是 σ 本身,也就是 0.1; 目标是「负的噪声除以 σ²」,所以目标每个分量的典型大小是 0.1 ÷ 0.01 = 10, 也就是 1/σ。(不是 100 —— 除以 σ² 的同时,分子上那份噪声自己也只有 σ 那么大。)

第二步,损失是怎么算的。 代码把一个点的两个分量的平方误差加起来,再对一批取平均8于是一个什么都不预测、一律输出零的网络,损失正好是 2 × 10² = 2/σ² = 200。

第三步,对上了。 日志停在 192~198,离那个 200 只差百分之二三。 所以这个数不是「没训好」,它是这个目标定义下的天然量级。 反过来说也成立:目标里真正可预测的只有它的平均值(就是那张真值箭头场), 剩下的部分——你自己刚抽的是哪一份噪声——看着加噪后的点是猜不出来的; 猜不出来的那部分原样留在损失里,把 200 撑住了。

那怎么判断学得好不好?书用的办法是画图: 把网络给出的箭头场和真值箭头场并排放在一起看9这是一条实用经验:目标量级奇怪的时候,损失曲线不可读,只能看输出本身。

判断(我们的,不是书里的): 这里其实有一个更简单的修法,书没有做—— 把目标乘上 σ,也就是让网络去猜那份「不带 σ 的、大小就是 1 的噪声」 (扩散那一路管它叫 ε)。这样目标每个分量的量级从 1/σ 变成 1, 零预测的损失从 2/σ² 变成 2,曲线立刻可读这正是第 13 章那个去噪做法在干的事:它猜的是噪声本身,不是噪声除以 σ²。 所以「去噪」除了推导上的好处,还顺手治好了这个日志不可读的毛病。 如果错,会错在: 乘 σ 等于把各档噪声的损失权重拉平了 (原来最小的那一档在总损失里占的份额最大,见第 8 节), 万一退火恰恰需要那种偏心,这个修法就不是免费的。判据是: 两种写法训出来的箭头场,在同一批测试点上差多少? 书没有做这个对照。

6. 有了箭头怎么产生样本:朗之万动力学

结论先行:采样算法只有一行,而且它的两项各有各的用处。

先说它从哪儿来:书说这套东西传统上用在分子系统上—— 那种既有确定性的力、又有随机扰动的系统10

更新式一句话:

下一个位置 = 当前位置 + ε × 这一点的箭头 + √(2ε) × 一份随机噪声。

两项各管一件事:

作用去掉它会怎样
沿箭头走一步把点往概率高的地方领点不动,永远停在起点
加一点随机让点不至于全部挤到峰顶所有点都塌到峰的最高点上,得不到一个分布

书给的理论保证是:在一组正则性条件下,步数趋于无穷、步长趋于零时, 迭代出来的点收敛为目标分布的一个样本10

主走查第 5 步(起点的选法,这一步是书的教学设计): 不从随机噪声出发,而是从一张稠密的规则网格出发—— 在 −5 到 5 之间均匀取 35 个数,横竖交叉,得到 35 × 35 = 1,225 个起点11这样能看清:域内各处的点,分别会不会、以及怎样朝密度高的地方移动。

主走查第 6 步(跑): 步长 0.01,跑 501 步, 在第 0、100、200、300、400、500 步各存一帧11

主走查第 7 步(结果): 规则排布的点正确地移向了高密度区。 右侧那些点主要落进右边那个密度高的簇; 其他方位的点落进中间那个密度较低的峰12

这一步为什么值得看:它是「分布」这件事第一次被看见。 1,225 个起点没有全部跑到同一个地方去,而是按两个峰的分量分开了。 第 01 章那个「两支都要拿到」的要求,到这里有了一个可以画出来的答案。

7. σ 的两难

结论先行:上一节那个方法有一个参数,它往两边都不能调。

书把这个两难写得很直白13:

这个方法需要相当大的噪声 σ,才能保证箭头真的把样本「领」向正确的目标。 σ 太小,我们就没有箭头;σ 太大,重叠的高斯会降低数据样本的质量 ——把重要的细节淹没在噪声里。

为什么小 σ 会「没有箭头」: 回到第 4 节那个比方—— σ 小,每根针只摊成一个很窄的小包;包与包之间的空地上仍然是平的,坡度是零。 你的起点要是落在空地上,箭头就不告诉你往哪走。

书接着说了一段更要紧的话,它解释了为什么「大 σ」不只是个精度问题13:

噪声越大,被扰动过的数据覆盖的区域就越大,这样无论我们从哪儿出发都有箭头。 这一点在实践中很重要:我们不该为了给迭代找一个好的初始点而做一大堆假设, 那只是把「生成输出」的问题挪成了「生成合适的输入」的问题。 这就是为什么许多经典工作需要仔细规定先验分布来保证算法收敛。

这句话的分量:它把 σ 从一个调参问题,提升成了一个「这套方法能不能自立」的问题。 如果必须从一个精心挑选的起点出发才能收敛,那你就没有真正解决问题,只是把它推给了别人。

8. 退火:那为什么非得只用一个 σ

结论先行:两难解不开,那就别在一个 σ 上解。

书的问法就是答案14:为什么我们要被限制在单一的 σ 上?

做法:取一串从大到小的噪声尺度,先用最大的那个跑一段,再换小一档,一路降到最小。 这个做法叫退火朗之万动力学。

配套要改一件事:网络得知道自己现在处在哪一档。 所以把噪声尺度当成网络的一个额外输入喂进去—— 同一个网络,给它不同的 σ,它给出不同尺度下的箭头场14

主走查第 8 步(退火的档位): 六档,σ = [4.0, 2.0, 1.0, 0.5, 0.2, 0.01], 每档跑 150 步15⚠️ 起点这次铺得更开:在 −10 到 10 之间取 35 个数交叉,还是 1,225 个起点。

主走查第 9 步(步长跟着 σ 走,这是一处容易看漏的细节): 代码里每一档的实际步长是 1e-5 ×(当前 σ ÷ 0.01)²15算出来:σ = 4.0 那一档,步长是 1.6;σ = 0.01 那一档,步长是 1e-5。 也就是说,第一档一步走的距离是最后一档的十六万倍。 粗档大步跑到位置对的地方,细档小步磨形状——这就是「退火」两个字的具体动作。

主走查第 10 步(结果): 书给的描述是—— 从一个变化非常平滑的箭头场出发(等高线很宽),一路走向目标分布尖锐的峰。 书的结论:退火成功地免掉了「手工规定扰动量」的需要16

⚠️ 这一次的训练日志同样不可读:在 3300 上下震荡17原因和第 5 节一样,只是更极端。 照第 5 节那把尺子逐档算一遍 (目标量级 1/σ,零预测的损失 2/σ²):

σ4.02.01.00.50.20.01
这一档的损失量级 2/σ²0.1250.5285020,000

六档在数据集里是等量混着抽的,所以平均下来是 (0.125+0.5+2+8+50+20000) ÷ 6 ≈ 3343 —— 日志上那个 3300,就是它。 最小那一档一个人贡献了 99.7%:整条曲线实际上只在反映 σ = 0.01 那一档, 另外五档的进展被完全盖住了。(这张表和这个平均值是我们算的,书里没有18。)

9. 结账:拿到了什么,还欠什么

书自己在这一章末尾列了两张单子,值得原样传达19

已经拿到的:

拿到了什么和上一章比
去噪分数匹配即使对图像这样的高维数据也管用神经 ODE 扩不上去
不需要在很多步之间反传梯度神经 ODE 要把整条积分从头解到尾
有办法采样,而且不需要对先验分布做什么非平凡的假设经典方法要仔细规定先验

还欠着的:

欠什么严重在哪
好的噪声尺度序列怎么定不清楚而它「至关重要」——书自己用的这个词
能采样,但算不了可能性第 11 章那个「方便的」训练目标用不上了
推理要多次求值网络产生一个样本可能很贵

第一条到第 13 章才被治好: 那一章把这串离散的档位换成一条连续的时间轴, 「序列怎么定」的问题就变成了「函数怎么选」。

第三条书自己说「以后再回来算这笔账」—— 而它真正被算清也在第 13 章: 流匹配用 20 步做到去噪 200 步的精度。

10. 主走查合起来看

发生了什么具体的数
1靶子和第 11 章同一个二维高斯混合,外加一个解析的箭头场当参照
2网络四层全连接,宽度 128,SiLU;进一个二维点,出一个二维箭头
3数据10,000 个点,σ = 0.1;目标是「负的噪声 ÷ σ²」
4训练100 轮,日志 192.86 → 197.79 一直震荡——零预测的损失就是 2/σ² = 200,日志本来就该停在这儿
5质检画图并排比学到的箭头场和真值箭头场(损失曲线不可读)
6采样起点−5 到 5 的 35 × 35 = 1,225 个网格点
7采样沿箭头走一步 + 随机抖一下,步长 0.01,跑 501 步
8结果规则网格上的点分别落进两个峰,右侧的点主要进右峰
9退火档位σ = [4.0, 2.0, 1.0, 0.5, 0.2, 0.01],每档 150 步
10退火步长1e-5 ×(σ ÷ 0.01)² → 第一档 1.6,最后一档 1e-5,差十六万倍
11退火结果箭头场从「等高线很宽」走到「峰很尖」,不再需要手工规定扰动量

每个数都是书里那次运行的真实输出(逐条见脚注); 「十六万倍」这个比值,和「损失本来就该停在 2/σ² 上」这套换算(200 与 3343), 是我们算的、书没有写。

11. 作者的判断与证据

书里给了证据的:

说法证据
分数比可能性容易学一段结构性论证:局部信息 vs 全局约束2
加噪之后的目标有解析形式完整推导 + 那一行「负的噪声除以 σ²」4
朗之万能把规则网格上的点领进两个峰六帧轨迹图,外加书自己对结果的描述12
退火免掉了手工规定扰动量沿六档 σ 的可视化16

作者的判断:

说法为什么算判断
「去噪分数匹配即使对图像这样的高维数据也管用」这一章没有跑任何高维例子,全是二维19
「比 CNF 或神经 ODE 可扩展得多」没有给两者在同一任务上的耗时对照19
「好的噪声尺度序列至关重要」没有做「换一组 σ 会差多少」的消融19

判断(我们的,不是书里的): 这一章最该被带走的不是朗之万那个算法 ——它在第 13 章就被换掉了——而是那次目标的替换本身: 「不学状态,学状态的变化方向」是一条可以搬到别处的思路。 它之所以省事,是因为方向是局部量,而绝对值往往带着全局约束。 第 09 章那个「网络只给一个加性修正、不输出完整状态」,是同一条思路在另一处的样子。 如果错,会错在: 如果你的问题里那个全局约束本身就是要点 (比如必须严格守恒的量),那么只学方向会把这个约束丢掉,得另外补回来。 判据是:你丢掉的那个全局量,后面还有人要用吗?

12. 边界与局限

  • 全章只有二维实验。 两个坐标、两个峰——而书对这套方法的最大主张恰恰是「高维也行」;
  • 两次训练的损失都不可读,书没有解释原因,也没有给一个可读的替代指标;
  • σ = 0.1 是怎么选的书没说。 换成 0.05 或者 0.5 会怎样,没有对照;
  • 退火那六档也是给定的,而书自己承认「序列怎么定不清楚」——这一章没有回答这个问题;
  • 步长随 σ 平方缩放这条规则只在代码里,正文没有解释为什么是平方;
  • 朗之万的理论保证要求步数趋于无穷、步长趋于零,而实际跑的是 501 步、步长 0.01 ——理论和实操之间的这段距离书没有量过;
  • 这一章完全没有物理。 靶子是一个人造的二维分布,PDE、求解器一次都没出现。

13. 可带走的

  1. 第 11 章的病根不在架构,在训练目标: 只要还要求「算得出可能性」, 就得保证总和为 1,就得每层可逆,就得整条回溯;
  2. 分数就是「往哪个方向概率更大」的那个箭头,精确地说是对数似然的梯度;
  3. 它省事的唯一原因是局部: 高度是全局量(带归一化约束),坡度是局部量(不带);
  4. 真值箭头拿不到,所以给样本加一点高斯噪声—— 这把一堆孤立的点摊成一张能求坡度的连绵地形;
  5. 加噪之后的学习目标是「负的噪声 ÷ σ²」。 你自己造的噪声就是标准答案;
  6. 这个目标会让损失日志变得不可读: 目标量级是 1/σ, 于是一个什么都不学的网络损失就有 2/σ²(σ=0.1 时正好 200,日志也正停在那儿), 质检只能靠把箭头场画出来比;
  7. 采样算法只有一行:沿箭头走一步 + 随机抖一下,反复。 这叫朗之万动力学;
  8. 那一点随机不是噪声污染,是必需品: 去掉它,所有点会塌到峰顶,得不到分布;
  9. σ 两头都不能调:太小没有箭头,太大淹掉细节;
  10. 而「大 σ 才能到处都有箭头」这一条更要紧—— 否则你必须精心挑起点,等于把问题从「生成输出」挪成了「生成合适的输入」;
  11. 解法是退火:从大 σ 到小 σ 逐级降,并把 σ 当成网络的一个额外输入;
  12. 粗档大步、细档小步。 书的代码里步长按 σ 的平方缩放,首尾两档差十六万倍;
  13. 这一章欠下三笔账: 档位序列怎么定不清楚 · 算不了可能性 · 推理要反复调网络。 第一笔和第三笔第 13 章还。

14. 原文地图

主题原书章原文位置
分数的定义、不用操心归一化23 Score Matchingtext/11-p201-220.txt:719(搜「the so-called score」) · text/11-p201-220.txt:721(搜「worry about normalization」)
为什么分数比可能性容易学23.1 Gaussian Toy Dataset with Analytic Scorestext/11-p201-220.txt:873(搜「estimate the likelihood of a single individual sample」) · text/11-p201-220.txt:882(搜「depends on local information only」)
Fisher 散度、真值梯度拿不到、加噪23.2 Learning the Scoretext/11-p201-220.txt:891(搜「Fisher divergence」) · text/11-p201-220.txt:894(搜「collection of point-wise samples」)
「负的噪声除以 σ²」23.2 同上text/12-p221-240.txt:10(搜「surprisingly simple」) · text/12-p221-240.txt:70(搜「divided by」)
网络与数据集23.2.1text/12-p221-240.txt:35(搜「hidden_dim=128」) · text/12-p221-240.txt:106(搜「sigma=0.1」)
那份不可读的训练日志23.2.2 Trainingtext/12-p221-240.txt:115(搜「Loss: 192.8589」) · text/12-p221-240.txt:124(搜「Loss: 197.7943」)
靠画图质检23.2.3 Compare Learned and Reference Scorestext/12-p221-240.txt:127(搜「qualitatively evaluate」)
朗之万的来历与更新式23.3 Langevin Dynamicstext/12-p221-240.txt:192(搜「molecular systems」)
从规则网格出发23.3.1text/12-p221-240.txt:207(搜「points on a dense regular」) · text/12-p221-240.txt:243(搜「step_size=0.01」)
结果:点分别落进两个峰23.3.2text/12-p221-240.txt:306(搜「correctly move towards the higher density regions」)
σ 的两难、大 σ 为什么重要23.4 Annealed Langevin Dynamicstext/12-p221-240.txt:313(搜「too small」) · text/12-p221-240.txt:318(搜「shift the problem from」)
退火与「σ 当额外输入」23.4 同上text/12-p221-240.txt:323(搜「restricted to a single」) · text/12-p221-240.txt:328(搜「additional input」)
六档 σ、每档 150 步、步长缩放23.4.1–23.4.2text/12-p221-240.txt:418(搜「sigmas = 」) · text/12-p221-240.txt:461(搜「alpha = step_size」) · text/12-p221-240.txt:479(搜「n_steps_each=150」)
退火那份日志23.4.2 同上text/12-p221-240.txt:431(搜「Loss: 3306.6889」)
退火的结果描述23.4.3text/12-p221-240.txt:527(搜「smoothly varying score function」)
结账两张单子23.5 Score Summarytext/12-p221-240.txt:536(搜「high-dimensional data such as images」) · text/12-p221-240.txt:542(搜「unclear to obtain so far」)

Footnotes

  1. 出处:第 23 章开头(p.207)第 719 段(text/11-p201-220.txt:719,搜「the so-called score」) 与第 721 段(text/11-p201-220.txt:721,搜「worry about normalization」)。 原文:积分的时候需要有正确的常数偏移,但对 x 处的「局部」梯度而言, 唯一重要的是这一点的导数。 2

  2. 出处:第 23.1 节(p.209–210)第 873 段 (text/11-p201-220.txt:873,搜「estimate the likelihood of a single individual sample」) 与第 882 段(text/11-p201-220.txt:882,搜「depends on local information only」)。 原文还点明归一化流靠模型和网络的构造方式总能满足积分为 1,但它扩不到高维、算得贵。 2 3

  3. 出处:第 23.2 节 Learning the Score(p.210)第 891 段 (text/11-p201-220.txt:891,搜「Fisher divergence」) 与第 894 段(text/11-p201-220.txt:894,搜「collection of point-wise samples」)。 「一根针摊成一个小土包」这个说法是我们补的解释(补充,不在书里,来自通用知识); 书给的是扰动分布的积分式。 2

  4. 出处:第 23.2 节(p.210–211)第 10 段(text/12-p221-240.txt:10,搜「surprisingly simple」)。 训练时怎么用见第 70 段(text/12-p221-240.txt:70,搜「divided by」), 原文写的是「由数据集里那份扰动(noise)除以 σ²」给出。 补充(不在书里,依据我们的 ai-book-reference 书架): 依据: shelf=ai-book-reference/nndl-2e#38-diffusion-and-flow.md 事实=预测分数和预测噪声只差一个随时刻变化的尺度因子,四种预测目标(原始信号 / 噪声 / 分数 / 速度)数学上等价。 这条解释了第 5 节那个「把目标乘上 σ、改成预测噪声」为什么成立: 两种目标只差一个尺度因子,学的是同一件事,差别只在损失的量级好不好读。 2

  5. 出处:第 23.1 节(p.207–209)第 726 段 (text/11-p201-220.txt:726,搜「re-use the same Gaussian mixture case」)。 书说给基类扩了一个 score() 函数,好检查学到的近似有多准。

  6. 出处:第 23.2.1 节(p.211)第 35 段(text/12-p221-240.txt:35,搜「hidden_dim=128」) 与第 106 段(text/12-p221-240.txt:106,搜「sigma=0.1」)。 正文说这是一个「有四个隐藏层」的简单分数网络 (text/12-p221-240.txt:27,搜「four hidden layers」)。 2

  7. 出处:第 23.2.2 节 Training(p.212)第 115 段(text/12-p221-240.txt:115,搜「Loss: 192.8589」) 与第 124 段(text/12-p221-240.txt:124,搜「Loss: 197.7943」)。 ⚠️ 书没有对这份日志作任何说明,「它本来就该停在 200」是我们的解释。

  8. 出处:损失那一行在第 23.2.2 节第 90 段 (text/12-p221-240.txt:90,搜「pred_score - target_score」), 写的是 torch.mean(torch.sum((pred_score - target_score)**2, dim=1)) —— sum(..., dim=1) 是把一个点的两个分量加起来,mean 是对一批取平均。 噪声怎么抽见第 61 段(text/12-p221-240.txt:61,搜「randn_like」), 写的是 torch.randn_like(x) * self.sigma,所以噪声每个分量的标准差就是 σ。 「2/σ² = 200」这个推算是我们做的,书里没有。

  9. 出处:第 23.2.3 节(p.212)第 127 段 (text/12-p221-240.txt:127,搜「qualitatively evaluate」)。

  10. 出处:第 23.3 节 Langevin Dynamics(p.213)第 192 段 (text/12-p221-240.txt:192,搜「molecular systems」) 与第 200 段(text/12-p221-240.txt:200,搜「regularity conditions」)。 「去掉随机项所有点会塌到峰顶」这句是我们补的(补充,不在书里,来自通用知识); 书只说了收敛性质,没有说去掉噪声会怎样。 2

  11. 出处:第 23.3.1 节(p.213)第 207 段(text/12-p221-240.txt:207,搜「points on a dense regular」) 与第 243 段(text/12-p221-240.txt:243,搜「step_size=0.01」)。 网格是 torch.linspace(-5, 5, 35) 横竖交叉 (text/12-p221-240.txt:217,搜「linspace(-5, 5」);1,225 这个数是我们算的(35×35)。 2

  12. 出处:第 23.3.2 节(p.215–216)第 306 段 (text/12-p221-240.txt:306,搜「correctly move towards the higher density regions」)。 2

  13. 出处:第 23.4 节 Annealed Langevin Dynamics(p.216)第 313 段 (text/12-p221-240.txt:313,搜「too small」) 与第 318 段(text/12-p221-240.txt:318,搜「shift the problem from」)。 原文末尾还有一句权衡:大 σ 对实际应用很重要,但扰动太大时两个分布就不像了, 最坏情况下产生的样本没有用。 2

  14. 出处:第 23.4 节(p.216)第 323 段(text/12-p221-240.txt:323,搜「restricted to a single」) 与第 328 段(text/12-p221-240.txt:328,搜「additional input」)。 书在这里还预告了一句:这也让我们更接近扩散那一块的中心话题 ——不同的、变化着的噪声水平。 2

  15. 出处:第 23.4.2 节(p.218–219)第 418 段(text/12-p221-240.txt:418,搜「sigmas = 」)、 第 461 段(text/12-p221-240.txt:461,搜「alpha = step_size」) 与第 479 段(text/12-p221-240.txt:479,搜「n_steps_each=150」)。 步长那条平方缩放规则只出现在代码里,正文没有解释为什么是平方; 「首尾两档差十六万倍」是我们算的。 2

  16. 出处:第 23.4.3 节(p.221)第 527 段 (text/12-p221-240.txt:527,搜「smoothly varying score function」)。 2

  17. 出处:第 23.4.2 节(p.219)第 431 段(text/12-p221-240.txt:431,搜「Loss: 3306.6889」) 与第 440 段(text/12-p221-240.txt:440,搜「Loss: 3328.9864」)。 ⚠️ 同样没有说明。「被最小那一档主宰」是我们的解释。

  18. 「六档等量混着抽」的依据是数据集那两行:第 368 段 (text/12-p221-240.txt:368,搜「return len(self.samples)」) 把长度乘上了档数,第 372 段(text/12-p221-240.txt:372,搜「sigma_idx = idx %」) 用取余轮流分配档位 —— 每档样本数一样多。 损失那一行与单 σ 时同形(text/12-p221-240.txt:403,搜「pred_score - target_score」)。 那张逐档表、平均值 3343、以及「最小那档占 99.7%」都是我们算的,书里没有。

  19. 出处:第 23.5 节 Score Summary(p.221)第 536 段 (text/12-p221-240.txt:536,搜「high-dimensional data such as images」) 与第 542 段(text/12-p221-240.txt:542,搜「unclear to obtain so far」)。 性能那一条在第 545 段(text/12-p221-240.txt:545,搜「many evaluations」), 书自己说「以后会再回到计算效率这个问题上」。 2 3 4