
<a id="ch01"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01)


# 第一章　从任务到分布


<a id="ch01-opening"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-opening)

桌上有一只红杯。找出它、补好被遮住的杯柄、设计另一只可握持的杯子，是三个不同任务。检测器交付位置，补全模型交付一段与原图相容的外观，设计系统还要容纳多种方案。后两项要求模型构造更多细节，但这不使第一个任务变得低级：在强遮挡下精确定位杯子，仍可能比画一只普通杯子困难。本讲研究的是**怎样学习可能结果之间的关系，并把其中一种变成完整样本**。


<a id="ch01-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0001)


## 1.1 标签压缩了哪些差异


<a id="ch01-label-versus-sample"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-label-versus-sample)

“杯子”这个标签把圆杯、直杯、曲柄与方柄合在了一起。分类成功，意味着这些差异没有妨碍识别；生成一只杯子，却必须对这些差异作具体选择。因此，识别过程通常不能简单倒放成生成过程。分类器可能知道什么是杯子，同时完全没有学会杯柄、杯壁、视角和光照怎样共同出现。


<a id="ch01-output-space"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-output-space)

概率记号本身不能区分任务。写成 $p(y\mid x)$ 时，$y$ 可以是一个类别、一段描述、一幅完整图像。传统判别模型通常直接预测任务需要的标签或数值；传统生成建模讨论输入的边缘或联合分布；现代条件生成则强调给定条件构造复杂样本。阅读论文时，先把 $x$、$y$ 换成具体对象，再问输出空间、训练目标和使用过程。Caption 已经生成文字，检测也可以输出复杂结构，不能只按“有没有输入”或“是不是一个数字”来命名。


<a id="ch01-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0002)


## 1.2 同一条件允许多个结果，也排除一些结果


<a id="ch01-condition-cup"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-condition-cup)

给定“红色杯子放在木桌上”，颜色、对象和支撑关系已经被约束，杯型、木纹、光照与视角仍可变化。两张不同的红杯图可能都是合法答案；一张蓝杯图即使很漂亮，也没有满足这次颜色条件。这里的“多解”并不意味着任何结果都可以。条件把输出空间分出相容与不相容的区域，模型还要在相容区域内组织哪些结果更常见。


<a id="ch01-cup-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-cup-figure)

![六幅木桌上的红杯示意，杯身、杯柄、视角与光照各有不同，颜色与支撑关系保持为共同条件。](https://codingai-lec04.pages.dev/assets/conditional-cups.jpg.webp)


<a id="ch01-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0003)

这组图是课程 ImageGen 示意，用来辨认对象与条件，不是本课程训练的 VAE、GAN 或扩散模型输出，也不是固定权重、只改一个随机种子的受控实验。先比较上排的不同视角，再看下排杯身与杯柄的差异：颜色和桌面支撑共同出现，其他部分仍可变化。它展示允许变化的种类，不能从六幅图直接读出完整分布或真实频率。


<a id="ch01-support-frequency"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-support-frequency)

“可能出现什么”称为支持集；“各种结果出现多少”由概率决定。例如只允许红红、蓝蓝两种鞋对时，红红占一半还是四分之三，不会改变允许集合，却会改变频率。在真实图像中，严格判定某张图的概率是否为零通常很困难；课堂先用有限例子把两件事分清，再回到实际模型用条件满足率、样本分布和覆盖作近似检查。


<a id="ch01-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0004)


## 1.3 部件分别正确，不足以组成正确答案


<a id="ch01-joint-table"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-joint-table)

设左鞋与右鞋各有一半概率是红色，一半是蓝色。要求一双鞋同色。下面两个模型对“左鞋是什么颜色”和“右鞋是什么颜色”给出的统计完全相同，完整鞋对却不同。


<a id="ch01-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0005)


| 完整鞋对 | 保留同色关系的 $P$ | 独立拼接的 $Q$ |
| --- | --- | --- |
| 红—红 | 1/2 | 1/4 |
| 红—蓝 | 0 | 1/4 |
| 蓝—红 | 0 | 1/4 |
| 蓝—蓝 | 1/2 | 1/4 |


<a id="ch01-joint-reading"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-joint-reading)

先按列求左鞋为红的概率，两列都是 $1/2$；再检查非对角线，$Q$ 把一半质量放到了不合要求的组合。缺失的不是红色图片或蓝色图片，而是左右之间的依赖。图像中的手与手臂、视频中的同一物体、句子中的主语与动词，都有类似的联合相容要求。单独识别每个部件，不能替代对它们关系的建模。


<a id="ch01-conditioning-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-conditioning-example)

观察到左鞋为红以后，$P$ 中右鞋必为红，$Q$ 中右鞋仍然各色一半。这就是条件概率提供的新信息：先保留符合已知条件的格子，再用这些格子的总质量归一化。若条件本身概率为零，普通比值没有定义，不能照搬这个计算。第二章将反过来利用条件关系：先选左鞋，再按刚选的颜色生成右鞋，真正得到一个保持依赖的采样器。


<a id="ch01-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0006)


## 1.4 平均答案可能不是一个可能样本


<a id="ch01-mean-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-mean-example)

把复杂图像暂时缩成一个数。固定条件 $c$，真实结果 $X$ 等概率取 $-1$ 或 $+1$。模型只交付一个确定值 $a$，按平方误差评分，则


<a id="ch01-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0007)

$$\mathbb E[(X-a)^2\mid c]=\tfrac12(-1-a)^2+\tfrac12(1-a)^2=1+a^2.$$


<a id="ch01-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0008)

最优输出是 $a=0$，最小误差是 $1$。计算完全正确，但真实过程从不产生 $0$。这个目标学到的是条件均值；如果任务需要一个实际可能发生的结果，它回答的就不是完整问题。


<a id="ch01-mse-distribution"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-mse-distribution)

再让生成器忠实地各以一半概率输出 $-1$ 和 $+1$，然后拿它与一份**独立抽取**的真值比较。两者一半相同、一半相差 $2$，平均平方误差是 $2$，反而比输出 $0$ 更差。错误不在生成分布，而在把没有逐项配对关系的两个合理样本当作唯一答案比较。杯子可能在左或右时，逐像素平均也可能形成重影；这个类比帮助看清目标，但不能据此宣称所有使用 MSE 的模型都会输出模糊图。


<a id="ch01-three-evaluations"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-three-evaluations)

生成评价因此至少需要分别回答：样本是否满足条件、单个样本是否合理、样本集合是否覆盖重要变化。总画同一只漂亮红杯可能满足前两项，却遗漏大量允许杯型；不停改变颜色与部件可能很“多样”，却降低条件满足率。这些维度不能压成“看起来新颖”一个印象。


<a id="ch01-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0009)


## 1.5 一条记录怎样变成许多训练题


<a id="ch01-record-signal"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-record-signal)

训练数据通常只记录一次发生，而没有列出同条件下所有可能世界。一段文字可切成许多“根据前缀预测下一项”的题；一张图可以作为重建目标；一对线稿和照片给出内容对应；给图像添加已知噪声，则得到输入与噪声答案。训练机制决定每条记录怎样提供反馈。模型通过跨记录共享参数，学习能够迁移到新输入的规律，而不是为每个条件存一张独立答案表。


<a id="ch01-augmentation-limits"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-augmentation-limits)

从一张图制造一百种遮挡，确实增加了恢复任务，但没有增加一百种从未出现的杯型。训练题数量、对象多样性和关系覆盖是三个不同量。若数据只展示干燥桌面上的成功拿杯，增加同类照片不一定补上湿滑、裂纹与失败情况。训练集与测试集若有近重复记录，记忆还可能被误看成泛化。


<a id="ch01-three-uncertainties"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-three-uncertainties)

这里有三类经常混在一起的变化。设计椅子本来允许多解，属于任务开放性；杯背被遮住造成信息不足，需要新观察；固定模型换随机种子，只改变这次采样选择。更多观察可能解决当前杯背是否有裂纹，却不会把开放设计任务压成唯一方案。更多随机样本也不会自动提供关于杯背的事实。


<a id="ch01-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0010)


## 1.6 生成式路线为什么扩展了任务接口


<a id="ch01-generative-opportunity"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-generative-opportunity)

固定标签体系要求事先决定模型允许回答什么。构造文字、图像或代码，使许多任务能够通过同一输出空间表达：解释、摘要、设计、补全、翻译和程序编写可以共享表示与训练基础。数据本身又能为下一项预测、遮挡恢复等任务提供大量监督信号。这些性质共同扩大了可训练规模与任务复用范围；它们与数据质量、架构、优化和计算条件一起，使生成式路线成为重要选择。


<a id="ch01-more-demand"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-more-demand)

构造完整结果常要求保留更丰富的关系，也扩大了出错方式。写出一段程序，需要语法、接口和跨行依赖；程序可以流畅而无法执行。生成一张建筑图，需要同时安排门窗、透视和材质；自然外观仍不保证尺寸可施工。生成任务能够提出更丰富的能力要求，却不能仅凭输出复杂就认定模型更智能、已经理解或适合所有任务。若只需一个可靠分类结果，直接任务模型仍可能更合适。


<a id="ch01-data-cost"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-data-cost)

投入也随交付对象而变。除了收集数量，还要处理来源、内容质量、长尾关系、数据使用条件和评价；除了单次推理，还要算候选筛选、工具验证、人工复核和返工。比较成本时，一个有用口径是“每个成功完成的任务”，而不是只比一张图或一次调用。共享底座可以摊薄训练投入，可靠性不足也可能把节省的生成成本消耗在验证环节。这里是在建立分析口径，不是在断言某条路线普遍更便宜。


<a id="ch01-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0011)


## 1.7 生成、选择、决策和验证


<a id="ch01-decision-chair"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-decision-chair)

两把椅子都可能满足“漂亮的红椅子”，但只有一把能推进眼前这张桌子。生成器组织候选；采样交付某一把；选择规则决定采用哪一把；测量或试放验证桌下空间是否相容。模型概率、用户偏好和事实正确性是不同的量。即使始终挑概率最高的候选，也不会自动测出未知尺寸。


<a id="ch01-generate-more"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-generate-more)

多生成一百把椅子有时能增加找到好方案的机会，但前提是系统知道如何判断好。如果真正缺少桌下尺寸，正确下一步可能是测量；如果验证很昂贵，盲目扩候选会增加成本。第八章会把这个区别继续推进到行动：有些动作不是直接完成任务，而是取得能够改变后续判断的信息。


<a id="ch01-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0012)


## 1.8 四种生成组织方式


<a id="ch01-model-map"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-model-map)

接下来的方法共享生成问题，组织方式不同。自回归按顺序补上结果的一部分；VAE 用可采样潜变量和条件解码建立生成路径；GAN 让从数据中学到的判别反馈塑造生成器；扩散用不同噪声程度下的局部预测连接一串更新。它们并不是互不相容的四个盒子：自回归或扩散可以在潜表示中生成，对抗目标也可以参与压缩器训练。


<a id="ch01-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-u0013)


| 路线 | 训练时主要追踪什么 | 使用时追踪什么 |
| --- | --- | --- |
| 自回归 | 给定合法前缀，真实下一项得到多少概率 | 当前已生成内容如何进入下一步条件 |
| VAE | 数据解释与潜分布约束如何共同更新参数 | 潜变量从哪里来，解码器如何产生输出 |
| GAN | D 和 G 各在哪一步学习，梯度怎样流动 | 随机输入经生成器变成什么样本 |
| 扩散 | 怎样造带噪题、预测什么、答案从哪里来 | 当前状态怎样经预测器和采样器更新 |


<a id="ch01-check-and-answer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-check-and-answer)

**自检。** 一个模型生成 20 张不同红杯图，其中杯柄都悬空；另一个总生成同一张正确红杯图。谁成功了？**参考答案：**前者有表面变化但联合相容失败，后者的单图与条件可能合格但没有展示覆盖。应分别报告，不在一个“成功／失败”词里隐藏差异。再问“哪个模型更适合识别杯子”时，上述图集还没有提供识别证据。


<a id="ch01-next"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-next)

**继续阅读与实践。** 第二章把鞋对关系做成可计算的概率树。[LAB01](https://codingai-lec04.pages.dev/course/notebooks/lab01.html) 让你固定模型、改变温度，区分模型分布与取样规则；[真实图像实验](https://codingai-lec04.pages.dev/course/experiments/image-generation.html) 将条件、种子和编辑保持要求放回可见对象。本章的有限数表与算例是课程构造，图像示意不作为训练效果证据。


<a id="ch01-sources"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch01-sources)

**来源与延伸。** 本章由课程既有 CLS01、N01–N08 及数学材料重组。概率与生成任务背景可续读 [MIT 6.S978：Introduction](https://mit-6s978.github.io/assets/pdfs/lec1_intro.pdf)；三种代表训练接口的原始来源分别为 [Auto-Encoding Variational Bayes](https://arxiv.org/abs/1312.6114)、[Generative Adversarial Networks](https://arxiv.org/abs/1406.2661) 和 [Denoising Diffusion Probabilistic Models](https://arxiv.org/abs/2006.11239)。阅读它们前，先能为自己的任务写清条件、样本和验证对象。


<a id="ch02"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02)


# 第二章　自回归怎样组织生成


<a id="ch02-opening"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-opening)

上一章的鞋对例子留下了一个可以真正实现的办法：先随机选择左鞋颜色，再让右鞋使用左鞋作为条件。这样，随机性负责给出不同样本，条件关系负责让部件相容。自回归把这个办法扩展到文字、像素和潜变量 token：每次预测下一部分，并把已经产生的部分交给后续预测。


<a id="ch02-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0001)


## 2.1 一条完整条件链没有删除依赖


<a id="ch02-chain-rule"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-chain-rule)

对于序列 $x_1,\ldots,x_n$，概率链式法则给出


<a id="ch02-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0002)

$$p(x_1,\ldots,x_n)=p(x_1)\,p(x_2\mid x_1)\cdots p(x_n\mid x_1,\ldots,x_{n-1}).$$


<a id="ch02-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0003)

每一项保留了前面所有变量，所以这是同一个联合分布的精确写法，不是假设各位置独立。鞋对中若 $p(左红)=1/2$、$p(右红\mid 左红)=1$，红红的概率就是 $1/2$；在蓝色分支使用对应条件，蓝蓝也为 $1/2$，不相容组合自然没有质量。


<a id="ch02-short-context"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-short-context)

额外假设出现在我们删除条件时。把 $p(x_i\mid x_1,\ldots,x_{i-1})$ 改成只看 $x_{i-1}$，就假定更早历史在给定最近一项后不再有用。设一条序列的首符号决定末符号，中间全是同一个占位符；仅看最后一个占位符的模型无法判断该怎样收尾。共享一个网络来计算所有位置，与删掉历史不是一回事：参数相同，输入条件仍然不同。


<a id="ch02-order-choice"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-order-choice)

变量不必天然有时间顺序。图像可以按行扫描，也可以先粗后细；有限变量集合的任何完整顺序都能写出链式分解。顺序是否合法，与有限网络是否容易学习、计算是否昂贵，是不同问题。把多个位置合成一块可以减少外层步骤，但块内仍有依赖需要处理，不能靠更换“token”名称消除联合建模任务。


<a id="ch02-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0004)


## 2.2 网络输出概率，训练目标给参数反馈


<a id="ch02-training-object"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-training-object)

给定“开始、红”，网络输出下一项词表分布，例如“杯”得到 $0.7$，“书”得到 $0.2$，其余合计 $0.1$。它先计算整个分布，随后训练程序拿真实下一项“杯”取出对应概率，并计算 $-\log 0.7$。答案参与评分，不能提前进入产生这份预测的输入。模型下一次把真实词概率提高，损失就减小。


<a id="ch02-sequence-loss"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-sequence-loss)

整段观察序列的负对数似然为


<a id="ch02-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0005)

$$\mathcal L(\theta;x)=-\sum_i\log p_\theta(x_i\mid x_{<i}).$$


<a id="ch02-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0006)

假设两个真实 token 的条件概率分别是 $0.8$、$0.5$，整段概率是 $0.4$，损失是 $-\log0.4\approx0.916$，也等于 $-\log0.8-\log0.5$。局部计算像分类，沿链相乘后却定义完整序列分布。按 token 平均会让长序列贡献更多位置，按序列先平均再求均值则改变权重；报告损失时要说清口径，不能跨不同词表与长度处理直接比数值。


<a id="ch02-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0007)


## 2.3 训练看真实过去，生成接自己的过去


<a id="ch02-teacher-forcing"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-teacher-forcing)

训练样本“红杯在桌上”已经完整存在。计算第二个词概率时可以给模型“红”，计算第三个词概率时可以给“红杯”。这称为 teacher forcing：真实前缀本来就是链式似然的条件，使用它没有算错目标，也避免先自由生成一条随机轨迹才能训练。禁止读取的是当前要预测的 token 及未来内容，而不是所有来自真实数据的信息。


<a id="ch02-shift-table"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-shift-table)

一个最小的输入—标签对齐如下。表内每一行都是一次合法预测，具体架构可以将这些计算合并处理。


<a id="ch02-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0008)


| 当前预测位置 | 允许读取的前缀 | 真实目标 |
| --- | --- | --- |
| 1 | 开始标记 | 红 |
| 2 | 开始标记、红 | 杯 |
| 3 | 开始标记、红、杯 | 结束标记 |


<a id="ch02-mask-parallel"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-mask-parallel)

完整句子虽然在训练程序里，模型内部仍要守住可见信息边界。因果遮罩限制一个位置能读到哪些输入；先看输入是否右移，再决定遮罩矩阵的对角线含义，不能只背“遮住未来”。合适的 Transformer 实现可以并行计算各位置的预测，而 RNN 仍可能依赖前一个隐藏状态。teacher forcing 提供已知前缀，并不自动保证任意架构都能位置并行。这里的“因果”描述计算方向，不是已经识别现实因果机制。


<a id="ch02-free-running"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-free-running)

生成时没有一份完整真句可用。模型采到“蓝”，下一步就必须以本次已经生成的“蓝”为前缀；它可能走到训练中少见的状态。于是似然训练正确和自由生成稳健可以同时一好一差。要判断模型，除了看留出数据上的损失，还要检查它自己的轨迹。偏离某一句参考文本不自动意味着失败，因为语言任务往往多解；但丢失题目条件、前后矛盾或无法结束，是需要单独检查的行为。


<a id="ch02-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0009)


## 2.4 一条边很确定，整条路径仍可能不常见


<a id="ch02-tree-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-tree-figure)

![两步概率树：根节点选择A的概率0.6、B的概率0.4；A后选择0的概率0.51，B后选择0的概率0.99。完整路径A0、A1、B0、B1的概率分别为0.306、0.294、0.396、0.004。](https://codingai-lec04.pages.dev/assets/labs-v13/lab01-tree.png)


<a id="ch02-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0010)

这幅图来自 LAB01 的课程概率表计算。左边每条边是条件概率，右边每根柱是完整路径概率。先沿一条路径相乘，再到右边找对应柱。B 后出现 0 几乎确定，但 B0 的总概率是 $0.4\times0.99=0.396$，不是 $0.99$。


<a id="ch02-greedy-map"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-greedy-map)

这个小树也说明三种使用方法不同。**按分布采样**保留四个结果及其频率；**贪心**每一步取局部最大，先选 A，再选 0，输出 A0；**完整路径最大概率选择**比较乘积，会选 B0，因为 $0.396>0.306$。贪心没有找到全局最大，并不表示链式模型有错，只表示局部选择与全路径搜索优化的对象不同。对很长序列，全路径枚举通常不可行，搜索还需要计算预算和任务评价。


