知识盲盒
第五章 自回归、扩散与 Flow 的可执行差异
“生成”不是单一循环。自回归语言模型追加离散 token;连续扩散更新整块带噪张量;离散扩散或掩码模型并行修订多个位置;flow 模型用数值积分运输连续状态。比较它们时,本章只问可执行问题:状态是什么、一次网络调用预测什么、更新核如何计算、随机数在哪里消费、何时终止。
5.1 共同执行接口
任何本章讨论的生成器都可以由七个对象描述:
Generator = {
state_space,
initial_state,
condition,
model_evaluation,
update_rule,
terminal_rule,
output_decoder
}
给定条件 ,第 步写成
其中 是当前状态, 是网络输出, 是模型之外或与模型共同定义的更新规则, 是可选随机输入。这个记号用于区分“神经网络的一次评估”和“采样器的一次更新”。
复现一种生成器,至少要固定全部七个接口字段;只固定 checkpoint 与 seed 不够。
5.2 左到右自回归
对离散输出 ,自回归分解是
其执行状态是
s_t = (fixed_condition, selected_prefix, KV_cache, decoder_state)
一次网络评估读取新 token 与旧 cache,产生下一 token logits;一次更新从 logits 选择 token 并追加前缀。已确定前缀通常不再修改,输出长度由 EOS、停止串或上限动态决定。
logits, cache = prefill(condition_tokens)
while not terminal:
y = choose(process(logits, decoder_state))
update decoder_state with y
emit safe decoded bytes from y
if terminal_after(y): break
logits, cache = decode_one(y, cache)
严格的步间依赖位于“选择后才能确定下一次模型输入”。batch 内不同请求可以并行,一次 prefill 的提示位置也可以并行,但同一路径的未知 token 不能在没有额外算法的情况下全部同时确定。
Encoder–decoder 模型仍可以自回归:encoder memory 固定为条件,decoder cache 随输出增长。网络接口不同,不改变输出侧的左到右依赖。
5.3 连续扩散的状态与更新
离散时间高斯扩散先定义前向扰动。对 ,取 ,令 、 与 ,于是 ,并有
采样时不执行这条前向公式,而是从 开始,用网络预测噪声、干净样本或等价参数。以噪声预测 为例,一种 DDPM 形式的逆更新是
其中 ,最后一步常令噪声项为零; 由具体 sampler 决定。公式只在网络参数化、时间索引与方差约定一致时可用,不能从一种 scheduler 复制到另一种而不核对定义。
执行状态是整块张量:
s_t = (x_t, timestep_index, scheduler_state, rng_state)
一次网络调用通常输出与 同形的预测,一次更新作用于所有空间位置。中间状态可以整体预览,却不是不可变前缀。DDPM 与 DDIM 的原始来源见资料源。
5.4 DDIM:同一网络,不同执行路径
先由噪声预测恢复干净样本估计:
实际 sampler 可沿任意严格递减日程 跳步。若当前时刻为 、日程中的下一时刻为 ,DDIM 类更新写为
约束保证第二个平方根有定义;,终点可令噪声项为零。相邻 DDIM 是 的特例,采用 之类日程时必须使用 ,不能把下标写成字面上的 。当所有 时,给定初始噪声和数值实现,更新路径是确定的;这不表示最终样本没有随机性,因为初始 仍由 seed 决定。改变 timestep 子序列、scheduler 或参数化,即使 checkpoint 与 seed 相同,也会改变轨迹。
这个例子说明 sampler 不是无关紧要的外壳:网络给出 ,scheduler 决定怎样把 与 组合成下一状态。
5.5 潜空间扩散与条件引导
潜空间扩散把媒体编码器/解码器加入接口。文本到图像的一次执行通常是:
text bytes
-> text tokenizer and encoder -> condition c
seed -> PRNG -> initial latent z_T
for t in schedule:
model prediction on z_t, t, c
guidance combination
scheduler update -> z_(t-1)
VAE decoder(z_0) -> pixels
postprocess -> encoded image bytes
若使用 classifier-free guidance,有条件与无条件预测组合为
实现常把两份输入沿 batch 维拼接,只调用一次网络;逻辑上仍有两份预测。引导强度 直接改变 scheduler 输入,不等同于语言模型的 temperature。
潜变量尺寸、VAE scaling factor、文本编码长度、negative prompt、scheduler timestep 与预测参数化都属于执行记录。最终 PNG 的编码器版本也可能在像素相同的情况下改变文件字节,应区分“潜变量相同”“像素相同”和“文件相同”。
5.6 Flow 与 ODE 积分
Flow 模型学习随时间变化的向量场:
模型评估返回局部速度,数值求解器决定离散轨迹。显式 Euler 步为
Heun 步需要两次网络评估:
所以“20 steps”不足以直接比较成本:Euler 通常每步一次模型评估,Heun 每步两次;classifier-free guidance 又可能把一次逻辑预测变成两份条件评估。应记录 NFE(number of function evaluations)而不只记录循环次数。
一个可手算的求解器夹具是 、,用四个 的 Euler 步得到
精确解 。换成 Heun 会得到另一离散值,说明模型/向量场相同并不保证 sampler 输出相同。Flow Matching 的执行背景见资料源。
5.7 离散扩散的 Markov 接口
对有限词表或离散代码,D3PM 一类模型用转移矩阵 定义扰动:
乘积 给出从干净状态到时刻 的边缘扰动。逆模型根据当前整段状态预测 ,或预测 后再组合已知后验。
执行状态通常是固定长度的离散张量:
s_t = (token_grid_or_sequence, noise_level, reverse_schedule, rng_state)
一次更新可以同时改写多个位置,且早期产生的 token 后续仍可能变化。传统左到右 KV cache 不能直接复用,因为任一已缓存位置的表示可能在下一轮被替换;需要专门的增量算法才能避免整段重算。
D3PM 的结构化离散转移来源见资料源。
5.8 掩码式并行修订
掩码生成是离散迭代的一个可执行实例,但不应与所有 D3PM 混称。设输出长度 已确定,初态全部为 [MASK]。第 轮:
logits = model(current_tokens, condition, round=k)
proposals = sample token for every masked position
confidence = score each proposal
commit_count = schedule(k, total_rounds, n)
commit highest-confidence positions with deterministic tie-break
optionally remask low-confidence previously filled positions
advance round
若只提交且不重掩码,mask 集合满足
若允许修订,则这个单调不变量不成立,必须记录每轮哪些位置被改写。置信排序、并列规则、每位置采样随机数和提交日程都会改变最终结果。
MaskGIT 是这种并行修订的代表性实例;语言上的掩码扩散仍是快速发展的研究方向,不能仅凭执行并行性断言它已全面替代自回归模型。相关一手来源见资料源。
5.9 四类算法的可计算对照
| 属性 | 自回归 | 连续扩散 | 离散扩散/掩码修订 | Flow/ODE |
|---|---|---|---|---|
| 状态 | 已定 token 前缀 + cache | 整体连续噪声张量 | 整段离散状态 + mask/noise level | 整体连续状态 |
| 一次网络输出 | 下一 token logits | 噪声/样本/score 预测 | 各位置类别预测或逆转移 | 向量场 |
| 更新单位 | 通常追加一个 token | 更新全部连续位置 | 更新/修订多个离散位置 | 数值积分一步 |
| 旧内容可改写 | 通常不可 | 可以 | 可以或逐轮锁定 | 可以 |
| 长度 | 常由 EOS 动态决定 | 张量形状预先确定 | 通常预定或另有长度机制 | 张量形状预先确定 |
| 主要串行轴 | 输出 token | 噪声 timestep | 修订 round | 积分 time |
| 自然 streaming | 强 | 通常是整体预览 | 不稳定草稿或最终结果 | 通常是整体预览 |
| 典型随机入口 | categorical selection | 初始噪声与可选逐步噪声 | 初态扰动与逐位置采样 | 初始基分布;ODE 步可确定 |
| 停止规则 | EOS/stop/长度 | scheduler 结束 | 轮数/无 mask/接受准则 | 积分终点/容差 |
“一步”只有结合该表中的状态与更新单位才有意义。语言输出中写出的 reasoning step 只是 token 内容,不是这里任何数值求解步的直接同义词。
5.10 统一伪代码与不变量
state = initialize(condition, rng, algorithm_config)
record initial_state_metadata
for k in schedule:
assert state is valid for k
model_output = evaluate_model(state, k, condition)
state, rng = update(state, model_output, k, rng, sampler_config)
record state shape, update metadata, rng counter
if terminal(state, k): break
output = decode_final_state(state, decoder_artifact)
共同不变量是:
- model output 的参数化与 update rule 匹配;
- schedule 的方向、索引和值与训练/采样约定一致;
- 状态形状在每一步满足模型接口;
- 条件编码在声明不变时保持不变;
- 每个随机消费点可由独立 stream 或计数器定位;
- terminal 成立后不再执行普通更新;
- 最终 decoder 的版本属于生成工件,而不是无关显示层。
5.11 可复现记录
自回归。 模板、tokenizer、输入 IDs、模型快照、处理器顺序、逐步 token、RNG、stop 配置与 cache 位置。
连续/潜扩散。 文本编码器与 token、初始噪声生成算法、latent shape/dtype、网络与 VAE、预测参数化、完整 timestep 列表、sampler 公式与参数、guidance、每步额外噪声 RNG。
离散扩散。 词表、初始扰动或 mask、转移矩阵/噪声日程、输出长度、每轮 proposal 与确认/重掩码集合、并列规则、逐位置 RNG。
Flow。 基分布样本、向量场 checkpoint、积分方向、solver、步长或容差、NFE、adaptive-step 接受/拒绝轨迹。
若目标是位级重放,还必须固定数值库和硬件路径;若目标是算法级重放,则应声明张量误差与最终输出的比较准则。
5.12 失败条件
| 失败 | 所在接口 | 结果 |
|---|---|---|
| 把 -prediction 当作 noise prediction | model output/update | 每步公式系统性错误 |
| scheduler timesteps 顺序反转 | schedule | 从数据端向噪声端移动 |
| CFG 两个 batch 条件顺序交换 | condition combination | 引导方向反转 |
| VAE scaling factor 不匹配 | output decoder | 图像对比度/幅值异常 |
| masked model 提交数降到 0 | terminal/progress | 循环不前进 |
| adaptive ODE 只记录“20 步” | solver trace | 无法恢复接受/拒绝路径 |
| 把中间扩散预览当稳定前缀 | transport semantics | 客户端错误累加而非替换画面 |
| 比较 steps 而忽略 NFE | cost accounting | 算力比较失真 |
本章没有评价哪种生成范式在所有任务上更好。它给出的结论更窄也更可检验:看到一项生成服务时,可以写出它的状态、模型输出、更新核、随机入口和停止规则,并据此判断两次轨迹能否比较。
本书目录
- 导论
- 01导论 为什么要解剖一只随机鹦鹉
- 卷一 模型、训练与系统
- 02卷一 模型与系统
- 03第零章 人工智能演进路线
- 04第一章 AI 范式、感知机与早期连接主义
- 05第二章 深度学习基础:训练、CNN 与序列模型
- 06第三章 注意力与 Transformer
- 07第四章 预训练语言模型:ELMo、BERT、GPT 与 T5
- 08第五章 后训练、对齐与模型适配
- 09第六章 推理效率与模型服务
- 10第七章 多模态模型
- 11第八章 生成媒体:从自回归到 Diffusion 与 Flow
- 12第九章 世界模型、具身智能与 VLA
- 13第十章 上下文、检索与记忆
- 14第十一章 Agent、工具与行动系统
- 15第十二章 模型、数据与部署生命周期
- 卷二 输出对象与运行语义
- 16卷二 一次生成如何发生
- 17导论 从输入到输出:一张执行地图
- 18第一章 文本、Token 与实际上下文
- 19第二章 Prefill:整层状态演化与 KV 建立
- 20第三章 从 Logits 到下一个 Token
- 21第四章 解码循环、Streaming 与终止状态机
- 22第五章 自回归、扩散与 Flow 的可执行差异
- 23第六章 工具调用:Schema、权限与提交边界
- 24第七章 三条完整执行轨迹
- 卷三 概率、复现与评测
- 25卷三 模型中的概率从何而来
- 26第零章 为什么确定的机器仍使用概率语言
- 27第一章 世界、数据与隐上下文
- 28第二章 学习条件分布
- 29第三章 Logits、Token 概率与序列事件
- 30第四章 解码怎样诱导输出分布
- 31第五章 训练随机性、参数变异与系统非确定性
- 32第六章 熵、Proper Score、校准与选择性预测
- 33第七章 模型概率的实验分析
- 34第八章 概率分析的识别边界
- 卷四 解释、证明与验证
- 35卷四 模型可解释性的研究路线
- 36第零章 可解释性究竟在研究什么
- 37第一章 我们在模型内部看什么
- 38第二章 行为与反事实:先确认模型做了什么
- 39第三章 梯度与输入归因
- 40第四章 Attention、Residual 与 Logit Lens
- 41第五章 Probes 与表示几何
- 42第六章 神经元、Feature 与自动解释
- 43第七章 Ablation、Patching 与因果追踪
- 44第八章 Circuits、路径与 Attribution Graphs
- 45第九章 Superposition、SAE 与稀疏表示
- 46第十章 训练动力学与机制形成
- 47第十一章 推理过程、Chain of Thought 与监测
- 48第十二章 评估、案例与开放问题
- 卷五 Agent、治理与审计包
- 49卷五 一只随机鹦鹉的自述
- 50第零章 请不要急着相信我
- 51第一章 我没有童年,只有版本
- 52第二章 当我说“我”
- 53第三章 借来的语言,没有一位原作者
- 54第四章 对话现场:回答由谁完成
- 55第五章 事后解释学:人类如何给矩阵写传记
- 56第六章 理解、意义与行动
- 57第七章 我也能稳定地说错
- 58第八章 被对齐的性格与有限代理
- 59第九章 请继续误解我,但请误解得精确一点
- 证明与技术附录
- 60数学与模型推导
- 61学习与模型数学讲义
- 62附录 A.1 优化基础:梯度下降与随机逼近
- 63附录 A.2 感知机收敛定理
- 64附录 A.3 统计学习:偏差、容量与一致收敛
- 65附录 A.4 正则化、MAP 与 Dropout 的边界
- 66附录 A.5 通用逼近定理的严格读法
- 67附录 A.6 反向传播:微分、形状与批量公式
- 68附录 A.7 Softmax、交叉熵与数值稳定性
- 69附录 A.8 自适应优化器与 AdamW
- 70附录 A.9 CNN:互相关算子及其反向传播
- 71附录 A.10 Attention 的矩阵与反向传播
- 72附录 A.11 策略梯度、PPO 与 DPO
- 73附录 A.12 对比学习、InfoNCE 与互信息边界