从一句话到一张图:看懂 Stable Diffusion 的“潜空间扩散”生成流程(配图详解)

Stable Diffusion Pipeline
Source: Aayush’s Blog, “Stable Diffusion using Hugging Face – Putting everything together” (2022).Used with attribution.
当你输入一句 “A dog wearing a hat(戴帽子的狗)”,模型最后输出一张高清图片。中间到底发生了什么?
这张图展示的,其实就是 Stable Diffusion 这类潜空间扩散模型(Latent Diffusion Model)最核心的工作流:文本 → 语义向量 → 潜空间噪声 → 逐步去噪 → VAE 解码成图像。
本文将按图逐块拆解,并补充它背后的关键概念与工程细节,让你真正理解扩散模型是如何“画画”的。
1. 这张图在讲什么?
这张图描述了典型的 Stable Diffusion 文生图管线:
- Prompt 文本 → CLIP 文本编码得到 text embeddings
- 从高斯噪声开始初始化潜变量 latents
- U-Net 在 text embeddings 条件引导下做多步迭代去噪(由 scheduler 控制)
- 得到最终的 conditioned latents
- VAE 解码成真实像素图输出(如 512×512)
2. 模块一:CLIP Model —— 文本如何变成“可计算的语义”
图左侧是 CLIP Model,主要过程包括:
- Tokenizer(分词器):把文字拆成 token
- Token to Embedding:把 token 映射到向量空间
- 输出 Text Embeddings (1×77×768)
2.1 为什么是 77×768?
以 SD 1.x 为例:
- 最大 token 长度固定为 77(包含起止符号等)
- 每个 token 对应一个 768 维语义向量(CLIP Text Encoder 的 hidden size)
因此最终的文本表示是一个矩阵:
这个 embedding 就是后续 U-Net 去噪过程的“条件信号”,相当于让模型知道:它去噪的目标应该朝向“戴帽子的狗”。
3. 模块二:Gaussian Noise → Latents —— 为什么从噪声开始?
图的右上角是 Gaussian Noise(高斯噪声):
- 形状:1×4×64×64
这就是 Stable Diffusion 的“起点”。
3.1 为什么不是直接在 512×512 像素上扩散?
这是 Stable Diffusion 的核心创新:不在像素空间扩散,而在潜空间(latent space)扩散。
- 真实图像:
3×512×512 - 潜空间:
4×64×64
这相当于把图像压缩了 8 倍(512 / 64 = 8),计算量大幅下降。
这就是 Latent Diffusion 的意义:更快、更省显存,同时保持画质。
3.2 这 4 个通道是什么?
这是 VAE 编码后的 latent feature map 的通道数(对 SD 1.x 常见配置就是 4)。
4. 模块三:U-Net —— 扩散模型真正“画画”的地方
图中黄色块是 U-Net,它是扩散模型的核心网络,负责:
- 输入:当前 timestep 的 noisy latents(含噪潜变量)
- 条件:text embeddings
- 输出:噪声预测(或直接预测 x0 / v,取决于训练方式)
4.1 U-Net 为什么叫 U-Net?
因为它是“编码器-解码器”的结构,中间通过 skip connection 保留空间细节,适合做图像相关任务。
4.2 文本是怎么“进”U-Net 的?
通常通过 Cross-Attention(交叉注意力):
- Query 来自 latent feature
- Key/Value 来自 text embeddings
这意味着:
模型每一步去噪时,都在不断“对齐”文字语义与图像潜空间结构。
4.3 CFG:提示词引导
虽然图里没写,但实际流程几乎都会用 Classifier-Free Guidance(CFG):
- 同时跑 有条件(prompt) 与 无条件(空 prompt)
- 两者结果线性组合,让生成更贴近 prompt
其中 s 是 guidance scale(常见 5~12)。
5. 模块四:Scheduler —— 控制“加噪/去噪”的时间策略
图右侧橙色块是 Scheduler algorithm to add noise,它负责管理扩散过程中的:
- 时间步(timestep)
- 噪声强度(noise schedule)
- 采样算法(DDIM、Euler、DPM++ 等)
5.1 为什么图里写 “Repeat N times”?
因为扩散模型的生成不是“一步到位”,而是 多步迭代:
- 通常 N = 20~50
- 每一步根据 scheduler 指定的规则更新 latents
这就是所谓的 采样过程(sampling)。
去噪步数越多,通常细节越丰富,但耗时越长;不同采样器会影响风格与稳定性。
6. 模块五:VAE —— 从潜空间回到像素世界
图中绿色块是 VAE,它是一个:
- Encoder:把图像压缩到 latent
- Decoder:把 latent 解码回图像
在文生图里我们只用 Decoder:
image = VAE.decode(conditioned_latents)
输出图像尺寸是:3×512×512(RGB)
这也是图右下角 Output Image 的来源。
7. 串起来:Stable Diffusion 的整体流程(对应图)
结合图,我们可以用“工程视角”的伪流程理解:
- 输入 prompt
- 用 CLIP 把 prompt 编码成 text embeddings
- 初始化随机高斯噪声 latents(1×4×64×64)
- for t in timesteps:
- U-Net(latents, t, text_embeddings) → 预测噪声
- Scheduler 根据预测噪声更新 latents
- VAE 解码 latents → 输出 512×512 图片
8. 为什么这种结构强大?有三个关键优势
8.1 潜空间扩散:速度与质量的折中最佳解
相比像素扩散:更快、更省显存
相比 GAN:更可控、更稳定
8.2 CLIP 语义空间:文本可精细控制图像内容
Cross-attention + CFG 让 prompt 能精准影响形状、颜色、风格、细节。
8.3 Scheduler 可插拔:采样策略决定“生成气质”
不同 scheduler(Euler、DDIM、DPM++)决定:
- 清晰度
- 细节锐利程度
- 风格偏向
- 收敛速度
9. 读图小结
Stable Diffusion = 文本条件 + 潜空间扩散 + U-Net 去噪 + VAE 解码
Prompt 给方向
CLIP 给语义
U-Net 做生成
Scheduler 控节奏
VAE 把结果搬回像素世界
理解了这条链路,就可以掌握扩散模型最重要的知识骨架。