<a id="ch02-legal-sampling"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-legal-sampling)

采样器的关键不只是每张条件表加起来等于一，还要使用当前实际前缀。若第一步采到 B，却读取 A 的下一项概率，程序仍能运行，也仍会输出两个 token，但生成的联合分布已经变了。LAB01 的有限表可以用来核对：先计算理论路径概率，再用多次独立抽样看频率是否接近。固定随机种子有助复现一批样本，不能单独证明采样器正确。


<a id="ch02-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0011)


## 2.5 温度改的是哪一层概率


<a id="ch02-temperature-definition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-temperature-definition)

模型通常先输出 logit $\ell_k$。温度为正数 $T$ 时，下一项概率为


<a id="ch02-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0012)

$$p_T(k\mid h)=\frac{\exp(\ell_k(h)/T)}{\sum_j\exp(\ell_j(h)/T)},$$


<a id="ch02-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0013)

其中 $h$ 是当前前缀。$T=1$ 保持模型原分布；较小的正温度使每个条件分布更集中；较大温度使它更平。温度没有更新网络权重。$T\to0^+$ 在没有并列最大值时趋向贪心，不能直接把公式里的 $T$ 写成零进行除法。


<a id="ch02-temperature-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-temperature-figure)

![LAB01在相同两步概率模型上比较温度0.35、1和2；深蓝为理论完整序列概率，黄色为抽样频率，圆点表示五个重复种子。每个种子采样6000条。](https://codingai-lec04.pages.dev/assets/labs-v13/lab01-temperature.png)


<a id="ch02-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0014)

这组保存结果固定概率表，只改温度，每个种子抽样 6,000 条，并做五个种子重复。看深蓝柱与黄色柱是否接近，检查实现；看同一结果跨三幅图怎样变，解释采样规则。它运行的是有限表采样，没有训练语言模型。


<a id="ch02-local-global-temperature"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-local-global-temperature)

有一个容易漏掉的细节：温度在**每个前缀的条件分布**上应用，不能把它想成最后四根柱统一变平。图中 B0 在 $T=2$ 时略高于 $T=1$，尽管各节点局部分布都更平。原因是根节点选择 B 的概率增加，而 B 后选 0 的概率下降，完整路径是两者乘积。不同前缀还有不同归一化常数，因此通常不等于把整段原概率统一做一次 $p(x)^{1/T}$ 再归一化。


<a id="ch02-temperature-values"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-temperature-values)

具体算一次：$T=2$ 时根节点 B 概率为 $\sqrt{0.4}/(\sqrt{0.6}+\sqrt{0.4})\approx0.4495$；B 后选 0 的概率为 $\sqrt{0.99}/(\sqrt{0.99}+\sqrt{0.01})\approx0.9087$，相乘约 $0.4084$。这比原来的 $0.396$ 稍高。看到“升温”后某条完整路径变常见，不能据此判断实验错误。


<a id="ch02-sampling-value"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-sampling-value)

更高温度能让低分候选更容易被抽到，却没有定义“更有创造力”。创造性价值还取决于新颖性、条件遵循、结构和用途。同样，概率最高的答案也不等于事实最正确。比较解码方法应固定模型、提示和样本预算，同时记录有效与无效候选；若后面接工具验证，还要把验证成本算进任务完成过程。


<a id="ch02-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0015)


## 2.6 图像也能变成一串生成单元


<a id="ch02-image-units"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-image-units)

一幅 RGB 图像可以拆成像素位置，再拆成颜色通道；每个八位通道有 256 个可能值。若每个通道都是一个 token，$32\times32$ 的图像就有 3,072 个 token；若一个 token 代表一块压缩表示，数量会完全不同。所以“生成一千个 token”不是明确的图像分辨率。讨论步数前，先写出每一步交付的是通道、像素、图块还是潜代码。


<a id="ch02-image-context"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-image-context)

按扫描顺序生成时，当前像素只能利用已经生成的区域。二维空间里的近邻可能在序列中很远；这会影响网络访问关系的难度。换成粗到细可以先确定布局，再补细节，但也要解释各尺度之间怎样条件化。这些是表示和计算选择，并没有推翻概率链式法则。[PixelCNN 的原始工作](https://arxiv.org/abs/1606.05328) 提供了图像条件分布建模的一种具体实现。


<a id="ch02-tokenizer-prior"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-tokenizer-prior)

另一条路径先把真实图像压缩成短潜网格，再让 AR 模型学习这些代码怎样共同出现，最后通过解码器回到像素。这里有两条不同的路线：**重建**从一张真实图像编码出的代码开始；**生成**从已学先验采出的代码开始。清晰重建主要证明压缩器能保留信息，不能保证独立随机拼出的代码网格整体合理。第三章会专门解释这项缺口。


<a id="ch02-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0016)


## 2.7 外部条件固定任务，前缀记录生成进度


<a id="ch02-external-condition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-external-condition)

图像 caption 的外部条件是一幅图 $c$，输出是文字 $x$，模型使用


<a id="ch02-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0017)

$$p_\theta(x\mid c)=\prod_i p_\theta(x_i\mid x_{<i},c).$$


<a id="ch02-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0018)

图像在整条生成过程中提供相对固定的任务信息，前缀则随每次采样改变。固定前缀、改变图像，可以检查模型是否读取图像；固定图像、改变前缀，可以检查模型如何接续不同路径。这两个干预回答不同问题，不能把生成差异全部归因给某一个模块。


<a id="ch02-architecture-bridge"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-architecture-bridge)

到这里我们已经说明条件概率、训练答案与采样步骤，还没有打开网络怎样读取长历史的细节。RNN、CNN 或 Transformer 可以用不同计算结构实现条件预测；自回归不是 Transformer 的同义词。第五讲将继续问：远处信息如何到达当前预测，哪些计算可以复用，长上下文里的证据如何保留。


<a id="ch02-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-u0019)


## 2.8 自检与一次可完成的观察


<a id="ch02-exercise"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-exercise)

**练习。** 在上面的树里，若连续采样 100 条没有出现 B1，能否判断程序把它删除了？如果把模型重新训练一轮和把温度改为 2 都称作“让模型更随机”，这句话漏掉了什么？


<a id="ch02-answer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-answer)

**参考答案。** 原温度下 B1 概率为 $0.004$，独立采样 100 条均未出现的概率是 $(1-0.004)^{100}\approx0.670$，所以缺席很常见；应检查代码条件与更充分的频率证据。训练修改共享参数，从而可能改变所有前缀的预测；调温只修改已有 logit 的取样规则。两者的机制、成本和可逆性都不同，不能只用“随机性”概括。


<a id="ch02-lab-task"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-lab-task)

**带着结果进入实践。** 在 [LAB01 网页教材](https://codingai-lec04.pages.dev/course/notebooks/lab01.html) 先读保存的概率树与温度图，再进入同册 Deepnote。保留原模型，只改一个温度；在运行前算一条路径的概率，运行后比较频率，并解释偏差是抽样波动、设置变化还是实现错误。成果可以只有一张带注释的图，但应明确概率来自哪里、何时使用当前前缀。


<a id="ch02-sources"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch02-sources)

**来源与延伸。** 本章综合现有 AR 数学材料与 N09–N14，主要课堂来源为 [MIT 6.S978：Autoregressive Models](https://mit-6s978.github.io/assets/pdfs/lec3_ar.pdf)。两步树、鞋对、温度路径计算均为课程有限例子；[Conditional Image Generation with PixelCNN Decoders](https://arxiv.org/abs/1606.05328) 用于继续理解图像中的条件预测，不代表本课运行了该模型。


<a id="ch03"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03)


# 第三章　潜表示怎样成为生成入口


<a id="ch03-opening"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-opening)

把一张图压成一个短向量，再把向量还原成图，是自然的表示学习任务。但如果生成时没有原图，短向量从哪里来？本章围绕这个差别展开：**重建路径从观察出发，生成路径从规定的分布出发；两条路径共享解码器，却不自动使用同一区域。** VAE 的先验、近似后验与训练目标正是为了建立这种联系。


<a id="ch03-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0001)


## 3.1 先分清编码、解码与两种起点


<a id="ch03-two-paths"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-two-paths)

普通自编码器用编码器 $E$ 把输入图像 $x$ 变成代码 $z=E(x)$，解码器 $D$ 再给出重建 $D(z)$。训练要求还原输入，因此解码器在编码器带它访问的区域得到反馈。训练完成后，随便输入一个向量通常也能算出像素数组，但“能算出数组”不等于“产生符合数据规律的图像”。程序接受的空间大于训练实际约束过的空间。


<a id="ch03-prior-gap"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-prior-gap)

设编码器把所有训练图都送到潜空间里远离原点的一条窄带，解码器在窄带上表现很好；你却在生成时从原点附近的标准正态分布抽取 $z$。这就像只在城市东边练过路，使用时却把起点放在西边：已经会重建不能保证新起点好用。缺少的是生成起点与已学表示之间的约束，不是再给解码器加一个“生成”按钮。


<a id="ch03-model-definition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-model-definition)

潜变量生成模型首先规定 $p(z)$，常见选择是标准正态；再定义 $p_\theta(x\mid z)$，由解码器提供分布参数。使用时先抽 $z\sim p(z)$，再按 $p_\theta(x\mid z)$ 产生观察。这里的 $\theta$ 是跨样本共享的网络参数，训练时更新；$z$ 是一次样本的潜变量，采样时改变。换 $z$ 与训练网络是两个不同操作。


<a id="ch03-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0002)


## 3.2 同一个真实训练实验，先看重建，再看生成


<a id="ch03-reconstruction-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-reconstruction-figure)

![LAB07固定十张测试数字；依次为原灰度图、实际二值输入、随机初始化重建、β0训练后重建、β1训练后重建。每列输入不变，输出显示decoder(mu)的Bernoulli像素概率。](https://codingai-lec04.pages.dev/course/experiments/vae/reconstruction.png)


<a id="ch03-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0003)

本课 LAB07 使用公开的 UCI $8\times8$ 手写数字，共 1,797 张，分为 1,437 张训练与 360 张测试；它不是 MNIST。像素值大于 8 记为 1，其余为 0，因而每个像素是明确的二值观察。一个小 MLP 编码器给出二维潜变量分布，另一个 MLP 解码器给出 64 个像素取 1 的概率。标签仅用于读图，没有进入重建训练。


<a id="ch03-reconstruction-reading"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-reconstruction-reading)

沿图中同一列向下看：初始化只有接近灰色的数值，训练后出现了笔画结构。再横向比较最后两行：不同目标都让共享参数学会了一些重建，但部分数字仍模糊或容易混淆。这里显示的是将编码均值 $\mu(x)$ 放进解码器得到的概率图，便于固定输入比较；它既不是所有后验输出的平均，也不是完整模型最后抽出的一张二值观察。


<a id="ch03-prior-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-prior-figure)

![同一组标准正态潜变量分别进入初始化、β0和β1解码器。这里没有输入图像，三行每列使用同一个z。](https://codingai-lec04.pages.dev/course/experiments/vae/prior_same_seed.png)


<a id="ch03-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0004)

现在取消输入图像，从标准正态分布取一组固定 $z$，交给同样三个解码器。下两行仍然不同，且仍有重复与模糊。这个对照回答的是“标准先验入口是否可用”，与上图的测试图重建是两个问题。判断不能只凭哪个数字好看；还要看两类起点实际位于哪里。


<a id="ch03-latent-figure-zero"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-figure-zero)

![β0实验中，测试图后验均值分散在较远区域，25个固定标准正态起点是原点附近黑叉；右侧均匀扫描[-3,3]潜网格。](https://codingai-lec04.pages.dev/course/experiments/vae/latent_beta0.png)


<a id="ch03-latent-zero-reading"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-zero-reading)

先读左图的坐标刻度：黑叉是标准正态起点，彩色点是测试图的编码均值。β=0 的彩色点多数远离先验常到达的原点区域；右侧均匀网格是另一种取点方式。


<a id="ch03-latent-figure-one"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-figure-one)

![β1实验中，同一批测试图后验均值和固定标准正态起点的尺度更接近；右侧仍为相同坐标范围的均匀网格。](https://codingai-lec04.pages.dev/course/experiments/vae/latent_beta1.png)


<a id="ch03-latent-one-reading"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-one-reading)

β=1 的编码均值与黑叉在数值尺度上更接近。两幅左图按各自范围定轴，需比较刻度；右侧网格仍不等于高斯先验抽样。


<a id="ch03-role-answer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-role-answer)

**模拟学生的追问：“我已经重建得不错，为什么不能随便取一个 $z$？”** 请先看左侧坐标轴，再看黑叉和彩色点。两幅左图按各自数据范围定轴，所以同为半径2的虚线圆在屏幕上大小不同；它们的数值尺度相同。先读轴刻度，再比较黑叉与彩色点所在的坐标区域。$\beta=0$ 时，测试图编码均值距原点的平均距离是 12.323，标准正态起点则多数处在小得多的尺度；重建常用的区域和先验经常访问的区域发生了明显偏离。$\beta=1$ 时平均距离为 1.285，两者尺度更接近。这给出了看得见的回答：好重建约束了“从这些输入得到的潜变量”，没有自动约束“你后来随便选择的潜变量”。下一节的 KL 是组织这个约束的方法名称，而不是对上述现象的替代解释。


<a id="ch03-latent-reading-limits"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-reading-limits)

两幅左图显示的是后验**均值**，完整后验还包含方差；不能把散点图当作整个聚合后验。右图按坐标均匀扫描网格，也不是从高斯先验独立抽样。$\beta=1$ 的先验图仍不够清楚，图集也没有证明十类数字被充分覆盖。实验支持的是一次真实权衡，不是“加 KL 后一切生成问题都解决”。


<a id="ch03-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0005)


## 3.3 先验、真实后验与近似后验各回答什么


<a id="ch03-three-distributions"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-three-distributions)

先验 $p(z)$ 回答“没看到这张输入时，从哪里选潜变量”；生成分布 $p_\theta(x\mid z)$ 回答“给定潜变量，观察怎样产生”。看见一张图 $x$ 后，反问哪些 $z$ 最可能解释它，就得到真实后验 $p_\theta(z\mid x)$。真实后验由当前生成模型和贝叶斯规则决定，并不是额外任选的一条高斯曲线。


<a id="ch03-marginal-hard"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-marginal-hard)

困难在于归一化。边缘似然需要汇总所有可能的潜来源：


<a id="ch03-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0006)

$$p_\theta(x)=\int p(z)p_\theta(x\mid z)\,dz,\qquad p_\theta(z\mid x)=\frac{p(z)p_\theta(x\mid z)}{p_\theta(x)}.$$


<a id="ch03-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0007)

给定一个 $z$，解码器容易计算条件分布参数；把高维潜空间中所有 $z$ 的贡献积分起来却通常很难。取一个编码点再给图像打分，没有完成这个积分。VAE 因而训练共享推断网络 $q_\phi(z\mid x)$，用它近似难算的后验。


<a id="ch03-amortized"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-amortized)

常见编码器一次输出 $\mu_\phi(x)$ 和 $\log\sigma_\phi^2(x)$，定义一个对角高斯分布。每张图产生不同分布参数，网络权重 $\phi$ 却在所有图之间共享；这种把逐样本推断交给共享网络的方式称为摊销推断。选择高斯是计算与表达之间的取舍，不表示真实后验必然是高斯。注意 $q_\phi$ 是近似后验，不能把编码器每一次输出直接称为精确贝叶斯答案。


<a id="ch03-gaussian-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-gaussian-example)

**可算例子。** 令 $z\sim\mathcal N(0,1)$，$x\mid z\sim\mathcal N(z,0.25)$，观察到 $x=1.5$。将先验与似然的指数相加、配平方，可以得到 $p(z\mid x)=\mathcal N(1.2,0.2)$，第二个数是方差。后验向观察移动，又受到先验拉回，因此均值不是 1.5。这个模型的后验可以解析计算，适合做实现参照；图像 VAE 通常没有同样便利。


<a id="ch03-lab02-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-lab02-figure)

![LAB02可解高斯模型：灰线为先验，蓝线为观察x=1.5后的真实后验，金线为选定的近似后验q；右侧区分重建项、先验KL、ELBO、对数边缘似然与后验KL缺口。](https://codingai-lec04.pages.dev/assets/labs-v13/lab02-density-and-terms.png)


<a id="ch03-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0008)

这张图来自 LAB02 的解析计算，没有训练图像网络。先读左边谁在比较谁，再读右边两种 KL 的名称：一项比较 $q$ 和先验，另一项比较 $q$ 和真实后验，它们不是同一根尺子。LAB02 让数学关系可算；LAB07 才让共享参数真实学习后呈现图像路径。


<a id="ch03-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0009)


## 3.4 为什么目标同时需要数据解释与先验约束


<a id="ch03-elbo-definition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-elbo-definition)

VAE 的标准目标最大化证据下界：


<a id="ch03-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0010)

$$\operatorname{ELBO}(x)=\mathbb E_{q_\phi(z\mid x)}[\log p_\theta(x\mid z)]-\operatorname{KL}(q_\phi(z\mid x)\Vert p(z)).$$


<a id="ch03-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0011)

第一项要求：从这张图的近似后验抽出的潜变量，应该能给这张图较高概率。第二项限制这些分布过分偏离生成时的起点。只有重建项，模型可能把代码搬到先验很少访问的区域；只有先验项，所有输入都输出同一个 $q=p$ 就能取到零，但代码可能不再携带输入信息。因此目标是共同取舍，不能把任何一项单独降到零当作成功。


<a id="ch03-two-kls"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-two-kls)

“下界”的精确含义由另一个 KL 说明：


<a id="ch03-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0012)

$$\log p_\theta(x)=\operatorname{ELBO}(x)+\operatorname{KL}(q_\phi(z\mid x)\Vert p_\theta(z\mid x)).$$


<a id="ch03-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0013)

由于后面的 KL 非负，ELBO 不超过同一模型的对数似然。注意右侧比较的是**真实后验**。若把 $q$ 强行设成先验，目标展开式中的先验 KL 为零，但真实后验通常因 $x$ 而移动，所以下界缺口不一定小。前面的高斯例子里，先验均值 0、真实后验均值 1.2，已经足以看出这两个“接近”不是同一要求。


<a id="ch03-optional-derivation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-optional-derivation)

**可选数学。** 在相关支持与可积条件成立时，把边缘积分写成 $q$ 下的期望：$p_\theta(x)=\mathbb E_q[p_\theta(x,z)/q(z\mid x)]$。对数的凹性给出 $\log p_\theta(x)\ge\mathbb E_q[\log p_\theta(x,z)-\log q(z\mid x)]$。再展开 $p_\theta(x,z)=p(z)p_\theta(x\mid z)$，便得到上式。这里唯一引入不等号的是 Jensen 不等式；数据解释项与先验 KL 是展开后的同一目标，不是随意拼接的两个口号。


<a id="ch03-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0014)


## 3.5 解码器输出的是观察分布的参数


<a id="ch03-likelihood-not-mse"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-likelihood-not-mse)

