Stable Diffusion 原理
SD 1.5 在潜在空间中逐步去噪,生成符合文本提示的图像。
Stable Diffusion(SD)是一类基于潜在扩散的图像生成模型。它在压缩后的图像特征上逐步去噪,最终由解码器把特征还原为像素。 文本提示词参与每一步噪声预测,影响生成内容。
本文以 Stable Diffusion 1.5(SD 1.5) 为准,核心组件是 VAE、CLIP 文本编码器和 U-Net。公式部分需要高斯分布、向量和神经网络训练的基础。
1. 四个组件的分工
图像经过编码器后,会变成一组更小的特征。这些特征所在的空间称为潜在空间(latent space),其中的数值保存了图像信息,需要经过解码才能显示为 RGB 图像。
| 组件 | 输入与输出 | 职责 |
|---|---|---|
| VAE | 图像 ↔ 潜在特征 | 编码器压缩图像,解码器重建像素 |
| CLIP 文本编码器 | 提示词 → 文本特征序列 | 为生成过程提供文本条件 |
| U-Net | 带噪特征、时间步、文本条件 → 噪声预测 | 判断当前特征应如何去噪 |
| Scheduler(调度器) | 当前特征、噪声预测、时间步 → 下一状态 | 确定采样时间步,并按采样算法更新特征 |
VAE(变分自编码器)由编码器和解码器组成。 编码器根据图像给出潜在变量的分布,从中采样得到潜在特征;解码器学习根据特征重建图像。SD 1.5 的扩散训练直接使用训练好的 VAE,固定其参数。
对一张 的 RGB 图像,SD 1.5 的 VAE 将其编码为 的潜在张量,排列为“通道 × 高 × 宽”。空间位置减少到原来的 ,通道数则由 3 变成 4;这里比较的是空间尺寸,计算量不能直接按 64 倍折算。
压缩减少了扩散模型反复处理的数据量,代价是重建可能损失细节。文生图时,扩散模型负责把初始噪声逐步变成符合文本条件的潜在特征,VAE 解码器负责将结果还原为图像。
2. 扩散训练:构造噪声,学习预测
前向加噪
记原图为 ,编码后的干净潜在特征为 ,加噪后的特征为 。 表示噪声时间步, 表示加噪终点;下文的 已包含模型所需的潜在缩放。
DDPM(去噪扩散概率模型)的前向过程是一条马尔可夫链:给定上一状态,就能确定本步的分布,无需更早的状态。 每一步按预设比例保留信号,并加入独立高斯噪声:
控制本步噪声方差, 控制上一状态的保留比例。 表示各维度独立、均值为 0、方差为 1 的高斯分布。
由于独立高斯变量的线性组合仍是高斯变量,递推可合并为:
表示合并了前面所有加噪步骤的等效噪声, 则只表示第 步新加入的噪声。随着 减小,原图信号变弱;当它接近 0 时, 的分布接近标准高斯分布。
训练时可随机选取一个时间步,直接由干净特征构造该步的带噪特征,无需逐步执行整条加噪链。
噪声预测目标
训练样本包含图像及其文字描述。CLIP 把描述编码为条件 ;U-Net 接收 、 和 ,输出 ,其中 是待学习参数。
训练程序记录了加进去的噪声 ,因此能直接比较预测值与真实值。常用的简化训练目标是均方误差:
式中的期望表示对不同训练样本、时间步和噪声取平均。误差经反向传播更新 U-Net,VAE 与文本编码器在 SD 1.5 的基础扩散训练中保持固定。
高斯噪声的分布是预先规定的;模型学习的是结合带噪特征、噪声强度和文本条件预测噪声。 同一种加噪规则作用在不同图像上,会产生不同的带噪输入。U-Net 需要学到图像结构及其与文字的关系,才能降低预测误差。
3. 采样:噪声预测如何变成图像
训练时有干净特征 ,生成时则要从随机噪声中估计它。反向过程需要求出当前状态 对应的上一状态 。如果已知 ,根据贝叶斯公式:
表示已规定的前向过程及其导出的分布。右侧两项都是已知高斯分布,因此给定干净特征 时,反向后验可直接算出。生成时缺少的正是 ,这时就需要 U-Net 的预测。
将加噪公式整理,并把真实噪声换成 U-Net 的预测,就得到干净特征的估计:
Scheduler 根据这个估计计算下一状态。DDPM 采用相邻时间步更新,将估计代入后验均值后可写成:
是所选反向方差对应的标准差, 是本步重新采样的噪声,最后一步通常不再加入随机噪声。当前特征和预测噪声都要乘上与时间步有关的系数,更新过程比直接相减多了这些缩放。
U-Net 负责预测噪声,Scheduler 负责按采样规则更新状态。 上式是 DDPM 的规则;DDIM 等方法采用不同的更新方式,其中确定性 DDIM 不在每一步额外注入随机噪声。
文生图在潜在空间采样高斯噪声作为初始状态。U-Net 预测噪声,Scheduler 更新潜在特征,更新后的特征又作为下一步的输入,文本条件贯穿整个过程。采样结束时,VAE 解码器将最终特征还原为图像;这条生成流程不需要 VAE 编码器。
训练时间表有 1000 个时间步时,推理可选取覆盖高、低噪声阶段的 50 个时间步,逐次更新到最终特征。“50 步”是推理中的更新次数, 则是本次更新对应的训练时间步,两者含义不同。启用 CFG(下节介绍)时,一次更新需要两份条件预测。
图生图保留了一部分输入图像的信息:图像经过 VAE 编码,潜在特征按指定强度加噪,并从对应时间步开始去噪。噪声强度越高,保留的输入信号越少,生成结果通常越容易偏离原图。
4. 文本条件与 CFG
CLIP 与交叉注意力
CLIP 包含文本编码器和图像编码器,通过成对的图像与文字训练。对比学习让匹配图文的表示更接近,不匹配的表示更远,因此模型能比较图像与类别描述的相似度。 这种不针对目标分类数据重新训练的分类方式称为零样本分类。
SD 1.5 使用 CLIP 的文本编码器提供条件,基础文生图流程不调用 CLIP 图像编码器。 提示词被拆成 token,编码为一串文本特征,保留词语及上下文信息,供 U-Net 在去噪时使用。
U-Net 是具有下采样、上采样和跳跃连接的神经网络。它在不同分辨率上处理带噪特征,跳跃连接将下采样阶段的特征送给对应的上采样层。文本通过其中的交叉注意力参与计算:
- Query(Q)来自 U-Net 当前层的图像特征。 每个空间位置查询相关的文本信息。
- Key(K)和 Value(V)来自文本特征。 Q 与 K 的匹配程度形成权重,对 V 加权汇总后影响图像特征。
时间步 同样进入 U-Net,告诉网络当前的噪声强度。随着采样推进,潜在特征不断变化,同一段文本会作用于这些不同的图像状态。
正向与负向提示词
Classifier-Free Guidance(CFG,无分类器引导)把同一状态下的两份噪声预测组合起来,增强文本条件的影响。训练阶段会随机丢弃部分文本条件,让同一个网络学会有条件和无条件的噪声预测。
记正向条件的预测为 ,基准条件的预测为 , 为引导系数。两次预测使用相同的 和 :
未填写负向提示词时,基准条件通常为空文本;填写后,常见实现将负向文本的编码作为基准。公式相减的是两种条件下的噪声预测,组合后的 交给 Scheduler 更新潜在特征。
按这个公式, 时只保留正向预测, 时沿两份预测的差异方向外推。常见示例中的 7.5 就是 的一个取值。提高 通常会增强提示词的影响,但可能造成过饱和或伪影;负向提示词改变的是预测方向,无法保证指定对象彻底消失。
5. ControlNet:增加空间条件
ControlNet 是为预训练扩散模型增加空间条件的网络结构。 文本说明画面内容,控制图则提供姿态、轮廓或深度等位置关系:
- OpenPose 姿态图:人体关键点及其连接关系。
- Canny 边缘图:物体边界与轮廓。
- 深度图:场景中各位置的远近关系。
控制图通常由预处理器提取,作为 ControlNet 的输入。图生图通过加噪后的输入特征决定初始状态,ControlNet 则在去噪过程中持续向网络提供空间信息,两者可以组合使用。
原始 SD 版 ControlNet 保留基础 U-Net,并增加一条可训练分支:
- 冻结的基础 U-Net:保留预训练权重,训练 ControlNet 时不更新。
- 可训练的副本:复制 U-Net 的编码块和中间块,接收带噪特征、时间步、文本及空间条件。
- 零初始化卷积连接:以权重和偏置初始化为 0 的 卷积输出控制残差,加到主网络的中间块输出及通向解码侧的跳跃连接上。
零初始化让控制分支在训练开始时不改变主网络的输出;参数更新后,分支逐渐学会提供控制信息。 卷积参数会参与训练,不会一直保持为零。
基础 U-Net 虽然冻结了参数,推理时仍与控制分支一起参与计算,因此 ControlNet 会增加显存与计算开销。控制效果取决于条件图质量、所用模型和控制强度。
6. 个性化训练与 LoRA
个性化训练让模型生成指定人物、物体或风格。不同方法更新的参数范围不同:
| 方法 | 可训练参数 | 保存内容 |
|---|---|---|
| Textual Inversion | 新标记的一个或少量词向量;模型其余参数固定 | 文本嵌入 |
| DreamBooth | 全量微调 U-Net;文本编码器可按方案一同训练 | 微调后的模型权重 |
| Custom Diffusion | 交叉注意力中将文本映射为 K、V 的投影参数,以及新标记嵌入 | 注意力层权重与文本嵌入 |
| LoRA | 附加的低秩矩阵;原权重固定 | 低秩矩阵权重,可单独加载或合并到原权重 |
Textual Inversion 的参数少,但只能通过输入嵌入影响已有模型,表达能力受基础模型限制。
DreamBooth 根据主体的少量参考图像,将特定标识符与这个主体关联起来,使模型能在新场景中生成同一主体。
它的 prior preservation(先验保持)损失用原模型生成的同类图像约束训练,避免模型把整个类别都学成这个主体。这有助于减轻过拟合,但不能完全避免遗忘。
LoRA(低秩适配)将权重更新表示为两个较小矩阵的乘积:
固定,、 可训练, 是远小于输入、输出维度的秩, 控制更新幅度。可训练参数由完整矩阵的 减少为 。
LoRA 保留原模型权重,学习一个低秩权重增量。 参数减少后,需要保存的梯度、优化器状态和增量文件都更小,但整次训练的加速比不能按参数减少的比例计算。
DreamBooth 描述主体定制的训练方式,LoRA 描述参数更新的形式,因此两者可以组合。 ControlNet 关注的是空间结构控制,与这些方法解决的问题不同。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。