跳至内容

Stable Diffusion 原理

SD 1.5 在潜在空间中逐步去噪,生成符合文本提示的图像。

  • Stable Diffusion
  • 扩散模型
  • ControlNet
  • LoRA

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,固定其参数。

对一张 512×512512\times512 的 RGB 图像,SD 1.5 的 VAE 将其编码为 4×64×644\times64\times64 的潜在张量,排列为“通道 × 高 × 宽”。空间位置减少到原来的 1/641/64,通道数则由 3 变成 4;这里比较的是空间尺寸,计算量不能直接按 64 倍折算。

压缩减少了扩散模型反复处理的数据量,代价是重建可能损失细节。文生图时,扩散模型负责把初始噪声逐步变成符合文本条件的潜在特征,VAE 解码器负责将结果还原为图像。

2. 扩散训练:构造噪声,学习预测

前向加噪

记原图为 xx,编码后的干净潜在特征为 z0z_0,加噪后的特征为 ztz_t。tt 表示噪声时间步,TT 表示加噪终点;下文的 z0z_0 已包含模型所需的潜在缩放。

DDPM(去噪扩散概率模型)的前向过程是一条马尔可夫链:给定上一状态,就能确定本步的分布,无需更早的状态。 每一步按预设比例保留信号,并加入独立高斯噪声:

zt=αt zt−1+βt ηt,αt=1−βt,ηt∼N(0,I)z_t=\sqrt{\alpha_t}\,z_{t-1}+\sqrt{\beta_t}\,\eta_t, \qquad \alpha_t=1-\beta_t,\quad \eta_t\sim\mathcal N(0,I)

βt\beta_t 控制本步噪声方差,αt\alpha_t 控制上一状态的保留比例。N(0,I)\mathcal N(0,I) 表示各维度独立、均值为 0、方差为 1 的高斯分布。

由于独立高斯变量的线性组合仍是高斯变量,递推可合并为:

zt=αˉt z0+1−αˉt ϵ,αˉt=∏s=1tαs,ϵ∼N(0,I)z_t=\sqrt{\bar\alpha_t}\,z_0+\sqrt{1-\bar\alpha_t}\,\epsilon, \qquad \bar\alpha_t=\prod_{s=1}^{t}\alpha_s,\quad \epsilon\sim\mathcal N(0,I)

ϵ\epsilon 表示合并了前面所有加噪步骤的等效噪声,ηt\eta_t 则只表示第 tt 步新加入的噪声。随着 αˉt\bar\alpha_t 减小,原图信号变弱;当它接近 0 时,ztz_t 的分布接近标准高斯分布。

训练时可随机选取一个时间步,直接由干净特征构造该步的带噪特征,无需逐步执行整条加噪链。

噪声预测目标

训练样本包含图像及其文字描述。CLIP 把描述编码为条件 cc;U-Net 接收 ztz_t、tt 和 cc,输出 ϵθ(zt,t,c)\epsilon_\theta(z_t,t,c),其中 θ\theta 是待学习参数。

扩散训练:构造带噪特征,比较真实噪声与 U-Net 的预测

训练程序记录了加进去的噪声 ϵ\epsilon,因此能直接比较预测值与真实值。常用的简化训练目标是均方误差:

L=Ez0,c,t,ϵ[∥ϵ−ϵθ(zt,t,c)∥22]\mathcal L=\mathbb E_{z_0,c,t,\epsilon} \left[\left\|\epsilon-\epsilon_\theta(z_t,t,c)\right\|_2^2\right]

式中的期望表示对不同训练样本、时间步和噪声取平均。误差经反向传播更新 U-Net,VAE 与文本编码器在 SD 1.5 的基础扩散训练中保持固定。

高斯噪声的分布是预先规定的;模型学习的是结合带噪特征、噪声强度和文本条件预测噪声。 同一种加噪规则作用在不同图像上,会产生不同的带噪输入。U-Net 需要学到图像结构及其与文字的关系,才能降低预测误差。

3. 采样:噪声预测如何变成图像