“重建损失”并不总是 MSE。若假设 $x\mid z$ 是固定方差高斯，负对数似然才等于加权平方误差加常数；若观察是严格二值像素，就可用 Bernoulli 分布。LAB07 的每个输出 $\pi_j(z)$ 是像素取 1 的概率，损失为 $-x_j\log\pi_j-(1-x_j)\log(1-\pi_j)$，沿 64 个像素求和。真实像素为 1 时，预测 0.8 的损失约为 0.223，预测 0.2 则约为 1.609，错误的高置信度会受到更大惩罚。


<a id="ch03-observation-layer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-observation-layer)

显示 $\pi(z)$ 是一种便于观察的概率图。若要从整个 Bernoulli 生成模型取样，还需按每个像素概率抽 0 或 1。这个抽样与之前选择 $z$ 是两层随机性：固定 $z$ 后仍可有不同二值观察；固定一张输入 $x$ 后，从 $q(z\mid x)$ 抽不同 $z$ 又是另一层。灰度概率图不应被误写成已经完成全部观测抽样。


<a id="ch03-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0015)


## 3.6 随机抽样怎样让编码器继续学习


<a id="ch03-reparameterization"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-reparameterization)

若只把“从 $q$ 抽样”当作黑盒，怎样把重建误差传回控制 $q$ 的编码器就不清楚。对高斯近似后验，先抽与参数无关的 $\epsilon\sim\mathcal N(0,I)$，再计算


<a id="ch03-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0016)

$$z=\mu_\phi(x)+\sigma_\phi(x)\odot\epsilon.$$


<a id="ch03-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0017)

给定本次 $\epsilon$，这条路径对均值和尺度可微，梯度能够从损失经解码器、$z$、均值与尺度回到编码器。我们没有对随机数发生器求导，也没有取消抽样，只把参数依赖移进了确定的变换。


<a id="ch03-reparam-number"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-reparam-number)

例如一维情况下 $\mu=1$、$\sigma=0.5$，本次 $\epsilon=-0.4$，得到 $z=0.8$。局部变化满足 $\partial z/\partial\mu=1$、$\partial z/\partial\sigma=-0.4$；重建梯度便可沿这两个方向传回。对一个固定样本的路径导数可以精确计算，随机性在于用有限 $\epsilon$ 估计期望梯度。少量抽样造成波动，并不表示梯度在随意猜测。


<a id="ch03-gaussian-kl"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-gaussian-kl)

标准正态先验下，对角高斯 KL 还可以直接计算：


<a id="ch03-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0018)

$$\operatorname{KL}(q\Vert p)=\tfrac12\sum_j(\mu_j^2+\sigma_j^2-1-\log\sigma_j^2).$$


<a id="ch03-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0019)

均值移得很远或尺度缩得过小都会付出代价。实现应区分标准差、方差和 log variance；并声明像素、潜维与批次如何求和或平均。否则看似相同的 KL 权重，实际可能代表不同取舍。


<a id="ch03-u0020"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0020)


## 3.7 从真实结果读这次取舍


<a id="ch03-beta-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-beta-results)

LAB07 固定初始化、训练批次和重参数化噪声，只把重建目标中的 KL 权重 $\beta$ 从 0 改为 1。每组都训练 150 个 epoch、3,450 次更新。测试结果如下，数值来自本次保存运行。


<a id="ch03-u0021"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0021)


| 固定测试量 | 初始化 | $\beta=0$ | $\beta=1$ |
| --- | --- | --- | --- |
| 重建负对数似然，nats/图 | 44.875 | 16.061 | 18.638 |
| 到标准先验的 KL，nats/图 | 0.454 | 103.375 | 2.258 |
| 后验均值平均半径 | — | 12.323 | 1.285 |


<a id="ch03-beta-interpretation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-beta-interpretation)

重建项对 64 像素求和，再对测试图与 8 组固定后验噪声平均；KL 对两个潜维求和后按图平均。$\beta=0$ 重建较好，但编码明显偏离标准先验；$\beta=1$ 为兼顾起点分布付出重建代价。$\beta=1$ 才是这里标准负 ELBO 的估计；其他权重改变目标。$\beta=0$ 训练仍抽取 $z$，即使最终标准差很小，也不能直接改称确定性自编码器。该对照没有证明更大权重普遍更好，也没有完成生成覆盖评价。


<a id="ch03-u0022"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0022)


## 3.8 插值、码本与后续生成先验


<a id="ch03-three-demonstrations"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-three-demonstrations)

看潜空间展示前，先问 $z$ 怎么获得。重建使用某张图的编码；插值在两张图的编码之间选一条路径；先验抽样从规定分布抽取；均匀网格按坐标扫描。平滑插值说明解码器沿选定路径连续响应，不能验证其他区域或整个先验。把所有图都叫“随机生成”会隐藏实验真正检验的能力。


<a id="ch03-codebook"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-codebook)

潜表示也可以离散化。VQ 思路先让编码器输出连续向量，再选最近的码向量进入解码器。编号只是索引，码向量才包含可用于计算的数值；编号 3 和编号 7 的平均 5 没有可靠语义，因为换一次编号就会改变答案。前向最近邻选择不可直接按普通连续函数精确反传，训练需要直通估计、停止梯度和码本更新等具体规则；“离散”不是把连续 VAE 的重参数化公式原样复制。[VQ-VAE 原论文](https://arxiv.org/abs/1711.00937) 说明了这样一种实现。


<a id="ch03-kmeans"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-kmeans)

一个更小的思考模型是 K-means：输入映到中心编号，再用中心重建；按规定概率抽编号便定义了一个能返回中心的生成分布。它合法地“能生成”，却最多直接输出有限中心，忽略簇内变化。这提醒我们区分有无生成定义与生成能力好坏。标准 EM 中潜变量推断与参数估计服务同一似然目标；VAE 用共享近似推断与随机梯度处理相关困难，也不能仅因涉及两组未知量就与任意交替训练混为一谈。


<a id="ch03-latent-interface"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-latent-interface)

压缩后的代码网格仍有整体结构。独立挑取合法码本项，可能得到局部能解码、整体不相容的布局，因此还要学习代码的联合先验。第二章的 AR 可以承担它，后面的扩散也可以。一个系统于是能够同时包含自编码表示、扩散生成先验和图像解码器；要分别说明每个组件学什么。潜空间扩散中的压缩器观察，不等于本章独立 VAE 从标准先验训练与采样的全部任务。


<a id="ch03-u0023"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-u0023)


## 3.9 自检与下一步


<a id="ch03-exercise-answer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-exercise-answer)

**自检。** 若一份报告只展示十张测试图的清晰重建，以及它们之间的平滑插值，能否接受“标准先验可以生成整个数据分布”的结论？**参考答案：**不能。两种展示都借助真实输入得到起点，没有直接检验标准先验经常访问的区域。需要固定先验起点、保留失败样本、分别观察质量与覆盖。若先验 KL 近零，还应检查潜变量是否携带输入信息，不能单项判胜。


<a id="ch03-practice"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-practice)

**继续做。** [LAB02](https://codingai-lec04.pages.dev/course/notebooks/lab02.html) 让你在可解高斯模型里改变 $q$，同时核对两种 KL；[LAB07](https://codingai-lec04.pages.dev/course/notebooks/lab07.html) 提供完整图像网络、初始化对照、保存权重和独立运行代码。先读上述结果，再只改训练预算或一个 $\beta$，解释重建与先验入口分别发生什么。下一章把反馈再换一种组织方式：不为每个随机 $z$ 指定唯一目标图，而让一个从数据中学习的判别器告诉生成器它目前遗漏了什么差异。


<a id="ch03-sources"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch03-sources)

**来源与延伸。** 概念沿现有 DERIV、N15–N20 和 LAB02 重组；VAE 的生成模型、变分目标与重参数化见 [Kingma 与 Welling：Auto-Encoding Variational Bayes](https://arxiv.org/abs/1312.6114)。码本路线见 [Neural Discrete Representation Learning](https://arxiv.org/abs/1711.00937)。LAB07 是课程自己的轻量实现，数据说明见 [scikit-learn：load_digits](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html)，不作为原论文指标复现。


<a id="ch04"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04)


# 第四章　学到的反馈与图像翻译


<a id="ch04-opening"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-opening)

VAE 用观察模型给数据打分，并把编码与先验连接起来。现在换一个问题：我们有很多真实样本，却不为每个随机输入指定唯一目标，生成器怎样知道哪里需要改？GAN 的办法是让另一组参数学习辨别真实样本与当前生成样本，再把这种差异反馈给生成器。理解它不只要记住“两个网络”，还要追踪每一步谁看见什么、谁的参数改变。


<a id="ch04-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0001)


## 4.1 生成分布可以由过程定义


<a id="ch04-implicit-distribution"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-implicit-distribution)

从简单分布抽 $z$，经过生成器 $G_\theta(z)$ 得到样本。某类 $z$ 被映入某个输出区域，就决定了该区域的出现概率。模型因此定义了分布，即使我们不能方便地计算任意一张图的密度。**能采样**和**能显式计算概率密度**是不同能力；不应因为生成器只输出像素或坐标，就说它没有概率模型。


<a id="ch04-discriminator"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-discriminator)

判别器 $D_\psi(x)$ 接收真实数据和生成样本，尝试分辨来源。经典写法是


<a id="ch04-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0002)

$$\min_G\max_D\;\mathbb E_{x\sim p_{data}}\log D(x)+\mathbb E_{z\sim p(z)}\log(1-D(G(z))).$$


<a id="ch04-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0003)

这里反馈依赖当前 $D$ 的参数和当前 $G$ 的分布。它不是固定审美标准，更不是关于世界真实性的通用证书。真实数据若有水印等捷径，判别器也可能依赖这些差异；反馈从数据里学来，同时意味着它受到数据与训练的约束。


<a id="ch04-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0004)


## 4.2 一轮训练要切换两种责任


<a id="ch04-d-step"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-d-step)

**D 步。** 先固定生成器，取得一批真实样本 $x$ 和生成数值 $\tilde x=G(z)$。判别器希望真实样本得高分、生成样本得低分，所以最小化 $-\log D(x)-\log(1-D(\tilde x))$ 的批次平均。此步只更新 $\psi$。自动微分实现可把生成结果从 G 的计算图分离；假图仍作为数值进入 D，D 自己的参数仍能正常求梯度。


<a id="ch04-g-step"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-g-step)

**G 步。** 固定当前 D 的参数，让新生成样本再次经过 D。常用非饱和目标为 $-\log D(G(z))$，与原始 minimax 的生成器形式不同，目的是让生成样本获得更高判别分数。若某个生成点的分数从 0.2 提高到 0.6，此损失从约 1.609 降为 0.511；真正更新靠的是关于 G 参数的梯度，而不是用这个数值直接移动样本。


<a id="ch04-freeze-gradient"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-freeze-gradient)

**冻结 D 为什么还可以经过 D 反传？** 固定函数 $f(x)=2x$ 的系数不会让 $df/dx$ 消失。同样，G 步不改变 D 参数，却仍需要 D 对输入的导数，才能知道生成坐标怎样改变会提高评分。若把生成结果 detach，或把整个 D 前向放进禁止求导的区域，损失到 G 的这条路径就被切断。固定参数与删除输入导数必须分开理解。


<a id="ch04-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0005)


| 当前步骤 | 输入到 D 的对象 | 更新哪些参数 | 关于 G 的路径 |
| --- | --- | --- | --- |
| D 步 | 真实数据与当前生成数值 | D | 不沿假图追溯更新 G |
| G 步 | G 产生的样本 | G | 经 D 对输入的导数回到 G |
| 使用已训练模型 | 通常不需要 D | 通常都不更新 | 从新 $z$ 直接得到样本 |


<a id="ch04-training-use"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-training-use)

判别器主要在训练阶段塑造生成器。普通 GAN 使用时通常运行 G 即可，不是每出一张图都必须让 D 从候选中选一张。交替训练的另一后果是目标不断随对手改变：不能期待两条损失都像固定监督问题那样单调下降，也不能把 D 训练准确率接近 100% 当作一般目标。


<a id="ch04-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0006)


## 4.3 把反馈放到一个真的会学习的分布里


<a id="ch04-lab-world"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-lab-world)

LAB08 使用八个等权二维高斯簇：中心 $\mu_k=2(\cos(2\pi k/8),\sin(2\pi k/8))$，$k=0,\ldots,7$，每个坐标的标准差为 0.12。G 把二维标准正态 $z$ 映为二维点，D 区分真实点和生成点，两者都使用小型 MLP。没有人为规定某个 $z$ 必须到哪个簇；簇结构要通过反馈学习。


<a id="ch04-gan-training-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-gan-training-figure)

![LAB08同一组2048个潜变量，在初始化、1000和4000次G更新后的样本。上排D:G为1:1，下排3:1；灰点是真实参照，橙点是生成点，叉为八个中心，蓝色背景是当时D的真实概率判断。](https://codingai-lec04.pages.dev/course/experiments/learned/lab08-training.png)


<a id="ch04-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0007)

先横读橙点：初始化聚在中央，训练后向环上数据区域移动。再比较两排末态：上排八个簇附近都有点，但簇间也有很多点；下排若干簇更紧密，却对上、下两个中心明显欠覆盖。最后看蓝色背景，它来自当时的判别器，**不是数据密度**，也不是一份永远正确的老师答案。这些图来自本次实际训练，不是手写点轨迹。


<a id="ch04-metrics-definition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-metrics-definition)

本实验预先规定两个读法。近模式比例：全部 2,048 点中，到任一中心距离不超过 0.36 的比例。模式覆盖：某中心这个邻域内至少有全部样本的 1%，即至少 21 点，才算覆盖。这里是二维圆邻域，不能套用一维正态“3σ 覆盖 99.7%”的数字。两个指标互补：全部点挤到一个中心时，近模式比例可以很高，覆盖仍只有 1/8。


<a id="ch04-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0008)


| 相同 4,000 次 G 更新后 | 近模式比例 | 达到阈值的模式 |
| --- | --- | --- |
| 每轮 1 次 D 更新 | 54.25% | 8/8 |
| 每轮 3 次 D 更新 | 85.64% | 6/8 |


<a id="ch04-metrics-meaning"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-metrics-meaning)

两臂从相同 G/D 初始化开始，每轮使用相同真实批次、$z_D$ 和 $z_G$；3:1 对该 D 批次重复三次优化，因此 G 更新次数相同，D 计算量更多，不是等总算力比较。3:1 末态两个欠覆盖模式各有 10 和 16 点，并非严格零概率。这个固定实验说明本次更密集的样本伴随覆盖下降，没有证明多训 D 必然导致模式坍塌，也没有给所有 GAN 排名。


<a id="ch04-quality-coverage"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-quality-coverage)

“样本集中到簇附近”还没有完整匹配数据分布：把一个高斯簇压成中心上的单点，会丢掉簇内方差。真实图像里同样如此：每张脸都很逼真，不代表年龄、姿态或其他变化被覆盖；很多图看起来不同，也可能只在少数模式内换细节。损失、质量、覆盖与记忆需要分别观察。有限样本中一个罕见模式缺席，也要结合其概率与样本量解释。


<a id="ch04-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0009)


## 4.4 换一种分布差异，为什么还要约束评价者


<a id="ch04-wasserstein"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-wasserstein)

可选地看一个几何动机。真实分布集中在 0，生成分布集中在 10 或 1：两种生成都容易被区分，但我们希望目标能表达从 10 移到 1 是进步。Wasserstein 距离将概率质量与移动代价联系起来；WGAN 使用受 Lipschitz 条件约束的 critic 近似提供这种信号。它不是只删掉 sigmoid，更不能把有限训练得到的 critic 差值当作精确距离。这个小例帮助理解目标设计的动机，不是一条关于所有 GAN 必然失败的定理。[Wasserstein GAN](https://arxiv.org/abs/1701.07875) 给出原始方法。


<a id="ch04-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0010)


## 4.5 有条件地画：评价者也要看条件


<a id="ch04-conditional-d"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-conditional-d)

现在输入变成建筑线稿 $A$，输出应是同一布局的立面图 $B$。无条件判别器只看 $B$，可能接受一张逼真但门窗不对应的房屋。条件判别器同时读取 $(A,B)$，才能把“像真图”与“和输入相配”一起纳入反馈。生成器也要读取 $A$；若另有随机变量 $z$，则要检查输出是否真正利用它，而不能只确认接口上多了一根输入线。


<a id="ch04-paired-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-paired-figure)

![三组建筑线稿与外观示意按行配对；同一行的楼层、屋顶与门窗位置建立内容对应，不同行建筑没有逐项监督关系。](https://codingai-lec04.pages.dev/assets/v4-paired-translation.jpg.webp)


<a id="ch04-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0011)

本图为课程 ImageGen 示意，不是 pix2pix 的推理结果。沿每一行找屋顶、门和窗的位置，才能看到“配对”提供了什么。两堆图片数量相同、排序相同，都不意味着它们描述同一个内容；错误配对会把本应保留的几何关系变成错误监督。


<a id="ch04-pix2pix-three-parts"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-pix2pix-three-parts)

在 pix2pix 中，三项设计承担不同职责。配对数据提供“这个输入对应这个目标”的监督；U-Net 跳连把编码端已有的空间细节送到解码端，减少从窄瓶颈重新恢复轮廓的负担；局部 PatchGAN 判别器评估一片区域是否符合条件下的目标外观。数据关系、架构信息通路和损失的观察范围是三层选择，不能用“用了 U-Net”代替整个方法解释。


<a id="ch04-pix2pix-objective"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-pix2pix-objective)

典型目标将条件对抗项与配对 $L_1$ 项结合：$\mathcal L_{cGAN}+\lambda\mathbb E_{A,B}\|B-G(A)\|_1$。$L_1$ 看对应位置的偏差，对抗项学习更复杂的外观差异。局部纹理都合理也可能整体多一个窗口，因而 PatchGAN 不是全局语义裁判。若额外使用感知特征距离，它又依赖所选表征；这几种损失互补，但任何一项都不能自动保证文字、数量或测量细节真实。


<a id="ch04-restoration-truth"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-restoration-truth)

例如低分辨率文字缺了一个笔画，高分辨率结果有很多种都能缩回相同输入。对抗或感知目标可以补得更自然，却不证明补出的笔画就是原文。此时需要保存输入、区分可恢复信息与模型补充，并按用途验证。增强照片的自然感与恢复事实细节是不同任务。


<a id="ch04-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0012)


## 4.6 没有配对时，循环增加了什么信息


<a id="ch04-cyclegan-setup"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-cyclegan-setup)

假设只有一堆夏景 $X$ 和一堆冬景 $Y$，没有同地点的对应图。CycleGAN 设置两个映射 $G:X\to Y$、$F:Y\to X$：$D_Y$ 比较真实冬景与 $G(x)$，$D_X$ 比较真实夏景与 $F(y)$。对抗项让输出像目标域，却没有单独指定哪张夏景应对应哪张冬景。


<a id="ch04-two-cycles"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-two-cycles)

循环一致性补上往返约束：$x\xrightarrow{G}\hat y\xrightarrow{F}\hat x$ 应接近原 $x$，而 $y\xrightarrow{F}\hat x\xrightarrow{G}\hat y$ 应接近原 $y$。相应损失为


<a id="ch04-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0013)

$$\mathcal L_{cyc}=\mathbb E_x\|F(G(x))-x\|_1+\mathbb E_y\|G(F(y))-y\|_1.$$


<a id="ch04-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0014)

如果 G 把所有输入都压成同一张图，F 一般无法仅凭这张相同的中间图恢复不同输入，所以循环约束限制了这种退化。但“信息能恢复”与“中间翻译语义正确”仍是不同要求。


