模型架构 #
整体架构概览 #
Stable Diffusion 由三个核心组件构成,它们协同工作实现文本到图像的生成:
text
┌─────────────────────────────────────────────────────────────┐
│ Stable Diffusion 整体架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入 │
│ ├── 文本提示词 │
│ └── 可选:参考图像 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. CLIP Text Encoder │ │
│ │ │ │
│ │ 文本 ──→ Tokenize ──→ Transformer ──→ 嵌入向量 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 2. U-Net (核心去噪网络) │ │
│ │ │ │
│ │ 噪声潜码 + 文本嵌入 ──→ 多步去噪 ──→ 清晰潜码 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 3. VAE Decoder │ │
│ │ │ │
│ │ 潜空间表示 ──→ 上采样 ──→ 像素图像 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 输出:生成的图像 │
│ │
└─────────────────────────────────────────────────────────────┘
CLIP 文本编码器 #
什么是 CLIP? #
CLIP(Contrastive Language-Image Pre-training)是 OpenAI 开发的多模态模型,能够理解文本和图像之间的关联。
text
┌─────────────────────────────────────────────────────────────┐
│ CLIP 模型结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 训练阶段: │
│ │
│ 图像 ──→ Image Encoder ──→ 图像嵌入 │
│ │ │
│ ├── 对比学习 ──→ 拉近正样本 │
│ │ 推远负样本 │
│ │ │
│ 文本 ──→ Text Encoder ──→ 文本嵌入 │
│ │
│ Stable Diffusion 使用: │
│ │
│ 文本 ──→ Text Encoder ──→ 条件向量 │
│ (冻结权重) (引导图像生成) │
│ │
└─────────────────────────────────────────────────────────────┘
CLIP 在 SD 中的应用 #
text
文本处理流程:
1. 文本输入
"a beautiful sunset over mountains"
2. Tokenization(分词)
["a", "beautiful", "sunset", "over", "mountains"]
→ [49406, 64, 4628, 26903, 525, 10127, 49407, ...]
(添加开始/结束标记,填充到固定长度)
3. Transformer 编码
Tokens → Transformer Layers → 嵌入向量
形状: [batch, 77, 768] (SD 1.5)
4. 输出条件向量
用于引导 U-Net 去噪方向
不同版本的 CLIP #
text
CLIP 版本对比:
SD 1.x / SD 2.0:
├── 模型: OpenAI CLIP ViT-L/14
├── 参数: ~123M
├── 嵌入维度: 768
└── 最大长度: 75 tokens
SDXL:
├── 模型: 双编码器
│ ├── OpenCLIP ViT-bigG/14
│ └── CLIP ViT-L/14
├── 嵌入维度: 768 + 1280
└── 更强的文本理解能力
SD 3:
├── 模型: T5 + CLIP
├── T5: 支持更长文本
└── 更好的指令遵循
Token 限制与处理 #
text
Token 限制说明:
SD 1.x/2.x:
├── 最大: 75 tokens
├── 超出会被截断
└── WebUI 会自动分段处理
SDXL:
├── 最大: 75 tokens × 2 编码器
└── 更长的有效上下文
SD 3:
├── T5 支持 512 tokens
└── 可处理更长描述
超出处理方式:
1. 截断(默认)
2. 分段加权(WebUI)
3. 使用 T5 编码器(SD 3)
U-Net 去噪网络 #
U-Net 结构 #
U-Net 是 Stable Diffusion 的核心,负责预测和去除噪声:
text
┌─────────────────────────────────────────────────────────────┐
│ U-Net 结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入: 噪声潜码 [B, 4, 64, 64] + 时间步 t + 文本嵌入 │
│ │
│ ┌─────────────┐ │
│ │ Time Embed │ │
│ │ (t) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────┐ │
│ │ 编码器 │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │
│ │ │64×64 │→│32×32 │→│16×16 │→│ 8×8 │ │ │
│ │ │ResBlock │ResBlock │ResBlock │ResBlock│ │ │
│ │ │+Attn │ │+Attn │ │+Attn │ │+Attn │ │ │
│ │ └───────┘ └───────┘ └───────┘ └───────┘ │ │
│ └────────────────────────┼────────────────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ 中间层 │ │
│ │ 8×8 │ │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────┐ │
│ │ 解码器 │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │
│ │ │64×64 │←│32×32 │←│16×16 │←│ 8×8 │ │ │
│ │ │ResBlock │ResBlock │ResBlock │ResBlock│ │ │
│ │ │+Attn │ │+Attn │ │+Attn │ │+Attn │ │ │
│ │ └───────┘ └───────┘ └───────┘ └───────┘ │ │
│ └────────────────────────┼────────────────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ 输出层 │ │
│ │ [B,4,64,64] │ │
│ └─────────────┘ │
│ │
│ ←─────── Skip Connections(跳跃连接)───────→ │
│ │
└─────────────────────────────────────────────────────────────┘
注意力机制 #
text
注意力类型:
1. Self-Attention(自注意力)
┌─────────────────────────────────────────┐
│ 图像特征之间的交互 │
│ Q, K, V 都来自图像特征 │
│ 学习图像内部的空间关系 │
└─────────────────────────────────────────┘
2. Cross-Attention(交叉注意力)
┌─────────────────────────────────────────┐
│ 图像特征与文本嵌入的交互 │
│ Q 来自图像特征 │
│ K, V 来自文本嵌入 │
│ 实现文本引导的图像生成 │
└─────────────────────────────────────────┘
计算过程:
┌─────────────────────────────────────────────────────────────┐
│ │
│ Cross-Attention: │
│ │
│ 图像特征 (Q) ───┐ │
│ ├──→ Attention(Q, K, V) ──→ 加权特征 │
│ 文本嵌入 (K, V) ┘ │
│ │
│ Attention(Q, K, V) = softmax(QK^T / √d) × V │
│ │
│ 这使得模型能够: │
│ - 根据文本描述生成对应内容 │
│ - 在特定位置生成特定对象 │
│ - 控制图像的风格和属性 │
│ │
└─────────────────────────────────────────────────────────────┘
时间步嵌入 #
text
时间步编码的作用:
目的:
├── 告诉网络当前处于哪个去噪阶段
├── 不同阶段需要不同的去噪策略
└── 使用 Sinusoidal Position Encoding
实现:
┌─────────────────────────────────────────────────────────────┐
│ │
│ t (时间步) ──→ Sinusoidal Encoding ──→ MLP ──→ 时间嵌入 │
│ │
│ PE(t, 2i) = sin(t / 10000^(2i/d)) │
│ PE(t, 2i+1) = cos(t / 10000^(2i/d)) │
│ │
│ 嵌入向量注入到每个 ResBlock 中 │
│ │
└─────────────────────────────────────────────────────────────┘
作用:
├── 早期时间步 (t ≈ 1000): 去除大量噪声,生成整体结构
├── 中期时间步 (t ≈ 500): 细化内容,添加细节
└── 晚期时间步 (t ≈ 100): 微调,完善细节
ResBlock 结构 #
text
Residual Block 结构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────────────────┐ │
│ │ 输入 x │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ GroupNorm │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ SiLU Activation │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ Conv 3×3 │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ ┌──────────────────────────┐ │
│ │时间嵌入 t│→│ + (时间嵌入投影) │ │
│ └─────────┘ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ GroupNorm │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ SiLU Activation │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ Conv 3×3 │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ ─────────┤ + (残差连接) │ │
│ └───────────┬──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ 输出 │ │
│ └──────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
VAE 变分自编码器 #
VAE 的作用 #
VAE(Variational Autoencoder)负责图像与潜空间之间的转换:
text
┌─────────────────────────────────────────────────────────────┐
│ VAE 结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 图像空间 潜空间 │
│ 512×512×3 64×64×4 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ │ Encoder │ │ │
│ │ 图像 │ ───────────────→ │ 潜码 │ │
│ │ 512×512×3 │ │ 64×64×4 │ │
│ │ │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ │ 扩散过程 │
│ │ 在这里进行 │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ │ Decoder │ │ │
│ │ 图像 │ ←─────────────── │ 潜码 │ │
│ │ 512×512×3 │ │ 64×64×4 │ │
│ │ │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 压缩比: 512×512×3 / 64×64×4 = 48 倍 │
│ 大幅降低计算量 │
│ │
└─────────────────────────────────────────────────────────────┘
编码器结构 #
text
VAE Encoder 流程:
输入图像 [B, 3, 512, 512]
│
▼
┌─────────────────┐
│ Conv 3×3 │ → [B, 128, 512, 512]
└────────┬────────┘
│
▼
┌─────────────────┐
│ DownBlock × 4 │ → 逐步下采样
│ 每次缩小 2 倍 │
└────────┬────────┘
│
▼
[B, 512, 64, 64]
│
▼
┌─────────────────┐
│ 分离为均值和方差 │
│ μ, σ │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 重参数化采样 │
│ z = μ + σ × ε │
└────────┬────────┘
│
▼
输出潜码 [B, 4, 64, 64]
解码器结构 #
text
VAE Decoder 流程:
输入潜码 [B, 4, 64, 64]
│
▼
┌─────────────────┐
│ Conv 3×3 │ → [B, 512, 64, 64]
└────────┬────────┘
│
▼
┌─────────────────┐
│ UpBlock × 4 │ → 逐步上采样
│ 每次放大 2 倍 │
└────────┬────────┘
│
▼
[B, 128, 512, 512]
│
▼
┌─────────────────┐
│ Conv 3×3 │
└────────┬────────┘
│
▼
输出图像 [B, 3, 512, 512]
VAE 对图像质量的影响 #
text
VAE 的作用:
1. 颜色表现
├── 不同 VAE 影响颜色饱和度
├── 有些 VAE 更鲜艳
└── 有些 VAE 更自然
2. 细节保留
├── 压缩会损失部分细节
├── 高质量 VAE 损失更少
└── 影响图像清晰度
3. 常用 VAE
├── sd-vae-ft-mse(官方优化)
├── vae-ft-mse-840000(推荐)
├── clearvae(更清晰)
└── kolors(适合亚洲人脸)
使用建议:
├── SD 1.5: 推荐使用 vae-ft-mse
├── SDXL: 内置 VAE 已优化
└── 动漫模型: 可能自带 VAE
潜空间扩散 #
为什么在潜空间扩散? #
text
像素空间 vs 潜空间对比:
像素空间扩散(如 DALL-E 2):
┌─────────────────────────────────────────────────────────────┐
│ 分辨率: 512×512×3 = 786,432 维 │
│ 计算量: 极大 │
│ 显存需求: 高 │
│ 生成速度: 慢 │
└─────────────────────────────────────────────────────────────┘
潜空间扩散(Stable Diffusion):
┌─────────────────────────────────────────────────────────────┐
│ 分辨率: 64×64×4 = 16,384 维 │
│ 计算量: 减少约 48 倍 │
│ 显存需求: 可在消费级 GPU 运行 │
│ 生成速度: 快 │
└─────────────────────────────────────────────────────────────┘
优势:
├── 大幅降低计算成本
├── 可在普通显卡上运行
├── 保持生成质量
└── 加速推理过程
潜空间特性 #
text
潜空间特点:
1. 压缩表示
├── 保留图像关键信息
├── 去除冗余细节
└── 高效的特征表示
2. 连续性
├── 相似图像在潜空间中距离近
├── 平滑插值产生平滑过渡
└── 支持图像混合
3. 语义性
├── 不同区域编码不同语义
├── 便于条件控制
└── 支持局部编辑
潜空间操作:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 插值: │
│ z_new = (1-α) × z_1 + α × z_2 │
│ 产生两张图像之间的过渡 │
│ │
│ 方向编辑: │
│ z_new = z + α × direction │
│ 沿特定方向修改图像属性 │
│ │
└─────────────────────────────────────────────────────────────┘
不同版本架构对比 #
SD 1.x vs SDXL #
text
架构对比:
SD 1.x:
┌─────────────────────────────────────────────────────────────┐
│ U-Net 参数: 860M │
│ 文本编码器: CLIP ViT-L/14 (单个) │
│ 潜空间: 64×64×4 (512×512 图像) │
│ 注意力分辨率: 64, 32, 16, 8 │
└─────────────────────────────────────────────────────────────┘
SDXL:
┌─────────────────────────────────────────────────────────────┐
│ U-Net 参数: 2.6B │
│ 文本编码器: CLIP ViT-L/14 + OpenCLIP ViT-bigG/14 │
│ 潜空间: 128×128×4 (1024×1024 图像) │
│ 注意力分辨率: 128, 64, 32, 16 │
│ 额外: │
│ ├── Refiner 模型(可选) │
│ ├── 时间步条件嵌入 │
│ └── 更大的注意力块 │
└─────────────────────────────────────────────────────────────┘
SD 3 架构创新 #
text
SD 3 新特性:
1. Multimodal Diffusion Transformer (MMDiT)
├── 使用 Transformer 替代 U-Net
├── 更好的扩展性
└── 更强的文本理解
2. 多文本编码器
├── CLIP ViT-L
├── OpenCLIP ViT-bigG
└── T5 XXL(支持长文本)
3. 改进的时间步编码
└── 更好的训练稳定性
4. Rectified Flow
├── 新的训练目标
└── 更快的采样速度
下一步 #
理解了模型架构后,继续学习:
最后更新:2026-04-05