本讲目录

第 04 讲 · 潜空间与整机架构

前两讲把"扩散"的数学讲完了,但一直假装网络 \(\epsilon_\theta\) 是个黑盒、图像直接在像素上加噪。本讲拆开整机:Stable Diffusion = VAE(压缩)+ 文本编码器(读题)+ 去噪网络(干活) 三大件。看懂这三大件,你就看懂了 ComfyUI 里所有模型加载节点、E:\AI\Models 下那十几个文件夹、以及 SD1.5/SDXL/FLUX 之间到底差在哪。

1. 潜空间:SD 的立身之本

潜空间降维

图 4.1潜扩散:不在像素上、而在压缩后的潜空间跑扩散——维数大降、算得起,Stable Diffusion 的立身之本。

1.1 像素扩散太贵

\(512 \times 512 \times 3 \approx 7.9 \times 10^5\) 维的像素空间跑扩散,每步去噪都要网络处理全分辨率图像,训练和采样都极其昂贵(早期像素扩散模型只有大厂玩得起)。

Latent Diffusion(Rombach et al. 2022,即 SD 的论文)的洞察:图像的像素里绝大部分是"感知冗余"——邻近像素高度相关,人眼对高频细节的精确值不敏感。那就先用一个 VAE 把图像压进一个小得多的潜空间,在潜空间里跑扩散,最后再解压回像素

\[ \underbrace{x \in \mathbb{R}^{512 \times 512 \times 3}}_{\text{像素}} \;\xrightarrow{\;\text{VAE Encoder}\;}\; \underbrace{z \in \mathbb{R}^{64 \times 64 \times 4}}_{\text{潜空间: 空间} \times\frac{1}{8}} \;\xrightarrow[\text{(第 02/03 讲的全部数学发生在这里)}]{\;\text{扩散加噪/去噪}\;}\; z' \;\xrightarrow{\;\text{VAE Decoder}\;}\; x' \]

维数从 786k 降到 16k,缩小约 48 倍——同样的数学,1/48 的战场。这就是消费级显卡能跑 SD 的原因,也是"Stable Diffusion"里 stable 之外那半个奇迹。

1.2 由此立刻解释的 ComfyUI 现象

2. 文本编码器:把提示词变成向量组

提示词进入模型前,经历 tokenize → embedding → Transformer 编码,产出一组向量(每个 token 一个),这组向量就是第 02 讲以来一直写的条件 \(c\)

对应 ComfyUI:CLIP Text Encode 节点做的就是这一步(黄色 CLIP 线进,橙色 CONDITIONING 线出);Models/text_encoders(或 clip)文件夹放的就是这些编码器的权重——SD1.5/SDXL 的 checkpoint 里已打包,FLUX 一族则常拆开单独下载。

3. 去噪网络本体:U-Net → DiT

去噪网络结构:U-Net(下采样-瓶颈-上采样 + skip)→ DiT,标出时间步/条件注入点。

图 4.2去噪网络结构:U-Net(下采样-瓶颈-上采样 + skip)→ DiT,标出时间步/条件注入点。

3.1 U-Net:卷积时代的答案

SD1.5/SDXL 的 \(\epsilon_\theta\)U-Net:编码路径逐级下采样(64→32→16→8)抓全局结构,解码路径逐级上采样恢复分辨率,同分辨率层之间有跳跃连接直通细节(输入输出同形状的任务的经典架构——去噪正是)。两个关键改装:

3.2 DiT:Transformer 接管

Diffusion Transformer(Peebles & Xie 2023):把潜空间图切成 patch 序列,整个去噪网络就是一叠 Transformer 块(Sora、SD3、FLUX、Qwen-Image 均属此系)。动机与姊妹课程第 06/07 讲一脉相承:Transformer 的 scaling 性质好——加参数加数据,性能按幂律稳定爬升,而 U-Net 放大到一定规模后收益变差。SD3/FLUX 用的 MMDiT 变体让文本 token 和图像 patch 在同一序列里双向注意(不再是单向的 cross-attention),图文对齐更强。

3.3 流匹配:更直的路