<a id="ch04-cycle-counterexample-figure"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-cycle-counterexample-figure)

![四类建筑的错误双射：尖顶住宅到平顶楼，平顶楼到双塔，双塔到圆顶馆，圆顶馆到尖顶住宅；反向映射准确返回原图。因此循环误差为零，但按建筑身份的对应全部错误。](https://codingai-lec04.pages.dev/assets/labs-v13/lab03-buildings-cycle.png)


<a id="ch04-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0015)

这幅图来自 LAB03 的有限枚举与课程构造，不是训练过的 CycleGAN。先看中间行：它仍包含四类建筑，每类频率不变；再看最下面：每张输入都回来了。若任务要求建筑身份不变，中间行却全部错配。往返与边际分布都正确，没有唯一确定想要的跨域关系。


<a id="ch04-cycle-math"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-cycle-math)

有限版本非常直接：两域各有四种等频建筑，任意置换 $\pi$ 都能保持输出频率；令反向映射为 $\pi^{-1}$，循环误差便为零。一共有 $4!=24$ 个这种候选。加入一条正确配对锚点后，还有 $3!=6$ 个；两条相容锚点后还剩 $2!=2$ 个。配对提供的关系信息因此可计算地缩小了歧义，而不只是多一个训练样本。


<a id="ch04-identity-loss"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-identity-loss)

identity loss 可进一步鼓励“输入已经属于目标域，就少改动”，例如让 $G(y)\approx y$。这里 identity 指恒等映射，不是人脸身份识别，也不能单凭名字保证跨域人物身份保持。约束能减少某些不必要变化，却仍需独立检查任务语义。CycleGAN 的有效应用来自数据结构、网络偏置与目标共同作用，不由一个循环公式独立保证。


<a id="ch04-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0016)


## 4.7 BicycleGAN：让多解入口留下可恢复的影响


<a id="ch04-bicycle-motivation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-bicycle-motivation)

回到配对建筑任务。固定门窗布局，墙面可以是砖、灰泥或木饰面。如果把不同 $z$ 全映成同一张砖墙图，生成器虽然接收随机输入，却没有使用它；如果变化只是几个噪点，也未必带来有价值方案。BicycleGAN 将图像重建和潜变量恢复两条回路结合，鼓励固定条件下的多种输出。这里文献中的 multimodal 指多种输出模式，并不一定指文字、图像、声音等媒介。


<a id="ch04-bicycle-loops"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-bicycle-loops)

把输入条件记为 $A$、配对真实目标记为 $B$，就能明确画出两条回路：


<a id="ch04-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0017)


| 回路 | 从哪里开始 | 实际前向计算 | 与什么比较 |
| --- | --- | --- | --- |
| 图像重建回路（cVAE-GAN） | 真实配对 $(A,B)$ | 编码器从 $B$ 给出潜分布，抽 $z_B$；生成器读取 $(A,z_B)$ 得到 $\hat B$ | $\hat B$ 与真实 $B$；潜分布同时受先验约束 |
| 潜变量恢复回路（cLR-GAN） | 条件 $A$ 与先验抽样 $z$ | 生成器读取 $(A,z)$ 得到 $\tilde B$；编码器从 $\tilde B$ 估计 $\hat z$ | $\hat z$ 与本次实际抽取的 $z$ |


<a id="ch04-bicycle-first-loop"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-bicycle-first-loop)

第一条从真实目标开始，因此它知道应当重建哪张图片。$A$ 提供布局，$B$ 的编码提供这一次目标的额外变化，二者一起进入生成器。不能漏掉条件 $A$，否则回路就不再表达“在这张线稿下重建这张外观”；也不能把本次编码来的 $z_B$ 与任意先验 $z$ 混为一谈。近似后验到先验的约束使生成时可从规定分布取起点，与第三章形成直接联系。


<a id="ch04-bicycle-second-loop"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-bicycle-second-loop)

第二条没有为随机 $z$ 配一张唯一真图。它先生成，再要求编码器恢复原 $z$。若 G 完全忽略 $z$，同一 A 下许多 $z$ 得到相同 $\tilde B$，编码器无法从同一图恢复不同答案，潜重建误差就暴露这个问题。对抗反馈继续约束生成外观。两条回路合起来促进“输出能回应潜变量、又符合输入条件”，但不保证潜维分别对应人类命名的材质、颜色或姿态，也不保证所有模式都被覆盖。


<a id="ch04-munit"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-munit)

没有配对时，MUNIT 采用内容与风格分开的建模假设：跨域传递内容表示，在目标域取风格，再组合输出，并用重建等目标支持分工。对于本例，门的位置可视为内容、墙面材质可视为变化；另一个任务可能恰好需要识别材质，因而这不是自然界固定的划分。变量叫“内容”或“风格”不构成分解成功的证据，仍要固定输入、展示完整候选并检验受保护的关系。


<a id="ch04-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0018)


## 4.8 控制潜变量，与编辑真实照片仍有一段距离


<a id="ch04-style-control"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-style-control)

StyleGAN 提供中间潜空间与多尺度调制入口，使控制不必只发生在生成器最初输入。改变不同层的风格、改变局部随机噪声，可以观察形体与细节如何响应。但语义不是人工写死在每层：一个方向可能同时影响多个属性，作用也可能随输入改变。固定其他量、只干预一个入口，才有机会判断变化来自哪里。


<a id="ch04-inversion"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-inversion)

真实照片并不自带生成器潜变量。编辑前往往先反演：用优化或编码器找到 $z^*$，让 $G(z^*)$ 尽量重建输入，再沿某个方向改变 $z$。因此需要看三张图：原图、未编辑重建、编辑结果。如果一处细节在第二张已经消失，就不能把它全部归因给编辑方向；它可能来自生成器表达范围或反演误差。


<a id="ch04-inversion-formula"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-inversion-formula)

一个简化表达是 $z^*\approx\arg\min_z\mathcal L_{recon}(G(z),x)$，随后 $z_{edit}=z^*+\alpha n$。改变 $\alpha$ 是使用时的控制，并不重新训练 G；较大步长可能离开熟悉区域，产生副作用。即使去掉某个线性方向能在局部保护一个属性，也不能推出任意输入、任意幅度下都能作可靠因果干预。


<a id="ch04-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-u0019)


## 4.9 自检：把不同约束的责任说清


<a id="ch04-exercise"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-exercise)

**练习。** 一个建筑翻译系统输出逼真，往返误差很低，换随机输入也能改变纹理。还缺什么，才能说它学会了“保持建筑布局的多种合理外观”？


<a id="ch04-answer"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-answer)

**参考答案。** 需要直接检查门窗与建筑身份是否保持，因为逼真和循环没有排除错配；需要在固定同一输入下展示全部采样，区分有意义材质变化、无关噪点和失败；还要说明潜变量是否真正影响输出，以及样本覆盖的范围。若用于真实照片编辑，还需增加未编辑重建图，分离反演与编辑误差。上述条件可以分别满足，也可以分别失败，不能让一个漂亮例子替整套任务作证。


<a id="ch04-practice-bridge"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-practice-bridge)

**继续阅读与实践。** [LAB08](https://codingai-lec04.pages.dev/course/notebooks/lab08.html) 让你从保存图回到 D/G 的实际梯度与参数更新；[LAB03](https://codingai-lec04.pages.dev/course/notebooks/lab03.html) 用可枚举反例检查循环与配对锚点。前者真正训练二维网络，后者故意不训练，直接检验约束是否足以确定语义。两项实验回答不同问题，都不冒充 pix2pix 或 CycleGAN 的真实图像复现。下一章再换一种监督来源：自己制造带噪输入和已知答案，学习局部预测，再用采样规则组成完整结果。


<a id="ch04-sources"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch04-sources)

**来源与延伸。** 本章沿 N21–N28 与现有数学说明重组，课程实验数据另见 LAB08。原始方法入口：[GAN](https://arxiv.org/abs/1406.2661)、[pix2pix](https://arxiv.org/abs/1611.07004)、[CycleGAN](https://arxiv.org/abs/1703.10593)、[BicycleGAN](https://arxiv.org/abs/1711.11586)、[MUNIT](https://arxiv.org/abs/1804.04732)、[StyleGAN](https://arxiv.org/abs/1812.04948)。图像示意解释任务，枚举实验解释约束，真实小 GAN 解释学习过程；它们的证据身份分别保留。


<a id="ch05"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05)


# 5. 从局部预测到完整样本


<a id="ch05-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0001)

看见一张几乎被噪声淹没的杯子，直觉上会问：模型怎样把它修好？这个问题只讲出了训练的一半。训练者取出一张已知图像，主动制造受损版本；生成者则从一份新噪声出发，没有指定原图等着被找回。本章要接通这两件事：怎样用有答案的局部训练题，学会从简单随机起点生成整个样本分布。


<a id="ch05-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0002)

前一章的 GAN 用判别器提供学习反馈。扩散选择了另一种可重复制造的反馈：我们亲手改变数据，因此知道加了什么噪声、原样本是什么。网络学习局部预测，采样器再把很多次局部判断组成一份新结果。读完本章，应能在一段代码里指出：哪里在造题，哪里在更新参数，哪里只是在更新当前样本。


<a id="ch05-training-question"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-training-question)


## 训练者怎样制造有答案的题


<a id="ch05-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0003)

令 $x_0$ 表示一张训练图，$\epsilon\sim\mathcal N(0,I)$ 是独立抽取的高斯噪声。选一个噪声等级 $t$，构造


<a id="ch05-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0004)

$$x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\,\epsilon.$$


<a id="ch05-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0005)

$\bar\alpha_t$ 决定还保留多少信号；平方根是振幅，$\bar\alpha_t$ 本身是系数的平方。经典 DDPM 先规定单步 $\alpha_t=1-\beta_t$，再令 $\bar\alpha_t=\prod_{s=1}^t\alpha_s$。若两步都取 $\alpha=.8$，累计是 $.64$，但原图前的振幅是 $.8$。这个小区别决定网络收到的噪声等级，不能把横线当作可省略的记号。


<a id="ch05-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0006)

前向线性高斯链允许直接抽某一时刻的边缘样本，所以训练不必逐步算完此前所有加噪状态。一次更新可以随机取 $t$，构造 $x_t$，把 $(x_t,t)$ 给网络，以亲手抽到的 $\epsilon$ 为标签。网络权重 $\theta$ 通过大量不同图像、噪声与时间题目共享学习；$x_0$ 只在监督侧使用，并未作为答案偷偷输入预测器。[DDPM 原文](https://arxiv.org/abs/2006.11239)给出这种训练与生成的分工。


<a id="ch05-one-dimensional"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-one-dimensional)

**把一张图暂时缩成一个数。** 设 $x_0=2$、$\bar\alpha_t=.64$、$\epsilon=-.5$，则 $x_t=.8\times2+.6\times(-.5)=1.3$。训练者知道全部数；生成者只得到 $1.3$、噪声等级和允许的条件。如果网络预测 $\hat\epsilon=-.3$，可估计


<a id="ch05-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0007)

$$\hat x_0=\frac{x_t-\sqrt{1-\bar\alpha_t}\hat\epsilon}{\sqrt{\bar\alpha_t}}=\frac{1.3+.18}{.8}=1.85.$$


<a id="ch05-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0008)

这里误差是预测造成的，不是代数除法造成的。仅凭 $x_t=1.3$ 无法唯一反求原样本：还不知道它是哪个干净值与哪一份噪声混合而成的。生成需要数据给出的统计规律，而不是对一条公式做无条件求逆。


<a id="ch05-training-sampling"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-training-sampling)


| 时刻 | 可用信息 | 改变的对象 | 成功意味着什么 |
| --- | --- | --- | --- |
| 训练造题 | 数据 $x_0$、自抽噪声、时间 | 构造网络输入与监督标签 | 题目符合规定的前向过程 |
| 参数学习 | 带噪输入、允许条件、监督标签 | 共享权重 $\theta$ | 对未见题目的局部预测改善 |
| 采样生成 | 当前状态、时间、固定权重、允许条件 | 当前样本 $x_t$ | 最终样本群接近目标分布 |


<a id="ch05-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0009)

给同一张原图的不同时间各抽一份独立噪声，只保证每帧符合相应边缘分布；始终复用一份噪声，又得到另一种跨时刻关联。两者都不能仅凭“每帧的公式相同”就称为原始 DDPM 马尔可夫轨迹。教学图若采用共享噪声插值，应按其实际构造理解。研究路径时要保存抽样关系，研究单时刻训练题时则不必制造整条路径。


<a id="ch05-posterior"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-posterior)


## 明明有解析后验，为什么还要学习


<a id="ch05-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0010)

前向链已知时，$q(x_{t-1}\mid x_t,x_0)$ 是可计算的高斯分布。它回答“知道这张原图和当前受损状态，前一步可能在哪里”。生成需要的却是 $q(x_{t-1}\mid x_t)$：原图尚未出现，必须汇总所有可能来处。两者相差的 $x_0$ 正是核心未知量。


<a id="ch05-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0011)

以两步 $\alpha_1=\alpha_2=.8$ 为例，给定 $x_0=2$ 与 $x_2=1.3$，解析后验均值约 $1.6398$、方差 $1/9$。即使首尾都知道，中间状态仍不唯一，因为两步各有随机增量。若抽标准正态值 $z=-.6$，一次后验样本为 $1.6398+(1/3)(-.6)=1.4398$。平均值与一次样本不同，恰恰符合概率模型。


<a id="ch05-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0012)

可选数学：令 $\tilde\beta_t=\beta_t(1-\bar\alpha_{t-1})/(1-\bar\alpha_t)$，解析后验为 $\mathcal N(\tilde\mu_t,\tilde\beta_tI)$，其中


<a id="ch05-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0013)

$$\tilde\mu_t=\frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t}x_0+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}x_t.$$


<a id="ch05-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0014)

代入上例，两个均值系数都约为 $.4969$，得到 $.4969\times(2+1.3)\approx1.6398$；系数相等是本例日程的巧合。它为训练提供可核对的目标；生成模型则用学得预测替代未知的数据依赖部分。有限步的单高斯逆转移是一种建模选择，并不表示真实混合后的逆条件总是单高斯。是否学习逆方差、最后一步怎样处理，也要与所用目标和采样器配套。


<a id="ch05-local-average"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-local-average)


## 局部平均，怎样通向多样的样本


<a id="ch05-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0015)

用平方误差预测噪声时，理想函数是 $\epsilon^*(x_t,t)=\mathbb E[\epsilon\mid x_t,t]$。给定同一个带噪观察，可能有不同原图和噪声与之相容；网络不可能识别隐藏抽样的“身份证”，只能学习条件平均。这个平均发生在当前状态的局部预测上，随后还要进入生成动态；它不是把所有训练图片平均成一张最终图片。


<a id="ch05-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0016)

LAB05 把这件事做成可精确核对的例子：干净数据只取 $-1$ 与 $+1$，带噪观察为 $.5$，累计信号系数为 $.64$。贝叶斯公式给 $P(x_0=+1\mid x_t=.5)\approx.9022$。于是干净值条件均值约为 $.8045$，但真实干净数据仍只在两个端点。若将这个均值直接当作唯一终点，就误解了局部预测的用途；后续采样关系才负责把分布组织起来。


<a id="ch05-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0017)

![LAB05 解析噪声预测的保存结果：比较零预测、贝叶斯条件均值与人为加上0.5偏差后的误差。此图来自可解分布，不是神经网络训练。](https://codingai-lec04.pages.dev/assets/labs-v13/lab05-noise-prediction.png)


<a id="ch05-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0018)

**读图顺序。** 先看输入对应哪些可能来源，再看条件平均如何变化，最后读误差。保存结果中零预测 MSE 为 $1$，贝叶斯预测约 $.4737$，加上 $.5$ 的固定偏差后约 $.7237$；增加的 $.25$ 来自平方偏差。最优误差不为零，反映观察没有保留足够信息，并不说明公式失效。LAB05 是解析参照；LAB09 才把相同教学问题带到共享参数学习，二者的噪声参数化与采样器需对齐后才能作数值比较。


<a id="ch05-objective"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-objective)


## 网络预测什么，与在哪个空间计分，是两个选择


<a id="ch05-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0019)

噪声、干净图和某种速度参数化可以在非退化系数下相互换算。但有限网络直接输出哪一种量，以及损失在哪个空间计算，会影响信息需求和优化权重。上面的式子给出


<a id="ch05-u0020"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0020)

$$\hat x_0-x_0=-\sqrt{\frac{1-\bar\alpha_t}{\bar\alpha_t}}(\hat\epsilon-\epsilon).$$


<a id="ch05-u0021"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0021)

因此，相同噪声预测误差在低信号处会变成更大的干净值误差；对两种输出都使用未加权 MSE，不会自动得到同一个训练目标。经典 DDPM 的变分下界可以导出带时间权重的局部回归；实践中的简单噪声 MSE 去掉部分权重，是重新分配学习重点，不能一概说成只省略了常数。


<a id="ch05-u0022"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0022)

JiT 的研究据此重新检验干净图预测，使用直接作用于像素 patch 的 Transformer，区分网络直接输出、损失空间与采样使用的量。它的贡献不是首次想到“预测干净图”，也不是把“能输出干净图估计”变成“一步生成”。原文仍使用多步求解；自然图像的低维结构与高维噪声对有限网络的要求，是论文研究的具体问题。[JiT 原文 §3–4](https://arxiv.org/html/2511.13720v2#S3)由 Tianhong Li 与 Kaiming He 撰写，阅读时要同时核对表示、容量和训练预算。


<a id="ch05-sampling"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-sampling)


## 采样器把预测接成一条路线


<a id="ch05-u0023"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0023)

训练结束后，参数通常固定。采样器从简单分布抽新起点，再反复调用预测器。经典祖先采样将预测转为逆均值 $\mu_\theta(x_t,t)$，然后取 $x_{t-1}=\mu_\theta(x_t,t)+\sigma_t z$，其中 $z$ 是这一步新抽的噪声。它与前向造题时的 $\epsilon$ 角色不同。删除随机项会改变算法；不能假定余下均值路线仍采到同一分布。


<a id="ch05-u0024"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0024)

DDIM 展示另一种重要分工：可以复用已有噪声预测器，改变生成路径和时间网格；在相应确定性设置下，给定初始噪声便得到确定路线。确定路线仍能产生多样样本，因为初始噪声是随机的。减少时间点会改变数值误差和结果，原本训练了很多噪声等级，并不保证任意跳步都准确。[DDIM 原文](https://arxiv.org/abs/2010.02502)讨论的是路径与采样设计，不是重新定义图片质量。


<a id="ch05-score"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-score)

**选读：score 与连续动态。** $s_t(x)=\nabla_x\log p_t(x)$ 是当前带噪分布的对数密度梯度。对于上述高斯扰动，它与理想噪声预测满足 $s_t(x)=-\epsilon^*(x,t)/\sqrt{1-\bar\alpha_t}$。score 是有方向的向量，不是概率值、审美评分或置信度。平滑密度峰顶的梯度通常为零；沿梯度一直爬到峰顶是优化，不等于按整个分布取样。


<a id="ch05-sde-ode"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-sde-ode)

