模型架构 #

整体架构概览 #

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