Files
2026-05-16 17:16:51 +08:00

185 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 2-SD-StableDiffusion
draft: false
tags:
- Stable-Diffusion
- 扩散模型
- 生成模型
- 深度学习
---
# Stable Diffusion 全链路深度解析:从潜空间到语义生成
## 一、 整体架构总览:降维打击与模态融合
Stable Diffusion 的核心思想是将扩散过程从高维的**像素空间 (Pixel Space)** 转移到低维的**潜空间 (Latent Space)**。这种做法不仅大幅降低了计算成本,还通过解耦“感知压缩”与“语义生成”,提高了生成质量。
整个训练通路可以抽象为:
1. **感知压缩器 (VAE)**:负责将图像 $x$ 压缩为隐向量 $z$,或将 $z$ 反推回图像。
2. **语义编码器 (CLIP)**:负责将文本提示词 $y$ 映射为 U-Net 能理解的特征向量。
3. **生成引擎 (U-Net)**:在潜空间中进行条件扩散过程,学习预测噪声。
---
## 二、 组件一VAE——空间的感知压缩
VAE 在 SD 中充当“空间翻译官”。它通过自编码结构学习图像的低维表示。
### 1. 数学定义与映射
- **编码器 $\mathcal{E}$**:将图像 $x \in \mathbb{R}^{H \times W \times 3}$ 映射到潜空间 $z = \mathcal{E}(x)$。在 SD 中,$z \in \mathbb{R}^{h \times w \times c}$,下采样倍数通常为 8即 $h = H/8$)。
- **解码器 $\mathcal{D}$**:将潜变量映射回像素空间 $\hat{x} = \mathcal{D}(z)$。
### 2. 训练目标(变分下界与正则化)
VAE 的训练不仅仅是 MSE 损失,它包含了一个正则化项以确保潜空间 $z$ 具有良好的分布特性:
$$L_{VAE} = \|x - \mathcal{D}(\mathcal{E}(x))\|^2 + \lambda \cdot D_{KL}(q_\phi(z|x) \| \mathcal{N}(0, I))$$
- **KL 正则化**:确保 $z$ 接近标准正态分布,防止潜空间出现过于稀疏的“空洞”,这对后续扩散模型的采样至关重要。
- **感知损失 (Perceptual Loss)**:在 SD 的 VAE 训练中,还会加入 LPIPS 或 GAN Loss 来保证重建图像的视觉清晰度(而非仅仅是像素对齐)。
---
## 三、 组件二CLIP——语义的桥梁
为了实现“文生图”我们需要一个能同时理解图像和文本的模型。OpenAI 的 **CLIP (Contrastive Language-Image Pre-training)** 提供了这一能力。
### 1. 对比学习推导
CLIP 通过大规模对(图像 $I_i$, 文本 $T_i$)进行训练。其核心是学习两个编码器:$f_{img}$ 和 $f_{txt}$。
训练目标是最大化对角线上的相似度:
$$\text{Loss}_{\text{CLIP}} = -\sum_{i=1}^N \log \frac{\exp(\cos(f_{img}(I_i), f_{txt}(T_i)) / \tau)}{\sum_{j=1}^N \exp(\cos(f_{img}(I_i), f_{txt}(T_j)) / \tau)}$$
**直觉解释**:这一损失函数的核心思想是"匹配的对应该更相似"。对于每个样本 $i$,我们希望图像编码 $f_{img}(I_i)$ 与其对应文本编码 $f_{txt}(T_i)$ 的余弦相似度越高越好,同时与所有不匹配的文本编码 $f_{txt}(T_j)$(其中 $j \neq i$)的相似度越低越好。
- $\tau$ 是温度参数,控制 softmax 的锐度
- $\cos(\cdot, \cdot)$ 是余弦相似度函数
- 分母是对所有文本的相似度求和,体现对比学习的"对比"特性
### 2. 在 SD 中的应用
在 Stable Diffusion 推理时,我们**冻结** CLIP 的 Text Encoder通常是 ViT-L/14 的一部分)。文本 $y$ 经过 CLIP 后得到特征矩阵 $C \in \mathbb{R}^{L \times d_{\text{clip}}}$$L$ 为 token 长度,通常为 $77 \times 768$),这个矩阵将作为 **Conditioning** 注入 U-Net。
**CLIP 的核心作用**
1. **语义对齐**:将文本中的抽象语义(如"一只在睡觉的猫")映射到图像特征空间
2. **零样本迁移**:预训练好的 CLIP 可以理解任意文本描述,无须针对特定类别微调
3. **条件信息提取**CLIP 提取的文本特征 $C$ 包含丰富的语义信息,可引导 U-Net 生成对应的视觉内容
---
## 四、 组件三U-Net 与 Cross-Attention 核心逻辑
SD 使用的 U-Net 是一个带有**空间变压器 (Spatial Transformer)** 的增强版本,它是实现噪声预测的主体。
### 1. U-Net 结构组成
- **ResNet Blocks**:处理潜空间特征图的局部纹理。
- **Spatial Transformer Blocks**:包含 Self-Attention 和 Cross-Attention处理全局依赖和外部条件。
### 2. Cross-Attention 的数学细节
这是文本引导图像生成的关键。在 U-Net 的中间层,潜特征 $z_t$ 被映射为 Query而 CLIP 文本向量 $C$ 被映射为 Key 和 Value。
$$Q = W_Q \cdot \phi(z_t), \quad K = W_K \cdot C, \quad V = W_V \cdot C$$
$$\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d}} \right) \cdot V$$
- **物理意义**注意力图Attention Map决定了文本中的哪个单词如“猫”应该对应潜特征图中的哪个空间位置。通过这种方式文本语义被“注入”到了潜空间的去噪过程中。
---
## 五、 整体训练通路:全链路数学推导
现在我们将上述组件串联,描述 Stable Diffusion 的训练全过程。
### 1. 前向扩散(像素到潜空间的退化)
给定训练图像 $x$,先通过 VAE 得到 $z_0 = \mathcal{E}(x)$。
随后根据 DDPM 的加噪公式,在时间步 $t$ 生成带噪潜变量:
$$z_t = \sqrt{\bar{\alpha}_t} z_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)$$
### 2. 预测与损失函数(目标优化)
U-Net 网络 $\epsilon_\theta$ 接收三个输入:带噪潜变量 $z_t$、时间步 $t$、文本条件 $\tau(y)$。
其训练目标是预测注入的噪声 $\epsilon$
$$\min_\theta \mathcal{L}_{LDM} = \mathbb{E}_{x, y, \epsilon, t} \left[ \left\| \epsilon - \epsilon_\theta(z_t, t, \tau(y)) \right\|_2^2 \right]$$
**详细步骤拆解:**
1. **采样图像 $x$**
2. **编码图像**$z_0 = \text{VAE\_Encode}(x)$。
3. **采样时间步**$t \in \{1, \dots, T\}$。
4. **生成噪声**$\epsilon \sim \mathcal{N}(0, I)$。
5. **前向加噪**:计算 $z_t$(利用重参数化技巧)。
6. **编码文本**$c = \text{CLIP\_Text\_Encode}(y)$。
7. **前向传播**$\hat{\epsilon} = \text{U-Net}(z_t, t, c)$。
8. **反向传播**:更新 U-Net 参数 $\theta$。
---
## 六、 推理/采样通路:无分类器引导 (CFG)
在推理时,我们需要从纯噪声 $z_T \sim \mathcal{N}(0, I)$ 开始,逐步迭代到 $z_0$。
### 1. CFG 的数学推导
为了增强文本的一致性,使用 Classifier-Free Guidance (CFG)。其核心思想是:**在无条件和有条件之间进行线性插值**,以增强条件信号同时保留一定的多样性。
$$\tilde{\epsilon}_\theta(z_t, t, c) = \epsilon_\theta(z_t, t, c_{\text{null}}) + s \cdot (\epsilon_\theta(z_t, t, c) - \epsilon_\theta(z_t, t, c_{\text{null}}))$$
- 其中 $s$ 是引导强度Guidance Scale通常在 $1.0 \sim 10.0$ 之间
- $c_{\text{null}}$ 是空字符串的 CLIP 编码(对应无条件生成)
- 当 $s = 1$ 时,退化为普通条件预测;$s$ 越大,条件引导越强
**直觉**CFG 本质上是在估计**条件梯度** $\nabla_z \log p(c|z)$。方向指向高条件概率的区域。
### 2. 采样流程
经过 $T$ 步迭代得到 $z_0$ 后,通过 VAE 的解码器还原为图像:
$$x_{\text{gen}} = \mathcal{D}(z_0)$$
**Algorithm: Stable Diffusion Sampling**
1. **初始化**$z_T \sim \mathcal{N}(0, I)$
2. **文本编码**$c = \text{CLIP\_Text\_Encode}(y)$
3. **迭代去噪**:对 $t = T, T-1, \dots, 1$
- 预测噪声:$\epsilon = \epsilon_\theta(z_t, t, c)$
- CFG 修正:$\tilde{\epsilon} = \epsilon + s \cdot (\epsilon - \epsilon_\theta(z_t, t, c_{\text{null}}))$
- 更新:$z_{t-1} = \text{denoise}(z_t, \tilde{\epsilon}, t)$
4. **解码**$x_{\text{gen}} = \mathcal{D}(z_0)$
---
## 七、 总结Stable Diffusion 的严谨定义
> **Stable Diffusion 是一个基于潜空间扩散的生成模型。它利用 VAE 实现感知压缩,解决计算开销问题;利用 CLIP 实现多模态对齐,解决控制问题;利用 U-Net 的 Cross-Attention 机制在低维潜空间内执行受条件的去噪逆过程。其本质是在概率分布的对数梯度Score Function引导下从高斯分布向特定语义分布的映射。**
---