若前向 SDE 为 $dx=f(x,t)dt+g(t)dW_t$，状态无关的 $g(t)$ 下，逆时间 SDE 的漂移涉及 $f-g^2s_t$，概率流 ODE 则使用 $f-\tfrac12g^2s_t$。这里逆过程沿 $t$ 递减积分；离散实现必须明确有向时间步。理想 score 和相应正则条件下，两者可具有同一时刻的边缘分布，但不是同一条路径。只把 SDE 随机项删掉而不改漂移，不会自动得到概率流 ODE。[Score-based SDE 原文](https://arxiv.org/abs/2011.13456)给出这一联系。


<a id="ch05-u0025"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0025)

布朗增量的每维方差等于时间间隔，因此正向长度 $\Delta t>0$ 的 Euler–Maruyama 步里，漂移按 $\Delta t$ 缩放、噪声按 $\sqrt{\Delta t}$ 缩放。把步长缩成四分之一，漂移缩成四分之一，噪声标准差只缩成二分之一。$W_t$ 是布朗运动，不是网络权重。这条小算例帮助检查模拟代码中看似无害的时间缩放错误。


<a id="ch05-learned-denoiser"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-learned-denoiser)


## 真正训练一次：参数学到了什么


<a id="ch05-u0026"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0026)

LAB09 把解析预测换成一个可学习的小网络。数据是半径2的圆周上八个二维高斯簇，每簇标准差 $.12$；它与 LAB08 的 GAN 共用这份分布，便于比较训练信号与采样过程。训练题采用 $x_t=\alpha_t x_0+\sigma_t\epsilon$，其中 $\alpha_t=e^{-5t}$、$\sigma_t=\sqrt{1-e^{-10t}}$。**这里 $\alpha_t$ 表示信号振幅，等于前文 $\sqrt{\bar\alpha_t}$ 的角色**，不能照搬符号漏掉平方根。


<a id="ch05-u0027"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0027)

预测器由一个固定的同均值同方差高斯线性支路，加上64→64→2的时间条件 MLP 残差组成。初始化已经知道数据的零均值与每轴方差 $2.0144$，但没有八个模式的位置分配；所有共享 MLP 参数通过噪声 MSE 更新。训练标签始终是亲手抽取的 $\epsilon$，没有用解析条件均值蒸馏网络。这个披露帮助辨认预置结构与真正学得的结构。


<a id="ch05-learned-schedule"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-learned-schedule)

训练与采样使用时间的方式也要一起读。LAB09 训练从 $U\sim\mathrm{Uniform}(0,1)$ 构造 $t=.001+.999U^2$，让固定预算更多覆盖低噪声题；损失是在这个时间分布下对样本与两个坐标求平均的噪声 MSE，不能直接称为均匀时间下的原始 DDPM 权重。采样采用 DDIM 的 $\eta=0$ 确定性更新，正时间网格从 $1$ 均匀降至 $.001$；20步与100步分别表示20次与100次预测器调用，最后用末次预测得到的 $\hat x_0$ 作为数据端输出。起点从标准正态抽取，和 $t=1$ 的真实前向边缘近似而非严格相等。两个比较分支共享这些选择，解析预测器也没有消除时间离散、末端处理与起点近似的误差。


<a id="ch05-learned-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-learned-results)

![LAB09固定2048个相同噪声起点的实际采样。列依次是初始化、2000次更新、8000次更新、匹配的解析预测器；上排20次预测，下排100次预测。灰色为真实样本，橙色为学得分支，青色为解析参照。](https://codingai-lec04.pages.dev/course/experiments/learned/lab09-training-and-steps.png)


<a id="ch05-u0028"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0028)

先沿下排从左向右读：初始化的散点经训练逐渐形成八个模式。再固定8000次更新这一列上下比较：100步比20步更集中到簇附近。最后看最右列：解析预测器也会受到有限步采样影响。它与学习器用的是同一八模分布、噪声日程、时间网格和2048份初始噪声，因此这里可以直接比较；LAB05 的另一分布与另一参数化则不能直接混进这张排名表。


<a id="ch05-u0029"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0029)

4096份固定未见训练题上，对抽样噪声的 MSE 从 $.34665$ 降到 $.24462$；同题解析条件均值的误差仍为 $.22569$，因为观察存在不可消除的条件不确定性。网络与解析条件均值之间的 MSE 则从 $.11890$ 降到 $.01875$。两组量分别回答“实际题目答得如何”和“离最佳均方预测还有多远”。


<a id="ch05-learned-errors"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-learned-errors)

生成结果带来更具体的反例：从2000到8000次更新，预测误差下降，但20步下落在模式邻域的比例从 $61.23\%$ 降到 $58.89\%$；固定8000次更新，改为100步则为 $80.03\%$。邻域在此定义为距最近中心不超过 $.36$，覆盖另要求每簇至少占总样本的 $1\%$。这个变化说明局部预测误差与某个离散采样器的终点分布不是同一个指标。所有这些训练后设置都覆盖8/8模式，也仍不能因此忽略簇间散点与模式内方差。


<a id="ch05-u0030"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0030)

学得分支的采样器只读取当前坐标、时间、日程与网络预测，没有目标 $x_0$ 或解析答案。解析参照单独运行，方便区分网络近似与数值更新；它不是偷偷把学得终点吸到中心的补丁。第一次实践只需固定最终权重和起点，将20步改为100步，再读轨迹；无需重训就能回答一个有边界的问题。完整条件、图、代码和结果在 LAB09 中保留，本课不依据这次小预算训练给 GAN 与扩散家族排名。


<a id="ch05-cfg"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg)


## 同一状态下，两支预测怎样改变条件的影响


<a id="ch05-u0031"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0031)

在 LAB06 的固定模型里，提示词是“窗边木桌上的红色陶瓷杯，柔和日光，静物照片”。它已经说明了颜色与物体，为什么还要调 CFG？因为**给模型条件**与**在采样时放大条件对预测的影响**是两件事。训练得到的条件预测不是一套逐字保证约束成立的规则；有限模型仍可能弱化条件，或把条件的多个方面处理得不均衡。


<a id="ch05-u0032"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0032)

先把视线停在生成过程的某一步。当前潜变量记为 $z_t$，时间为 $t$。权重固定的同一个预测网络作两次判断：一次读取提示文本的表示 $c$，得到 $\epsilon_c=\epsilon_\theta(z_t,t,c)$；一次读取空文本的表示 $\varnothing$，得到 $\epsilon_u=\epsilon_\theta(z_t,t,\varnothing)$。两次的 $z_t$ 和 $t$ 必须相同。差值 $\epsilon_c-\epsilon_u$ 才能表达在这一状态、这一时刻加入条件带来的预测差异。空条件分支的可靠性来自相应训练，通常通过训练时随机丢弃条件获得；使用时随意清空一个从未这样训练过的模型输入，并不能自动得到有效无条件预测。


<a id="ch05-cfg-combination"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg-combination)

本课使用的组合约定是


<a id="ch05-u0033"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0033)

$$\epsilon_{\mathrm{CFG}}=\epsilon_u+s(\epsilon_c-\epsilon_u).$$


<a id="ch05-u0034"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0034)

它将同一位置的两个**预测张量**相减、缩放、相加，再将结果交给 scheduler 更新 $z_t$。它没有把两张生成结束的照片混合，也没有把文字变成一个事后审美分数。下一步会用新的状态重新计算两支预测，因此条件影响贯穿生成过程。


<a id="ch05-cfg-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg-example)

**可以手算的一次组合。** 为看清运算，暂用两个数表示张量的两个坐标，设空条件预测为 $(0.2,-0.1)$，有条件预测为 $(0.4,-0.2)$。差为 $(0.2,-0.1)$。当 $s=1$ 时，组合恰好等于有条件预测 $(0.4,-0.2)$；当 $s=4$ 时，得到 $(1.0,-0.5)$。这组数是教学算例，不是 SD 1.5 实测的中间张量。数值变大只表示沿两支预测的差异外推，不能把每一坐标解释成“更红一点”或“更正确一点”。scheduler 还会依据当前状态、时间网格和预测参数化，将组合转成下一状态。第6章提供[真实SD 1.5组件调用与数值](https://codingai-lec04.pages.dev/lecture.html#ch06-component-numeric)，可以把这组便于手算的示意与实际张量运算对照。


<a id="ch05-u0035"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0035)

按这条数学公式，$s=0$ 会取空条件预测。但**公式的参数与软件开关必须分别读**：本课固定的 Diffusers 0.35.1 `StableDiffusionPipeline` 在 `guidance_scale>1` 时才执行双分支；`s=1` 直接用文本条件预测，`s≤1` 也不会自动替你改成空文本。本实验没有把 `s=0` 当作无条件生成组。负提示固定为空字符串；若换成有内容的 negative prompt，第二支的含义也随之改变，不能再无条件称为完全无条件分支。


<a id="ch05-cfg-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg-results)

![同一初始潜变量下的真实 CFG 图阵：三行分别为 seed 11、23、37，三列为 CFG 1、4、8。每行固定文本、模型、DDIM 20步与初始潜变量，只改变引导系数。](https://codingai-lec04.pages.dev/course/experiments/image-lab/figures/cfg.png)


<a id="ch05-u0036"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0036)

**怎样读这张图。** 先横读第一行：CFG 1 的图主要是窗边环境，CFG 4 与 8 的红杯更突出。再横读第二行：杯子的尺度、位置和双色外观随引导变化，不能只看红色鲜不鲜。最后读第三行：CFG 8 除了杯子，还出现另一个较大的红色容器。红色更显著与“只出现期望的那只杯子”没有同步改善。随后才纵读，确认相同超参数在不同随机起点上并不产生同一种变化。图阵保留了三个预定种子的全部结果，没有重新选种子去证明“越大越好”。


<a id="ch05-cfg-judgment"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg-judgment)

这个观察把评价拆成三个具体问题：提示中的对象与关系是否成立；局部形体、材质与光线是否自然；一批输出是否保有不同的合法结果。三行图足以指出某次变化和反例，却不足以估计整体成功率或多样性。CFG 是模型预测与采样的选择，不是约束求解器。对要求严格的任务，还要独立检查数量、空间关系和其他条件；若结果不合格，应修正生成过程或筛选策略，不能因为引导系数大就先判成功。


<a id="ch05-u0037"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0037)

**计算代价也发生了变化。** 常规双分支 CFG 每个更新时间需要两份预测。实现可以把它们放进同一批次，但计算与显存需求仍须记入总成本。这里的 CFG 图阵没有测出最优系数，也没有证明速度收益。若要比较不同设置，应在同一任务、样本数和质量要求下记录完整运行。


<a id="ch05-cfg-selfcheck"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg-selfcheck)

**自检与回答。** “提示已经写明红杯，所以 CFG 8 必然比 CFG 4 更正确吗？”不必然。提示提供条件，CFG 改变两支预测差异在采样中的力度；外推会同时影响相互耦合的外观、位置和数量。本组 seed 37 的额外容器就是需要分别评价的理由。“两支能不能各用一个随机起点？”不能据此得到本节定义的差值：那样同时改了状态，无法将差异归于文本条件。


<a id="ch05-u0038"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0038)

继续阅读与实践：[LAB06 的 CFG 对照](https://codingai-lec04.pages.dev/course/experiments/image-generation.html#cfg)。先选同一行写下“固定了什么、变了什么、实际看见什么”，再到同册 Deepnote 只改一项参数。回课堂：[N34](https://codingai-lec04.pages.dev/classroom/N34.html)。机制来源：[Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598)；实现约定见 [Diffusers 0.35.1 源码](https://github.com/huggingface/diffusers/blob/v0.35.1/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py)。


<a id="ch05-representation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-representation)


## 计算发生在哪里：表示、网络与目标


<a id="ch05-u0039"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0039)

一张大图在每一步都被完整处理，代价会累积。潜空间扩散先用已训练的编码器把图像变成较紧凑的空间表示，在这个表示上训练生成先验，最后解码成像素。压缩器决定能保存多少细节，生成先验决定怎样产生相容的潜表示。压缩重建的失真与生成先验的错误是两层问题：前者即使在输入真实图像时也可能发生，后者则发生在构造新潜样本时。


<a id="ch05-u0040"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0040)

U-Net 与 DiT 回答的是预测网络怎样处理当前状态、时间与条件。U-Net 使用多尺度路径与跳接；DiT 把图像或潜网格分成 token，用 Transformer 组织交互。换骨干不自动改变噪声回归目标，使用 Transformer 也不自动等于自回归。研究系统时，把“表示是什么、直接预测什么、怎样计分、怎样采样”写成四项，比争论整个系统只能属于哪一类更有用。[Latent Diffusion](https://arxiv.org/abs/2112.10752)与 [DiT](https://arxiv.org/abs/2212.09748)分别提供这两类改变的典型例子。


<a id="ch05-flow"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-flow)


## 从一份训练配对，学到一群样本的方向场


<a id="ch05-u0041"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0041)

另一种造题方法是取数据端点 $x$ 与噪声端点 $\epsilon$，规定中间路径。本节沿用**数据在 $t=0$、噪声在 $t=1$**的约定：$z_t=(1-t)x+t\epsilon$，每对端点的速度为 $\epsilon-x$。训练时把 $(z_t,t)$ 交给网络，让它预测该速度；生成时没有数据端点，只从新噪声沿学得场反向积分。


<a id="ch05-u0042"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0042)

为何训练路径是直线，生成路径却会转弯？同一位置附近可能出现许多不同配对的监督方向。平方损失把它们汇成条件平均场 $v(z,t)=\mathbb E[\epsilon-x\mid z_t=z]$。模型沿场移动以后，所处位置与可相容的配对改变，下一步方向也随之改变。直的是单份造题路径，真正积分的是汇总后的场。[Flow Matching](https://arxiv.org/abs/2210.02747)由 Yaron Lipman 等提出，核心是学习预定概率路径的向量场，而不是推理时知道训练端点。


<a id="ch05-u0043"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0043)

“Flow”也不是一个唯一算法。传统 normalizing flow 用可逆变换及 Jacobian 条件计算密度；连续 flow 用微分方程描述分布演化；Flow Matching 是训练向量场的方法。Rectified Flow 的 reflow 则先用现有运输得到新的起终点配对，再训练新路径，使其更便于少步求解。新配对可能继承现有模型遗漏，重新生成训练对和训练的成本也要计算。[Rectified Flow 原文](https://arxiv.org/abs/2209.03003)由 Xingchao Liu、Chengyue Gong 与 Qiang Liu 撰写。


<a id="ch05-step-error"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-step-error)

![LAB05 固定起点下的解析场步数对照。轨迹与终点分布说明积分步数改变数值误差；这里没有训练网络。](https://codingai-lec04.pages.dev/assets/labs-v13/lab05-flow.png)


<a id="ch05-u0044"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0044)

**看这张图时先固定起点，再比较更新路线，最后看终点分布。** 本课解析高斯参照的保存结果里，一步更新把方差压到接近零；4、16、64步得到的经验方差约为 $.1175$、$.2103$、$.2417$，逐渐接近目标 $.25$。这是这个场与这个数值方案的结果，不是“一步模型必然坍缩”的证据。一部专门训练跨段关系的模型，回答的学习问题不同。LAB09 的学得网络还带入函数近似误差，不能将它的全部偏差都归于积分步数。


<a id="ch05-consistency"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-consistency)


## 真正少走几步，需要学习跨段关系


<a id="ch05-u0045"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0045)

减少网络调用有几种不同办法。一种是使用更合适的求解器或更容易积分的路径，仍由局部预测组织动态；另一种是直接改变学习任务，让模型练习“从这里跨到哪里”。**Consistency** 要求同一条概率流轨迹上不同阶段映到相同的数据端点，并用数据端边界条件限制解。不同轨迹仍可通向不同样本；这不是把所有输入压成一个常数。它也不同于普通去噪 MSE 下“所有可能来处的条件平均”：同轨迹终点与受损观测后验是不同对象。


<a id="ch05-u0046"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0046)

[Consistency Models](https://arxiv.org/abs/2303.01469)由 Yang Song、Prafulla Dhariwal、Mark Chen 与 Ilya Sutskever 提出。蒸馏路线利用预训练扩散模型提供路径关系；直接训练路线从数据与相邻噪声阶段构造学习关系，不应把所有 consistency 方法都说成依赖现成教师。这里要关心的是监督从哪里来，以及边界和跨阶段约束怎样共同防止退化。


<a id="ch05-u0047"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0047)

**Shortcut** 把跨度作为模型输入，并让一次大步与连续两个半步相协调，小步则保有数据提供的基础速度监督。若两个半步都错了，组合一致本身无法证明大步正确；必须与基础监督和最终分布评价一起看。[Shortcut Models](https://arxiv.org/abs/2410.12557)的作者是 Kevin Frans、Danijar Hafner、Sergey Levine 与 Pieter Abbeel；同章出现不代表与 MeanFlow 是同一作者路线。


<a id="ch05-meanflow"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-meanflow)


## 平均速度回答整段变化，而非放大眼前箭头


<a id="ch05-u0048"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0048)

在一条会转弯的轨迹上，起点切线回答“此刻朝哪边挪一点”。连接整段起终点的位移则回答“走完这一段，净变化是多少”。放大切线无法替代沿途转向；平均速度一般也不等于两端瞬时速度的算术平均。


<a id="ch05-u0049"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0049)

保持数据端 $0$、噪声端 $1$ 的约定。若轨迹满足 $dz_s/ds=v(z_s,s)$，对 $r<t$ 定义


<a id="ch05-u0050"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0050)

$$u(z_t,r,t)=\frac1{t-r}\int_r^t v(z_s,s)\,ds=\frac{z_t-z_r}{t-r}.$$


<a id="ch05-u0051"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0051)

因此向数据侧更新为 $z_r=z_t-(t-r)u(z_t,r,t)$。例如 $z_t=0$、$t-r=.1$、区间平均速度为 $-3$，则 $z_r=.3$。平均速度按时间增加方向定义，采样沿相反方向，所以这里用减号。这组数只检查方向约定，不是图像生成结果。


<a id="ch05-meanflow-identity"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-meanflow-identity)

可选数学：固定 $r$，对 $(t-r)u(z_t,r,t)=\int_r^t v(z_s,s)ds$ 求全导数，得


<a id="ch05-u0052"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0052)

$$u+(t-r)\frac{du}{dt}=v,\qquad \frac{du}{dt}=\nabla_z u\,v+\partial_tu.$$


<a id="ch05-u0053"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0053)

它将区间平均量与当前瞬时量、沿轨迹的变化联系起来。MeanFlow 利用这种关系构造可训练目标；生成时让网络预测区间平均速度。定义成立不等于有限网络已经学准，更不能在推理时使用真实终点制造“完美平均”。[MeanFlow 原文](https://arxiv.org/abs/2505.13447)由 Zhengyang Geng、Mingyang Deng、Xingjian Bai、J. Zico Kolter 与 Kaiming He 提出。其“无需预训练教师或蒸馏”指生成器训练路线；原文 ImageNet 实验仍使用预训练 VAE 潜表示，不能扩写成所有组件都从零。


<a id="ch05-u0054"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0054)

iMF 继续研究跨段生成的训练困难，以预测平均速度的网络重参数化瞬时速度回归，并把引导强度作为条件。这使引导的训练与推理取值可以变化，但不保证任意范围都可靠。深入时读 [iMF 原文](https://arxiv.org/html/2512.02012v2)，逐项比较训练目标和条件；本课不把其中性能数字移作自己实验结论。


<a id="ch05-composition"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-composition)


## 方法可以在不同层次合作