FLUX/SD3 还换了训练目标:流匹配 / 整流(rectified flow)。把"数据→噪声"的路径定义为最朴素的直线插值:

\[ x_t = (1 - t)\, x_0 + t\,\epsilon, \qquad t \in [0, 1] \]

网络学习这条路径的速度场 \(v_\theta(x_t, t) \approx \epsilon - x_0\)(损失仍是平方损失,与第 02 讲同构——你已有的全部理解平移可用)。好处:DDPM 的加噪路径是弯曲的,而直线路径用数值积分(第 03 讲)走起来步数更少、误差更小。工程结论:FLUX 系不看 cfgguidance(蒸馏进权重的引导强度,дefault ~3.5),采样器搭配也不同——遇到 FLUX 别照搬 SDXL 参数。

4. 系谱与"整机 vs 散件"

4.1 主流模型系谱(2026 年初,只列你会遇到的)

模型 年份 去噪网络 文本编码 原生分辨率 在你 16GB 卡上
SD1.5 2022 U-Net (0.86B) CLIP-L 512 秒出,练手神器
SDXL 2023 U-Net (2.6B) 双 CLIP 1024 主力甜点区
SD3.x 2024 MMDiT 双 CLIP + T5 1024 可跑,生态一般
FLUX.1 2024 MMDiT (12B) CLIP-L + T5 1024+ fp8 量化可跑,慢但质高
Qwen-Image 2025 DiT 系 多模态 LLM 1024+ fp8 可跑(你朋友工作流用的这个)
动漫特化(Illustrious/NoobAI 等) 2024–25 SDXL 底子微调 同 SDXL 1024 你的 VRChat 场景主推(第 10 讲)

4.2 checkpoint 文件到底是什么

一个 .safetensors checkpoint = 三大件打包:去噪网络 + 文本编码器 + VAE,一个文件全装。所以 ComfyUI 的 Checkpoint Loader 一个节点吐出三条线:MODEL(紫)、CLIP(黄)、VAE(红)——现在你知道每条线是什么了。

而 FLUX/Qwen 时代流行散件分发diffusion_models/(或 unet/)只放去噪网络、text_encoders/ 放文本编码器、vae/ 放 VAE,各下各的、按需组合(T5 太大,打包进每个微调版太浪费)。对应 ComfyUI 的散件加载路线:UNET Loader + CLIP Loader(可加载双/三编码器)+ VAE Loader 三个节点分别加载,再各自接线。E:\AI\Models 下那些空文件夹的用途至此全部对号入座。

两个实用小知识:

5. 整机流水线总览

把四讲的内容拼成一张完整流程(文生图,SDXL 为例):

提示词 ──CLIP×2──▶ 条件向量组 c ─────────────┐
                                             ▼ (cross-attention, 每步)
随机种子 ──▶ 潜空间噪声 z_T ──▶ [U-Net 去噪 ε_θ  ×25 步, CFG 双跑] ──▶ z_0
   (64×4×128×128)              (第02讲的数学, 第03讲的积分器)          │
                                                          VAE Decode ▼
                                                            1024×1024 像素图

ComfyUI 的默认文生图工作流,就是把这张图的每个箭头画成一根线、每个方块画成一个节点——第 07 讲将逐节点验证这句话。

本讲小结

概念 一句话
潜空间扩散 VAE 压缩 8×,扩散战场缩小 48×——消费级显卡的门票
VAE 显影/压缩两用件;决定色彩细节;可单独替换
文本编码器 CLIP(词堆)→ 双 CLIP → +T5(长句);决定提示词写法
U-Net 下-上采样+跳连;时间嵌入知进度;cross-attention 吃文字
DiT/流匹配 Transformer 化吃 scaling 红利;直线路径少步数
checkpoint 三大件打包;散件 = unet/clip/vae 分文件夹自由组合
safetensors 只下这种格式;文件大小 ≈ 精度档位

三大件都认识了,最后一块原理拼图:怎么在不重训整机的前提下定制它——几十 MB 的 LoRA 为什么能改变整个画风?ControlNet 怎么让模型"看着骨架画"?下一讲把定制件的数学讲完,原理篇收官。