训练时有干净特征 z0z_0,生成时则要从随机噪声中估计它。反向过程需要求出当前状态 ztz_t 对应的上一状态 zt−1z_{t-1}。如果已知 z0z_0,根据贝叶斯公式:

q(zt−1∣zt,z0)∝q(zt∣zt−1) q(zt−1∣z0)q(z_{t-1}\mid z_t,z_0) \propto q(z_t\mid z_{t-1})\,q(z_{t-1}\mid z_0)

qq 表示已规定的前向过程及其导出的分布。右侧两项都是已知高斯分布,因此给定干净特征 z0z_0 时,反向后验可直接算出。生成时缺少的正是 z0z_0,这时就需要 U-Net 的预测。

将加噪公式整理,并把真实噪声换成 U-Net 的预测,就得到干净特征的估计:

z^0=zt−1−αˉt ϵθ(zt,t,c)αˉt\hat z_0=\frac{z_t-\sqrt{1-\bar\alpha_t}\,\epsilon_\theta(z_t,t,c)}{\sqrt{\bar\alpha_t}}

Scheduler 根据这个估计计算下一状态。DDPM 采用相邻时间步更新,将估计代入后验均值后可写成:

zt−1=1αt(zt−βt1−αˉtϵθ(zt,t,c))+σtξ,ξ∼N(0,I)z_{t-1}=\frac{1}{\sqrt{\alpha_t}} \left(z_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\epsilon_\theta(z_t,t,c)\right) +\sigma_t\xi,\qquad \xi\sim\mathcal N(0,I)

σt\sigma_t 是所选反向方差对应的标准差,ξ\xi 是本步重新采样的噪声,最后一步通常不再加入随机噪声。当前特征和预测噪声都要乘上与时间步有关的系数,更新过程比直接相减多了这些缩放。

U-Net 负责预测噪声,Scheduler 负责按采样规则更新状态。 上式是 DDPM 的规则;DDIM 等方法采用不同的更新方式,其中确定性 DDIM 不在每一步额外注入随机噪声。

文生图:每次去噪后判断采样步数是否完成,未完成继续更新,完成后由 VAE 解码

文生图在潜在空间采样高斯噪声作为初始状态。U-Net 预测噪声,Scheduler 更新潜在特征,更新后的特征又作为下一步的输入,文本条件贯穿整个过程。采样结束时,VAE 解码器将最终特征还原为图像;这条生成流程不需要 VAE 编码器。

训练时间表有 1000 个时间步时,推理可选取覆盖高、低噪声阶段的 50 个时间步,逐次更新到最终特征。“50 步”是推理中的更新次数,tt 则是本次更新对应的训练时间步,两者含义不同。启用 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 加权汇总后影响图像特征。

时间步 tt 同样进入 U-Net,告诉网络当前的噪声强度。随着采样推进,潜在特征不断变化,同一段文本会作用于这些不同的图像状态。

正向与负向提示词

Classifier-Free Guidance(CFG,无分类器引导)把同一状态下的两份噪声预测组合起来,增强文本条件的影响。训练阶段会随机丢弃部分文本条件,让同一个网络学会有条件和无条件的噪声预测。

记正向条件的预测为 ϵpos\epsilon_{\mathrm{pos}},基准条件的预测为 ϵbase\epsilon_{\mathrm{base}},ww 为引导系数。两次预测使用相同的 ztz_t 和 tt:

ϵ^=ϵbase+w(ϵpos−ϵbase)\hat\epsilon=\epsilon_{\mathrm{base}} +w\left(\epsilon_{\mathrm{pos}}-\epsilon_{\mathrm{base}}\right)

CFG:同一 U-Net 在两种文本条件下预测噪声,组合结果交给 Scheduler

未填写负向提示词时,基准条件通常为空文本;填写后,常见实现将负向文本的编码作为基准。公式相减的是两种条件下的噪声预测,组合后的 ϵ^\hat\epsilon 交给 Scheduler 更新潜在特征。