<a id="ch05-u0055"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0055)

AR 规定依赖怎样组织，并不要求每个条件分布一定是离散 softmax。MAR 在外层利用已知图像 token 组织未知内容的生成，在内层用扩散损失表达连续 token 的条件分布。内层生成的结果写回当前位置，成为后续条件；图上的“起点—中间态—终点”属于同一个待填位置，不是在图中连续换了三个位置。[MAR 原文](https://arxiv.org/abs/2406.11838)因此是组件分工的例子：外层次序决定能看见什么，内层决定当前变量怎样取值。总成本包含两层调用，不能只数外层轮数。


<a id="ch05-u0056"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0056)

现在可以用一张表读研究方法，而不按名字记排行榜。


<a id="ch05-u0057"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-u0057)


| 改变位置 | 首先问的问题 | 需要核对的证据 |
| --- | --- | --- |
| 预测对象 | 直接输出噪声、干净值还是速度？ | 损失空间、时间权重、合法输入 |
| 路径与求解器 | 局部量怎样组成更新？ | 时间网格、误差、函数调用量 |
| 跨段约束 | 终点或不同跨度怎样相容？ | 监督来源、边界条件、失败模式 |
| 表示与网络 | 每一步处理什么规模的状态？ | 压缩失真、容量、实际完整耗时 |


<a id="ch05-practice"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch05-practice)

**读完后做一件具体的事。** 先在 LAB05 重算上面的解析概率与步数误差，再读 LAB09 的固定起点轨迹。用三句话区分造题规则、学得预测器与采样器；将终点偏差分成网络近似、数值求解与覆盖不足三个待检验原因。若更细步数不再明显改善，优先查看预测误差，而不是无止境加步。下一章把同一套生成过程放进用户接口：从文本或已有图像出发，怎样既改出内容，又保住任务要求。


<a id="ch06"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06)


# 6. 生成成为编辑与跨模态接口


<a id="ch06-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0001)

现在把“能生成一张图”改成一个具体需求：把现有红杯改成蓝杯，桌面、窗格与构图尽量保留。只改提示词就够了吗？上一章解释了预测如何组成采样，本章进一步追踪**信息从哪里进入、哪些量需要保持、结果凭什么算成功**。同一模型可提供多种接口，但文生图、图生图与遮罩编辑解决的约束并不相同。


<a id="ch06-text-interface"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-text-interface)


## 一句文字怎样进入图像生成


<a id="ch06-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0002)

先看普通文生图。文本 tokenizer 把提示变成 token，文本编码器产生条件表示；图像一侧从新采样的潜变量起步。预测网络反复读取当前潜状态、时间和文本条件，scheduler 根据预测更新状态，最终 VAE 解码器把潜表示变成像素。文本编码器提供条件、预测网络提供局部量、scheduler 组织更新、解码器恢复图像表示，它们各自承担不同工作。


<a id="ch06-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0003)

普通文生图**不需要先把一张输入照片送进 VAE 编码器**，因为任务根本没有提供输入照片。编码器在训练压缩表示、从真实图像出发的图生图或重建观察中才有相应作用。训练潜空间扩散时常对真实图像编码，不能据此把编码器误画到每一次文生图推理的入口。若比较系统成本，应包括条件编码、所有预测调用与最终解码。


<a id="ch06-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0004)

CFG 的两支组合发生在预测之后、scheduler 更新之前。同一初始潜变量只控制了随机起点，没有锁定最终构图：文本条件一变，每一步的场就可能改变。LAB06 中 red→blue 的配对图复用了初始潜变量；三张 blue 条件图都出现了蓝杯，但 seed 11 的位置和 seed 37 的物体尺度也发生变化。这个对照支持“改了条件会改变生成路径”，并不等于“逐像素只改颜色”。两支预测与数值组合见 [上一章的 CFG 正文](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg)。


<a id="ch06-component-trace"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-component-trace)


## 跟着一次真实调用核对这条链


<a id="ch06-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0005)

本轮已用 LAB06 的同一份 seed 11 初始潜变量，按固定 SD 1.5 权重、CFG 4、DDIM 20步与 $\eta=0$ 重新追踪一次生成。观测钩子只保存中间返回值，没有替换模型输出；最终 PNG 与已有红杯基线逐字节相同。下面的数值来自这次 CPU bfloat16 推理，不是按网络结构填写的示意数。


<a id="ch06-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0006)

![一次真实文生图调用的两支预测、CFG组合、scheduler更新及最终图。预测热图显示潜变量第0通道，不能当作中间照片。](https://codingai-lec04.pages.dev/course/experiments/image-lab/component-trace/component-trace-first-step.png)


<a id="ch06-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0007)

先读上排：同一个潜状态、同一个时间、同一 U-Net 的空文本与红杯提示两支预测，随后才是 CFG 组合。再读左下的状态更新；最后的杯子经过20步与解码才出现。热图相似不表示条件无效，共同噪声结构可能比条件差异大；原始差分图与色标在 LAB06 中保存。


<a id="ch06-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0008)


| 实际组件 | 本次返回或输入形状 | 这件事说明什么 |
| --- | --- | --- |
| 提示 token | $1\times77$，含首尾标记的有效位置为20 | token 是文本输入，未直接变成像素 |
| 单支文本表示 | $1\times77\times768$ | 空文本也经过编码，并非全零向量 |
| 双支 U-Net 输入 | $2\times4\times64\times64$ | 首维2是同一潜状态配两种条件，不是两个随机起点 |
| 20步后的潜状态 | $1\times4\times64\times64$ | scheduler 改变数值，没有直接变成RGB图片 |
| VAE decoder 返回 | $1\times3\times512\times512$ | 潜状态按规定缩放后解码为像素 |


<a id="ch06-component-numeric"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-component-numeric)

第一步时间标号为951。预先固定坐标 $[0,0,16,16]$ 的更新前潜值是 $.151367$，空文本预测为 $.171875$，条件预测为 $.166016$，实际交给 scheduler 的 CFG 4 预测为 $.148438$，更新后潜值为 $.152344$。先按“空支＋4×两支差”核对组合，再看更新值，便能确认预测与下一状态是不同量。bfloat16 在运算中舍入，普通十进制计算器的末位可能不同。


<a id="ch06-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0009)

完整20步都核对了组合张量与 pipeline 真正交给 scheduler 的输入一致；首步官方 DDIM 重放也与捕获的下一状态逐项相同。VAE 编码器的实际调用数为0，最后解码前按模型规定除以 $.18215$。这次追踪支持前面的组件分工，但张量均值或更新范数没有“图像质量分”的含义。查看保存轨迹也不会现场生成；需要重算时再进入 LAB06 的同源代码。


<a id="ch06-prompts"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-prompts)

![LAB06 同一起点的 red/blue 条件对照，每行固定原始潜变量，左列使用红杯提示，右列只把 red 改为 blue。](https://codingai-lec04.pages.dev/course/experiments/image-lab/figures/prompts.png)


<a id="ch06-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0010)

读图时先确认文本中的颜色变化，再比较位置、杯柄、尺度和背景。学生若只回答“右边更蓝”，仍没有完成对照阅读：关键还包括提示未要求改变的量是否跟着变化。对于从零生成，这些变化未必是错误；对于编辑既有作品，它们可能直接违反任务。


<a id="ch06-img2img"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-img2img)


## 从一张已有图出发：保留信息与允许改动


<a id="ch06-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0011)

图生图把原图编码成潜表示，在某个噪声等级加入扰动，再从那里开始条件采样。较低噪声起点保留更多原图信息；较高噪声起点放开更多变化。常见 `strength` 同时影响起始噪声等级和实际更新区间，并非生成结束后的混合透明度。若图中杯子颜色仍旧，可能是原图信息太强、新条件影响有限，也可能与具体模型或提示有关，需要一个变量一个变量地检查。


<a id="ch06-img2img-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-img2img-results)

![同一红杯原图的图生图结果：原图，以及strength 0.25、0.55、0.85。文本都要求蓝杯，较大strength改变了窗格并增加杯碟，但没有可靠改蓝。](https://codingai-lec04.pages.dev/course/experiments/image-lab/figures/img2img.png)


<a id="ch06-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0012)

**先读左图，再从左向右核对。** 本组输入固定为 seed 11 的红杯基线，提示改为蓝杯；名义20步下，三档 strength 在该实现中对应5、11、17次实际更新。前两档大体保留了红杯；最后一档改变窗格并增加小杯与杯碟。结果没有可靠实现“红杯变蓝”。这条失败记录不能用一张另外生成的蓝杯替换，因为那会丢掉任务最关键的“原图保留”条件。


<a id="ch06-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0013)

这也回答一个常见追问：“高 strength 变化更多，是否就更听提示？”变化幅度与目标达成是两个量。下一次实验可以固定原图、strength、起点与采样器，只改 CFG 或一句提示；同时记录颜色达成与背景保留。若同时改模型、遮罩和种子，就很难知道原因。相关思想可接 [SDEdit](https://arxiv.org/abs/2108.01073)：从带噪的用户输入出发，在数据先验与输入保留之间取舍。本课具体结果来自 SD 1.5 img2img 实现，不声称复现了原论文的全部设置。


<a id="ch06-inpainting"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-inpainting)


## 遮罩指定哪里要改，仍要检查它是否覆盖对象


<a id="ch06-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0014)

遮罩编辑多提供一个空间条件：哪些区域待生成，哪些内容作为已知上下文。它可以帮助把任务从“改整张图”收窄到“修改杯子”，却不会替使用者自动纠正画错的遮罩。遮罩之外严格不变也不是所有 pipeline 的默认保证；若输出后把外部像素贴回原图，是额外的合成步骤，应明确区分。


<a id="ch06-inpainting-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-inpainting-results)

![LAB06 两次遮罩编辑的原图、遮罩与原始输出。上排中央遮罩未覆盖左侧杯子，下排跟进遮罩完整包住杯子；后一输出得到白杯，仍未满足蓝色条件。](https://codingai-lec04.pages.dev/course/experiments/image-lab/figures/inpainting.png)


<a id="ch06-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0015)

这张图要按每行“原图→遮罩→输出”读取。上排的白色矩形覆盖中央窗格，没有完整包住左侧杯子；输出主要重建了窗格，红杯保留。看见失败后，实验只改遮罩范围，增加了下排的定向跟进，其余条件保持。下排确实重画了杯子，却得到形状不同的白杯。两次原始输出全部保留，未把遮罩外像素贴回原图。


<a id="ch06-three-judgments"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-three-judgments)

**这次能够同时作出三个明确判断。** 模型推理运行成功；第二次目标区域发生了变化；指定的蓝色编辑仍然失败。它们并不矛盾。第一项是工程运行，第二项是空间约束开始起作用，第三项才是当前语义任务的达成。把“可运行”当成“任务成功”，或把“颜色失败”说成“所有编辑机制都未生效”，都会丢掉有用信息。


<a id="ch06-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0016)

已知区域怎样与新区域衔接，是算法本身的一部分。[RePaint](https://arxiv.org/abs/2201.09865)在扩散采样中使用已知区域信息与重采样策略；本课保存图使用专门的 SD 1.5 inpainting 权重，**不是 RePaint 复现**。两者可用来理解同一约束问题的不同处理方式，不能只因都输入遮罩就混作同一算法。


<a id="ch06-edit-evaluation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-edit-evaluation)

**一个可复核的评价算例。** 假设20幅目标都是“只把杯子改蓝”：其中14幅目标区域明显改变，10幅杯子变蓝，7幅同时保留了背景。能够报告的是三个不同计数；最终任务成功率取决于事先规定的联合标准。在这个假设下，若标准为“变蓝且背景保留”，只有7幅通过，而不是将14与10取平均。这组数字是教学构造，未冒充 LAB06 统计。真实实验只保存有限样本，应逐图读出改变与失败，再决定是否需要扩大评价。


<a id="ch06-video"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-video)


## 视频增加的是跨时间的联合关系


<a id="ch06-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0017)

现在让同一只红杯从挡板左侧经过，短暂被完全遮住，再从右侧出现。遮挡后的单帧若画成蓝杯，仍可能是一张自然的照片，却没有满足“同一只杯子经过挡板”的事件。这里新增的约束包括身份保持、空间位置、运动连续性和遮挡关系；复制一张红杯图到所有帧，只满足外观恒定，不能解释运动。


<a id="ch06-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0018)

![N42 事件的起始图：红杯在挡板一侧，后续需要继续追踪同一对象。此图用于课堂构造。](https://codingai-lec04.pages.dev/assets/classroom/n42/frame-1.png)


<a id="ch06-event-start-reading"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-event-start-reading)

先记下这只红杯与挡板的位置。它后来被遮住，并不等于历史中的对象已经消失；这张课堂构造图建立后续身份判断的起点。


<a id="ch06-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0019)

![同一事件的蓝杯反例：若没有换杯或变色条件，遮挡后突然出现蓝杯不满足当前事件的身份要求。此图是教学构造，不是视频模型实测输出。](https://codingai-lec04.pages.dev/assets/classroom/n42/frame-4-blue.png)


<a id="ch06-u0020"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0020)

读这两张图时，先找到杯子与挡板，再把“看不见”与“已经不存在”分开。历史中的红杯仍是后续身份判断的依据；如果任务另外明确给出换杯、染色或照明变化，合理后续也会改变。视频生成不是规定任何属性永远不变，而是让变化具有与条件和事件相容的解释。


<a id="ch06-video-mechanism"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-video-mechanism)

机制上，模型的当前状态从单张图变成带帧维度的张量。空间模块组织每帧内部关系，时间模块在帧之间交换信息；时空注意力或分解的空间/时间操作让某个位置的预测能利用其他时刻的内容。文本条件、已知首帧、动作或其他控制分别规定不同信息，训练数据与损失必须让模型练习对应关系。[Video Diffusion Models 的官方说明](https://video-diffusion.github.io/)采用分解时空 U-Net，是这一思路的一个具体实现。


<a id="ch06-u0021"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0021)

这里有两条不同的“时间轴”：视频帧编号表示故事发生的先后，扩散时间表示整个视频张量的受损程度。第5帧并不比第1帧天然“噪声更多”；它们可能在同一次噪声等级上共同被预测。把这两条轴分开，才能理解为什么视频模型需要时间结构，却仍沿扩散时间多次更新。


<a id="ch06-video-cascade"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-video-cascade)

更高分辨率、更高帧率的视频还可由一条级联产生。base 模型先在文本条件下生成低分辨率、低帧率片段，确定较粗的内容与事件；空间 upsampler 以这段低分辨率视频和文本为条件补充像素细节；时间 upsampler 以稀疏帧和文本为条件生成中间帧。空间与时间阶段可以交错，每一级都接收前一级结果作为条件，并处理自己的受损目标张量。[Imagen Video §2.2–2.3](https://arxiv.org/html/2210.02303v1#S2.SS2)提供这类级联的具体例子。上采样不是放大图片或简单复制帧：它仍在生成未知细节，也可能继承或新增错误。


<a id="ch06-video-total-cost"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-video-total-cost)

因此不能只报 base 的步数就说整个系统快。总生成成本包括文本编码、base 的全部预测调用、各空间与时间网络的全部调用，以及潜空间方案中的表示解码；各阶段张量尺寸、帧数、CFG分支和每次调用成本不同，仅将步数相加也不足以代表耗时。若 base 在遮挡前后已把红杯变成蓝杯，后级可能把两只不同的杯子画得更清晰；即使 base 暂时一致，上采样也可能引入外观或身份漂移。高像素数与高帧率因此不能代替跨帧身份检查，应同时查看基段、中间阶段与最终视频，判断错误从何处出现。


<a id="ch06-u0022"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0022)

评价也要沿任务展开：抽帧检查图像自然度，再连续播放检查闪烁、对象身份和运动；需要动作预测时，还要检查改变动作是否改变对应后果。给各帧相同 seed 不能保证这些关系成立。N42 的分镜只暴露检验对象，没有证明某个视频模型已通过；可播放的未来也还不等于可靠行动模型，第8章再接这个问题。


<a id="ch06-audio"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-audio)


## 文本如何成为声音的条件


<a id="ch06-u0023"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0023)

“杯子轻放在木桌上，发出短促碰撞声”允许多种波形：杯子大小、接触力度和房间混响没有被唯一指定。生成系统需要把语义条件连到可还原的声音表示。以 AudioLDM 为例，这条链不能简写为“文字进入一个扩散框，出来声音”。


<a id="ch06-u0024"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0024)


| 部件 | 在 AudioLDM 中处理的量 | 为什么需要它 |
| --- | --- | --- |
| CLAP 文本/音频编码器 | 对齐的语义表示 | 让描述与声音事件可在共同条件空间关联 |
| 频谱 VAE | mel 频谱与其连续潜表示 | 将高维声学结构压成生成器可处理的表示 |
| 条件潜扩散 | 从噪声生成频谱潜表示 | 学习给定语义时可能出现的声学变化 |
| VAE 解码器与 vocoder | 潜表示→频谱→波形 | 将生成表示转回可听音频 |


<a id="ch06-u0025"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0025)

[AudioLDM 原文图1与 §3](https://proceedings.mlr.press/v202/liu23f/liu23f.pdf)的一个具体安排是：LDM 训练使用 CLAP 音频嵌入作条件，采样时使用 CLAP 文本嵌入；跨模态接口借助预训练对齐空间。这不表示系统从未用过音频—文字配对信息，CLAP 对齐本身有训练来源。也不要把语义条件嵌入与被生成的频谱潜变量混成同一个 latent。


<a id="ch06-u0026"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0026)

任务评价至少分开事件是否正确、时间顺序是否正确、音质是否自然。若要求“先落杯，再说话”，生成了两种声音却顺序颠倒，语义类别相似仍不足以判成功。对齐模型相似度可以作辅助观察，不能替听觉检查或所有任务标准。本课解释该研究接口，没有在此训练或实测音频模型。


<a id="ch06-multimodal"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-multimodal)


## 联合生成与条件生成：先说清哪一部分已知


<a id="ch06-u0027"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0027)

给定文字生成图像是在建模 $p(I\mid T)$；给定图像产生描述是在建模 $p(T\mid I)$；两者同时未知则涉及联合分布 $p(I,T)$。文字只挑出原图的一部分信息，因此“图→一句描述→图”通常不能精确恢复原图。另一张符合描述的图可以是合格生成，却不是原图重建。


<a id="ch06-u0028"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0028)

UniDiffuser 将图像与文本的表示纳入统一噪声预测接口，为两种模态分别设置受损程度。直观地说，图像侧受损、文本侧清楚，可以表达文本条件图像生成；双方都受损时学习联合关系。两种噪声等级描述信息是否已知，并非现实世界中图像先发生还是文字后发生。[UniDiffuser 原文](https://proceedings.mlr.press/v202/bao23a.html)研究图像与文本；本节将 AudioLDM 放在旁边比较条件接口，不宣称 UniDiffuser 是同时完成图像、文字、声音全部转换的单一系统。


<a id="ch06-u0029"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0029)

统一接口的价值在于共享对条件关系的组织，却不自动证明各方向能力相同。数据覆盖、编码压缩、解码器和任务评价仍可能不对称。读新模型时先写“已知什么、待生成什么、共享哪部分表示”，再判断所谓统一究竟统一到了哪一层。


<a id="ch06-selfcheck"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-selfcheck)

**自检与答案。** 如果输出白杯、背景基本保留，如何描述本次“改蓝”任务？应说区域编辑起作用，但颜色目标未达成；不能简称成功。若文字能描述图像，为什么由文字生成不保证原样还原？因为描述丢失了构图、纹理等信息，条件分布允许多种结果。视频中“时间”有哪两种？事件帧时间与扩散受损程度，它们分别组织事件关系和生成更新。


<a id="ch06-u0030"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch06-u0030)

下一步可直接进入 [LAB06 网页实验](https://codingai-lec04.pages.dev/course/experiments/image-generation.html#inpainting)，对照原图、遮罩与原始输出；先记录观察，再选择是否重算。深读时回到 [第5章 CFG](https://codingai-lec04.pages.dev/lecture.html#ch05-cfg)核对两支预测。下一章把目标模态缩为文字：不再给连续像素加噪，而是让离散词语部分缺失，学习怎样协调多个位置的恢复。


<a id="ch07"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07)


# 7. 语言也能换一种生成次序


<a id="ch07-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0001)

如果模型已经能对一句话里所有空位同时给出候选，为什么还需要多轮生成？先看一个极小的世界。这里合法句子只有两条：


<a id="ch07-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0002)


- `猫 会 喵 ， 猫 喵`，概率 $1/2$；

- `狗 会 汪 ， 狗 汪`，概率 $1/2$。


<a id="ch07-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0003)

这是课程明确规定的联合分布。它故意简单到可以手算，让我们把问题放在生成次序与位置依赖上，不把现象归于大模型是否足够聪明。第2章用 AR 按条件生成完整序列；本章换一个入口：把句子的一部分藏起来，让模型根据当前可见内容恢复未知位置。


<a id="ch07-independent-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-independent-example)


## 每个位置都给对了概率，整句仍可能不成立


<a id="ch07-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0004)

从全空状态开始，“会”和逗号各自只有一个可能值。其余四个位置各有两种等概率候选：两个物种位置是猫/狗，两个叫声位置是喵/汪。若四处分别按正确边缘概率独立抽样，就有 $2^4=16$ 种等概率组合，其中只有两条合法，合法率为 $2/16=1/8$。


<a id="ch07-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0005)

错误不在某个位置的边缘概率，而在把它们当成可以独立组合。`猫 会 喵 ， 猫 汪`每个词都曾在对应位置出现，却违反了这两个句子定义的联合关系。一个更大的词表或更精确的边缘预测，并不会自动补上缺失的依赖。


<a id="ch07-traces"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-traces)

![LAB04 从相同全空状态出发的三种生成轨迹。灰色是未知，金色是本轮新提交，蓝色是已经保留。一次并行提交可能形成不合法句子；迭代与AR在本例中形成合法句子。](https://codingai-lec04.pages.dev/assets/labs-v13/lab04-token-traces.png)


<a id="ch07-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0006)

**先看每列最上面的共同起点，再逐行看金色块。** 一次并行把所有候选立即提交；迭代先提交“会”和逗号，再选定一个内容词，随后其余内容词由条件确定；AR 一次沿固定次序提交一个位置。图中同为蓝色的词表示状态没有改写，不表示这些词的内部网络表示或缓存永远不会改变。本实验的预测器是精确枚举，尚未训练语言模型。


<a id="ch07-iterative-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-iterative-example)

这个小例中，阈值 $.99$ 先选出概率为1的两个固定位置；下一轮若仍有平局，就只抽一个不确定位置。若抽到“猫”，剩余可相容句子只剩猫句，最后一轮可同时填完。关键转折不是“又运行了一次”本身，而是第二轮提交的内容成了第三轮真正可使用的新条件。


<a id="ch07-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0007)

该规则只为展示这个有限分布的依赖，不是从扩散理论导出的通用采样器。真实模型的高置信度可能错误；不同分布里，多个高置信位置同时提交也可能不相容。若把阈值降到 $.5$，本例所有位置会一起提交，退回前面的独立组合，理论合法率重新成为 $1/8$。


<a id="ch07-mask-process"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-mask-process)


## 离散文字怎样被破坏


<a id="ch07-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0008)

像素是数值，token ID 却是词表中的编号。把编号730加上高斯噪声、再四舍五入成728，并没有合理的语义距离：词表重排以后，结果就会改变。离散扩散需要在类别状态之间规定转移；D3PM 提供这类离散转移建模，遮罩扩散是其中一种特别清楚的情形。[D3PM 原文](https://arxiv.org/abs/2107.03006)可接在这里读，而不是把所有文字生成都称为“像素扩散换了输入”。


<a id="ch07-vocabulary-permutation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-vocabulary-permutation)

“编号没有天然距离”可以用一次一致的词表重编号检查：若只置换每个 token 的 ID，tokenizer 的 token→ID 映射与反向解码、输入 embedding 的对应行、输出 logits 的词表维度（以及输出偏置、共享权重的相关位置）都要同步置换；`[MASK]`、BOS、EOS、PAD 等特殊 token 的配置与离散转移规则也必须同步。对用转移矩阵定义的过程，还要同时重排来源与目标类别的轴。这样保持 token 身份与整个模型计算一致，只改变编号标签，才是在检验表示的不变性；只改 tokenizer 或只改某几行会破坏模型，不能用这种故障来证明编号本身具有语义距离。


<a id="ch07-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0009)

在常用吸收式遮罩过程中，某个 token 保持原值或进入特殊 `[MASK]`；一旦在前向链中变成遮罩，就继续保持遮罩。以 LLaDA 的线性日程为例，时间 $t\in[0,1]$ 表示每个位置被遮罩的概率：


<a id="ch07-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0010)

$$q(x_t^i=M\mid x_0^i)=t,\qquad q(x_t^i=x_0^i\mid x_0^i)=1-t.$$


<a id="ch07-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0011)

$t=.5$ 不表示每句话必定恰好有一半位置被遮；它是每个位置的概率，实际数量有波动。六个位置的期望遮罩数为3。每个状态仍由完整 token 与 `[MASK]` 组成，时间连续并没有把词变成小数。


<a id="ch07-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0012)

生成不是恢复某次被藏起来的唯一原句。同一遮罩序列可能由很多句子产生，模型要为这些可能的补全分配概率。也可以在连续词向量上研究扩散，但那需要另外说明表示、噪声与从向量解码成文本的机制；不能与本章的直接离散遮罩混用一条公式。


<a id="ch07-training"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-training)


## 从填空练习到一个生成模型


<a id="ch07-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0013)

训练者持有原句 $x_0$，先从均匀分布 $t\sim\mathrm{Uniform}(0,1)$ 选遮罩比例，再给定这个 $t$，将各位置独立地以概率 $t$ 换成遮罩，产生受损句子 $x_t$。预测器只读 $x_t$，为被遮住位置输出词表概率；原词只在监督侧计算损失。LLaDA 的基本目标可写成


<a id="ch07-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0014)

$$\mathcal L(\theta)=-\mathbb E_{t,x_0,x_t}\left[\frac1t\sum_i\mathbf1\{x_t^i=M\}\log p_\theta(x_0^i\mid x_t)\right].$$


<a id="ch07-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0015)

式中的指示函数选择真正被遮住的位置，$1/t$ 反映上述均匀时间目标下的加权。若改用另一种时间抽样而不作相应重要性权重调整，优化的期望也会改变。未遮住词提供上下文，不能主要靠“抄回可见词”获得训练分数。具体代码还可能除以序列长度、采用有限的端点截断；比较损失数值前先对齐这些归一化。取值 $t=0$ 的形式不能直接代入 $1/t$，理论积分与实现的边界处理要分开。


<a id="ch07-loss-example"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-loss-example)

**可手算的监督。** 在 `猫 [MASK] 喵 ， [MASK] 喵` 中，假设模型给两个正确 token “会”“猫”的概率分别为 $.8$ 与 $.6$。两个位置的未加权负对数概率和为 $-\log .8-\log .6\approx.734$；若这份题的 $t=.5$，上式的加权和约为 $1.468$，再按实现决定是否除以长度。模型前向从未看见两个位置的正确答案；批改时知道答案并不等于输入泄漏。网络必须从可见上下文和已学知识给出概率。


<a id="ch07-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0016)

[LLaDA 原文 §2](https://arxiv.org/html/2502.09992v3#S2)将不同遮罩比例、恢复预测与似然上界联系起来。它与固定比例遮罩的表示学习有关联，但要成为一个生成方法，还需定义整个破坏过程、逆转移与采样程序。只训练某几个填空例子，不能自动宣称得到了可靠的全句生成分布。


<a id="ch07-context"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-context)


## 双向上下文提供什么，没有提供什么


<a id="ch07-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0017)

监督微调时，可以保持用户提示完整，只遮罩回答部分。预测器看到的是“提示＋目前可见的回答词”，并据此恢复其余回答。双向读取意味着当前位置可以利用左右两侧**已经可见**的词，不意味着看到了被遮住的真实答案。位置可读范围与数据泄漏必须分别检查。


<a id="ch07-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0018)

这也给使用方式带来区别。典型 AR 响应不断追加新 token，当前位置主要依赖此前生成前缀；遮罩式生成可先预留回答位置，再从多个位置逐步确定内容，更自然地容纳中间填空或分块恢复。典型 AR 同样能读取完整允许的提示，不能把差异误说成“AR 只能看问题的左半句”。具体产品还可能采用分块、插入或其他混合策略。


<a id="ch07-commit"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-commit)


## 候选、提交、重预测与重新遮罩


<a id="ch07-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0019)

一次前向计算给出多个位置的候选分布；采样器再决定本轮哪些值进入状态。**预测**是网络给概率，**提交**是采样器接受某些候选，**重预测**是在更新后的上下文下重新计算仍待定位置，**重新遮罩**则是明确将某些候选或已选择内容变回未知，以便再处理。它们不是同一个动作，也不是每种方法都允许同一范围的改写。


<a id="ch07-u0020"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0020)

LAB04 的蓝色已提交词一旦写入就保留，当前调度器没有重新遮罩它们；后续只重新计算仍未知位置。LLaDA 研究随机或低置信度重遮罩等具体采样策略。读动画时应问“这个词是临时候选，还是已经被算法承诺保留的状态”，不要把屏幕上短暂出现的每一个词都当作最终提交，再误以为模型任意反复改写所有上下文。


<a id="ch07-carryover"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-carryover)

MDLM 的 SUBS 参数化明确加入两项结构：对干净 token 的预测不给 `[MASK]` 概率；逆过程中已经揭开的 token 直接保留。前者约束输出的支持，后者约束状态更新。这里“干净预测不给遮罩概率”不表示每一步所有位置必须揭开：逆转移本身仍可保留部分 `[MASK]`。[MDLM §3.2.3](https://arxiv.org/html/2406.07524v2#S3.SS2.SSS3)帮助把预测分布与转移分布分清。


<a id="ch07-cache"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-cache)


## 为什么 token 不变，还不能直接说计算可复用


<a id="ch07-u0021"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0021)

假设本轮只新增了一个“猫”。其他位置的 token 虽然没改，双向网络中的表示却可能改变，因为新词为它们提供了上下文。继续使用旧的预测，可能忽略刚获得的线索。“保留一个 token 的值”因此并不等于“保留关于所有 token 的计算结果”。


<a id="ch07-u0022"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0022)

MDLM 的一种严格复用情形更窄：某一时间转移后**整个输入状态没有任何新揭开位置**，网络又不显式依赖时间，其余条件与权重也未改变，便可复用上次的网络预测。采样转移仍须按当前时间重新计算。若网络含时间输入、上下文改变、条件变化，或推理还使用随机 dropout，就不能只凭 token 序列的一个局部没变，宣称数值输出完全相同。[MDLM §4.1](https://arxiv.org/html/2406.07524v2#S4.SS1)讨论的是这种依赖条件明确的缓存。


<a id="ch07-u0023"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0023)


| 情况 | token 状态 | 网络预测是否可直接复用 |
| --- | --- | --- |
| 没有任何位置变化，网络无时间输入，其他输入与计算确定 | 整段相同 | 可复用网络预测，转移概率仍随时间更新 |
| 新揭开了一个位置，其他词保留 | 部分相同 | 双向依赖已变，通常需重新计算 |
| 整段相同，但网络显式接收新时间 | 整段相同 | 不保证相同输出 |
| 典型因果 AR 追加后续 token | 原前缀相同 | 因果结构允许前缀 KV 复用；新位置仍计算 |


<a id="ch07-u0024"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0024)

AR 的缓存依据是后来的 token 不影响先前因果表示；上述遮罩缓存依据是函数的全部有效输入没变。两者都叫复用，但成立理由不同。更激进的近似缓存可以另行研究，不过需要测量误差与收益，不能冒称严格等价。


<a id="ch07-results"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-results)


## 回到可观察的结果，避免用轮数冒充速度


<a id="ch07-u0025"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0025)

![LAB04 4000个种子的合法率与依赖轮数：一次并行的合法率接近理论1/8；迭代和AR在本固定语法上合法率为1。右图是轮数，不是语言模型延迟。](https://codingai-lec04.pages.dev/assets/labs-v13/lab04-validity-rounds.png)


<a id="ch07-u0026"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0026)

当前保存结果中，一次并行的合法率为 $13.25\%$，迭代与 AR 都为 $100\%$；平均依赖轮数分别为1、3、6。样本量4000、迭代阈值 $.99$，相同有限语法的解析条件预测器用于三组。它说明分阶段加入条件可以修复本例的联合冲突，也说明一次并行结果与理论 $12.5\%$ 接近。它没有测大语言模型的训练、词表预测或 GPU 延迟。


<a id="ch07-u0027"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0027)

如果扩散模型生成100个 token 用10轮，AR 用100步，不能直接说快10倍。扩散每轮可能处理整段状态，AR 常有增量计算和因果缓存；批量、硬件利用、序列长度、停止规则与输出质量都会影响完整耗时。应记录总延迟、吞吐、内存或显存、最终长度与任务质量，再判断哪种使用方式适合当前需求。生成轮数只描述依赖组织的一部分。


<a id="ch07-research"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-research)


## 新路线说明了什么


<a id="ch07-u0028"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0028)

LLaDA 从头训练遮罩扩散语言模型，用大规模语言学习与指令任务检验“常见语言能力是否必须依赖左到右生成”。Dream 则从既有 AR 权重出发，再训练为扩散模型，研究如何继承已有语言模型。权重起源不永久决定最终目标；但转化也不是仅在推理时关闭因果遮罩，仍需要配套训练与验证。[Dream 原文 §4](https://arxiv.org/html/2508.15487v1#S4)给出其具体初始化与训练设计。


<a id="ch07-u0029"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0029)

这些工作提供替代生成路线的能力证据，不等于全面替代 AR 的结论。某些反向关系或规划任务上的差异，可能与生成结构有关，也受数据、初始化、训练预算和推理设置影响。有效比较先明确问题：是在同样预算下检验生成次序，还是比较两个已训练系统的使用效果？前者需要更强控制，后者应如实记录全部条件。不要从单个任务差异跳到“通用推理更强”。


<a id="ch07-practice"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-practice)

**本章可以留下的一个观察。** 打开 LAB04，先保持语法不变，只把提交阈值从 $.99$ 改为 $.5$。在运行前写出预期：哪些位置将同时提交，合法率会接近多少？答案是它退回一次独立并行抽样，理论合法率为 $1/8$。这次干预改变采样调度，没有训练新网络。随后把首词固定成“狗”，会发现整个剩余句子已被这个极小分布决定；这是一项更容易的条件任务，不应与全空生成混在一起作能力排名。


<a id="ch07-selfcheck"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-selfcheck)

**自检与答案。** 为什么正确边缘不能保证正确句子？因为联合分布还包含位置间依赖。为什么一轮出现所有候选还要继续？候选共享不完整上下文，只有部分提交后，新信息才成为后续真实条件。为什么词保留不保证预测可缓存？双向模型可能读到其他位置的新词，函数输入与表示已经改变。为什么不同方法都可用 Transformer？网络组织信息，目标与采样规则组织学习和生成，它们属于不同层次。


<a id="ch07-u0030"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch07-u0030)

至此，语言也回到了本讲同一条主线：从允许多解的条件出发，规定训练信号，再组织联合相容的生成。下一章进一步问，若生成内容是“采取某动作以后的未来”，怎样让观察、记忆、行动与独立反馈形成闭环；Lecture 05 则继续拆开这些预测共同依赖的上下文计算。


<a id="ch08"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08)


# 第八章｜从生成内容到预测行动


<a id="ch08-u0001"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0001)

前面几章问的是怎样从条件得到一个完整候选。到了行动场景，候选还没有完成任务：预测杯子会停在目标处，杯子不一定真的到了那里。我们需要把“想象会怎样”接到“执行了什么、观察到什么、下一步怎样改变”上。本章沿杯子与自动门两条小情境建立这个连接，先解释所需信息，再讨论研究路线。


<a id="ch08-u0002"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0002)

本章采用一个工作定义：**世界模型为与预测或行动有关的状态变化提供模型。**它可以预测画面、潜在表示或奖励等任务量；这一定义不要求所有系统使用同一种架构，也不要求每一步都生成完整视频。要判断它是否有用，必须说清它预测什么、谁使用预测，以及环境用什么反馈检查它。


<a id="ch08-prediction-feedback"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-prediction-feedback)


## 8.1 同一个杯子，有预测的位置，也有实际的位置


<a id="ch08-u0003"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0003)

桌上有一只杯子和一道挡板，目标是把杯子移到另一边。先固定当前观察，再提出轻推、强推两项动作。模型为每项动作预测一个后果；它们是同一起点下的候选未来，尚未成为环境事实。选择并执行其中一项后，新的观察才告诉我们杯子停在哪里。


<a id="ch08-u0004"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0004)

![红杯、木挡板、水迹与蓝书构成行动情境。杯子的完整形状、挡板与目标的位置，以及水迹提示的表面变化，都可能影响下一步。](https://codingai-lec04.pages.dev/assets/classroom/world/world-w10-transfer.png.webp)


<a id="ch08-u0005"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0005)

这是沿用课堂的 ImageGen 场景示意。先找杯柄与挡板，再找目标和水迹：前三者帮助提出空间问题，水迹提醒我们检查动态条件。图本身没有测得摩擦系数、推力或停止距离。


<a id="ch08-u0006"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0006)

若轻推后的杯子比预测滑得更远，下一次计划必须从**观察到的新位置**开始。误差可能来自当前状态估计不准，也可能来自动态模型没有学到这种表面，或动作执行与指令有偏差。先更新当前状态、重新规划，不等于每次都重训整个模型；参数学习与本次状态更新是两种不同操作。


<a id="ch08-u0007"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0007)

可以用一个最小记号保留这几个位置：历史记录是过去的观察与动作；由历史得到当前状态估计；模型用状态估计和候选动作预测后果；真实动作得到新的环境观察。预测允许我们比较尚未执行的分支，反馈只直接检验这次实际执行的分支。没执行的强推仍是预测，不能与已观察的轻推同样记作事实。


<a id="ch08-u0008"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0008)

这里的反事实比较也有前提：两个候选必须从可比的初始条件出发，只改变正在研究的动作。如果轻推用干桌面、强推用湿桌面，差异就不能只归给动作强弱。课堂中的杯子位置是预设规则示意；后面的 LAB10 则把独立环境、候选预测和更新完整地运行出来。


<a id="ch08-interactive-world"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-interactive-world)


## 8.2 能播放的未来，怎样成为能操作的环境


<a id="ch08-u0009"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0009)