按这个公式,w=1w=1 时只保留正向预测,w>1w>1 时沿两份预测的差异方向外推。常见示例中的 7.5 就是 ww 的一个取值。提高 ww 通常会增强提示词的影响,但可能造成过饱和或伪影;负向提示词改变的是预测方向,无法保证指定对象彻底消失。

5. ControlNet:增加空间条件

ControlNet 是为预训练扩散模型增加空间条件的网络结构。 文本说明画面内容,控制图则提供姿态、轮廓或深度等位置关系:

  • OpenPose 姿态图:人体关键点及其连接关系。
  • Canny 边缘图:物体边界与轮廓。
  • 深度图:场景中各位置的远近关系。

控制图通常由预处理器提取,作为 ControlNet 的输入。图生图通过加噪后的输入特征决定初始状态,ControlNet 则在去噪过程中持续向网络提供空间信息,两者可以组合使用。

ControlNet 基本模块:原网络冻结,可训练分支接收空间条件,两路输出相加

原始 SD 版 ControlNet 保留基础 U-Net,并增加一条可训练分支:

  1. 冻结的基础 U-Net:保留预训练权重,训练 ControlNet 时不更新。
  2. 可训练的副本:复制 U-Net 的编码块和中间块,接收带噪特征、时间步、文本及空间条件。
  3. 零初始化卷积连接:以权重和偏置初始化为 0 的 1×11\times1 卷积输出控制残差,加到主网络的中间块输出及通向解码侧的跳跃连接上。

零初始化让控制分支在训练开始时不改变主网络的输出;参数更新后,分支逐渐学会提供控制信息。 卷积参数会参与训练,不会一直保持为零。

基础 U-Net 虽然冻结了参数,推理时仍与控制分支一起参与计算,因此 ControlNet 会增加显存与计算开销。控制效果取决于条件图质量、所用模型和控制强度。

6. 个性化训练与 LoRA

个性化训练让模型生成指定人物、物体或风格。不同方法更新的参数范围不同:

方法可训练参数保存内容
Textual Inversion新标记的一个或少量词向量;模型其余参数固定文本嵌入
DreamBooth全量微调 U-Net;文本编码器可按方案一同训练微调后的模型权重
Custom Diffusion交叉注意力中将文本映射为 K、V 的投影参数,以及新标记嵌入注意力层权重与文本嵌入
LoRA附加的低秩矩阵;原权重固定低秩矩阵权重,可单独加载或合并到原权重

Textual Inversion 的参数少,但只能通过输入嵌入影响已有模型,表达能力受基础模型限制。

DreamBooth 根据主体的少量参考图像,将特定标识符与这个主体关联起来,使模型能在新场景中生成同一主体。

它的 prior preservation(先验保持)损失用原模型生成的同类图像约束训练,避免模型把整个类别都学成这个主体。这有助于减轻过拟合,但不能完全避免遗忘。

LoRA(低秩适配)将权重更新表示为两个较小矩阵的乘积:

W′=W0+sBA,W0∈Rdout×din,B∈Rdout×r,A∈Rr×dinW'=W_0+sBA,\qquad W_0\in\mathbb R^{d_{\mathrm{out}}\times d_{\mathrm{in}}},\quad B\in\mathbb R^{d_{\mathrm{out}}\times r},\quad A\in\mathbb R^{r\times d_{\mathrm{in}}}

W0W_0 固定,AA、BB 可训练,rr 是远小于输入、输出维度的秩,ss 控制更新幅度。可训练参数由完整矩阵的 doutdind_{\mathrm{out}}d_{\mathrm{in}} 减少为 r(din+dout)r(d_{\mathrm{in}}+d_{\mathrm{out}})。

LoRA 保留原模型权重,学习一个低秩权重增量。 参数减少后,需要保存的梯度、优化器状态和增量文件都更小,但整次训练的加速比不能按参数减少的比例计算。

DreamBooth 描述主体定制的训练方式,LoRA 描述参数更新的形式,因此两者可以组合。 ControlNet 关注的是空间结构控制,与这些方法解决的问题不同。

评论

使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。

阅读到这里时加载评论。