一段视频可以非常顺滑，却不必接住使用者的新选择。交互环境多了一项要求：同样的起点下，参与者的动作成为后续变化的条件。人按向左或向右，后果应当按场景规则发生相应变化，而不是随机播放一段与动作无关的片段。


<a id="ch08-u0010"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0010)

仅有动作响应还不够。转身再回来时，刚才的物体是否仍在原位？杯子被遮住以后是否凭空换了身份？桌边是否无故漂移？等待与返回是否保留先前经历的影响？这些问题检查持续状态和长时一致性。低延迟有助于操作，却不能补偿世界状态漂移；画面一致也不自动证明动态符合某个现实环境。


<a id="ch08-u0011"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0011)

方向键、语言指令、从视频推断出的潜在动作和机器人执行器的控制量，还属于不同接口。给生成器一个“往左”的条件，可以影响画面；机器人则需要控制量的单位、幅度、持续时间与执行约束。一个交互世界能生成动作相关的画面，是一类能力；它能准确替代现实试验，是更强的主张，需要独立检验。


<a id="ch08-memory"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-memory)


## 8.3 当前画面不是完整状态，记忆也不是最后一帧


<a id="ch08-u0012"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0012)

![左侧向不透明红杯倒水，右侧只见红杯的外观。右图没有显示杯内，但左图提供了仍可能与当前状态有关的历史证据。](https://codingai-lec04.pages.dev/assets/classroom/world/world-pouring-history.png.webp)


<a id="ch08-u0013"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0013)

图像是课程情境示意。只看右侧，很难断言杯里是否有水；看过左侧，才得到“曾经倒入水”的证据。若随后倒空或漏水，这份判断仍须更新。


<a id="ch08-u0014"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0014)

要避免混淆三个对象：环境真实状态是杯里实际有什么；观察是当前能看见或测到的部分；内部状态是系统根据历史维护的表示或估计。内部状态可能比眼前画面包含更多信息，也可能错误或不完整。它不是一份免于检查的事实副本。


<a id="ch08-u0015"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0015)

遮挡使区别更明显。杯子在挡板后移动时，最后一次看见的位置已经过时。系统应结合之前的观察和遮挡期间发生的动作，推测它现在可能在哪里；如果信息不足，就保留可能范围。杯子重新出现以后，新观察用来纠正估计。保存更多帧本身不保证记住了正确的信息：若没保留对象身份、动作和时间关系，大量纹理仍无法回答当前问题。


<a id="ch08-u0016"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0016)

LAB10 会给出一个可运行的记忆对照。两次运行的当前观察都是“人在远处，门关闭”，但此前单独走近的结果不同。历史不同使候选判断不同，下一步最省成本的开门动作也不同。这个对照在两种固定门机制之间进行，不表示同一扇固定规则的门会无缘无故改变规律。


<a id="ch08-door-intervention"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-door-intervention)


## 8.4 历史都预测对了，为什么还要行动


<a id="ch08-u0017"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0017)

想象旧记录总是“走近并按按钮，门打开；离开以后，门关闭”。至少有两个候选解释得通：按钮触发开门，或接近触发开门。因为旧记录中走近与按键总是同时发生，重复播放多少次，也没有把两者分开。


<a id="ch08-u0018"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0018)

![同一扇门的关闭和打开状态，按钮位于门右侧。开门结果不能独立说明按钮或接近哪个条件起作用。](https://codingai-lec04.pages.dev/assets/classroom/world/world-door-states.png.webp)


<a id="ch08-u0019"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0019)

这是教学示意，不是真实门的实验照片。重要对象是动作与返回的开关状态；先看两个候选在新动作下是否作出不同预测。


<a id="ch08-u0020"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0020)

为了把“按键”和“走近”独立改变，LAB10 把按钮抽象为可从远处发送的遥控脉冲，并不要求人隔空按墙上的实体按钮。每一步重新判断是否触发开门；实验目标只要求下一步观察到门开，没有模拟人穿过门。这样，下面四项动作及其代价才有一致的任务含义。


<a id="ch08-u0021"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0021)


| 从远处开始的新动作 | 按钮候选预测 | 接近候选预测 | 对这两个候选的区分力 |
| --- | --- | --- | --- |
| 走近并按按钮 | 开 | 开 | 没有 |
| 单独按按钮，仍在远处 | 开 | 关 | 有 |
| 只走近，不按按钮 | 关 | 开 | 有 |
| 在远处等待 | 关 | 关 | 没有 |


<a id="ch08-u0022"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0022)

先写出预测，再执行“只走近”。在 LAB10 的按钮环境中，独立环境函数实际返回门关闭，于是接近候选与新观察冲突，按钮候选留下。控制器随后选择“远处按按钮”，环境返回开门。这一轮包含了旧历史、分歧预测、实际动作、外部反馈、候选更新与下一步选择，推理没有停在说明两项预测不同。


<a id="ch08-u0023"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0023)

![左图列出动作执行前两个候选的预测，右图是独立规则环境返回反馈后的候选概率。前两条历史不区分模型，单独走近后，按钮候选由0.5变为1，接近候选由0.5变为0，随后按按钮获得开门反馈。](https://codingai-lec04.pages.dev/course/experiments/lab10/action-feedback.png)


<a id="ch08-u0024"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0024)

这是保存的默认基线（按钮环境＋approach）的 Python 规则环境实际结果。LAB10 另列本轮两个自选干预的独立记录与图表。概率只在列出的两个确定性候选内部归一化；曲线变成 1 不表示现实中全部机制已经被证明。图中金色带对应有区分力的一次干预。


<a id="ch08-u0025"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0025)

这也回答了角色检验中学生的追问：“既然两个模型历史都答对，为什么还需要行动？”因为行动可以创造历史里没有的条件组合。再走近并按一次，会复现旧现象；只走近，则让候选承担不同的预测。信息来自**实际反馈与预先写下的预测之间的关系**，并非“动过一次”就自动更了解世界。


<a id="ch08-u0026"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0026)

候选更新依赖明确条件：人确实进入约定范围，没有按按钮，门没有故障或响应延迟；两个候选假设机制在一次运行中固定。如果远处什么也没做，门却自行打开，当前两个候选都解释不了。程序在这种情形报告候选失配，不把矛盾结果硬塞进某一个模型。真实系统还需要处理噪声、遗漏机制和变化环境，不能照搬这里一次观察就归零的更新。


<a id="ch08-information-calculation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-information-calculation)


### 一个可手算的区分力


<a id="ch08-u0027"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0027)

若先给两个候选各 0.5 的权重，不确定性是 1 bit。“走近并按按钮”的返回无论如何按当前假设都为开，观察后仍为 0.5 与 0.5，因此预期减少 0 bit；“只走近”时，一个候选说开、一个说关，在无噪声且候选穷尽的这个小设定中，任一返回都留下一个候选，预期减少 1 bit。


<a id="ch08-u0028"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0028)

这项计算评估的是**候选内部的信息**，不是普遍的行动价值。若目标只要求立刻看到门开，“走近并按按钮”可以直接成功；若将来要反复以较低代价开门，先辨明机制才可能值得。获得信息也有动作成本，信息最多的动作未必是每个任务的最佳动作。[LAB10](https://codingai-lec04.pages.dev/course/notebooks/cc09b0442e194df5b0dd09251ac79985.html) 允许只把干预改回同时走近与按键，观察任务成功与机制辨认怎样分开。


<a id="ch08-imagination"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-imagination)


## 8.5 想象可以帮助这一次选路，也可以改变以后的策略


<a id="ch08-u0029"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0029)

已经有可接受反馈检查的预测后，计算可以花在不同阶段。当前选路是在同一状态上比较几项动作后果，选一个执行，再根据新观察重来。想象训练则利用模型展开的经历更新策略，让以后遇到相应情况时能直接提出更好的动作。两者可以组合，但不能混成“每次都在脑内展开搜索树”。


<a id="ch08-u0030"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0030)

[DreamerV3](https://arxiv.org/abs/2301.04104) 学习环境模型，并利用想象的未来改进行为，体现了后一种连接。论文中同一算法配置用于多种任务的结果，不能改写为一个已训练策略无需学习就解决所有任务。[MuZero](https://arxiv.org/abs/1911.08265) 则把学习到的模型与树搜索结合，预测奖励、策略和价值等规划所需的量。二者在这里帮助我们看清计算用途，并不构成方法排名。


<a id="ch08-u0031"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0031)

如果模型错误地允许杯子穿过挡板，规划可能选择这条路线，想象训练也可能强化它。模型内高回报只能说明策略利用了当前模型，不能证明现实任务完成。增加想象次数会更充分利用已有模型，却不会自动补上未观察过的材质或动作经验。闭环重新观察使系统有机会修正状态；长轨迹中的误差还可能改变后续输入，进入越来越不熟悉的区域，因此不能把长期可靠性等同于单步平均误差小。


<a id="ch08-task-representation"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-task-representation)


## 8.6 有用的预测保留什么：完整形状、空间关系与任务量


<a id="ch08-u0032"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0032)

杯身中心通过挡板，不代表整只杯子通过。杯柄伸出杯身，物体运动时扫过一片区域；任何部分与挡板相交都可能接触。若固定姿态比较路线，就要给完整形状留下净空；若改成旋转杯子，旋转过程及抓取约束也是新动作的一部分。这就是空间结构对行动的具体作用。


<a id="ch08-u0033"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0033)

同样，几何可行不保证动态可控。桌面变湿后，杯子可能滑得不同；水迹只能提示需要检查表面条件，不能从外观直接读出某个摩擦值。纹理变化、摩擦偏差、动作延迟和传感噪声也不是同一种现实差距，应分别选择能揭示它们的测试。随机化可以覆盖预设因素及范围，不能证明未覆盖因素也已处理。


<a id="ch08-u0034"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0034)

预测不必重现所有像素，但必须保留任务需要的信息。避碰可能不需要桌面花纹，却需要杯柄和通道边界；识别材质时，反光与纹理又可能重要；判断信号灯时，颜色会决定行动。压缩表示的关键问题是：压缩是否把原本需要不同动作的情形合并成了同一状态？


<a id="ch08-u0035"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0035)

MuZero 的任务量预测说明，可以按规划用途选择输出；[I-JEPA](https://arxiv.org/abs/2301.08243) 则从上下文预测目标区域的表示，原论文将其定位为非生成式图像自监督方法。本讲把它放在这里比较预测对象，而不把它改称像素生成器。这两条路线训练目标与用法不同，它们共同提出一个可检查问题：省略细节以后，目标任务依赖的区别是否还在？


<a id="ch08-data-experience"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-data-experience)


## 8.7 数据增加了什么经验，测试就应该检查什么


<a id="ch08-u0036"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0036)

一段杯子滑动视频记录了可见变化，却未必记录推力方向、持续时间和控制量。单凭滑动距离，又会混入表面、质量与接触方式。要学习给定动作的后果，需要对齐动作与前后观察；更多相似视频可能改善外观与运动表征，却没有自动补上缺失的动作条件。


<a id="ch08-u0037"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0037)

覆盖是另一层问题。干桌面轻推的许多成功记录，没有自动增加湿桌面、强推或挡板换位的经验。文件大小、记录精度和条件覆盖要分开。失败记录可能揭示边界；采集、对齐、模拟和评估也有成本。[V-JEPA 2](https://arxiv.org/abs/2506.09985) 区分大规模无动作视频预训练和动作条件的机器人后训练，提供了观察经验怎样接向行动的一条具体研究路线，而非任意无动作视频已经等价于机器人经验的证明。


<a id="ch08-u0038"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0038)

评估同样应拆开。画面好看检查生成质量；固定初始条件、改变动作并核对环境结果，检查动作条件预测；把模型接入策略，在留出任务上看收益，检查控制效用；改变布局、物体或动态条件，再以同样标准评价，才触及迁移。前一层成功不会自动替下一层完成证据。


<a id="ch08-u0039"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0039)

例如某预测器对轻推与强推始终给同一终点，而受控环境返回不同终点，这就提供了针对“它利用了动作强弱”的反例。换一个镜头仍画得漂亮，回答的是别的问题。一次同时改变镜头、杯子、表面与动作则难以归因。先明确主张和可能使自己改主意的结果，再选择下一项测试。


<a id="ch08-language-state"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-language-state)


## 8.8 只预测词，也可能需要跟踪状态


<a id="ch08-u0040"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0040)

盒中起初有三枚木球，取走一枚，再放入两枚，最后是四枚。若只把最后一步换成取走两枚，最后就是零枚。末尾问题一样，当前盒内也不可见，但正确答案随历史改变。这个小算例说明，文本中的事件关系可能要求预测者维护状态，而不只是沿着熟悉的局部句式续写。


<a id="ch08-u0041"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0041)

答对这两题首先是行为证据。它可能来自计数规则，也可能依赖题型或记忆；要区分，需要改数值、改长度、改表达，再看内部信息如何参与预测。[Othello 序列研究](https://arxiv.org/abs/2210.13382) 在受控棋局中研究内部棋盘表示，并通过干预考察它与预测的关系。可读出状态、改变表示会影响输出、迁移到新条件，属于不同证据层次；受控棋局也不直接证明现实物理理解。


<a id="ch08-u0042"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0042)

语言还为行动提供目标与组织接口。“把杯子移到蓝书右边”表达了任务，但没有确认杯子的当前位置。若执行后观察到它仍在左边，下一轮回答与动作就必须采用这个新信息。原先写下的“会到右边”可以保留为预测记录，却不能充当执行成功记录。


<a id="ch08-u0043"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0043)

因此，语言模型与世界模型不必被排成互相淘汰的阶段。一个系统可以用语言表达目标、调用工具，用状态预测比较行动，并根据环境或工具返回修正计划。下一讲继续追问：上下文中的条件、对象与事件怎样被表示和找到，系统如何区分指令、预测和已观察结果，并使新证据真正改变后续生成？


<a id="ch08-five-judgments"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-five-judgments)


## 8.9 五个判断，回到一个陌生情境


<a id="ch08-u0044"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0044)

现在再看开头的湿桌、杯柄和挡板。当前缺的可能是几何、动态经验、持续状态，或能区分机制的反馈；认出研究者的名字不会自动回答其中任何一项。课程用下面五条判断提示不同缺口。它们是课程概括，不是逐字引语，也不是五个人共同提出的一套理论。


<a id="ch08-u0045"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0045)


| 课程概括 | 在当前情境中怎样提问 | 原始语境与边界 |
| --- | --- | --- |
| Ilya：预测可能揭示数据背后的过程 | 为了预测杯子后续位置，模型是否学到了事件与状态关系？ | [访谈原文](https://www.dwarkesh.com/p/ilya-sutskever)讨论预测背后的过程；它提出可能性，不保证任意预测任务都学到正确机制。 |
| Jitendra：网页数据遗漏具身经验 | 记录中有没有实际动作量、感觉变化与不同表面？ | [Berkeley 官方讲座记录](https://news.berkeley.edu/2023/03/24/berkeley-talks-transcript-jitendra-malik/)帮助辨认感知运动经验缺口。 |
| Richard：交互揭示行动后果 | 哪个动作会让仍成立的候选作出不同预测？ | [智能决策者共同模型](https://arxiv.org/abs/2202.13252)讨论与世界交互和内部部件；N57 的信息试探是课程沿此框架的进一步推演。 |
| Fei-Fei：行动依赖空间结构 | 杯柄、通道、遮挡和接触是否允许整个动作发生？ | [空间智能论述](https://drfeifei.substack.com/p/from-words-to-worlds-spatial-intelligence)提出方向，不能替代本任务尺寸与行动测试。 |
| Yann：有用预测无需重现每个细节 | 表示省略了纹理以后，是否仍保留决定碰撞的边缘？ | [I-JEPA](https://arxiv.org/abs/2301.08243)提供表示预测实例，不能据此宣称所有行动问题已被解决。 |


<a id="ch08-u0046"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0046)

这些方向之间有真实张力：规模化观察可以走多远，行动经验何时不可少，压缩到什么程度仍能适应任务改变，都要靠具体证据回答。本章留下的共同问题是：**面对没有熟悉模板的新情境，什么使智能体仍能有效行动？**答案应落在系统保留的信息、可检验预测、可执行动作以及反馈后的改变上。


<a id="ch08-generation-map"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-generation-map)


## 8.10 把四种生成路线接回同一套判断


<a id="ch08-u0047"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0047)

回到本讲的方法地图，自回归逐次追加部分，把已有输出作为后续条件；VAE 从潜在起点经过解码器生成，训练时以重建和先验约束组织这个入口；GAN 的生成器通过学得的判别反馈改变参数，典型使用时由生成器出图；扩散把局部预测接入更新规则，多次改变同一状态。它们的典型过程不同，却都没有替最后的任务评价和环境检验作出保证。


<a id="ch08-u0048"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0048)

识别路线需要过程证据，单看一张漂亮杯子图通常不够。训练时参与的部件也不必在生成时继续参与：GAN 的判别器主要提供训练反馈；VAE 从先验生成时不必先编码输入照片；扩散预测器与采样规则仍然有各自职责。复杂系统还可以把外层自回归与内层扩散组合起来，不必强行归入唯一的格子。


<a id="ch08-u0049"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0049)

这些机制知识帮助我们定位故障。重建时已经丢失杯柄，与生成新组合才破坏杯柄，是不同问题；预测器输出有误，与更新规则把预测推进得不合适，也需不同检查。知道怎样生成，才能把“结果不好”改成有依据的下一项对照。进入行动以后，同一种习惯继续有效：先问状态、预测还是执行哪一处与反馈冲突。


<a id="ch08-practice"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-practice)


## 8.11 从本章继续：做一次真的会改变后续选择的反馈


<a id="ch08-u0050"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0050)

先在 [LAB10 网页正文](https://codingai-lec04.pages.dev/course/notebooks/cc09b0442e194df5b0dd09251ac79985.html) 读保存图和结果，再运行同册。默认“只走近”的反馈能排除一个候选；把唯一干预改为“走近并按按钮”，会看到门仍打开、两个候选却继续各占 0.5。之后比较相同当前观察与不同历史的两条记录，解释为什么保留历史能节省下一步动作成本。


<a id="ch08-u0051"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0051)

这个实验没有训练物理模型或机器人。候选由课程明确写出，环境按独立规则执行，发生的学习是新反馈改变候选权重与下一动作。它把状态、干预、反馈和选择变成了可查的运行对象；如果要进一步声称学得可迁移世界模型，还要另做参数学习、留出环境预测和控制检验。


<a id="ch08-u0052"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0052)

自检：若一个模型自己生成“走近但门没开”的视频，这段视频能否排除感应机制？不能。它提供了候选后果，仍需独立环境返回验证。若两种候选都解释不了反馈，应首先检查动作条件、观测噪声和候选集合，而不是用叙述补出一个成功故事。能够指出这两件事，才真正把生成、决策和验证分开了。


<a id="ch08-u0053"></a>
[区块原文](https://codingai-lec04.pages.dev/lecture.html#ch08-u0053)

如果你的真实疑问仍是“怎样让图片只改目标部分”，可以回到真实图像实验的原图、遮罩与原始输出，分别观察目标改变和非目标保留；如果疑问是“从随机潜变量为什么能生成”，就比较图像 VAE 的重建和先验样本；如果疑问是“局部学习如何形成整张分布”，就回看学得去噪器的训练题与采样轨迹。下一步由问题决定，不要求把所有实验依次运行一遍。

